Revision: 14496
http://sourceforge.net/p/edk2/code/14496
Author: lgao4
Date: 2013-07-22 06:35:48 +0000 (Mon, 22 Jul 2013)
Log Message:
-----------
Fixed the issue that BitFieldWrite32, BitFieldAnd32, BitFieldOr32,
BitFieldAndThenOr32 with StartBit==0 and EndBit== 31 will hang in debug tip.
Signed-off-by: Liming Gao <[email protected]>
Reviewed-by: Ruiyu Ni <[email protected]>
Modified Paths:
--------------
trunk/edk2/MdePkg/Library/BaseLib/BitField.c
Modified: trunk/edk2/MdePkg/Library/BaseLib/BitField.c
===================================================================
--- trunk/edk2/MdePkg/Library/BaseLib/BitField.c 2013-07-19 00:07:16 UTC
(rev 14495)
+++ trunk/edk2/MdePkg/Library/BaseLib/BitField.c 2013-07-22 06:35:48 UTC
(rev 14496)
@@ -1,7 +1,7 @@
/** @file
Bit field functions of BaseLib.
- Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD
License
which accompanies this distribution. The full text of the license may be
found at
@@ -71,7 +71,10 @@
//
// Higher bits in OrData those are not used must be zero.
//
- ASSERT ((OrData >> (EndBit - StartBit + 1)) == 0);
+ // EndBit \x96 StartBit + 1 might be 32 while the result right shifting 32
on a 32bit integer is undefined,
+ // So the logic is updated to right shift (EndBit \x96 StartBit) bits and
compare the last bit directly.
+ //
+ ASSERT ((OrData >> (EndBit - StartBit)) == ((OrData >> (EndBit - StartBit))
& 1));
//
// ~((UINTN)-2 << EndBit) is a mask in which bit[0] thru bit[EndBit]
@@ -110,7 +113,10 @@
//
// Higher bits in AndData those are not used must be zero.
//
- ASSERT ((AndData >> (EndBit - StartBit + 1)) == 0);
+ // EndBit \x96 StartBit + 1 might be 32 while the result right shifting 32
on a 32bit integer is undefined,
+ // So the logic is updated to right shift (EndBit \x96 StartBit) bits and
compare the last bit directly.
+ //
+ ASSERT ((AndData >> (EndBit - StartBit)) == ((AndData >> (EndBit -
StartBit)) & 1));
//
// ~((UINTN)-2 << EndBit) is a mask in which bit[0] thru bit[EndBit]
@@ -802,7 +808,13 @@
ASSERT (EndBit < 64);
ASSERT (StartBit <= EndBit);
- ASSERT (RShiftU64 (OrData, EndBit - StartBit + 1) == 0);
+ //
+ // Higher bits in OrData those are not used must be zero.
+ //
+ // EndBit \x96 StartBit + 1 might be 64 while the result right shifting 64
on RShiftU64() API is invalid,
+ // So the logic is updated to right shift (EndBit \x96 StartBit) bits and
compare the last bit directly.
+ //
+ ASSERT (RShiftU64 (OrData, EndBit - StartBit) == (RShiftU64 (OrData, EndBit
- StartBit) & 1));
Value1 = LShiftU64 (OrData, StartBit);
Value2 = LShiftU64 ((UINT64) - 2, EndBit);
@@ -848,7 +860,13 @@
ASSERT (EndBit < 64);
ASSERT (StartBit <= EndBit);
- ASSERT (RShiftU64 (AndData, EndBit - StartBit + 1) == 0);
+ //
+ // Higher bits in AndData those are not used must be zero.
+ //
+ // EndBit \x96 StartBit + 1 might be 64 while the right shifting 64 on
RShiftU64() API is invalid,
+ // So the logic is updated to right shift (EndBit \x96 StartBit) bits and
compare the last bit directly.
+ //
+ ASSERT (RShiftU64 (AndData, EndBit - StartBit) == (RShiftU64 (AndData,
EndBit - StartBit) & 1));
Value1 = LShiftU64 (~AndData, StartBit);
Value2 = LShiftU64 ((UINT64)-2, EndBit);
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
See everything from the browser to the database with AppDynamics
Get end-to-end visibility with application monitoring from AppDynamics
Isolate bottlenecks and diagnose root cause in seconds.
Start your free trial of AppDynamics Pro today!
http://pubads.g.doubleclick.net/gampad/clk?id=48808831&iu=/4140/ostg.clktrk
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits