git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2832 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			349 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			349 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*++
 | |
| 
 | |
| Copyright (c) 2006, Intel Corporation                                                         
 | |
| All rights reserved. This program and the accompanying materials                          
 | |
| are licensed and made available under the terms and conditions of the BSD License         
 | |
| which accompanies this distribution.  The full text of the license may be found at        
 | |
| http://opensource.org/licenses/bsd-license.php                                            
 | |
|                                                                                           
 | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
 | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
 | |
| 
 | |
| Module Name:
 | |
| 
 | |
|   Thunk16Lib.h
 | |
| 
 | |
| Abstract:
 | |
| 
 | |
|   Real Mode Thunk Header file
 | |
| 
 | |
| --*/
 | |
| 
 | |
| #ifndef __THUNK_16_LIB_H__
 | |
| #define __THUNK_16_LIB_H__
 | |
| #include "Tiano.h"
 | |
| 
 | |
| //
 | |
| // Thunk Flags
 | |
| //
 | |
| #define THUNK_SAVE_FP_STATE         0x1
 | |
| #define THUNK_USER_STACK            0x2
 | |
| #define THUNK_INTERRUPT             0x10000
 | |
| 
 | |
| //
 | |
| // Byte packed structure for 16-bit Real Mode FLAGS
 | |
| //
 | |
| typedef union {
 | |
|   struct {
 | |
|     UINT32  CF:1;           // Carry Flag
 | |
|     UINT32  Reserved_0:1;   // Reserved
 | |
|     UINT32  PF:1;           // Parity Flag
 | |
|     UINT32  Reserved_1:1;   // Reserved
 | |
|     UINT32  AF:1;           // Auxiliary Carry Flag
 | |
|     UINT32  Reserved_2:1;   // Reserved
 | |
|     UINT32  ZF:1;           // Zero Flag
 | |
|     UINT32  SF:1;           // Sign Flag
 | |
|     UINT32  TF:1;           // Trap Flag
 | |
|     UINT32  IF:1;           // Interrupt Enable Flag
 | |
|     UINT32  DF:1;           // Direction Flag
 | |
|     UINT32  OF:1;           // Overflow Flag
 | |
|     UINT32  IOPL:2;         // I/O Privilege Level
 | |
|     UINT32  NT:1;           // Nested Task
 | |
|     UINT32  Reserved_3:1;   // Reserved
 | |
|   } Bits;
 | |
|   UINTN     UintN;
 | |
| } IA32_FLAGS16;
 | |
| 
 | |
| //
 | |
| // Byte packed structure for EFLAGS
 | |
| // 32-bits on IA32
 | |
| // 64-bits on X64
 | |
| //
 | |
| 
 | |
| typedef union {
 | |
|   struct {
 | |
|     UINT32  CF:1;           // Carry Flag
 | |
|     UINT32  Reserved_0:1;   // Reserved
 | |
|     UINT32  PF:1;           // Parity Flag
 | |
|     UINT32  Reserved_1:1;   // Reserved
 | |
|     UINT32  AF:1;           // Auxiliary Carry Flag
 | |
|     UINT32  Reserved_2:1;   // Reserved
 | |
|     UINT32  ZF:1;           // Zero Flag
 | |
|     UINT32  SF:1;           // Sign Flag
 | |
|     UINT32  TF:1;           // Trap Flag
 | |
|     UINT32  IF:1;           // Interrupt Enable Flag
 | |
|     UINT32  DF:1;           // Direction Flag
 | |
|     UINT32  OF:1;           // Overflow Flag
 | |
|     UINT32  IOPL:2;         // I/O Privilege Level
 | |
|     UINT32  NT:1;           // Nested Task
 | |
|     UINT32  Reserved_3:1;   // Reserved
 | |
|     UINT32  RF:1;           // Resume Flag
 | |
|     UINT32  VM:1;           // Virtual 8086 Mode
 | |
|     UINT32  AC:1;           // Alignment Check
 | |
|     UINT32  VIF:1;          // Virtual Interrupt Flag
 | |
|     UINT32  VIP:1;          // Virtual Interrupt Pending
 | |
|     UINT32  ID:1;           // ID Flag
 | |
|     UINT32  Reserved_4:10;  // Reserved
 | |
|   } Bits;
 | |
|   UINTN     UintN;
 | |
| } IA32_EFLAGS32;
 | |
| 
 | |
| //
 | |
| // Byte packed structure for an FP/SSE/SSE2 context
 | |
| //
 | |
| typedef struct {
 | |
|   UINT8  Buffer[512];
 | |
| } IA32_FX_BUFFER;
 | |
