OpenCorePkg/Library/OcAfterBootCompatLib/RelocationCallGate.nasm

88 lines
2.7 KiB
NASM

;------------------------------------------------------------------------------
; @file
; Copyright (C) 2020, vit9696. All rights reserved.
;
; 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.
;------------------------------------------------------------------------------
BITS 64
DEFAULT REL
;------------------------------------------------------------------------------
; Copied from BootCompatInternal.h, keep in sync.
;------------------------------------------------------------------------------
%define ESTIMATED_CALL_GATE_SIZE 256
%define KERNEL_BASE_PADDR 0x100000
;------------------------------------------------------------------------------
; Copy kernel memory to lower memory and jump back to kernel call gate.
;
; To generate the binary blob execute the following command:
; nasm RelocationCallGate.nasm -o /dev/stdout | xxd -i > RelocationCallGate.h
;
; @param[in] QWordCount Number of QWORDS to copy (rcx).
; @param[in] EntryPoint Kernel entry point (rdx).
; @param[in] Source Relocation block address to copy from (r8).
; @param[in] Args Kernel arguments (r9).
;
; Kernel call gate resides ESTIMATED_CALL_GATE_SIZE above and expects
; Args (rcx), EntryPoint (rdx) arguments to be passed.
;
; UINTN
; EFIAPI
; AsmCopySelf (
; IN UINTN QWordCount,
; IN UINTN EntryPoint,
; IN EFI_PHYSICAL_ADDRESS Source,
; IN UINTN Args
; );
;------------------------------------------------------------------------------
AsmRelocationCallGate:
; Disable interrupts just in case UEFI timer kills us.
cli
; Perform copying with direction reset.
cld
mov rsi, r8
mov edi, KERNEL_BASE_PADDR
rep movsq
; Update stack pointer to point to the relocation block (just in case).
mov rsp, rsi
; Print K and die (useful for testing).
; mov cl, 0x4b
; mov dx, 0x3fd
;ready1:
; in al, dx
; test al, 0x20
; je ready1
; mov dx, 0x3f8
; mov al, cl
; out dx, al
; mov cl, 0xa
; mov dx, 0x3fd
;ready2:
; in al, dx
; test al, 0x20
; je ready2
; mov dx, 0x3f8
; mov al, cl
; out dx, al
;freeze:
; jmp freeze
; Move Args to the first argument.
mov rcx, r9
; Jump back to the Apple call gate.
jmp AsmRelocationCallGate - ESTIMATED_CALL_GATE_SIZE