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) 2014 - 2018, 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.
18 #include <Library/BaseLib.h>
34 UINT32 DefaultSize
: 1;
35 UINT32 Granularity
: 1;
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,
59 Assembly function to transition from long mode to compatibility mode to execute 32-bit code and then transit back to
62 @param[in] Function The 32bit code entry to be executed.
63 @param[in] Param1 The first parameter to pass to 32bit code
64 @param[in] Param2 The second parameter to pass to 32bit code
65 @param[in] InternalGdtr The GDT and GDT descriptor used by this library
75 IN IA32_DESCRIPTOR
*InternalGdtr
79 Wrapper for a thunk to transition from long mode to compatibility mode to execute 32-bit code and then transit back to
82 @param[in] Function The 32bit code entry to be executed.
83 @param[in] Param1 The first parameter to pass to 32bit code.
84 @param[in] Param2 The second parameter to pass to 32bit code.
99 // Idtr might be changed inside of FSP. 32bit FSP only knows the <4G address.
100 // If IDTR.Base is >4G, FSP can not handle. So we need save/restore IDTR here for X64 only.
101 // Interrupt is already disabled here, so it is safety to update IDTR.
104 Status
= AsmExecute32BitCode (Function
, Param1
, Param2
, &mGdt
);
105 AsmWriteIdtr (&Idtr
);