| 
 | |
| //
 | |
| // Structures for the 16-bit real mode thunks
 | |
| //
 | |
| typedef struct {
 | |
|   UINT32                            Reserved1;
 | |
|   UINT32                            Reserved2;
 | |
|   UINT32                            Reserved3;
 | |
|   UINT32                            Reserved4;
 | |
|   UINT8                             BL;
 | |
|   UINT8                             BH;
 | |
|   UINT16                            Reserved5;
 | |
|   UINT8                             DL;
 | |
|   UINT8                             DH;
 | |
|   UINT16                            Reserved6;
 | |
|   UINT8                             CL;
 | |
|   UINT8                             CH;
 | |
|   UINT16                            Reserved7;
 | |
|   UINT8                             AL;
 | |
|   UINT8                             AH;
 | |
|   UINT16                            Reserved8;
 | |
| } IA32_BYTE_REGS;
 | |
| 
 | |
| typedef struct {
 | |
|   UINT16                            DI;
 | |
|   UINT16                            Reserved1;
 | |
|   UINT16                            SI;
 | |
|   UINT16                            Reserved2;
 | |
|   UINT16                            BP;
 | |
|   UINT16                            Reserved3;
 | |
|   UINT16                            SP;
 | |
|   UINT16                            Reserved4;
 | |
|   UINT16                            BX;
 | |
|   UINT16                            Reserved5;
 | |
|   UINT16                            DX;
 | |
|   UINT16                            Reserved6;
 | |
|   UINT16                            CX;
 | |
|   UINT16                            Reserved7;
 | |
|   UINT16                            AX;
 | |
|   UINT16                            Reserved8;
 | |
|   UINT16                            DS;
 | |
|   UINT16                            ES;
 | |
|   UINT16                            FS;
 | |
|   UINT16                            GS;
 | |
|   IA32_FLAGS16                      Flags;
 | |
|   UINT16                            IP;
 | |
|   UINT16                            Reserved10;
 | |
|   UINT16                            CS;
 | |
|   UINT16                            SS;
 | |
| } IA32_WORD_REGS;
 | |
| 
 | |
| typedef struct {
 | |
|   UINT32                            EDI;
 | |
|   UINT32                            ESI;
 | |
|   UINT32                            EBP;
 | |
|   UINT32                            ESP;
 | |
|   UINT32                            EBX;
 | |
|   UINT32                            EDX;
 | |
|   UINT32                            ECX;
 | |
|   UINT32                            EAX;
 | |
|   UINT16                            DS;
 | |
|   UINT16                            ES;
 | |
|   UINT16                            FS;
 | |
|   UINT16                            GS;
 | |
|   IA32_EFLAGS32                     EFLAGS;
 | |
|   UINT32                            EIP;
 | |
|   UINT16                            CS;
 | |
|   UINT16                            SS;
 | |
| } IA32_DWORD_REGS;
 | |
| 
 | |
| typedef union {
 | |
|   IA32_DWORD_REGS                   E;
 | |
|   IA32_WORD_REGS                    X;
 | |
|   IA32_BYTE_REGS                    H;
 | |
| } IA32_REGISTER_SET;
 | |
| 
 | |
| //
 | |
| // Byte packed structure for an 16-bit real mode thunks
 | |
| //
 | |
| typedef struct {
 | |
|   UINT32                            RealModeBuffer;
 | |
|   UINT32                            DefaultStack;
 | |
| } THUNK_CONTEXT;
 | |
| 
 | |
| //
 | |
| // 16-bit thunking services
 | |
| //
 | |
| 
 | |
| UINTN
 | |
| EFIAPI
 | |
