+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2004 - 2018, 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
- BaseLibInternals.h\r
- \r
-Abstract: \r
-\r
- Declaration of internal functions in BaseLib.\r
-\r
---*/\r
-\r
-#ifndef __BASE_LIB_INTERNALS_H__\r
-#define __BASE_LIB_INTERNALS_H__\r
-\r
-#include "EdkIIGlueBase.h"\r
-\r
-#define QUIENT_MAX_UINTN_DIVIDED_BY_10 ((UINTN) -1 / 10)\r
-#define REMINDER_MAX_UINTN_DIVIDED_BY_10 ((UINTN) -1 % 10)\r
-\r
-#define QUIENT_MAX_UINTN_DIVIDED_BY_16 ((UINTN) -1 / 16)\r
-#define REMINDER_MAX_UINTN_DIVIDED_BY_16 ((UINTN) -1 % 16)\r
-\r
-#define QUIENT_MAX_UINT64_DIVIDED_BY_10 ((UINT64) -1 / 10)\r
-#define REMINDER_MAX_UINT64_DIVIDED_BY_10 ((UINT64) -1 % 10)\r
-\r
-#define QUIENT_MAX_UINT64_DIVIDED_BY_16 ((UINT64) -1 / 16)\r
-#define REMINDER_MAX_UINT64_DIVIDED_BY_16 ((UINT64) -1 % 16)\r
-\r
-//\r
-// Math functions\r
-//\r
-\r
-/**\r
- Shifts a 64-bit integer left between 0 and 63 bits. The low bits\r
- are filled with zeros. The shifted value is returned.\r
-\r
- This function shifts the 64-bit value Operand to the left by Count bits. The\r
- low Count bits are set to zero. The shifted value is returned.\r
-\r
- @param Operand The 64-bit operand to shift left.\r
- @param Count The number of bits to shift left.\r
-\r
- @return Operand << Count\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-InternalMathLShiftU64 (\r
- IN UINT64 Operand,\r
- IN UINTN Count\r
- );\r
-\r
-/**\r
- Shifts a 64-bit integer right between 0 and 63 bits. This high bits\r
- are filled with zeros. The shifted value is returned.\r
-\r
- This function shifts the 64-bit value Operand to the right by Count bits. The\r
- high Count bits are set to zero. The shifted value is returned.\r
-\r
- @param Operand The 64-bit operand to shift right.\r
- @param Count The number of bits to shift right.\r
-\r
- @return Operand >> Count\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-InternalMathRShiftU64 (\r
- IN UINT64 Operand,\r
- IN UINTN Count\r
- );\r
-\r
-/**\r
- Shifts a 64-bit integer right between 0 and 63 bits. The high bits\r
- are filled with original integer's bit 63. The shifted value is returned.\r
-\r
- This function shifts the 64-bit value Operand to the right by Count bits. The\r
- high Count bits are set to bit 63 of Operand. The shifted value is returned.\r
-\r
- @param Operand The 64-bit operand to shift right.\r
- @param Count The number of bits to shift right.\r
-\r
- @return Operand arithmetically shifted right by Count\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-InternalMathARShiftU64 (\r
- IN UINT64 Operand,\r
- IN UINTN Count\r
- );\r
-\r
-/**\r
- Rotates a 64-bit integer left between 0 and 63 bits, filling\r
- the low bits with the high bits that were rotated.\r
-\r
- This function rotates the 64-bit value Operand to the left by Count bits. The\r
- low Count bits are fill with the high Count bits of Operand. The rotated\r
- value is returned.\r
-\r
- @param Operand The 64-bit operand to rotate left.\r
- @param Count The number of bits to rotate left.\r
-\r
- @return Operand <<< Count\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-InternalMathLRotU64 (\r
- IN UINT64 Operand,\r
- IN UINTN Count\r
- );\r
-\r
-/**\r
- Rotates a 64-bit integer right between 0 and 63 bits, filling\r
- the high bits with the high low bits that were rotated.\r
-\r
- This function rotates the 64-bit value Operand to the right by Count bits.\r
- The high Count bits are fill with the low Count bits of Operand. The rotated\r
- value is returned.\r
-\r
- @param Operand The 64-bit operand to rotate right.\r
- @param Count The number of bits to rotate right.\r
-\r
- @return Operand >>> Count\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-InternalMathRRotU64 (\r
- IN UINT64 Operand,\r
- IN UINTN Count\r
- );\r
-\r
-/**\r
- Switches the endianess of a 64-bit integer.\r
-\r
- This function swaps the bytes in a 64-bit unsigned value to switch the value\r
- from little endian to big endian or vice versa. The byte swapped value is\r
- returned.\r
-\r
- @param Operand A 64-bit unsigned value.\r
-\r
- @return The byte swaped Operand.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-InternalMathSwapBytes64 (\r
- IN UINT64 Operand\r
- );\r
-\r
-/**\r
- Multiples a 64-bit unsigned integer by a 32-bit unsigned integer\r
- and generates a 64-bit unsigned result.\r
-\r
- This function multiples the 64-bit unsigned value Multiplicand by the 32-bit\r
- unsigned value Multiplier and generates a 64-bit unsigned result. This 64-\r
- bit unsigned result is returned.\r
-\r
- @param Multiplicand A 64-bit unsigned value.\r
- @param Multiplier A 32-bit unsigned value.\r
-\r
- @return Multiplicand * Multiplier\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-InternalMathMultU64x32 (\r
- IN UINT64 Multiplicand,\r
- IN UINT32 Multiplier\r
- );\r
-\r
-/**\r
- Multiples a 64-bit unsigned integer by a 64-bit unsigned integer\r
- and generates a 64-bit unsigned result.\r
-\r
- This function multiples the 64-bit unsigned value Multiplicand by the 64-bit\r
- unsigned value Multiplier and generates a 64-bit unsigned result. This 64-\r
- bit unsigned result is returned.\r
-\r
- @param Multiplicand A 64-bit unsigned value.\r
- @param Multiplier A 64-bit unsigned value.\r
-\r
- @return Multiplicand * Multiplier\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-InternalMathMultU64x64 (\r
- IN UINT64 Multiplicand,\r
- IN UINT64 Multiplier\r
- );\r
-\r
-/**\r
- Divides a 64-bit unsigned integer by a 32-bit unsigned integer and\r
- generates a 64-bit unsigned result.\r
-\r
- This function divides the 64-bit unsigned value Dividend by the 32-bit\r
- unsigned value Divisor and generates a 64-bit unsigned quotient. This\r
- function returns the 64-bit unsigned quotient.\r
-\r
- @param Dividend A 64-bit unsigned value.\r
- @param Divisor A 32-bit unsigned value.\r
-\r
- @return Dividend / Divisor\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-InternalMathDivU64x32 (\r
- IN UINT64 Dividend,\r
- IN UINT32 Divisor\r
- );\r
-\r
-/**\r
- Divides a 64-bit unsigned integer by a 32-bit unsigned integer and\r
- generates a 32-bit unsigned remainder.\r
-\r
- This function divides the 64-bit unsigned value Dividend by the 32-bit\r
- unsigned value Divisor and generates a 32-bit remainder. This function\r
- returns the 32-bit unsigned remainder.\r
-\r
- @param Dividend A 64-bit unsigned value.\r
- @param Divisor A 32-bit unsigned value.\r
-\r
- @return Dividend % Divisor\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-InternalMathModU64x32 (\r
- IN UINT64 Dividend,\r
- IN UINT32 Divisor\r
- );\r
-\r
-/**\r
- Divides a 64-bit unsigned integer by a 32-bit unsigned integer and\r
- generates a 64-bit unsigned result and an optional 32-bit unsigned remainder.\r
-\r
- This function divides the 64-bit unsigned value Dividend by the 32-bit\r
- unsigned value Divisor and generates a 64-bit unsigned quotient. If Remainder\r
- is not NULL, then the 32-bit unsigned remainder is returned in Remainder.\r
- This function returns the 64-bit unsigned quotient.\r
-\r
- @param Dividend A 64-bit unsigned value.\r
- @param Divisor A 32-bit unsigned value.\r
- @param Remainder A pointer to a 32-bit unsigned value. This parameter is\r
- optional and may be NULL.\r
-\r
- @return Dividend / Divisor\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-InternalMathDivRemU64x32 (\r
- IN UINT64 Dividend,\r
- IN UINT32 Divisor,\r
- OUT UINT32 *Remainder\r
- );\r
-\r
-/**\r
- Divides a 64-bit unsigned integer by a 64-bit unsigned integer and\r
- generates a 64-bit unsigned result and an optional 64-bit unsigned remainder.\r
-\r
- This function divides the 64-bit unsigned value Dividend by the 64-bit\r
- unsigned value Divisor and generates a 64-bit unsigned quotient. If Remainder\r
- is not NULL, then the 64-bit unsigned remainder is returned in Remainder.\r
- This function returns the 64-bit unsigned quotient.\r
-\r
- @param Dividend A 64-bit unsigned value.\r
- @param Divisor A 64-bit unsigned value.\r
- @param Remainder A pointer to a 64-bit unsigned value. This parameter is\r
- optional and may be NULL.\r
-\r
- @return Dividend / Divisor\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-InternalMathDivRemU64x64 (\r
- IN UINT64 Dividend,\r
- IN UINT64 Divisor,\r
- OUT UINT64 *Remainder\r
- );\r
-\r
-/**\r
- Divides a 64-bit signed integer by a 64-bit signed integer and\r
- generates a 64-bit signed result and a optional 64-bit signed remainder.\r
-\r
- This function divides the 64-bit unsigned value Dividend by the 64-bit\r
- unsigned value Divisor and generates a 64-bit unsigned quotient. If Remainder\r
- is not NULL, then the 64-bit unsigned remainder is returned in Remainder.\r
- This function returns the 64-bit unsigned quotient.\r
-\r
- @param Dividend A 64-bit signed value.\r
- @param Divisor A 64-bit signed value.\r
- @param Remainder A pointer to a 64-bit signed value. This parameter is\r
- optional and may be NULL.\r
-\r
- @return Dividend / Divisor\r
-\r
-**/\r
-INT64\r
-InternalMathDivRemS64x64 (\r
- IN INT64 Dividend,\r
- IN INT64 Divisor,\r
- OUT INT64 *Remainder OPTIONAL\r
- );\r
-\r
-/**\r
- Transfers control to a function starting with a new stack.\r
-\r
- Transfers control to the function specified by EntryPoint using the\r
- new stack specified by NewStack and passing in the parameters specified\r
- by Context1 and Context2. Context1 and Context2 are optional and may\r
- be NULL. The function EntryPoint must never return.\r
- Marker will be ignored on IA-32, x64, and EBC.\r
- IPF CPUs expect one additional parameter of type VOID * that specifies\r
- the new backing store pointer.\r
-\r
- If EntryPoint is NULL, then ASSERT().\r
- If NewStack is NULL, then ASSERT().\r
-\r
- @param EntryPoint A pointer to function to call with the new stack.\r
- @param Context1 A pointer to the context to pass into the EntryPoint\r
- function.\r
- @param Context2 A pointer to the context to pass into the EntryPoint\r
- function.\r
- @param NewStack A pointer to the new stack to use for the EntryPoint\r
- function.\r
- @param Marker VA_LIST marker for the variable argument list.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-InternalSwitchStack (\r
- IN SWITCH_STACK_ENTRY_POINT EntryPoint,\r
- IN VOID *Context1, OPTIONAL\r
- IN VOID *Context2, OPTIONAL\r
- IN VOID *NewStack,\r
- IN VA_LIST Marker\r
- );\r
-\r
-\r
-/**\r
- Worker function that locates the Node in the List\r
-\r
- By searching the List, finds the location of the Node in List. At the same time,\r
- verifies the validity of this list.\r
-\r
- If List is NULL, then ASSERT().\r
- If List->ForwardLink is NULL, then ASSERT().\r
- If List->backLink is NULL, then ASSERT().\r
- If Node is NULL, then ASSERT();\r
- If PcdMaximumLinkedListLenth is not zero, and prior to insertion the number\r
- of nodes in ListHead, including the ListHead node, is greater than or\r
- equal to PcdMaximumLinkedListLength, then ASSERT().\r
-\r
- @param List A pointer to a node in a linked list.\r
- @param Node A pointer to one nod.\r
-\r
- @retval TRUE Node is in List\r
- @retval FALSE Node isn't in List, or List is invalid\r
-\r
-**/\r
-BOOLEAN\r
-IsNodeInList (\r
- IN CONST LIST_ENTRY *List,\r
- IN CONST LIST_ENTRY *Node\r
- );\r
-\r
-\r
-/**\r
- Performs an atomic increment of an 32-bit unsigned integer.\r
-\r
- Performs an atomic increment of the 32-bit unsigned integer specified by\r
- Value and returns the incremented value. The increment operation must be\r
- performed using MP safe mechanisms. The state of the return value is not\r
- guaranteed to be MP safe.\r
-\r
- @param Value A pointer to the 32-bit value to increment.\r
-\r
- @return The incremented value.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-InternalSyncIncrement (\r
- IN volatile UINT32 *Value\r
- );\r
-\r
-\r
-/**\r
- Performs an atomic decrement of an 32-bit unsigned integer.\r
-\r
- Performs an atomic decrement of the 32-bit unsigned integer specified by\r
- Value and returns the decrement value. The decrement operation must be\r
- performed using MP safe mechanisms. The state of the return value is not\r
- guaranteed to be MP safe.\r
-\r
- @param Value A pointer to the 32-bit value to decrement.\r
-\r
- @return The decrement value.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-InternalSyncDecrement (\r
- IN volatile UINT32 *Value\r
- );\r
-\r
-\r
-/**\r
- Performs an atomic compare exchange operation on a 32-bit unsigned integer.\r
-\r
- Performs an atomic compare exchange operation on the 32-bit unsigned integer\r
- specified by Value. If Value is equal to CompareValue, then Value is set to\r
- ExchangeValue and CompareValue is returned. If Value is not equal to CompareValue,\r
- then Value is returned. The compare exchange operation must be performed using\r
- MP safe mechanisms.\r
-\r
- @param Value A pointer to the 32-bit value for the compare exchange\r
- operation.\r
- @param CompareValue 32-bit value used in compare operation.\r
- @param ExchangeValue 32-bit value used in exchange operation.\r
-\r
- @return The original *Value before exchange.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-InternalSyncCompareExchange32 (\r
- IN volatile UINT32 *Value,\r
- IN UINT32 CompareValue,\r
- IN UINT32 ExchangeValue\r
- );\r
-\r
-\r
-/**\r
- Performs an atomic compare exchange operation on a 64-bit unsigned integer.\r
-\r
- Performs an atomic compare exchange operation on the 64-bit unsigned integer specified\r
- by Value. If Value is equal to CompareValue, then Value is set to ExchangeValue and\r
- CompareValue is returned. If Value is not equal to CompareValue, then Value is returned.\r
- The compare exchange operation must be performed using MP safe mechanisms.\r
-\r
- @param Value A pointer to the 64-bit value for the compare exchange\r
- operation.\r
- @param CompareValue 64-bit value used in compare operation.\r
- @param ExchangeValue 64-bit value used in exchange operation.\r
-\r
- @return The original *Value before exchange.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-InternalSyncCompareExchange64 (\r
- IN volatile UINT64 *Value,\r
- IN UINT64 CompareValue,\r
- IN UINT64 ExchangeValue\r
- );\r
-\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
-/**\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
-/**\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
-/**\r
- Worker function that checks ASSERT condition for JumpBuffer\r
-\r
- Checks ASSERT condition for JumpBuffer.\r
-\r
- If JumpBuffer is NULL, then ASSERT().\r
- For IPF CPUs, if JumpBuffer is not aligned on a 16-byte boundary, then ASSERT().\r
-\r
- @param JumpBuffer A pointer to CPU context buffer.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-InternalAssertJumpBuffer (\r
- IN BASE_LIBRARY_JUMP_BUFFER *JumpBuffer\r
- );\r
-\r
-\r
-/**\r
- Restores the CPU context that was saved with SetJump().\r
-\r
- Restores the CPU context from the buffer specified by JumpBuffer.\r
- This function never returns to the caller.\r
- Instead is resumes execution based on the state of JumpBuffer.\r
-\r
- @param JumpBuffer A pointer to CPU context buffer.\r
- @param Value The value to return when the SetJump() context is restored.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-InternalLongJump (\r
- IN BASE_LIBRARY_JUMP_BUFFER *JumpBuffer,\r
- IN UINTN Value\r
- );\r
-\r
-\r
-//\r
-// Ia32 and x64 specific functions\r
-//\r
-#if defined (MDE_CPU_IA32) || defined (MDE_CPU_X64)\r
-\r
-/**\r
- Reads the current Global Descriptor Table Register(GDTR) descriptor.\r
-\r
- Reads and returns the current GDTR descriptor and returns it in Gdtr. This\r
- function is only available on IA-32 and X64.\r
-\r
- @param Gdtr Pointer to a GDTR descriptor.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-InternalX86ReadGdtr (\r
- OUT IA32_DESCRIPTOR *Gdtr\r
- );\r
-\r
-/**\r
- Writes the current Global Descriptor Table Register (GDTR) descriptor.\r
-\r
- Writes and the current GDTR descriptor specified by Gdtr. This function is\r
- only available on IA-32 and X64.\r
-\r
- @param Gdtr Pointer to a GDTR descriptor.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-InternalX86WriteGdtr (\r
- IN CONST IA32_DESCRIPTOR *Gdtr\r
- );\r
-\r
-/**\r
- Reads the current Interrupt Descriptor Table Register(GDTR) descriptor.\r
-\r
- Reads and returns the current IDTR descriptor and returns it in Idtr. This\r
- function is only available on IA-32 and X64.\r
-\r
- @param Idtr Pointer to a IDTR descriptor.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-InternalX86ReadIdtr (\r
- OUT IA32_DESCRIPTOR *Idtr\r
- );\r
-\r
-/**\r
- Writes the current Interrupt Descriptor Table Register(GDTR) descriptor.\r
-\r
- Writes the current IDTR descriptor and returns it in Idtr. This function is\r
- only available on IA-32 and X64.\r
-\r
- @param Idtr Pointer to a IDTR descriptor.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-InternalX86WriteIdtr (\r
- IN CONST IA32_DESCRIPTOR *Idtr\r
- );\r
-\r
-/**\r
- Save the current floating point/SSE/SSE2 context to a buffer.\r
-\r
- Saves the current floating point/SSE/SSE2 state to the buffer specified by\r
- Buffer. Buffer must be aligned on a 16-byte boundary. This function is only\r
- available on IA-32 and X64.\r
-\r
- @param Buffer Pointer to a buffer to save the floating point/SSE/SSE2 context.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-InternalX86FxSave (\r
- OUT IA32_FX_BUFFER *Buffer\r
- );\r
-\r
-/**\r
- Restores the current floating point/SSE/SSE2 context from a buffer.\r
-\r
- Restores the current floating point/SSE/SSE2 state from the buffer specified\r
- by Buffer. Buffer must be aligned on a 16-byte boundary. This function is\r
- only available on IA-32 and X64.\r
-\r
- @param Buffer Pointer to a buffer to save the floating point/SSE/SSE2 context.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-InternalX86FxRestore (\r
- IN CONST IA32_FX_BUFFER *Buffer\r
- );\r
-\r
-/**\r
- Enables the 32-bit paging mode on the CPU.\r
-\r
- Enables the 32-bit paging mode on the CPU. CR0, CR3, CR4, and the page tables\r
- must be properly initialized prior to calling this service. This function\r
- assumes the current execution mode is 32-bit protected mode. This function is\r
- only available on IA-32. After the 32-bit paging mode is enabled, control is\r
- transferred to the function specified by EntryPoint using the new stack\r
- specified by NewStack and passing in the parameters specified by Context1 and\r
- Context2. Context1 and Context2 are optional and may be NULL. The function\r
- EntryPoint must never return.\r
-\r
- There are a number of constraints that must be followed before calling this\r
- function:\r
- 1) Interrupts must be disabled.\r
- 2) The caller must be in 32-bit protected mode with flat descriptors. This\r
- means all descriptors must have a base of 0 and a limit of 4GB.\r
- 3) CR0 and CR4 must be compatible with 32-bit protected mode with flat\r
- descriptors.\r
- 4) CR3 must point to valid page tables that will be used once the transition\r
- is complete, and those page tables must guarantee that the pages for this\r
- function and the stack are identity mapped.\r
-\r
- @param EntryPoint A pointer to function to call with the new stack after\r
- paging is enabled.\r
- @param Context1 A pointer to the context to pass into the EntryPoint\r
- function as the first parameter after paging is enabled.\r
- @param Context2 A pointer to the context to pass into the EntryPoint\r
- function as the second parameter after paging is enabled.\r
- @param NewStack A pointer to the new stack to use for the EntryPoint\r
- function after paging is enabled.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-InternalX86EnablePaging32 (\r
- IN SWITCH_STACK_ENTRY_POINT EntryPoint,\r
- IN VOID *Context1, OPTIONAL\r
- IN VOID *Context2, OPTIONAL\r
- IN VOID *NewStack\r
- );\r
-\r
-/**\r
- Disables the 32-bit paging mode on the CPU.\r
-\r
- Disables the 32-bit paging mode on the CPU and returns to 32-bit protected\r
- mode. This function assumes the current execution mode is 32-paged protected\r
- mode. This function is only available on IA-32. After the 32-bit paging mode\r
- is disabled, control is transferred to the function specified by EntryPoint\r
- using the new stack specified by NewStack and passing in the parameters\r
- specified by Context1 and Context2. Context1 and Context2 are optional and\r
- may be NULL. The function EntryPoint must never return.\r
-\r
- There are a number of constraints that must be followed before calling this\r
- function:\r
- 1) Interrupts must be disabled.\r
- 2) The caller must be in 32-bit paged mode.\r
- 3) CR0, CR3, and CR4 must be compatible with 32-bit paged mode.\r
- 4) CR3 must point to valid page tables that guarantee that the pages for\r
- this function and the stack are identity mapped.\r
-\r
- @param EntryPoint A pointer to function to call with the new stack after\r
- paging is disabled.\r
- @param Context1 A pointer to the context to pass into the EntryPoint\r
- function as the first parameter after paging is disabled.\r
- @param Context2 A pointer to the context to pass into the EntryPoint\r
- function as the second parameter after paging is\r
- disabled.\r
- @param NewStack A pointer to the new stack to use for the EntryPoint\r
- function after paging is disabled.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-InternalX86DisablePaging32 (\r
- IN SWITCH_STACK_ENTRY_POINT EntryPoint,\r
- IN VOID *Context1, OPTIONAL\r
- IN VOID *Context2, OPTIONAL\r
- IN VOID *NewStack\r
- );\r
-\r
-/**\r
- Enables the 64-bit paging mode on the CPU.\r
-\r
- Enables the 64-bit paging mode on the CPU. CR0, CR3, CR4, and the page tables\r
- must be properly initialized prior to calling this service. This function\r
- assumes the current execution mode is 32-bit protected mode with flat\r
- descriptors. This function is only available on IA-32. After the 64-bit\r
- paging mode is enabled, control is transferred to the function specified by\r
- EntryPoint using the new stack specified by NewStack and passing in the\r
- parameters specified by Context1 and Context2. Context1 and Context2 are\r
- optional and may be 0. The function EntryPoint must never return.\r
-\r
- @param Cs The 16-bit selector to load in the CS before EntryPoint\r
- is called. The descriptor in the GDT that this selector\r
- references must be setup for long mode.\r
- @param EntryPoint The 64-bit virtual address of the function to call with\r
- the new stack after paging is enabled.\r
- @param Context1 The 64-bit virtual address of the context to pass into\r
- the EntryPoint function as the first parameter after\r
- paging is enabled.\r
- @param Context2 The 64-bit virtual address of the context to pass into\r
- the EntryPoint function as the second parameter after\r
- paging is enabled.\r
- @param NewStack The 64-bit virtual address of the new stack to use for\r
- the EntryPoint function after paging is enabled.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-InternalX86EnablePaging64 (\r
- IN UINT16 Cs,\r
- IN UINT64 EntryPoint,\r
- IN UINT64 Context1, OPTIONAL\r
- IN UINT64 Context2, OPTIONAL\r
- IN UINT64 NewStack\r
- );\r
-\r
-/**\r
- Disables the 64-bit paging mode on the CPU.\r
-\r
- Disables the 64-bit paging mode on the CPU and returns to 32-bit protected\r
- mode. This function assumes the current execution mode is 64-paging mode.\r
- This function is only available on X64. After the 64-bit paging mode is\r
- disabled, control is transferred to the function specified by EntryPoint\r
- using the new stack specified by NewStack and passing in the parameters\r
- specified by Context1 and Context2. Context1 and Context2 are optional and\r
- may be 0. The function EntryPoint must never return.\r
-\r
- @param Cs The 16-bit selector to load in the CS before EntryPoint\r
- is called. The descriptor in the GDT that this selector\r
- references must be setup for 32-bit protected mode.\r
- @param EntryPoint The 64-bit virtual address of the function to call with\r
- the new stack after paging is disabled.\r
- @param Context1 The 64-bit virtual address of the context to pass into\r
- the EntryPoint function as the first parameter after\r
- paging is disabled.\r
- @param Context2 The 64-bit virtual address of the context to pass into\r
- the EntryPoint function as the second parameter after\r
- paging is disabled.\r
- @param NewStack The 64-bit virtual address of the new stack to use for\r
- the EntryPoint function after paging is disabled.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-InternalX86DisablePaging64 (\r
- IN UINT16 Cs,\r
- IN UINT32 EntryPoint,\r
- IN UINT32 Context1, OPTIONAL\r
- IN UINT32 Context2, OPTIONAL\r
- IN UINT32 NewStack\r
- );\r
-\r
-#else\r
-\r
-#endif\r
-\r
-#endif\r