// IPF context buffer used by SetJump() and LongJump()\r
//\r
typedef struct {\r
- UINT64 InitialUNAT;\r
- UINT64 AfterSpillUNAT;\r
- UINT64 PFS;\r
- UINT64 BSP;\r
- UINT64 RNAT;\r
- UINT64 Predicates;\r
- UINT64 LoopCount;\r
+ UINT64 F2[2];\r
+ UINT64 F3[2];\r
+ UINT64 F4[2];\r
+ UINT64 F5[2];\r
+ UINT64 F16[2];\r
+ UINT64 F17[2];\r
+ UINT64 F18[2];\r
+ UINT64 F19[2];\r
+ UINT64 F20[2];\r
+ UINT64 F21[2];\r
+ UINT64 F22[2];\r
+ UINT64 F23[2];\r
+ UINT64 F24[2];\r
+ UINT64 F25[2];\r
+ UINT64 F26[2];\r
+ UINT64 F27[2];\r
+ UINT64 F28[2];\r
+ UINT64 F29[2];\r
+ UINT64 F30[2];\r
+ UINT64 F31[2];\r
UINT64 R4;\r
UINT64 R5;\r
UINT64 R6;\r
UINT64 R7;\r
UINT64 SP;\r
- UINT64 F2Low;\r
- UINT64 F2High;\r
- UINT64 F3Low;\r
- UINT64 F3High;\r
- UINT64 F4Low;\r
- UINT64 F4High;\r
- UINT64 F5Low;\r
- UINT64 F5High;\r
- UINT64 F16Low;\r
- UINT64 F16High;\r
- UINT64 F17Low;\r
- UINT64 F17High;\r
- UINT64 F18Low;\r
- UINT64 F18High;\r
- UINT64 F19Low;\r
- UINT64 F19High;\r
- UINT64 F20Low;\r
- UINT64 F20High;\r
- UINT64 F21Low;\r
- UINT64 F21High;\r
- UINT64 F22Low;\r
- UINT64 F22High;\r
- UINT64 F23Low;\r
- UINT64 F23High;\r
- UINT64 F24Low;\r
- UINT64 F24High;\r
- UINT64 F25Low;\r
- UINT64 F25High;\r
- UINT64 F26Low;\r
- UINT64 F26High;\r
- UINT64 F27Low;\r
- UINT64 F27High;\r
- UINT64 F28Low;\r
- UINT64 F28High;\r
- UINT64 F29Low;\r
- UINT64 F29High;\r
- UINT64 F30Low;\r
- UINT64 F30High;\r
- UINT64 F31Low;\r
- UINT64 F31High;\r
- UINT64 FPSR;\r
UINT64 BR0;\r
UINT64 BR1;\r
UINT64 BR2;\r
UINT64 BR3;\r
UINT64 BR4;\r
UINT64 BR5;\r
+ UINT64 InitialUNAT;\r
+ UINT64 AfterSpillUNAT;\r
+ UINT64 PFS;\r
+ UINT64 BSP;\r
+ UINT64 Predicates;\r
+ UINT64 LoopCount;\r
+ UINT64 FPSR;\r
} BASE_LIBRARY_JUMP_BUFFER;\r
\r
#elif defined (MDE_CPU_X64)\r
IN UINTN Length\r
);\r
\r
+/**\r
+ Converts an 8-bit value to an 8-bit BCD value.\r
+\r
+ Converts the 8-bit value specified by Value to BCD. The BCD value is\r
+ returned.\r
+\r
+ If Value >= 100, then ASSERT().\r
+\r
+ @param Value The 8-bit value to convert to BCD. Range 0..99.\r
+\r
+ @return The BCD value\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+DecimalToBcd8 (\r
+ IN UINT8 Value\r
+ );\r
+\r
+/**\r
+ Converts an 8-bit BCD value to an 8-bit value.\r
+\r
+ Converts the 8-bit BCD value specified by Value to an 8-bit value. The 8-bit\r
+ value is returned.\r
+\r
+ If Value >= 0xA0, then ASSERT().\r
+ If (Value & 0x0F) >= 0x0A, then ASSERT().\r
+\r
+ @param Value The 8-bit BCD value to convert to an 8-bit value.\r
+\r
+ @return The 8-bit value is returned.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+BcdToDecimal8 (\r
+ IN UINT8 Value\r
+ );\r
+\r
//\r
// LIST_ENTRY definition\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 or equal to StartBit, 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
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 or equal to StartBit, 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
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 or equal to StartBit, 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
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 or equal to StartBit, 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
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 or equal to StartBit, 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
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 or equal to StartBit, 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
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 or equal to StartBit, 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
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 or equal to StartBit, 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
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 or equal to StartBit, 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
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 or equal to StartBit, 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
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 or equal to StartBit, 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
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 or equal to StartBit, 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
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 or equal to StartBit, 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
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 or equal to StartBit, 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
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 or equal to StartBit, 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
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 or equal to StartBit, 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
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 or equal to StartBit, 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
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 or equal to StartBit, 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
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 or equal to StartBit, 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
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 or equal to StartBit, 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
UINT32\r
EFIAPI\r
InterlockedCompareExchange32 (\r
- IN UINT32 *Value,\r
+ IN OUT UINT32 *Value,\r
IN UINT32 CompareValue,\r
IN UINT32 ExchangeValue\r
);\r
UINT64\r
EFIAPI\r
InterlockedCompareExchange64 (\r
- IN UINT64 *Value,\r
+ IN OUT UINT64 *Value,\r
IN UINT64 CompareValue,\r
IN UINT64 ExchangeValue\r
);\r
VOID *\r
EFIAPI\r
InterlockedCompareExchangePointer (\r
- IN VOID **Value,\r
+ IN OUT VOID **Value,\r
IN VOID *CompareValue,\r
IN VOID *ExchangeValue\r
);\r
\r
//\r
// Byte packed structure for an IDTR, GDTR, LDTR descriptor\r
+/// @bug How to make this structure byte-packed in a compiler independent way?\r
//\r
typedef struct {\r
UINT16 Limit;\r
// Byte packed structure for an 16-bit real mode thunks\r
//\r
typedef struct {\r
- IA32_REGISTER_SET RealModeState;\r
+ IA32_REGISTER_SET *RealModeState;\r
VOID *RealModeBuffer;\r
- UINTN RealModeBufferSize;\r
- VOID *CallStack;\r
- UINTN CallStackSize;\r
- VOID *RealModeCode;\r
- UINTN RealModeCodeSize;\r
+ UINT32 RealModeBufferSize;\r
+ UINT32 ThunkAttributes;\r
} THUNK_CONTEXT;\r
\r
+#define THUNK_ATTRIBUTE_BIG_REAL_MODE 0x00000001\r
+#define THUNK_ATTRIBUTE_DISABLE_A20_MASK_INT_15 0x00000002\r
+#define THUNK_ATTRIBUTE_DISABLE_A20_MASK_KBD_CTRL 0x00000004\r
+\r
/**\r
Retrieves CPUID information.\r
\r
OUT UINT32 *Edx OPTIONAL\r
);\r
\r
+/**\r
+ Retrieves CPUID information using an extended leaf identifier.\r
+\r
+ Executes the CPUID instruction with EAX set to the value specified by Index\r
+ and ECX set to the value specified by SubIndex. This function always returns\r
+ Index. This function is only available on IA-32 and x64.\r
+\r
+ If Eax is not NULL, then the value of EAX after CPUID is returned in Eax.\r
+ If Ebx is not NULL, then the value of EBX after CPUID is returned in Ebx.\r
+ If Ecx is not NULL, then the value of ECX after CPUID is returned in Ecx.\r
+ If Edx is not NULL, then the value of EDX after CPUID is returned in Edx.\r
+\r
+ @param Index The 32-bit value to load into EAX prior to invoking the\r
+ CPUID instruction.\r
+ @param SubIndex The 32-bit value to load into ECX prior to invoking the\r
+ CPUID instruction.\r
+ @param Eax Pointer to the 32-bit EAX value returned by the CPUID\r
+ instruction. This is an optional parameter that may be\r
+ NULL.\r
+ @param Ebx Pointer to the 32-bit EBX value returned by the CPUID\r
+ instruction. This is an optional parameter that may be\r
+ NULL.\r
+ @param Ecx Pointer to the 32-bit ECX value returned by the CPUID\r
+ instruction. This is an optional parameter that may be\r
+ NULL.\r
+ @param Edx Pointer to the 32-bit EDX value returned by the CPUID\r
+ instruction. This is an optional parameter that may be\r
+ NULL.\r
+\r
+ @return Index\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+AsmCpuidEx (\r
+ IN UINT32 Index,\r
+ IN UINT32 SubIndex,\r
+ OUT UINT32 *Eax, OPTIONAL\r
+ OUT UINT32 *Ebx, OPTIONAL\r
+ OUT UINT32 *Ecx, OPTIONAL\r
+ OUT UINT32 *Edx OPTIONAL\r
+ );\r
+\r
/**\r
Returns the lower 32-bits of a Machine Specific Register(MSR).\r
\r
\r
If StartBit is greater than 31, then ASSERT().\r
If EndBit is greater than 31, then ASSERT().\r
- If EndBit is less than or equal to StartBit, then ASSERT().\r
+ If EndBit is less than StartBit, then ASSERT().\r
\r
@param Index The 32-bit MSR index to read.\r
@param StartBit The ordinal of the least significant bit in the bit field.\r
\r
If StartBit is greater than 31, then ASSERT().\r
If EndBit is greater than 31, then ASSERT().\r
- If EndBit is less than or equal to StartBit, then ASSERT().\r
+ If EndBit is less than StartBit, then ASSERT().\r
\r
@param Index The 32-bit MSR index to write.\r
@param StartBit The ordinal of the least significant bit in the bit field.\r
\r
If StartBit is greater than 31, then ASSERT().\r
If EndBit is greater than 31, then ASSERT().\r
- If EndBit is less than or equal to StartBit, then ASSERT().\r
+ If EndBit is less than StartBit, then ASSERT().\r
\r
@param Index The 32-bit MSR index to write.\r
@param StartBit The ordinal of the least significant bit in the bit field.\r
\r
If StartBit is greater than 31, then ASSERT().\r
If EndBit is greater than 31, then ASSERT().\r
- If EndBit is less than or equal to StartBit, then ASSERT().\r
+ If EndBit is less than StartBit, then ASSERT().\r
\r
@param Index The 32-bit MSR index to write.\r
@param StartBit The ordinal of the least significant bit in the bit field.\r
\r
If StartBit is greater than 31, then ASSERT().\r
If EndBit is greater than 31, then ASSERT().\r
- If EndBit is less than or equal to StartBit, then ASSERT().\r
+ If EndBit is less than StartBit, then ASSERT().\r
\r
@param Index The 32-bit MSR index to write.\r
@param StartBit The ordinal of the least significant bit in the bit field.\r
\r
If StartBit is greater than 63, then ASSERT().\r
If EndBit is greater than 63, then ASSERT().\r
- If EndBit is less than or equal to StartBit, then ASSERT().\r
+ If EndBit is less than StartBit, then ASSERT().\r
\r
@param Index The 32-bit MSR index to read.\r
@param StartBit The ordinal of the least significant bit in the bit field.\r
\r
If StartBit is greater than 63, then ASSERT().\r
If EndBit is greater than 63, then ASSERT().\r
- If EndBit is less than or equal to StartBit, then ASSERT().\r
+ If EndBit is less than StartBit, then ASSERT().\r
\r
@param Index The 32-bit MSR index to write.\r
@param StartBit The ordinal of the least significant bit in the bit field.\r
\r
If StartBit is greater than 63, then ASSERT().\r
If EndBit is greater than 63, then ASSERT().\r
- If EndBit is less than or equal to StartBit, then ASSERT().\r
+ If EndBit is less than StartBit, then ASSERT().\r
\r
@param Index The 32-bit MSR index to write.\r
@param StartBit The ordinal of the least significant bit in the bit field.\r
\r
If StartBit is greater than 63, then ASSERT().\r
If EndBit is greater than 63, then ASSERT().\r
- If EndBit is less than or equal to StartBit, then ASSERT().\r
+ If EndBit is less than StartBit, then ASSERT().\r
\r
@param Index The 32-bit MSR index to write.\r
@param StartBit The ordinal of the least significant bit in the bit field.\r
\r
If StartBit is greater than 63, then ASSERT().\r
If EndBit is greater than 63, then ASSERT().\r
- If EndBit is less than or equal to StartBit, then ASSERT().\r
+ If EndBit is less than StartBit, then ASSERT().\r
\r
@param Index The 32-bit MSR index to write.\r
@param StartBit The ordinal of the least significant bit in the bit field.\r
// 16-bit thunking services\r
//\r
\r
+/**\r
+ Retrieves the properties for 16-bit thunk functions.\r
+\r
+ Computes the size of the buffer and stack below 1MB required to use the\r
+ AsmPrepareThunk16(), AsmThunk16() and AsmPrepareAndThunk16() functions. This\r
+ buffer size is returned in RealModeBufferSize, and the stack size is returned\r
+ in ExtraStackSize. If parameters are passed to the 16-bit real mode code,\r
+ then the actual minimum stack size is ExtraStackSize plus the maximum number\r
+ of bytes that need to be passed to the 16-bit real mode code.\r
+\r
+ If RealModeBufferSize is NULL, then ASSERT().\r
+ If ExtraStackSize is NULL, then ASSERT().\r
+\r
+ @param RealModeBufferSize A pointer to the size of the buffer below 1MB\r
+ required to use the 16-bit thunk functions.\r
+ @param ExtraStackSize A pointer to the extra size of stack below 1MB\r
+ that the 16-bit thunk functions require for\r
+ temporary storage in the transition to and from\r
+ 16-bit real mode.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+AsmGetThunk16Properties (\r
+ OUT UINT32 *RealModeBufferSize,\r
+ OUT UINT32 *ExtraStackSize\r
+ );\r
+\r
/**\r
Prepares all structures a code required to use AsmThunk16().\r
\r