From 99d01823a8a4353489e075e42b9b4dc2ffdaba3a Mon Sep 17 00:00:00 2001 From: Jordan Justen Date: Mon, 30 May 2016 18:52:18 -0700 Subject: MdeModulePkg EbcDxe: Convert Ia32/EbcLowLevel.asm to NASM The BaseTools/Scripts/ConvertMasmToNasm.py script was used to convert Ia32/EbcLowLevel.asm to Ia32/EbcLowLevel.nasm Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Jordan Justen --- MdeModulePkg/Universal/EbcDxe/EbcDxe.inf | 1 + .../Universal/EbcDxe/Ia32/EbcLowLevel.nasm | 197 +++++++++++++++++++++ 2 files changed, 198 insertions(+) create mode 100644 MdeModulePkg/Universal/EbcDxe/Ia32/EbcLowLevel.nasm diff --git a/MdeModulePkg/Universal/EbcDxe/EbcDxe.inf b/MdeModulePkg/Universal/EbcDxe/EbcDxe.inf index 0dfe005e7b..44558aaf64 100644 --- a/MdeModulePkg/Universal/EbcDxe/EbcDxe.inf +++ b/MdeModulePkg/Universal/EbcDxe/EbcDxe.inf @@ -39,6 +39,7 @@ [Sources.Ia32] Ia32/EbcSupport.c + Ia32/EbcLowLevel.nasm Ia32/EbcLowLevel.S Ia32/EbcLowLevel.asm diff --git a/MdeModulePkg/Universal/EbcDxe/Ia32/EbcLowLevel.nasm b/MdeModulePkg/Universal/EbcDxe/Ia32/EbcLowLevel.nasm new file mode 100644 index 0000000000..29a101d177 --- /dev/null +++ b/MdeModulePkg/Universal/EbcDxe/Ia32/EbcLowLevel.nasm @@ -0,0 +1,197 @@ +;/** @file +; +; This code provides low level routines that support the Virtual Machine +; for option ROMs. +; +; Copyright (c) 2006 - 2011, 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. +; +;**/ + +;--------------------------------------------------------------------------- +; Equate files needed. +;--------------------------------------------------------------------------- + +;--------------------------------------------------------------------------- +; Assembler options +;--------------------------------------------------------------------------- + +SECTION .text +extern ASM_PFX(CopyMem) +extern ASM_PFX(EbcInterpret) +extern ASM_PFX(ExecuteEbcImageEntryPoint) + +;**************************************************************************** +; EbcLLCALLEXNative +; +; This function is called to execute an EBC CALLEX instruction +; to native code. +; This instruction requires that we thunk out to external native +; code. For IA32, we simply switch stacks and jump to the +; specified function. On return, we restore the stack pointer +; to its original location. +; +; Destroys no working registers. +;**************************************************************************** +; INT64 EbcLLCALLEXNative(UINTN FuncAddr, UINTN NewStackPointer, VOID *FramePtr) +global ASM_PFX(EbcLLCALLEXNative) +ASM_PFX(EbcLLCALLEXNative): + push ebp + push ebx + mov ebp, esp ; standard function prolog + + ; Get function address in a register + ; mov ecx, FuncAddr => mov ecx, dword ptr [FuncAddr] + mov ecx, dword [esp + 0xC] + + ; Set stack pointer to new value + ; mov eax, NewStackPointer => mov eax, dword ptr [NewSp] + mov eax, dword [esp + 0x14] + mov edx, dword [esp + 0x10] + sub eax, edx + sub esp, eax + mov ebx, esp + push ecx + push eax + push edx + push ebx + call ASM_PFX(CopyMem) + pop eax + pop eax + pop eax + pop ecx + + ; Now call the external routine + call ecx + + ; ebp is preserved by the callee. In this function it + ; equals the original esp, so set them equal + mov esp, ebp + + ; Standard function epilog + mov esp, ebp + pop ebx + pop ebp + ret + +;**************************************************************************** +; EbcLLEbcInterpret +; +; Begin executing an EBC image. +;**************************************************************************** +; UINT64 EbcLLEbcInterpret(VOID) +global ASM_PFX(EbcLLEbcInterpret) +ASM_PFX(EbcLLEbcInterpret): + ; + ;; mov eax, 0xca112ebc + ;; mov eax, EbcEntryPoint + ;; mov ecx, EbcLLEbcInterpret + ;; jmp ecx + ; + ; Caller uses above instruction to jump here + ; The stack is below: + ; +-----------+ + ; | RetAddr | + ; +-----------+ + ; |EntryPoint | (EAX) + ; +-----------+ + ; | Arg1 | <- EDI + ; +-----------+ + ; | Arg2 | + ; +-----------+ + ; | ... | + ; +-----------+ + ; | Arg16 | + ; +-----------+ + ; | EDI | + ; +-----------+ + ; | ESI | + ; +-----------+ + ; | EBP | <- EBP + ; +-----------+ + ; | RetAddr | <- ESP is here + ; +-----------+ + ; | Arg1 | <- ESI + ; +-----------+ + ; | Arg2 | + ; +-----------+ + ; | ... | + ; +-----------+ + ; | Arg16 | + ; +-----------+ + ; + + ; Construct new stack + push ebp + mov ebp, esp + push esi + push edi + sub esp, 0x40 + push eax + mov esi, ebp + add esi, 8 + mov edi, esp + add edi, 4 + mov ecx, 16 + rep movsd + + ; call C-code + call ASM_PFX(EbcInterpret) + add esp, 0x44 + pop edi + pop esi + pop ebp + ret + +;**************************************************************************** +; EbcLLExecuteEbcImageEntryPoint +; +; Begin executing an EBC image. +;**************************************************************************** +; UINT64 EbcLLExecuteEbcImageEntryPoint(VOID) +global ASM_PFX(EbcLLExecuteEbcImageEntryPoint) +ASM_PFX(EbcLLExecuteEbcImageEntryPoint): + ; + ;; mov eax, 0xca112ebc + ;; mov eax, EbcEntryPoint + ;; mov ecx, EbcLLExecuteEbcImageEntryPoint + ;; jmp ecx + ; + ; Caller uses above instruction to jump here + ; The stack is below: + ; +-----------+ + ; | RetAddr | + ; +-----------+ + ; |EntryPoint | (EAX) + ; +-----------+ + ; |ImageHandle| + ; +-----------+ + ; |SystemTable| + ; +-----------+ + ; | RetAddr | <- ESP is here + ; +-----------+ + ; |ImageHandle| + ; +-----------+ + ; |SystemTable| + ; +-----------+ + ; + + ; Construct new stack + mov [esp - 0xC], eax + mov eax, [esp + 0x4] + mov [esp - 0x8], eax + mov eax, [esp + 0x8] + mov [esp - 0x4], eax + + ; call C-code + sub esp, 0xC + call ASM_PFX(ExecuteEbcImageEntryPoint) + add esp, 0xC + ret + -- cgit v1.2.3