+++ /dev/null
- page ,132\r
- title VM ASSEMBLY LANGUAGE ROUTINES\r
-;****************************************************************************\r
-;* \r
-;* Copyright (c) 2006 - 2007, Intel Corporation \r
-;* All rights reserved. This program and the accompanying materials \r
-;* are licensed and made available under the terms and conditions of the BSD License \r
-;* which accompanies this distribution. The full text of the license may be found at \r
-;* http://opensource.org/licenses/bsd-license.php \r
-;* \r
-;* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-;* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-;* \r
-;****************************************************************************\r
-;****************************************************************************\r
-; REV 1.0\r
-;****************************************************************************\r
-;\r
-; Rev Date Description\r
-; --- -------- ------------------------------------------------------------\r
-; 1.0 03/14/01 Initial creation of file.\r
-;\r
-;****************************************************************************\r
- \r
-;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\r
-; This code provides low level routines that support the Virtual Machine\r
-; for option ROMs. \r
-;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\r
-\r
-;---------------------------------------------------------------------------\r
-; Equate files needed.\r
-;---------------------------------------------------------------------------\r
-\r
-.XLIST\r
-\r
-.LIST\r
-\r
-;---------------------------------------------------------------------------\r
-; Assembler options\r
-;---------------------------------------------------------------------------\r
-\r
-.686p\r
-.model flat \r
-.code \r
-;---------------------------------------------------------------------------\r
-;;GenericPostSegment SEGMENT USE16\r
-;---------------------------------------------------------------------------\r
-CopyMem PROTO C Destination:PTR DWORD, Source:PTR DWORD, Count:DWORD\r
-\r
-;****************************************************************************\r
-; EbcLLCALLEXNative\r
-;\r
-; This function is called to execute an EBC CALLEX instruction\r
-; to native code. \r
-; This instruction requires that we thunk out to external native\r
-; code. For IA32, we simply switch stacks and jump to the \r
-; specified function. On return, we restore the stack pointer\r
-; to its original location.\r
-;\r
-; Destroys no working registers.\r
-;****************************************************************************\r
-; VOID EbcLLCALLEXNative(UINTN FuncAddr, UINTN NewStackPointer, VOID *FramePtr)\r
-_EbcLLCALLEXNative PROC NEAR PUBLIC\r
- push ebp\r
- push ebx\r
- mov ebp, esp ; standard function prolog\r
- \r
- ; Get function address in a register\r
- ; mov ecx, FuncAddr => mov ecx, dword ptr [FuncAddr]\r
- mov ecx, dword ptr [esp]+0Ch\r
- \r
- ; Set stack pointer to new value\r
- ; mov eax, NewStackPointer => mov eax, dword ptr [NewSp]\r
- mov eax, dword ptr [esp] + 14h\r
- mov edx, dword ptr [esp] + 10h\r
- sub eax, edx\r
- sub esp, eax \r
- mov ebx, esp\r
- push ecx\r
- push eax\r
- push edx\r
- push ebx\r
- call CopyMem\r
- pop eax\r
- pop eax\r
- pop eax\r
- pop ecx\r
-\r
- ; Now call the external routine\r
- call ecx\r
- \r
- ; ebp is preserved by the callee. In this function it\r
- ; equals the original esp, so set them equal\r
- mov esp, ebp\r
-\r
- ; Standard function epilog\r
- mov esp, ebp\r
- pop ebx\r
- pop ebp\r
- ret\r
-_EbcLLCALLEXNative ENDP\r
-\r
-\r
-; UINTN EbcLLGetEbcEntryPoint(VOID);\r
-; Routine Description:\r
-; The VM thunk code stuffs an EBC entry point into a processor\r
-; register. Since we can't use inline assembly to get it from\r
-; the interpreter C code, stuff it into the return value \r
-; register and return.\r
-;\r
-; Arguments:\r
-; None.\r
-;\r
-; Returns:\r
-; The contents of the register in which the entry point is passed.\r
-;\r
-_EbcLLGetEbcEntryPoint PROC NEAR PUBLIC\r
- ret\r
-_EbcLLGetEbcEntryPoint ENDP\r
-\r
-;/*++\r
-;\r
-;Routine Description:\r
-; \r
-; Return the caller's value of the stack pointer.\r
-;\r
-;Arguments:\r
-;\r
-; None.\r
-;\r
-;Returns:\r
-;\r
-; The current value of the stack pointer for the caller. We\r
-; adjust it by 4 here because when they called us, the return address\r
-; is put on the stack, thereby lowering it by 4 bytes.\r
-;\r
-;--*/\r
-\r
-; UINTN EbcLLGetStackPointer() \r
-_EbcLLGetStackPointer PROC NEAR PUBLIC\r
- mov eax, esp ; get current stack pointer\r
- add eax, 4 ; stack adjusted by this much when we were called\r
- ret\r
-_EbcLLGetStackPointer ENDP\r
-\r
-; UINT64 EbcLLGetReturnValue(VOID);\r
-; Routine Description:\r
-; When EBC calls native, on return the VM has to stuff the return\r
-; value into a VM register. It's assumed here that the value is still\r
-; in the register, so simply return and the caller should get the\r
-; return result properly.\r
-;\r
-; Arguments:\r
-; None.\r
-;\r
-; Returns:\r
-; The unmodified value returned by the native code.\r
-;\r
-_EbcLLGetReturnValue PROC NEAR PUBLIC\r
- ret\r
-_EbcLLGetReturnValue ENDP\r
-\r
-END\r