• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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