| AsmThunk16GetProperties (
 | |
|   OUT     UINTN                     *MinimumStackSize OPTIONAL
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Returns the properties of this real mode thunk implementation. Currently
 | |
|   there are 2 properties has been defined, the minimum real mode buffer size
 | |
|   and the minimum stack size.
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   MinimumStackSize  - The minimum size required for a 16-bit stack.
 | |
| 
 | |
| Returns:
 | |
| 
 | |
|   The minimum size of the real mode buffer needed by this thunk implementation
 | |
|   is returned.
 | |
| 
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| THUNK_CONTEXT *
 | |
| EFIAPI
 | |
| AsmThunk16SetProperties (
 | |
|   OUT     THUNK_CONTEXT             *ThunkContext,
 | |
|   IN      VOID                      *RealModeBuffer,
 | |
|   IN      UINTN                     BufferSize
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Tell this real mode thunk implementation the address and size of the real
 | |
|   mode buffer needed.
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   ThunkContext    - The thunk context whose properties to set.
 | |
|   RealModeBuffer  - The address of the buffer allocated by caller. It should be
 | |
|                     aligned on a 16-byte boundary.
 | |
|                     This buffer must be in identity mapped pages.
 | |
|   BufferSize      - The size of RealModeBuffer. Must be larger than the minimum
 | |
|                     size required as returned by AsmThunk16GetProperties().
 | |
| 
 | |
| Returns:
 | |
| 
 | |
|   None
 | |
| 
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| VOID
 | |
| EFIAPI
 | |
| AsmThunk16Destroy (
 | |
|   IN OUT  THUNK_CONTEXT             *ThunkContext
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Reset all internal states to their initial values. The caller should not
 | |
|   release the real mode buffer until after a call to this function.
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   ThunkContext  - The thunk context to destroy.
 | |
| 
 | |
| Returns:
 | |
| 
 | |
|   None
 | |
| 
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| IA32_REGISTER_SET *
 | |
| EFIAPI
 | |
| AsmThunk16FarCall86 (
 | |
|   IN      THUNK_CONTEXT             *ThunkContext,
 | |
|   IN OUT  IA32_REGISTER_SET         *RegisterSet,
 | |
|   IN      UINT32                    ThunkFlags
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Make a far call to 16-bit code.
 | |
| 
 | |
|   NOTE: This function must be called on TPL_HIGH_LEVEL or with interrupts
 | |
|         disabled because of GDTR and IDTR manipulations.
 | |
|         This function must be placed in identity mapped pages.
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   ThunkContext  - Thunk context to use.
 | |
|   RegisterSet   - CPU registers would be set to the values contained in this
 | |
|                   structure before making the far call. Then CPU registers are
 | |
|                   copied back to this structure.
 | |
|                   CS:EIP points to the real mode code being called on input.
 | |
|                   SS:ESP points to the real mode stack if THUNK_USER_STACK is
 | |
|                   set on input, otherwise ignored.
 | |
|                   EFlages is ignored on input.
 | |
|                   On output, values of CS, EIP, SS and ESP should be ignored.
 | |
|   ThunkFlags    - 2 flags have currently been defined, THUNK_SAVE_FP_STATE and
 | |
|                   THUNK_USER_STACK.
 | |
|                   THUNK_SAVE_FP_STATE - FPU state would be saved/restored
 | |
|                                         before/after calling real mode code.
 | |
|                   THUNK_USER_STACK    - The stack specified by SS:ESP would be
 | |
|                                         used instead of the default stack.
 | |
| 
 | |
| Returns:
 | |
| 
 | |
|   RegisterSet is returned.
 | |
| 
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| IA32_REGISTER_SET *
 | |
| EFIAPI
 | |
| AsmThunk16Int86 (
 | |
|   IN      THUNK_CONTEXT             *ThunkContext,
 | |
|   IN      UINT8                     IntNumber,
 | |
|   IN OUT  IA32_REGISTER_SET         *RegisterSet,
 | |
|   IN      UINT32                    ThunkFlags
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Invoke a 16-bit interrupt handler.
 | |
| 
 | |
|   NOTE: This function must be called on TPL_HIGH_LEVEL or with interrupts
 | |
|         disabled because of GDTR and IDTR manipulations.
 | |
|         This function must be placed in identity mapped pages.
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   ThunkContext  - Thunk context to use.
 | |
|   IntNumber     - The ordinal of the interrupt handler ranging from 0 to 255.
 | |
|   RegisterSet   - CPU registers would be set to the values contained in this
 | |
|                   structure before making the far call. Then CPU registers are
 | |
|                   copied back to this structure.
 | |
|                   SS:ESP points to the real mode stack if THUNK_USER_STACK is
 | |
|                   set on input, otherwise ignored.
 | |
|                   EFlages is ignored on input.
 | |
|                   On output, values of CS, EIP, SS and ESP should be ignored.
 | |
|   ThunkFlags    - 2 flags have currently been defined, THUNK_SAVE_FP_STATE and
 | |
|                   THUNK_USER_STACK.
 | |
|                   THUNK_SAVE_FP_STATE - FPU state would be saved/restored
 | |
|                                         before/after calling real mode code.
 | |
|                   THUNK_USER_STACK    - The stack specified by SS:ESP would be
 | |
|                                         used instead of the default stack.
 | |
| 
 | |
| Returns:
 | |
| 
 | |
|   RegisterSet is returned.
 | |
| 
 | |
| --*/
 | |
| ;
 | |
| 
 | |
| #endif
 |