+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2004 - 2006, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-\r
-Module Name:\r
-\r
- BitField.c\r
- \r
-Abstract: \r
-\r
- Bit field functions of BaseLib.\r
-\r
---*/\r
-\r
-#include "BaseLibInternals.h"\r
-\r
-/**\r
- Worker function that returns a bit field from Operand\r
-\r
- Returns the bitfield specified by the StartBit and the EndBit from Operand.\r
-\r
- @param Operand Operand on which to perform the bitfield operation.\r
- @param StartBit The ordinal of the least significant bit in the bit field.\r
- @param EndBit The ordinal of the most significant bit in the bit field.\r
-\r
- @return The bit field read.\r
-\r
-**/\r
-unsigned int\r
-BitFieldReadUint (\r
- IN unsigned int Operand,\r
- IN UINTN StartBit,\r
- IN UINTN EndBit\r
- )\r
-{\r
- //\r
- // ~((unsigned int)-2 << EndBit) is a mask in which bit[0] thru bit[EndBit]\r
- // are 1's while bit[EndBit + 1] thru the most significant bit are 0's.\r
- //\r
- return (Operand & ~((unsigned int)-2 << EndBit)) >> StartBit;\r
-}\r
-\r
-/**\r
- Worker function that reads a bit field from Operand, performs a bitwise OR, \r
- and returns the result.\r
-\r
- Performs a bitwise OR between the bit field specified by StartBit and EndBit\r
- in Operand and the value specified by AndData. All other bits in Operand are\r
- preserved. The new value is returned.\r
-\r
- @param Operand Operand on which to perform the bitfield operation.\r
- @param StartBit The ordinal of the least significant bit in the bit field.\r
- @param EndBit The ordinal of the most significant bit in the bit field.\r
- @param OrData The value to OR with the read value from the value\r
-\r
- @return The new value.\r
-\r
-**/\r
-unsigned int\r
-BitFieldOrUint (\r
- IN unsigned int Operand,\r
- IN UINTN StartBit,\r
- IN UINTN EndBit,\r
- IN unsigned int OrData\r
- )\r
-{\r
- //\r
- // ~((unsigned int)-2 << EndBit) is a mask in which bit[0] thru bit[EndBit]\r
- // are 1's while bit[EndBit + 1] thru the most significant bit are 0's.\r
- //\r
- return Operand | ((OrData << StartBit) & ~((unsigned int) -2 << EndBit));\r
-}\r
-\r
-/**\r
- Worker function that reads a bit field from Operand, performs a bitwise AND, \r
- and returns the result.\r
-\r
- Performs a bitwise AND between the bit field specified by StartBit and EndBit\r
- in Operand and the value specified by AndData. All other bits in Operand are\r
- preserved. The new value is returned.\r
-\r
- @param Operand Operand on which to perform the bitfield operation.\r
- @param StartBit The ordinal of the least significant bit in the bit field.\r
- @param EndBit The ordinal of the most significant bit in the bit field.\r
- @param AndData The value to And with the read value from the value\r
-\r
- @return The new value.\r
-\r
-**/\r
-unsigned int\r
-BitFieldAndUint (\r
- IN unsigned int Operand,\r
- IN UINTN StartBit,\r
- IN UINTN EndBit,\r
- IN unsigned int AndData\r
- )\r
-{\r
- //\r
- // ~((unsigned int)-2 << EndBit) is a mask in which bit[0] thru bit[EndBit]\r
- // are 1's while bit[EndBit + 1] thru the most significant bit are 0's.\r
- //\r
- return Operand & ~((~AndData << StartBit) & ~((unsigned int) -2 << EndBit));\r
-}\r
-\r
-/**\r
- Returns a bit field from an 8-bit value.\r
-\r
- Returns the bitfield specified by the StartBit and the EndBit from Operand.\r
-\r
- If 8-bit operations are not supported, then ASSERT().\r
- If StartBit is greater than 7, then ASSERT().\r
- If EndBit is greater than 7, then ASSERT().\r
- If EndBit is less than StartBit, then ASSERT().\r
-\r
- @param Operand Operand on which to perform the bitfield operation.\r
- @param StartBit The ordinal of the least significant bit in the bit field.\r
- Range 0..7.\r
- @param EndBit The ordinal of the most significant bit in the bit field.\r
- Range 0..7.\r
-\r
- @return The bit field read.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-BitFieldRead8 (\r
- IN UINT8 Operand,\r
- IN UINTN StartBit,\r
- IN UINTN EndBit\r
- )\r
-{\r
- ASSERT (EndBit < sizeof (Operand) * 8);\r
- ASSERT (StartBit <= EndBit);\r
- return (UINT8)BitFieldReadUint (Operand, StartBit, EndBit);\r
-}\r
-\r
-/**\r
- Writes a bit field to an 8-bit value, and returns the result.\r
-\r
- Writes Value to the bit field specified by the StartBit and the EndBit in\r
- Operand. All other bits in Operand are preserved. The new 8-bit value is\r
- returned.\r
-\r
- If 8-bit operations are not supported, then ASSERT().\r
- If StartBit is greater than 7, then ASSERT().\r
- If EndBit is greater than 7, then ASSERT().\r
- If EndBit is less than StartBit, then ASSERT().\r
-\r
- @param Operand Operand on which to perform the bitfield operation.\r
- @param StartBit The ordinal of the least significant bit in the bit field.\r
- Range 0..7.\r
- @param EndBit The ordinal of the most significant bit in the bit field.\r
- Range 0..7.\r
- @param Value New value of the bit field.\r
-\r
- @return The new 8-bit value.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-BitFieldWrite8 (\r
- IN UINT8 Operand,\r
- IN UINTN StartBit,\r
- IN UINTN EndBit,\r
- IN UINT8 Value\r
- )\r
-{\r
- ASSERT (EndBit < sizeof (Operand) * 8);\r
- ASSERT (StartBit <= EndBit);\r
- return BitFieldAndThenOr8 (Operand, StartBit, EndBit, 0, Value);\r
-}\r
-\r
-/**\r
- Reads a bit field from an 8-bit value, performs a bitwise OR, and returns the\r
- result.\r
-\r
- Performs a bitwise inclusive OR between the bit field specified by StartBit\r
- and EndBit in Operand and the value specified by OrData. All other bits in\r
- Operand are preserved. The new 8-bit value is returned.\r
-\r
- If 8-bit operations are not supported, then ASSERT().\r
- If StartBit is greater than 7, then ASSERT().\r
- If EndBit is greater than 7, then ASSERT().\r
- If EndBit is less than StartBit, then ASSERT().\r
-\r
- @param Operand Operand on which to perform the bitfield operation.\r
- @param StartBit The ordinal of the least significant bit in the bit field.\r
- Range 0..7.\r
- @param EndBit The ordinal of the most significant bit in the bit field.\r
- Range 0..7.\r
- @param OrData The value to OR with the read value from the value\r
-\r
- @return The new 8-bit value.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-BitFieldOr8 (\r
- IN UINT8 Operand,\r
- IN UINTN StartBit,\r
- IN UINTN EndBit,\r
- IN UINT8 OrData\r
- )\r
-{\r
- ASSERT (EndBit < sizeof (Operand) * 8);\r
- ASSERT (StartBit <= EndBit);\r
- return (UINT8)BitFieldOrUint (Operand, StartBit, EndBit, OrData);\r
-}\r
-\r
-/**\r
- Reads a bit field from an 8-bit value, performs a bitwise AND, and returns\r
- the result.\r
-\r
- Performs a bitwise AND between the bit field specified by StartBit and EndBit\r
- in Operand and the value specified by AndData. All other bits in Operand are\r
- preserved. The new 8-bit value is returned.\r
-\r
- If 8-bit operations are not supported, then ASSERT().\r
- If StartBit is greater than 7, then ASSERT().\r
- If EndBit is greater than 7, then ASSERT().\r
- If EndBit is less than StartBit, then ASSERT().\r
-\r
- @param Operand Operand on which to perform the bitfield operation.\r
- @param StartBit The ordinal of the least significant bit in the bit field.\r
- Range 0..7.\r
- @param EndBit The ordinal of the most significant bit in the bit field.\r
- Range 0..7.\r
- @param AndData The value to AND with the read value from the value.\r
-\r
- @return The new 8-bit value.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-BitFieldAnd8 (\r
- IN UINT8 Operand,\r
- IN UINTN StartBit,\r
- IN UINTN EndBit,\r
- IN UINT8 AndData\r
- )\r
-{\r
- ASSERT (EndBit < sizeof (Operand) * 8);\r
- ASSERT (StartBit <= EndBit);\r
- return (UINT8)BitFieldAndUint (Operand, StartBit, EndBit, AndData);\r
-}\r
-\r
-/**\r
- Reads a bit field from an 8-bit value, performs a bitwise AND followed by a\r
- bitwise OR, and returns the result.\r
-\r
- Performs a bitwise AND between the bit field specified by StartBit and EndBit\r
- in Operand and the value specified by AndData, followed by a bitwise\r
- inclusive OR with value specified by OrData. All other bits in Operand are\r
- preserved. The new 8-bit value is returned.\r
-\r
- If 8-bit operations are not supported, then ASSERT().\r
- If StartBit is greater than 7, then ASSERT().\r
- If EndBit is greater than 7, then ASSERT().\r
- If EndBit is less than StartBit, then ASSERT().\r
-\r
- @param Operand Operand on which to perform the bitfield operation.\r
- @param StartBit The ordinal of the least significant bit in the bit field.\r
- Range 0..7.\r
- @param EndBit The ordinal of the most significant bit in the bit field.\r
- Range 0..7.\r
- @param AndData The value to AND with the read value from the value.\r
- @param OrData The value to OR with the result of the AND operation.\r
-\r
- @return The new 8-bit value.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-BitFieldAndThenOr8 (\r
- IN UINT8 Operand,\r
- IN UINTN StartBit,\r
- IN UINTN EndBit,\r
- IN UINT8 AndData,\r
- IN UINT8 OrData\r
- )\r
-{\r
- ASSERT (EndBit < sizeof (Operand) * 8);\r
- ASSERT (StartBit <= EndBit);\r
- return BitFieldOr8 (\r
- BitFieldAnd8 (Operand, StartBit, EndBit, AndData),\r
- StartBit,\r
- EndBit,\r
- OrData\r
- );\r
-}\r
-\r
-/**\r
- Returns a bit field from a 16-bit value.\r
-\r
- Returns the bitfield specified by the StartBit and the EndBit from Operand.\r
-\r
- If 16-bit operations are not supported, then ASSERT().\r
- If StartBit is greater than 15, then ASSERT().\r
- If EndBit is greater than 15, then ASSERT().\r
- If EndBit is less than StartBit, then ASSERT().\r
-\r
- @param Operand Operand on which to perform the bitfield operation.\r
- @param StartBit The ordinal of the least significant bit in the bit field.\r
- Range 0..15.\r
- @param EndBit The ordinal of the most significant bit in the bit field.\r
- Range 0..15.\r
-\r
- @return The bit field read.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-BitFieldRead16 (\r
- IN UINT16 Operand,\r
- IN UINTN StartBit,\r
- IN UINTN EndBit\r
- )\r
-{\r
- ASSERT (EndBit < sizeof (Operand) * 8);\r
- ASSERT (StartBit <= EndBit);\r
- return (UINT16)BitFieldReadUint (Operand, StartBit, EndBit);\r
-}\r
-\r
-/**\r
- Writes a bit field to a 16-bit value, and returns the result.\r
-\r
- Writes Value to the bit field specified by the StartBit and the EndBit in\r
- Operand. All other bits in Operand are preserved. The new 16-bit value is\r
- returned.\r
-\r
- If 16-bit operations are not supported, then ASSERT().\r
- If StartBit is greater than 15, then ASSERT().\r
- If EndBit is greater than 15, then ASSERT().\r
- If EndBit is less than StartBit, then ASSERT().\r
-\r
- @param Operand Operand on which to perform the bitfield operation.\r
- @param StartBit The ordinal of the least significant bit in the bit field.\r
- Range 0..15.\r
- @param EndBit The ordinal of the most significant bit in the bit field.\r
- Range 0..15.\r
- @param Value New value of the bit field.\r
-\r
- @return The new 16-bit value.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-BitFieldWrite16 (\r
- IN UINT16 Operand,\r
- IN UINTN StartBit,\r
- IN UINTN EndBit,\r
- IN UINT16 Value\r
- )\r
-{\r
- ASSERT (EndBit < sizeof (Operand) * 8);\r
- ASSERT (StartBit <= EndBit);\r
- return BitFieldAndThenOr16 (Operand, StartBit, EndBit, 0, Value);\r
-}\r
-\r
-/**\r
- Reads a bit field from a 16-bit value, performs a bitwise OR, and returns the\r
- result.\r
-\r
- Performs a bitwise inclusive OR between the bit field specified by StartBit\r
- and EndBit in Operand and the value specified by OrData. All other bits in\r
- Operand are preserved. The new 16-bit value is returned.\r
-\r
- If 16-bit operations are not supported, then ASSERT().\r
- If StartBit is greater than 15, then ASSERT().\r
- If EndBit is greater than 15, then ASSERT().\r
- If EndBit is less than StartBit, then ASSERT().\r
-\r
- @param Operand Operand on which to perform the bitfield operation.\r
- @param StartBit The ordinal of the least significant bit in the bit field.\r
- Range 0..15.\r
- @param EndBit The ordinal of the most significant bit in the bit field.\r
- Range 0..15.\r
- @param OrData The value to OR with the read value from the value\r
-\r
- @return The new 16-bit value.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-BitFieldOr16 (\r
- IN UINT16 Operand,\r
- IN UINTN StartBit,\r
- IN UINTN EndBit,\r
- IN UINT16 OrData\r
- )\r
-{\r
- ASSERT (EndBit < sizeof (Operand) * 8);\r
- ASSERT (StartBit <= EndBit);\r
- return (UINT16)BitFieldOrUint (Operand, StartBit, EndBit, OrData);\r
-}\r
-\r
-/**\r
- Reads a bit field from a 16-bit value, performs a bitwise AND, and returns\r
- the result.\r
-\r
- Performs a bitwise AND between the bit field specified by StartBit and EndBit\r
- in Operand and the value specified by AndData. All other bits in Operand are\r
- preserved. The new 16-bit value is returned.\r
-\r
- If 16-bit operations are not supported, then ASSERT().\r
- If StartBit is greater than 15, then ASSERT().\r
- If EndBit is greater than 15, then ASSERT().\r
- If EndBit is less than StartBit, then ASSERT().\r
-\r
- @param Operand Operand on which to perform the bitfield operation.\r
- @param StartBit The ordinal of the least significant bit in the bit field.\r
- Range 0..15.\r
- @param EndBit The ordinal of the most significant bit in the bit field.\r
- Range 0..15.\r
- @param AndData The value to AND with the read value from the value\r
-\r
- @return The new 16-bit value.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-BitFieldAnd16 (\r
- IN UINT16 Operand,\r
- IN UINTN StartBit,\r
- IN UINTN EndBit,\r
- IN UINT16 AndData\r
- )\r
-{\r
- ASSERT (EndBit < sizeof (Operand) * 8);\r
- ASSERT (StartBit <= EndBit);\r
- return (UINT16)BitFieldAndUint (Operand, StartBit, EndBit, AndData);\r
-}\r
-\r
-/**\r
- Reads a bit field from a 16-bit value, performs a bitwise AND followed by a\r
- bitwise OR, and returns the result.\r
-\r
- Performs a bitwise AND between the bit field specified by StartBit and EndBit\r
- in Operand and the value specified by AndData, followed by a bitwise\r
- inclusive OR with value specified by OrData. All other bits in Operand are\r
- preserved. The new 16-bit value is returned.\r
-\r
- If 16-bit operations are not supported, then ASSERT().\r
- If StartBit is greater than 15, then ASSERT().\r
- If EndBit is greater than 15, then ASSERT().\r
- If EndBit is less than StartBit, then ASSERT().\r
-\r
- @param Operand Operand on which to perform the bitfield operation.\r
- @param StartBit The ordinal of the least significant bit in the bit field.\r
- Range 0..15.\r
- @param EndBit The ordinal of the most significant bit in the bit field.\r
- Range 0..15.\r
- @param AndData The value to AND with the read value from the value.\r
- @param OrData The value to OR with the result of the AND operation.\r
-\r
- @return The new 16-bit value.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-BitFieldAndThenOr16 (\r
- IN UINT16 Operand,\r
- IN UINTN StartBit,\r
- IN UINTN EndBit,\r
- IN UINT16 AndData,\r
- IN UINT16 OrData\r
- )\r
-{\r
- ASSERT (EndBit < sizeof (Operand) * 8);\r
- ASSERT (StartBit <= EndBit);\r
- return BitFieldOr16 (\r
- BitFieldAnd16 (Operand, StartBit, EndBit, AndData),\r
- StartBit,\r
- EndBit,\r
- OrData\r
- );\r
-}\r
-\r
-/**\r
- Returns a bit field from a 32-bit value.\r
-\r
- Returns the bitfield specified by the StartBit and the EndBit from Operand.\r
-\r
- If 32-bit operations are not supported, then ASSERT().\r
- If StartBit is greater than 31, then ASSERT().\r
- If EndBit is greater than 31, then ASSERT().\r
- If EndBit is less than StartBit, then ASSERT().\r
-\r
- @param Operand Operand on which to perform the bitfield operation.\r
- @param StartBit The ordinal of the least significant bit in the bit field.\r
- Range 0..31.\r
- @param EndBit The ordinal of the most significant bit in the bit field.\r
- Range 0..31.\r
-\r
- @return The bit field read.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-BitFieldRead32 (\r
- IN UINT32 Operand,\r
- IN UINTN StartBit,\r
- IN UINTN EndBit\r
- )\r
-{\r
- ASSERT (EndBit < sizeof (Operand) * 8);\r
- ASSERT (StartBit <= EndBit);\r
- return (UINT32)BitFieldReadUint (Operand, StartBit, EndBit);\r
-}\r
-\r
-/**\r
- Writes a bit field to a 32-bit value, and returns the result.\r
-\r
- Writes Value to the bit field specified by the StartBit and the EndBit in\r
- Operand. All other bits in Operand are preserved. The new 32-bit value is\r
- returned.\r
-\r
- If 32-bit operations are not supported, then ASSERT().\r
- If StartBit is greater than 31, then ASSERT().\r
- If EndBit is greater than 31, then ASSERT().\r
- If EndBit is less than StartBit, then ASSERT().\r
-\r
- @param Operand Operand on which to perform the bitfield operation.\r
- @param StartBit The ordinal of the least significant bit in the bit field.\r
- Range 0..31.\r
- @param EndBit The ordinal of the most significant bit in the bit field.\r
- Range 0..31.\r
- @param Value New value of the bit field.\r
-\r
- @return The new 32-bit value.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-BitFieldWrite32 (\r
- IN UINT32 Operand,\r
- IN UINTN StartBit,\r
- IN UINTN EndBit,\r
- IN UINT32 Value\r
- )\r
-{\r
- ASSERT (EndBit < sizeof (Operand) * 8);\r
- ASSERT (StartBit <= EndBit);\r
- return BitFieldAndThenOr32 (Operand, StartBit, EndBit, 0, Value);\r
-}\r
-\r
-/**\r
- Reads a bit field from a 32-bit value, performs a bitwise OR, and returns the\r
- result.\r
-\r
- Performs a bitwise inclusive OR between the bit field specified by StartBit\r
- and EndBit in Operand and the value specified by OrData. All other bits in\r
- Operand are preserved. The new 32-bit value is returned.\r
-\r
- If 32-bit operations are not supported, then ASSERT().\r
- If StartBit is greater than 31, then ASSERT().\r
- If EndBit is greater than 31, then ASSERT().\r
- If EndBit is less than StartBit, then ASSERT().\r
-\r
- @param Operand Operand on which to perform the bitfield operation.\r
- @param StartBit The ordinal of the least significant bit in the bit field.\r
- Range 0..31.\r
- @param EndBit The ordinal of the most significant bit in the bit field.\r
- Range 0..31.\r
- @param OrData The value to OR with the read value from the value\r
-\r
- @return The new 32-bit value.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-BitFieldOr32 (\r
- IN UINT32 Operand,\r
- IN UINTN StartBit,\r
- IN UINTN EndBit,\r
- IN UINT32 OrData\r
- )\r
-{\r
- ASSERT (EndBit < sizeof (Operand) * 8);\r
- ASSERT (StartBit <= EndBit);\r
- return (UINT32)BitFieldOrUint (Operand, StartBit, EndBit, OrData);\r
-}\r
-\r
-/**\r
- Reads a bit field from a 32-bit value, performs a bitwise AND, and returns\r
- the result.\r
-\r
- Performs a bitwise AND between the bit field specified by StartBit and EndBit\r
- in Operand and the value specified by AndData. All other bits in Operand are\r
- preserved. The new 32-bit value is returned.\r
-\r
- If 32-bit operations are not supported, then ASSERT().\r
- If StartBit is greater than 31, then ASSERT().\r
- If EndBit is greater than 31, then ASSERT().\r
- If EndBit is less than StartBit, then ASSERT().\r
-\r
- @param Operand Operand on which to perform the bitfield operation.\r
- @param StartBit The ordinal of the least significant bit in the bit field.\r
- Range 0..31.\r
- @param EndBit The ordinal of the most significant bit in the bit field.\r
- Range 0..31.\r
- @param AndData The value to AND with the read value from the value\r
-\r
- @return The new 32-bit value.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-BitFieldAnd32 (\r
- IN UINT32 Operand,\r
- IN UINTN StartBit,\r
- IN UINTN EndBit,\r
- IN UINT32 AndData\r
- )\r
-{\r
- ASSERT (EndBit < sizeof (Operand) * 8);\r
- ASSERT (StartBit <= EndBit);\r
- return (UINT32)BitFieldAndUint (Operand, StartBit, EndBit, AndData);\r
-}\r
-\r
-/**\r
- Reads a bit field from a 32-bit value, performs a bitwise AND followed by a\r
- bitwise OR, and returns the result.\r
-\r
- Performs a bitwise AND between the bit field specified by StartBit and EndBit\r
- in Operand and the value specified by AndData, followed by a bitwise\r
- inclusive OR with value specified by OrData. All other bits in Operand are\r
- preserved. The new 32-bit value is returned.\r
-\r
- If 32-bit operations are not supported, then ASSERT().\r
- If StartBit is greater than 31, then ASSERT().\r
- If EndBit is greater than 31, then ASSERT().\r
- If EndBit is less than StartBit, then ASSERT().\r
-\r
- @param Operand Operand on which to perform the bitfield operation.\r
- @param StartBit The ordinal of the least significant bit in the bit field.\r
- Range 0..31.\r
- @param EndBit The ordinal of the most significant bit in the bit field.\r
- Range 0..31.\r
- @param AndData The value to AND with the read value from the value.\r
- @param OrData The value to OR with the result of the AND operation.\r
-\r
- @return The new 32-bit value.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-BitFieldAndThenOr32 (\r
- IN UINT32 Operand,\r
- IN UINTN StartBit,\r
- IN UINTN EndBit,\r
- IN UINT32 AndData,\r
- IN UINT32 OrData\r
- )\r
-{\r
- ASSERT (EndBit < sizeof (Operand) * 8);\r
- ASSERT (StartBit <= EndBit);\r
- return BitFieldOr32 (\r
- BitFieldAnd32 (Operand, StartBit, EndBit, AndData),\r
- StartBit,\r
- EndBit,\r
- OrData\r
- );\r
-}\r
-\r
-/**\r
- Returns a bit field from a 64-bit value.\r
-\r
- Returns the bitfield specified by the StartBit and the EndBit from Operand.\r
-\r
- If 64-bit operations are not supported, then ASSERT().\r
- If StartBit is greater than 63, then ASSERT().\r
- If EndBit is greater than 63, then ASSERT().\r
- If EndBit is less than StartBit, then ASSERT().\r
-\r
- @param Operand Operand on which to perform the bitfield operation.\r
- @param StartBit The ordinal of the least significant bit in the bit field.\r
- Range 0..63.\r
- @param EndBit The ordinal of the most significant bit in the bit field.\r
- Range 0..63.\r
-\r
- @return The bit field read.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-BitFieldRead64 (\r
- IN UINT64 Operand,\r
- IN UINTN StartBit,\r
- IN UINTN EndBit\r
- )\r
-{\r
- ASSERT (EndBit < sizeof (Operand) * 8);\r
- ASSERT (StartBit <= EndBit);\r
- return RShiftU64 (Operand & ~LShiftU64 ((UINT64)-2, EndBit), StartBit);\r
-}\r
-\r
-/**\r
- Writes a bit field to a 64-bit value, and returns the result.\r
-\r
- Writes Value to the bit field specified by the StartBit and the EndBit in\r
- Operand. All other bits in Operand are preserved. The new 64-bit value is\r
- returned.\r
-\r
- If 64-bit operations are not supported, then ASSERT().\r
- If StartBit is greater than 63, then ASSERT().\r
- If EndBit is greater than 63, then ASSERT().\r
- If EndBit is less than StartBit, then ASSERT().\r
-\r
- @param Operand Operand on which to perform the bitfield operation.\r
- @param StartBit The ordinal of the least significant bit in the bit field.\r
- Range 0..63.\r
- @param EndBit The ordinal of the most significant bit in the bit field.\r
- Range 0..63.\r
- @param Value New value of the bit field.\r
-\r
- @return The new 64-bit value.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-BitFieldWrite64 (\r
- IN UINT64 Operand,\r
- IN UINTN StartBit,\r
- IN UINTN EndBit,\r
- IN UINT64 Value\r
- )\r
-{\r
- ASSERT (EndBit < sizeof (Operand) * 8);\r
- ASSERT (StartBit <= EndBit);\r
- return BitFieldAndThenOr64 (Operand, StartBit, EndBit, 0, Value);\r
-}\r
-\r
-/**\r
- Reads a bit field from a 64-bit value, performs a bitwise OR, and returns the\r
- result.\r
-\r
- Performs a bitwise inclusive OR between the bit field specified by StartBit\r
- and EndBit in Operand and the value specified by OrData. All other bits in\r
- Operand are preserved. The new 64-bit value is returned.\r
-\r
- If 64-bit operations are not supported, then ASSERT().\r
- If StartBit is greater than 63, then ASSERT().\r
- If EndBit is greater than 63, then ASSERT().\r
- If EndBit is less than StartBit, then ASSERT().\r
-\r
- @param Operand Operand on which to perform the bitfield operation.\r
- @param StartBit The ordinal of the least significant bit in the bit field.\r
- Range 0..63.\r
- @param EndBit The ordinal of the most significant bit in the bit field.\r
- Range 0..63.\r
- @param OrData The value to OR with the read value from the value\r
-\r
- @return The new 64-bit value.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-BitFieldOr64 (\r
- IN UINT64 Operand,\r
- IN UINTN StartBit,\r
- IN UINTN EndBit,\r
- IN UINT64 OrData\r
- )\r
-{\r
- UINT64 Value1;\r
- UINT64 Value2;\r
-\r
- ASSERT (EndBit < sizeof (Operand) * 8);\r
- ASSERT (StartBit <= EndBit);\r
-\r
- Value1 = LShiftU64 (OrData, StartBit);\r
- Value2 = LShiftU64 ((UINT64) - 2, EndBit);\r
-\r
- return Operand | (Value1 & ~Value2);\r
-}\r
-\r
-/**\r
- Reads a bit field from a 64-bit value, performs a bitwise AND, and returns\r
- the result.\r
-\r
- Performs a bitwise AND between the bit field specified by StartBit and EndBit\r
- in Operand and the value specified by AndData. All other bits in Operand are\r
- preserved. The new 64-bit value is returned.\r
-\r
- If 64-bit operations are not supported, then ASSERT().\r
- If StartBit is greater than 63, then ASSERT().\r
- If EndBit is greater than 63, then ASSERT().\r
- If EndBit is less than StartBit, then ASSERT().\r
-\r
- @param Operand Operand on which to perform the bitfield operation.\r
- @param StartBit The ordinal of the least significant bit in the bit field.\r
- Range 0..63.\r
- @param EndBit The ordinal of the most significant bit in the bit field.\r
- Range 0..63.\r
- @param AndData The value to AND with the read value from the value\r
-\r
- @return The new 64-bit value.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-BitFieldAnd64 (\r
- IN UINT64 Operand,\r
- IN UINTN StartBit,\r
- IN UINTN EndBit,\r
- IN UINT64 AndData\r
- )\r
-{\r
- UINT64 Value1;\r
- UINT64 Value2;\r
- \r
- ASSERT (EndBit < sizeof (Operand) * 8);\r
- ASSERT (StartBit <= EndBit);\r
-\r
- Value1 = LShiftU64 (~AndData, StartBit);\r
- Value2 = LShiftU64 ((UINT64)-2, EndBit);\r
-\r
- return Operand & ~(Value1 & ~Value2);\r
-}\r
-\r
-/**\r
- Reads a bit field from a 64-bit value, performs a bitwise AND followed by a\r
- bitwise OR, and returns the result.\r
-\r
- Performs a bitwise AND between the bit field specified by StartBit and EndBit\r
- in Operand and the value specified by AndData, followed by a bitwise\r
- inclusive OR with value specified by OrData. All other bits in Operand are\r
- preserved. The new 64-bit value is returned.\r
-\r
- If 64-bit operations are not supported, then ASSERT().\r
- If StartBit is greater than 63, then ASSERT().\r
- If EndBit is greater than 63, then ASSERT().\r
- If EndBit is less than StartBit, then ASSERT().\r
-\r
- @param Operand Operand on which to perform the bitfield operation.\r
- @param StartBit The ordinal of the least significant bit in the bit field.\r
- Range 0..63.\r
- @param EndBit The ordinal of the most significant bit in the bit field.\r
- Range 0..63.\r
- @param AndData The value to AND with the read value from the value.\r
- @param OrData The value to OR with the result of the AND operation.\r
-\r
- @return The new 64-bit value.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-BitFieldAndThenOr64 (\r
- IN UINT64 Operand,\r
- IN UINTN StartBit,\r
- IN UINTN EndBit,\r
- IN UINT64 AndData,\r
- IN UINT64 OrData\r
- )\r
-{\r
- ASSERT (EndBit < sizeof (Operand) * 8);\r
- ASSERT (StartBit <= EndBit);\r
- return BitFieldOr64 (\r
- BitFieldAnd64 (Operand, StartBit, EndBit, AndData),\r
- StartBit,\r
- EndBit,\r
- OrData\r
- );\r
-}\r