1 /*++ 2 3 Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR> 4 This program and the accompanying materials 5 are licensed and made available under the terms and conditions of the BSD License 6 which accompanies this distribution. The full text of the license may be found at 7 http://opensource.org/licenses/bsd-license.php 8 9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 11 12 Module Name: 13 14 Thunk16Lib.h 15 16 Abstract: 17 18 Real Mode Thunk Header file 19 20 --*/ 21 22 #ifndef __THUNK_16_LIB_H__ 23 #define __THUNK_16_LIB_H__ 24 #include "Tiano.h" 25 26 // 27 // Thunk Flags 28 // 29 #define THUNK_SAVE_FP_STATE 0x1 30 #define THUNK_USER_STACK 0x2 31 #define THUNK_INTERRUPT 0x10000 32 33 // 34 // Byte packed structure for 16-bit Real Mode FLAGS 35 // 36 typedef union { 37 struct { 38 UINT32 CF:1; // Carry Flag 39 UINT32 Reserved_0:1; // Reserved 40 UINT32 PF:1; // Parity Flag 41 UINT32 Reserved_1:1; // Reserved 42 UINT32 AF:1; // Auxiliary Carry Flag 43 UINT32 Reserved_2:1; // Reserved 44 UINT32 ZF:1; // Zero Flag 45 UINT32 SF:1; // Sign Flag 46 UINT32 TF:1; // Trap Flag 47 UINT32 IF:1; // Interrupt Enable Flag 48 UINT32 DF:1; // Direction Flag 49 UINT32 OF:1; // Overflow Flag 50 UINT32 IOPL:2; // I/O Privilege Level 51 UINT32 NT:1; // Nested Task 52 UINT32 Reserved_3:1; // Reserved 53 } Bits; 54 UINTN UintN; 55 } IA32_FLAGS16; 56 57 // 58 // Byte packed structure for EFLAGS 59 // 32-bits on IA32 60 // 64-bits on X64 61 // 62 63 typedef union { 64 struct { 65 UINT32 CF:1; // Carry Flag 66 UINT32 Reserved_0:1; // Reserved 67 UINT32 PF:1; // Parity Flag 68 UINT32 Reserved_1:1; // Reserved 69 UINT32 AF:1; // Auxiliary Carry Flag 70 UINT32 Reserved_2:1; // Reserved 71 UINT32 ZF:1; // Zero Flag 72 UINT32 SF:1; // Sign Flag 73 UINT32 TF:1; // Trap Flag 74 UINT32 IF:1; // Interrupt Enable Flag 75 UINT32 DF:1; // Direction Flag 76 UINT32 OF:1; // Overflow Flag 77 UINT32 IOPL:2; // I/O Privilege Level 78 UINT32 NT:1; // Nested Task 79 UINT32 Reserved_3:1; // Reserved 80 UINT32 RF:1; // Resume Flag 81 UINT32 VM:1; // Virtual 8086 Mode 82 UINT32 AC:1; // Alignment Check 83 UINT32 VIF:1; // Virtual Interrupt Flag 84 UINT32 VIP:1; // Virtual Interrupt Pending 85 UINT32 ID:1; // ID Flag 86 UINT32 Reserved_4:10; // Reserved 87 } Bits; 88 UINTN UintN; 89 } IA32_EFLAGS32; 90 91 // 92 // Byte packed structure for an FP/SSE/SSE2 context 93 // 94 typedef struct { 95 UINT8 Buffer[512]; 96 } IA32_FX_BUFFER; 97 98 // 99 // Structures for the 16-bit real mode thunks 100 // 101 typedef struct { 102 UINT32 Reserved1; 103 UINT32 Reserved2; 104 UINT32 Reserved3; 105 UINT32 Reserved4; 106 UINT8 BL; 107 UINT8 BH; 108 UINT16 Reserved5; 109 UINT8 DL; 110 UINT8 DH; 111 UINT16 Reserved6; 112 UINT8 CL; 113 UINT8 CH; 114 UINT16 Reserved7; 115 UINT8 AL; 116 UINT8 AH; 117 UINT16 Reserved8; 118 } IA32_BYTE_REGS; 119 120 typedef struct { 121 UINT16 DI; 122 UINT16 Reserved1; 123 UINT16 SI; 124 UINT16 Reserved2; 125 UINT16 BP; 126 UINT16 Reserved3; 127 UINT16 SP; 128 UINT16 Reserved4; 129 UINT16 BX; 130 UINT16 Reserved5; 131 UINT16 DX; 132 UINT16 Reserved6; 133 UINT16 CX; 134 UINT16 Reserved7; 135 UINT16 AX; 136 UINT16 Reserved8; 137 UINT16 DS; 138 UINT16 ES; 139 UINT16 FS; 140 UINT16 GS; 141 IA32_FLAGS16 Flags; 142 UINT16 IP; 143 UINT16 Reserved10; 144 UINT16 CS; 145 UINT16 SS; 146 } IA32_WORD_REGS; 147 148 typedef struct { 149 UINT32 EDI; 150 UINT32 ESI; 151 UINT32 EBP; 152 UINT32 ESP; 153 UINT32 EBX; 154 UINT32 EDX; 155 UINT32 ECX; 156 UINT32 EAX; 157 UINT16 DS; 158 UINT16 ES; 159 UINT16 FS; 160 UINT16 GS; 161 IA32_EFLAGS32 EFLAGS; 162 UINT32 EIP; 163 UINT16 CS; 164 UINT16 SS; 165 } IA32_DWORD_REGS; 166 167 typedef union { 168 IA32_DWORD_REGS E; 169 IA32_WORD_REGS X; 170 IA32_BYTE_REGS H; 171 } IA32_REGISTER_SET; 172 173 // 174 // Byte packed structure for an 16-bit real mode thunks 175 // 176 typedef struct { 177 UINT32 RealModeBuffer; 178 UINT32 DefaultStack; 179 } THUNK_CONTEXT; 180 181 // 182 // 16-bit thunking services 183 // 184 185 UINTN 186 EFIAPI 187 AsmThunk16GetProperties ( 188 OUT UINTN *MinimumStackSize OPTIONAL 189 ) 190 /*++ 191 192 Routine Description: 193 194 Returns the properties of this real mode thunk implementation. Currently 195 there are 2 properties has been defined, the minimum real mode buffer size 196 and the minimum stack size. 197 198 Arguments: 199 200 MinimumStackSize - The minimum size required for a 16-bit stack. 201 202 Returns: 203 204 The minimum size of the real mode buffer needed by this thunk implementation 205 is returned. 206 207 --*/ 208 ; 209 210 THUNK_CONTEXT * 211 EFIAPI 212 AsmThunk16SetProperties ( 213 OUT THUNK_CONTEXT *ThunkContext, 214 IN VOID *RealModeBuffer, 215 IN UINTN BufferSize 216 ) 217 /*++ 218 219 Routine Description: 220 221 Tell this real mode thunk implementation the address and size of the real 222 mode buffer needed. 223 224 Arguments: 225 226 ThunkContext - The thunk context whose properties to set. 227 RealModeBuffer - The address of the buffer allocated by caller. It should be 228 aligned on a 16-byte boundary. 229 This buffer must be in identity mapped pages. 230 BufferSize - The size of RealModeBuffer. Must be larger than the minimum 231 size required as returned by AsmThunk16GetProperties(). 232 233 Returns: 234 235 None 236 237 --*/ 238 ; 239 240 BOOLEAN 241 AsmThunk16SetUserStack ( 242 IN THUNK_CONTEXT *ThunkContext, 243 IN VOID *Stack, 244 IN UINTN StackSize 245 ); 246 247 VOID 248 EFIAPI 249 AsmThunk16Destroy ( 250 IN OUT THUNK_CONTEXT *ThunkContext 251 ) 252 /*++ 253 254 Routine Description: 255 256 Reset all internal states to their initial values. The caller should not 257 release the real mode buffer until after a call to this function. 258 259 Arguments: 260 261 ThunkContext - The thunk context to destroy. 262 263 Returns: 264 265 None 266 267 --*/ 268 ; 269 270 IA32_REGISTER_SET * 271 EFIAPI 272 AsmThunk16FarCall86 ( 273 IN THUNK_CONTEXT *ThunkContext, 274 IN OUT IA32_REGISTER_SET *RegisterSet, 275 IN UINT32 ThunkFlags 276 ) 277 /*++ 278 279 Routine Description: 280 281 Make a far call to 16-bit code. 282 283 NOTE: This function must be called on TPL_HIGH_LEVEL or with interrupts 284 disabled because of GDTR and IDTR manipulations. 285 This function must be placed in identity mapped pages. 286 287 Arguments: 288 289 ThunkContext - Thunk context to use. 290 RegisterSet - CPU registers would be set to the values contained in this 291 structure before making the far call. Then CPU registers are 292 copied back to this structure. 293 CS:EIP points to the real mode code being called on input. 294 SS:ESP points to the real mode stack if THUNK_USER_STACK is 295 set on input, otherwise ignored. 296 EFlages is ignored on input. 297 On output, values of CS, EIP, SS and ESP should be ignored. 298 ThunkFlags - 2 flags have currently been defined, THUNK_SAVE_FP_STATE and 299 THUNK_USER_STACK. 300 THUNK_SAVE_FP_STATE - FPU state would be saved/restored 301 before/after calling real mode code. 302 THUNK_USER_STACK - The stack specified by SS:ESP would be 303 used instead of the default stack. 304 305 Returns: 306 307 RegisterSet is returned. 308 309 --*/ 310 ; 311 312 IA32_REGISTER_SET * 313 EFIAPI 314 AsmThunk16Int86 ( 315 IN THUNK_CONTEXT *ThunkContext, 316 IN UINT8 IntNumber, 317 IN OUT IA32_REGISTER_SET *RegisterSet, 318 IN UINT32 ThunkFlags 319 ) 320 /*++ 321 322 Routine Description: 323 324 Invoke a 16-bit interrupt handler. 325 326 NOTE: This function must be called on TPL_HIGH_LEVEL or with interrupts 327 disabled because of GDTR and IDTR manipulations. 328 This function must be placed in identity mapped pages. 329 330 Arguments: 331 332 ThunkContext - Thunk context to use. 333 IntNumber - The ordinal of the interrupt handler ranging from 0 to 255. 334 RegisterSet - CPU registers would be set to the values contained in this 335 structure before making the far call. Then CPU registers are 336 copied back to this structure. 337 SS:ESP points to the real mode stack if THUNK_USER_STACK is 338 set on input, otherwise ignored. 339 EFlages is ignored on input. 340 On output, values of CS, EIP, SS and ESP should be ignored. 341 ThunkFlags - 2 flags have currently been defined, THUNK_SAVE_FP_STATE and 342 THUNK_USER_STACK. 343 THUNK_SAVE_FP_STATE - FPU state would be saved/restored 344 before/after calling real mode code. 345 THUNK_USER_STACK - The stack specified by SS:ESP would be 346 used instead of the default stack. 347 348 Returns: 349 350 RegisterSet is returned. 351 352 --*/ 353 ; 354 355 #endif 356