singrdk/base/boot/SingLdrPc/x86/bllegacy.asm

146 lines
2.6 KiB
NASM
Raw Permalink Normal View History

2008-11-17 18:29:00 -05:00
;++
;
; Copyright (c) Microsoft Corporation
;
; Module Name:
;
; bllegacy.asm
;
; Abstract:
;
; This module implements legacy call support.
;
; Environment:
;
; Boot loader.
;
;--
include bl.inc
.686p
.model flat
.code
assume ds:flat
assume es:flat
assume ss:flat
assume fs:flat
.code
;
; Legacy call frame.
;
LegacyCallFrame struct
_eax dq ?
_ebx dq ?
_ecx dq ?
_edx dq ?
_ebp dq ?
_esi dq ?
_edi dq ?
_idtr df ?
LegacyCallFrame ends
BlLegacyReturnStackPointer dd 0
;++
;
; VOID
; FASTCALL
; BlReturnToLegacyMode(
; VOID
; )
;
; Routine Description:
;
; This function returns to legacy mode to process a legacy request.
;
;--
?BlReturnToLegacyMode@@YIXXZ proc
;
; Save all registers.
;
sub esp, (sizeof LegacyCallFrame)
mov dword ptr [esp].LegacyCallFrame._eax, eax
mov dword ptr [esp].LegacyCallFrame._ebx, ebx
mov dword ptr [esp].LegacyCallFrame._ecx, ecx
mov dword ptr [esp].LegacyCallFrame._edx, edx
mov dword ptr [esp].LegacyCallFrame._ebp, ebp
mov dword ptr [esp].LegacyCallFrame._esi, esi
mov dword ptr [esp].LegacyCallFrame._edi, edi
;
; Save IDTR
;
sidt fword ptr [esp].LegacyCallFrame._idtr
;
; Save stack pointer.
;
mov BlLegacyReturnStackPointer, esp
;
; Set return address in BEB.
;
mov eax, BEB_BASE
lea ecx, @f
mov dword ptr [eax].BEB.LegacyReturnAddress, ecx
;
; Get legacy call stub address from BEB.
;
mov ecx, dword ptr [eax].BEB.LegacyCallAddress
;
; Return to legacy mode.
;
call ecx
@@:
;
; Restore stack pointer.
;
mov esp, BlLegacyReturnStackPointer
;
; Restore all registers.
;
mov eax, dword ptr [esp].LegacyCallFrame._eax
mov ebx, dword ptr [esp].LegacyCallFrame._ebx
mov ecx, dword ptr [esp].LegacyCallFrame._ecx
mov edx, dword ptr [esp].LegacyCallFrame._edx
mov ebp, dword ptr [esp].LegacyCallFrame._ebp
mov esi, dword ptr [esp].LegacyCallFrame._esi
mov edi, dword ptr [esp].LegacyCallFrame._edi
;
; Restore IDT
;
lidt fword ptr [esp].LegacyCallFrame._idtr
add esp, (sizeof LegacyCallFrame)
ret
?BlReturnToLegacyMode@@YIXXZ endp
public ?BlReturnToLegacyMode@@YIXXZ
end