diff --git a/Include/Acidanthera/Library/OcGuardLib.h b/Include/Acidanthera/Library/OcGuardLib.h index 3050d583654f2f19d5b59d8843e62f77fa98a6fc..4866fab5cb7979d3fa52eae7fb8d275f819c22ba 100644 --- a/Include/Acidanthera/Library/OcGuardLib.h +++ b/Include/Acidanthera/Library/OcGuardLib.h @@ -56,6 +56,27 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. // and multiplication with addition (A*B+C) support. // +BOOLEAN +OcOverflowAddU16 ( + UINT16 A, + UINT16 B, + UINT16 *Result + ); + +BOOLEAN +OcOverflowSubU16 ( + UINT16 A, + UINT16 B, + UINT16 *Result + ); + +BOOLEAN +OcOverflowMulU16 ( + UINT16 A, + UINT16 B, + UINT16 *Result + ); + BOOLEAN OcOverflowAddU32 ( UINT32 A, diff --git a/Library/OcGuardLib/BitOverflow.c b/Library/OcGuardLib/BitOverflow.c index 1bb76b4cdcec94fe8cb4f12c0ae78fb4de4aaac3..643216d2f9e70bc62858e33ac43e3d55bd805ff0 100644 --- a/Library/OcGuardLib/BitOverflow.c +++ b/Library/OcGuardLib/BitOverflow.c @@ -26,6 +26,73 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. // target C99 compliance rather than performance. // +BOOLEAN +OcOverflowAddU16 ( + UINT16 A, + UINT16 B, + UINT16 *Result + ) +{ +#if defined(OC_HAS_TYPE_GENERIC_BUILTINS) + return __builtin_add_overflow(A, B, Result); +#else + UINT32 Temp; + + // + // I believe casting will be faster on X86 at least. + // + Temp = A + B; + *Result = (UINT16) Temp; + if (Temp <= MAX_UINT16) { + return FALSE; + } + + return TRUE; +#endif +} + +BOOLEAN +OcOverflowSubU16 ( + UINT16 A, + UINT16 B, + UINT16 *Result + ) +{ +#if defined(OC_HAS_TYPE_GENERIC_BUILTINS) + return __builtin_sub_overflow(A, B, Result); +#else + *Result = (UINT16) (A - B); + + if (A >= B) { + return FALSE; + } + + return TRUE; +#endif +} + +BOOLEAN +OcOverflowMulU16 ( + UINT16 A, + UINT16 B, + UINT16 *Result + ) +{ +#if defined(OC_HAS_TYPE_GENERIC_BUILTINS) + return __builtin_mul_overflow(A, B, Result); +#else + UINT32 Temp; + + Temp = (UINT32) A * B; + *Result = (UINT16) Temp; + if (Temp <= MAX_UINT32) { + return FALSE; + } + + return TRUE; +#endif +} + BOOLEAN OcOverflowAddU32 ( UINT32 A,