From d766b22843bc2304cdb834eedc486ea3f1dd3335 Mon Sep 17 00:00:00 2001 From: jyao1 Date: Wed, 22 Dec 2010 04:26:08 +0000 Subject: Fix boot script thunk issue that we need dispatch in PEI mode for Framework dispatch function, not in DXE mode. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11189 6f19259b-4bc3-4df7-8a09-765794883524 --- .../IA32/DispatchExecute.c | 43 ++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 EdkCompatibilityPkg/Compatibility/BootScriptSaveOnS3SaveStateThunk/IA32/DispatchExecute.c (limited to 'EdkCompatibilityPkg/Compatibility/BootScriptSaveOnS3SaveStateThunk/IA32') diff --git a/EdkCompatibilityPkg/Compatibility/BootScriptSaveOnS3SaveStateThunk/IA32/DispatchExecute.c b/EdkCompatibilityPkg/Compatibility/BootScriptSaveOnS3SaveStateThunk/IA32/DispatchExecute.c new file mode 100644 index 0000000000..7a3c9143b6 --- /dev/null +++ b/EdkCompatibilityPkg/Compatibility/BootScriptSaveOnS3SaveStateThunk/IA32/DispatchExecute.c @@ -0,0 +1,43 @@ +/** @file + Execute 32-bit code in Long Mode + Provide a thunk function to transition from long mode to compatibility mode to execute 32-bit code and then transit + back to long mode. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +#include "ScriptSave.h" +/** + Wrapper for a thunk to transition from long mode to compatibility mode to execute 32-bit code and then transit back to + long mode. + + @param Function The 32bit code entry to be executed. + @param Param1 The first parameter to pass to 32bit code + @param Param2 The second parameter to pass to 32bit code + @retval EFI_SUCCESS Execute 32bit code successfully. + @retval other Something wrong when execute the 32bit code + +**/ +EFI_STATUS +Execute32BitCode ( + IN UINT64 Function, + IN UINT64 Param1, + IN UINT64 Param2 + ) +{ + DISPATCH_ENTRYPOINT_FUNC EntryFunc; + EFI_STATUS Status; + + EntryFunc = (DISPATCH_ENTRYPOINT_FUNC) (UINTN) (Function); + Status = EntryFunc ((VOID *)(UINTN)Param1, (VOID *)(UINTN)Param2); + + return Status; +} + -- cgit v1.2.3