From 0d0279cc7ff02ffedd5bead7a5241fade204b01b Mon Sep 17 00:00:00 2001 From: vit9696 Date: Sun, 31 Jan 2021 04:57:40 +0300 Subject: [PATCH] OcGuardLib: Add U16 arithmetics --- Include/Acidanthera/Library/OcGuardLib.h | 21 ++++++++ Library/OcGuardLib/BitOverflow.c | 67 ++++++++++++++++++++++++ 2 files changed, 88 insertions(+) diff --git a/Include/Acidanthera/Library/OcGuardLib.h b/Include/Acidanthera/Library/OcGuardLib.h index 3050d583..4866fab5 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 1bb76b4c..643216d2 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, -- GitLab