From 79e19664325c014e9017f8945f837aa8eb84af1d Mon Sep 17 00:00:00 2001 From: Jordan Justen Date: Mon, 30 May 2016 18:52:18 -0700 Subject: [PATCH] MdeModulePkg BootScriptExecutorDxe: Convert X64/S3Asm.asm to NASM The BaseTools/Scripts/ConvertMasmToNasm.py script was used to convert X64/S3Asm.asm to X64/S3Asm.nasm Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Jordan Justen --- .../BootScriptExecutorDxe.inf | 1 + .../Acpi/BootScriptExecutorDxe/X64/S3Asm.nasm | 135 ++++++++++++++++++ 2 files changed, 136 insertions(+) create mode 100644 MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/X64/S3Asm.nasm diff --git a/MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/BootScriptExecutorDxe.inf b/MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/BootScriptExecutorDxe.inf index ad34650a79..7cd38cf029 100644 --- a/MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/BootScriptExecutorDxe.inf +++ b/MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/BootScriptExecutorDxe.inf @@ -38,6 +38,7 @@ [Sources.X64] X64/SetIdtEntry.c + X64/S3Asm.nasm X64/S3Asm.asm X64/S3Asm.S diff --git a/MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/X64/S3Asm.nasm b/MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/X64/S3Asm.nasm new file mode 100644 index 0000000000..e9f7d4af38 --- /dev/null +++ b/MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/X64/S3Asm.nasm @@ -0,0 +1,135 @@ +;; @file +; This is the assembly code for transferring to control to OS S3 waking vector +; for X64 platform +; +; Copyright (c) 2006 - 2012, 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. +; +;; + +extern ASM_PFX(mOriginalHandler) +extern ASM_PFX(PageFaultHandler) + + DEFAULT REL + SECTION .text + +global ASM_PFX(AsmFixAddress16) +global ASM_PFX(AsmJmpAddr32) + +global ASM_PFX(AsmTransferControl) +ASM_PFX(AsmTransferControl): + ; rcx S3WakingVector :DWORD + ; rdx AcpiLowMemoryBase :DWORD + lea eax, [.0] + mov r8, 0x2800000000 + or rax, r8 + push rax + shrd ebx, ecx, 20 + and ecx, 0xf + mov bx, cx + mov [@jmp_addr], ebx + retf +.0: + DB 0xb8, 0x30, 0 ; mov ax, 30h as selector + mov ds, eax + mov es, eax + mov fs, eax + mov gs, eax + mov ss, eax + mov rax, cr0 + mov rbx, cr4 + DB 0x66 + and eax, ((~ 0x80000001) & 0xffffffff) + and bl, ~ (1 << 5) + mov cr0, rax + DB 0x66 + mov ecx, 0xc0000080 + rdmsr + and ah, ~ 1 + wrmsr + mov cr4, rbx + DB 0xea ; jmp far @jmp_addr +@jmp_addr: DD 0 + +global ASM_PFX(AsmTransferControl32) +ASM_PFX(AsmTransferControl32): + ; S3WakingVector :DWORD + ; AcpiLowMemoryBase :DWORD + push rbp + mov ebp, esp + DB 0x8d, 0x5 ; lea eax, AsmTransferControl16 +ASM_PFX(AsmFixAddress16): DD 0 + push 0x28 ; CS + push rax + retf + +global ASM_PFX(AsmTransferControl16) +ASM_PFX(AsmTransferControl16): + DB 0xb8, 0x30, 0 ; mov ax, 30h as selector + mov ds, ax + mov es, ax + mov fs, ax + mov gs, ax + mov ss, ax + mov rax, cr0 ; Get control register 0 + DB 0x66 + DB 0x83, 0xe0, 0xfe ; and eax, 0fffffffeh ; Clear PE bit (bit #0) + DB 0xf, 0x22, 0xc0 ; mov cr0, eax ; Activate real mode + DB 0xea ; jmp far AsmJmpAddr32 +ASM_PFX(AsmJmpAddr32): DD 0 + +global ASM_PFX(PageFaultHandlerHook) +ASM_PFX(PageFaultHandlerHook): + push rax ; save all volatile registers + push rcx + push rdx + push r8 + push r9 + push r10 + push r11 + ; save volatile fp registers + add rsp, -0x68 + stmxcsr [rsp + 0x60] + movdqa [rsp + 0x0], xmm0 + movdqa [rsp + 0x10], xmm1 + movdqa [rsp + 0x20], xmm2 + movdqa [rsp + 0x30], xmm3 + movdqa [rsp + 0x40], xmm4 + movdqa [rsp + 0x50], xmm5 + + add rsp, -0x20 + call ASM_PFX(PageFaultHandler) + add rsp, 0x20 + + ; load volatile fp registers + ldmxcsr [rsp + 0x60] + movdqa xmm0, [rsp + 0x0] + movdqa xmm1, [rsp + 0x10] + movdqa xmm2, [rsp + 0x20] + movdqa xmm3, [rsp + 0x30] + movdqa xmm4, [rsp + 0x40] + movdqa xmm5, [rsp + 0x50] + add rsp, 0x68 + + test al, al + + pop r11 + pop r10 + pop r9 + pop r8 + pop rdx + pop rcx + pop rax ; restore all volatile registers + jnz .1 + jmp ASM_PFX(mOriginalHandler) +.1: + add rsp, 0x8 ; skip error code for PF + iretq +