1/*++
2
3Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>
4This program and the accompanying materials
5are licensed and made available under the terms and conditions of the BSD License
6which accompanies this distribution.  The full text of the license may be found at
7http://opensource.org/licenses/bsd-license.php
8
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11
12Module Name:
13
14  LegacyBiosThunk.h
15
16Abstract:
17
18  The EFI Legacy BIOS Thunk Protocol is used to abstract Thunk16 call.
19
20  Note: The names for EFI_IA32_REGISTER_SET elements were picked to follow
21  well known naming conventions.
22
23  Thunk - A thunk is a transition from one processor mode to another. A Thunk
24          is a transition from native EFI mode to 16-bit mode. A reverse thunk
25          would be a transition from 16-bit mode to native EFI mode.
26
27
28  Note: Note: Note: Note: Note: Note: Note:
29
30  You most likely should not use this protocol! Find the EFI way to solve the
31  problem to make your code portable
32
33  Note: Note: Note: Note: Note: Note: Note:
34
35Revision History
36
37--*/
38
39#ifndef _EFI_LEGACY_BIOS_THUNK_H_
40#define _EFI_LEGACY_BIOS_THUNK_H_
41
42#include EFI_PROTOCOL_DEFINITION (LegacyBios)
43
44#define EFI_LEGACY_BIOS_THUNK_PROTOCOL_GUID \
45  { \
46    0x4c51a7ba, 0x7195, 0x442d, {0x87, 0x92, 0xbe, 0xea, 0x6e, 0x2f, 0xf6, 0xec} \
47  }
48
49EFI_FORWARD_DECLARATION (EFI_LEGACY_BIOS_THUNK_PROTOCOL);
50
51typedef
52BOOLEAN
53(EFIAPI *EFI_LEGACY_BIOS_THUNK_INT86) (
54  IN EFI_LEGACY_BIOS_THUNK_PROTOCOL   * This,
55  IN  UINT8                           BiosInt,
56  IN OUT  EFI_IA32_REGISTER_SET       * Regs
57  )
58/*++
59
60  Routine Description:
61    Thunk to 16-bit real mode and execute a software interrupt with a vector
62    of BiosInt. Regs will contain the 16-bit register context on entry and
63    exit.
64
65  Arguments:
66    This    - Protocol instance pointer.
67    BiosInt - Processor interrupt vector to invoke
68    Reg     - Register contexted passed into (and returned) from thunk to
69              16-bit mode
70
71  Returns:
72    FALSE   - Thunk completed, and there were no BIOS errors in the target code.
73              See Regs for status.
74    TRUE    - There was a BIOS erro in the target code.
75
76--*/
77;
78
79typedef
80BOOLEAN
81(EFIAPI *EFI_LEGACY_BIOS_THUNK_FARCALL86) (
82  IN EFI_LEGACY_BIOS_THUNK_PROTOCOL   * This,
83  IN  UINT16                          Segment,
84  IN  UINT16                          Offset,
85  IN  EFI_IA32_REGISTER_SET           * Regs,
86  IN  VOID                            *Stack,
87  IN  UINTN                           StackSize
88  )
89/*++
90
91  Routine Description:
92    Thunk to 16-bit real mode and call Segment:Offset. Regs will contain the
93    16-bit register context on entry and exit. Arguments can be passed on
94    the Stack argument
95
96  Arguments:
97    This      - Protocol instance pointer.
98    Segment   - Segemnt of 16-bit mode call
99    Offset    - Offset of 16-bit mdoe call
100    Reg       - Register contexted passed into (and returned) from thunk to
101                16-bit mode
102    Stack     - Caller allocated stack used to pass arguments
103    StackSize - Size of Stack in bytes
104
105  Returns:
106    FALSE     - Thunk completed, and there were no BIOS errors in the target code.
107                See Regs for status.
108    TRUE      - There was a BIOS erro in the target code.
109
110--*/
111;
112
113struct _EFI_LEGACY_BIOS_THUNK_PROTOCOL {
114  EFI_LEGACY_BIOS_THUNK_INT86                 Int86;
115  EFI_LEGACY_BIOS_THUNK_FARCALL86             FarCall86;
116};
117
118extern EFI_GUID gEfiLegacyBiosThunkProtocolGuid;
119
120#endif
121