+++ /dev/null
-/** @file\r
- Bit field functions of BaseLib.\r
-\r
- Copyright (c) 2006 - 2010, 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
-\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
-UINTN\r
-EFIAPI\r
-InternalBaseLibBitFieldReadUint (\r
- IN UINTN Operand,\r
- IN UINTN StartBit,\r
- IN UINTN EndBit\r
- )\r
-{\r
- //\r
- // ~((UINTN)-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 & ~((UINTN)-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
-UINTN\r
-EFIAPI\r
-InternalBaseLibBitFieldOrUint (\r
- IN UINTN Operand,\r
- IN UINTN StartBit,\r
- IN UINTN EndBit,\r
- IN UINTN OrData\r
- )\r
-{\r
- //\r
- // ~((UINTN)-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) & ~((UINTN) -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
-UINTN\r
-EFIAPI\r
-InternalBaseLibBitFieldAndUint (\r
- IN UINTN Operand,\r
- IN UINTN StartBit,\r
- IN UINTN EndBit,\r
- IN UINTN AndData\r
- )\r
-{\r
- //\r
- // ~((UINTN)-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) & ~((UINTN)-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 < 8);\r
- ASSERT (StartBit <= EndBit);\r
- return (UINT8)InternalBaseLibBitFieldReadUint (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 The 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 < 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 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 < 8);\r
- ASSERT (StartBit <= EndBit);\r
- return (UINT8)InternalBaseLibBitFieldOrUint (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 < 8);\r
- ASSERT (StartBit <= EndBit);\r
- return (UINT8)InternalBaseLibBitFieldAndUint (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
- 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 < 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 < 16);\r
- ASSERT (StartBit <= EndBit);\r
- return (UINT16)InternalBaseLibBitFieldReadUint (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 The 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 < 16);\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 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 < 16);\r
- ASSERT (StartBit <= EndBit);\r
- return (UINT16)InternalBaseLibBitFieldOrUint (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 < 16);\r
- ASSERT (StartBit <= EndBit);\r
- return (UINT16)InternalBaseLibBitFieldAndUint (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
- 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 < 16);\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 < 32);\r
- ASSERT (StartBit <= EndBit);\r
- return (UINT32)InternalBaseLibBitFieldReadUint (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 The 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 < 32);\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 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 < 32);\r
- ASSERT (StartBit <= EndBit);\r
- return (UINT32)InternalBaseLibBitFieldOrUint (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 < 32);\r
- ASSERT (StartBit <= EndBit);\r
- return (UINT32)InternalBaseLibBitFieldAndUint (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
- 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 < 32);\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 < 64);\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 The 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 < 64);\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 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 < 64);\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 < 64);\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
- 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 < 64);\r
- ASSERT (StartBit <= EndBit);\r
- return BitFieldOr64 (\r
- BitFieldAnd64 (Operand, StartBit, EndBit, AndData),\r
- StartBit,\r
- EndBit,\r
- OrData\r
- );\r
-}\r