MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf | 3 +++ MdePkg/Library/BaseSafeIntLib/SafeIntLib.c | 13 +++++++++---- MdePkg/Library/BaseSafeIntLib/SafeIntLib32.c | 3 ++- MdePkg/Library/BaseSafeIntLib/SafeIntLibEbc.c | 3 ++- 4 files changed, 16 insertions(+), 6 deletions(-)
The commit resolve the VS IA32 NOOPT target build failure for modules
that use the BaseSafeIntLib.
More specifically, corresponding BaseLib APIs should be used when
performing shift & mulitiplication operations with signed/unsigned
64-bit operands.
Cc: Michael D Kinney <michael.d.kinney@intel.com>
Cc: Sean Brogan <sean.brogan@microsoft.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Hao Wu <hao.a.wu@intel.com>
---
MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf | 3 +++
MdePkg/Library/BaseSafeIntLib/SafeIntLib.c | 13 +++++++++----
MdePkg/Library/BaseSafeIntLib/SafeIntLib32.c | 3 ++-
MdePkg/Library/BaseSafeIntLib/SafeIntLibEbc.c | 3 ++-
4 files changed, 16 insertions(+), 6 deletions(-)
diff --git a/MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf b/MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf
index 20a83ed97b..8fbdafe748 100644
--- a/MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf
+++ b/MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf
@@ -56,3 +56,6 @@
[Packages]
MdePkg/MdePkg.dec
+
+[LibraryClasses]
+ BaseLib
diff --git a/MdePkg/Library/BaseSafeIntLib/SafeIntLib.c b/MdePkg/Library/BaseSafeIntLib/SafeIntLib.c
index d846160ba0..64b8bc4ad8 100644
--- a/MdePkg/Library/BaseSafeIntLib/SafeIntLib.c
+++ b/MdePkg/Library/BaseSafeIntLib/SafeIntLib.c
@@ -28,6 +28,7 @@
#include <Base.h>
#include <Library/SafeIntLib.h>
+#include <Library/BaseLib.h>
//
@@ -3373,8 +3374,8 @@ SafeUint64Mult (
// b * c must be less than 2^32 or there would be bits in the high 64-bits
// then there must be no overflow of the resulting values summed up.
//
- DwordA = (UINT32)(Multiplicand >> 32);
- DwordC = (UINT32)(Multiplier >> 32);
+ DwordA = (UINT32)RShiftU64 (Multiplicand, 32);
+ DwordC = (UINT32)RShiftU64 (Multiplier, 32);
//
// common case -- if high dwords are both zero, no chance for overflow
@@ -3409,7 +3410,11 @@ SafeUint64Mult (
// now sum them all up checking for overflow.
// shifting is safe because we already checked for overflow above
//
- if (!RETURN_ERROR (SafeUint64Add (ProductBC << 32, ProductAD << 32, &UnsignedResult))) {
+ if (!RETURN_ERROR (SafeUint64Add (
+ LShiftU64 (ProductBC, 32),
+ LShiftU64 (ProductAD, 32),
+ &UnsignedResult
+ ))) {
//
// b * d
//
@@ -4011,7 +4016,7 @@ SafeInt32Mult (
OUT INT32 *Result
)
{
- return SafeInt64ToInt32 (((INT64)Multiplicand) *((INT64)Multiplier), Result);
+ return SafeInt64ToInt32 (MultS64x64 ((INT64)Multiplicand, (INT64)Multiplier), Result);
}
/**
diff --git a/MdePkg/Library/BaseSafeIntLib/SafeIntLib32.c b/MdePkg/Library/BaseSafeIntLib/SafeIntLib32.c
index 18bfb9e413..b3b7b802a1 100644
--- a/MdePkg/Library/BaseSafeIntLib/SafeIntLib32.c
+++ b/MdePkg/Library/BaseSafeIntLib/SafeIntLib32.c
@@ -28,6 +28,7 @@
#include <Base.h>
#include <Library/SafeIntLib.h>
+#include <Library/BaseLib.h>
/**
INT32 -> UINTN conversion
@@ -549,6 +550,6 @@ SafeIntnMult (
OUT INTN *Result
)
{
- return SafeInt64ToIntn (((INT64)Multiplicand) *((INT64)Multiplier), Result);
+ return SafeInt64ToIntn (MultS64x64 ((INT64)Multiplicand, (INT64)Multiplier), Result);
}
diff --git a/MdePkg/Library/BaseSafeIntLib/SafeIntLibEbc.c b/MdePkg/Library/BaseSafeIntLib/SafeIntLibEbc.c
index 4478957b7e..e810ba59ef 100644
--- a/MdePkg/Library/BaseSafeIntLib/SafeIntLibEbc.c
+++ b/MdePkg/Library/BaseSafeIntLib/SafeIntLibEbc.c
@@ -28,6 +28,7 @@
#include <Base.h>
#include <Library/SafeIntLib.h>
+#include <Library/BaseLib.h>
/**
INT32 -> UINTN conversion
@@ -607,7 +608,7 @@ SafeIntnMult (
)
{
if (sizeof (UINTN) == sizeof (UINT32)) {
- return SafeInt64ToIntn (((INT64)Multiplicand) *((INT64)Multiplier), Result);
+ return SafeInt64ToIntn (MultS64x64 ((INT64)Multiplicand, (INT64)Multiplier), Result);
}
return SafeInt64Mult ((INT64)Multiplicand, (INT64)Multiplier, (INT64 *)Result);
}
--
2.12.0.windows.1
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
Reviewed-By: Bret Barkelew Bret.Barkelew@microsoft.com - Bret From: Hao Wu<mailto:hao.a.wu@intel.com> Sent: Monday, February 12, 2018 6:09 PM To: edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org> Cc: Hao Wu<mailto:hao.a.wu@intel.com>; Michael D Kinney<mailto:michael.d.kinney@intel.com>; Jiewen Yao<mailto:jiewen.yao@intel.com>; Liming Gao<mailto:liming.gao@intel.com> Subject: [edk2] [PATCH] MdePkg/BaseSafeIntLib: Fix VS IA32 NOOPT target build failure The commit resolve the VS IA32 NOOPT target build failure for modules that use the BaseSafeIntLib. More specifically, corresponding BaseLib APIs should be used when performing shift & mulitiplication operations with signed/unsigned 64-bit operands. Cc: Michael D Kinney <michael.d.kinney@intel.com> Cc: Sean Brogan <sean.brogan@microsoft.com> Cc: Jiewen Yao <jiewen.yao@intel.com> Cc: Liming Gao <liming.gao@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Hao Wu <hao.a.wu@intel.com> --- MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf | 3 +++ MdePkg/Library/BaseSafeIntLib/SafeIntLib.c | 13 +++++++++---- MdePkg/Library/BaseSafeIntLib/SafeIntLib32.c | 3 ++- MdePkg/Library/BaseSafeIntLib/SafeIntLibEbc.c | 3 ++- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf b/MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf index 20a83ed97b..8fbdafe748 100644 --- a/MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf +++ b/MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf @@ -56,3 +56,6 @@ [Packages] MdePkg/MdePkg.dec + +[LibraryClasses] + BaseLib diff --git a/MdePkg/Library/BaseSafeIntLib/SafeIntLib.c b/MdePkg/Library/BaseSafeIntLib/SafeIntLib.c index d846160ba0..64b8bc4ad8 100644 --- a/MdePkg/Library/BaseSafeIntLib/SafeIntLib.c +++ b/MdePkg/Library/BaseSafeIntLib/SafeIntLib.c @@ -28,6 +28,7 @@ #include <Base.h> #include <Library/SafeIntLib.h> +#include <Library/BaseLib.h> // @@ -3373,8 +3374,8 @@ SafeUint64Mult ( // b * c must be less than 2^32 or there would be bits in the high 64-bits // then there must be no overflow of the resulting values summed up. // - DwordA = (UINT32)(Multiplicand >> 32); - DwordC = (UINT32)(Multiplier >> 32); + DwordA = (UINT32)RShiftU64 (Multiplicand, 32); + DwordC = (UINT32)RShiftU64 (Multiplier, 32); // // common case -- if high dwords are both zero, no chance for overflow @@ -3409,7 +3410,11 @@ SafeUint64Mult ( // now sum them all up checking for overflow. // shifting is safe because we already checked for overflow above // - if (!RETURN_ERROR (SafeUint64Add (ProductBC << 32, ProductAD << 32, &UnsignedResult))) { + if (!RETURN_ERROR (SafeUint64Add ( + LShiftU64 (ProductBC, 32), + LShiftU64 (ProductAD, 32), + &UnsignedResult + ))) { // // b * d // @@ -4011,7 +4016,7 @@ SafeInt32Mult ( OUT INT32 *Result ) { - return SafeInt64ToInt32 (((INT64)Multiplicand) *((INT64)Multiplier), Result); + return SafeInt64ToInt32 (MultS64x64 ((INT64)Multiplicand, (INT64)Multiplier), Result); } /** diff --git a/MdePkg/Library/BaseSafeIntLib/SafeIntLib32.c b/MdePkg/Library/BaseSafeIntLib/SafeIntLib32.c index 18bfb9e413..b3b7b802a1 100644 --- a/MdePkg/Library/BaseSafeIntLib/SafeIntLib32.c +++ b/MdePkg/Library/BaseSafeIntLib/SafeIntLib32.c @@ -28,6 +28,7 @@ #include <Base.h> #include <Library/SafeIntLib.h> +#include <Library/BaseLib.h> /** INT32 -> UINTN conversion @@ -549,6 +550,6 @@ SafeIntnMult ( OUT INTN *Result ) { - return SafeInt64ToIntn (((INT64)Multiplicand) *((INT64)Multiplier), Result); + return SafeInt64ToIntn (MultS64x64 ((INT64)Multiplicand, (INT64)Multiplier), Result); } diff --git a/MdePkg/Library/BaseSafeIntLib/SafeIntLibEbc.c b/MdePkg/Library/BaseSafeIntLib/SafeIntLibEbc.c index 4478957b7e..e810ba59ef 100644 --- a/MdePkg/Library/BaseSafeIntLib/SafeIntLibEbc.c +++ b/MdePkg/Library/BaseSafeIntLib/SafeIntLibEbc.c @@ -28,6 +28,7 @@ #include <Base.h> #include <Library/SafeIntLib.h> +#include <Library/BaseLib.h> /** INT32 -> UINTN conversion @@ -607,7 +608,7 @@ SafeIntnMult ( ) { if (sizeof (UINTN) == sizeof (UINT32)) { - return SafeInt64ToIntn (((INT64)Multiplicand) *((INT64)Multiplier), Result); + return SafeInt64ToIntn (MultS64x64 ((INT64)Multiplicand, (INT64)Multiplier), Result); } return SafeInt64Mult ((INT64)Multiplicand, (INT64)Multiplier, (INT64 *)Result); } -- 2.12.0.windows.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Flists.01.org%2Fmailman%2Flistinfo%2Fedk2-devel&data=04%7C01%7CBret.Barkelew%40microsoft.com%7Cd8ac84da07d848841ffe08d57286c19b%7Cee3303d7fb734b0c8589bcd847f1c277%7C1%7C0%7C636540845483912177%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwifQ%3D%3D%7C-1&sdata=b5dnMPDn1LjKQ19GWQdr8c4aAbrCWcp%2BjLPmbYApkG8%3D&reserved=0 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel
© 2016 - 2024 Red Hat, Inc.