2 Execute 32-bit code in Long Mode
3 Provide a thunk function to transition from long mode to compatibility mode to execute 32-bit code and then transit
6 Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>
7 This program and the accompanying materials
8 are licensed and made available under the terms and conditions of the BSD License
9 which accompanies this distribution. The full text of the license may be found at
10 http://opensource.org/licenses/bsd-license.php
12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
16 #include "ScriptSave.h"
31 UINT32 DefaultSize
: 1;
32 UINT32 Granularity
: 1;
40 // Global Descriptor Table (GDT)
42 GLOBAL_REMOVE_IF_UNREFERENCED IA32_GDT mGdtEntries
[] = {
43 {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, /* 0x0: reserve */
44 {{0xFFFF, 0, 0, 0xB, 1, 0, 1, 0xF, 0, 0, 1, 1, 0}}, /* 0x8: compatibility mode */
45 {{0xFFFF, 0, 0, 0xB, 1, 0, 1, 0xF, 0, 1, 0, 1, 0}}, /* 0x10: for long mode */
46 {{0xFFFF, 0, 0, 0x3, 1, 0, 1, 0xF, 0, 0, 1, 1, 0}}, /* 0x18: data */
47 {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, /* 0x20: reserve */
53 GLOBAL_REMOVE_IF_UNREFERENCED IA32_DESCRIPTOR mGdt
= {
54 sizeof (mGdtEntries
) - 1,
58 Assembly function to transition from long mode to compatibility mode to execute 32-bit code and then transit back to
60 @param Function The 32bit code entry to be executed.
61 @param Param1 The first parameter to pass to 32bit code
62 @param Param2 The second parameter to pass to 32bit code
63 @param InternalGdtr The GDT and GDT descriptor used by this library
65 @retval EFI_SUCCESS Execute 32bit code successfully.
66 @retval other Something wrong when execute the 32bit code
73 IN IA32_DESCRIPTOR
*InternalGdtr
77 Wrapper for a thunk to transition from long mode to compatibility mode to execute 32-bit code and then transit back to
80 @param Function The 32bit code entry to be executed.
81 @param Param1 The first parameter to pass to 32bit code
82 @param Param2 The second parameter to pass to 32bit code
83 @retval EFI_SUCCESS Execute 32bit code successfully.
84 @retval other Something wrong when execute the 32bit code
96 ASSERT (Function
!= 0);
98 Status
= AsmExecute32BitCode (