]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/X64/S3Asm.nasm
MdeModulePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdeModulePkg / Universal / Acpi / BootScriptExecutorDxe / X64 / S3Asm.nasm
CommitLineData
79e19664
JJ
1;; @file\r
2; This is the assembly code for transferring to control to OS S3 waking vector\r
3; for X64 platform\r
4;\r
5; Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>\r
6;\r
9d510e61 7; SPDX-License-Identifier: BSD-2-Clause-Patent\r
79e19664
JJ
8;\r
9;;\r
10\r
11extern ASM_PFX(mOriginalHandler)\r
12extern ASM_PFX(PageFaultHandler)\r
13\r
14 DEFAULT REL\r
15 SECTION .text\r
16\r
17global ASM_PFX(AsmFixAddress16)\r
18global ASM_PFX(AsmJmpAddr32)\r
19\r
20global ASM_PFX(AsmTransferControl)\r
21ASM_PFX(AsmTransferControl):\r
22 ; rcx S3WakingVector :DWORD\r
23 ; rdx AcpiLowMemoryBase :DWORD\r
24 lea eax, [.0]\r
25 mov r8, 0x2800000000\r
26 or rax, r8\r
27 push rax\r
28 shrd ebx, ecx, 20\r
29 and ecx, 0xf\r
30 mov bx, cx\r
f4a94a7c 31 mov [@jmp_addr + 1], ebx\r
79e19664 32 retf\r
f4a94a7c 33BITS 16\r
79e19664 34.0:\r
f4a94a7c
LG
35 mov ax, 0x30\r
36 mov ds, ax\r
37 mov es, ax\r
38 mov fs, ax\r
39 mov gs, ax\r
40 mov ss, ax\r
41 mov eax, cr0\r
42 mov ebx, cr4\r
79e19664
JJ
43 and eax, ((~ 0x80000001) & 0xffffffff)\r
44 and bl, ~ (1 << 5)\r
f4a94a7c 45 mov cr0, eax\r
79e19664
JJ
46 mov ecx, 0xc0000080\r
47 rdmsr\r
48 and ah, ~ 1\r
49 wrmsr\r
f4a94a7c
LG
50 mov cr4, ebx\r
51@jmp_addr:\r
52 jmp 0x0:0x0\r
79e19664
JJ
53\r
54global ASM_PFX(AsmTransferControl32)\r
55ASM_PFX(AsmTransferControl32):\r
f4a94a7c 56BITS 32\r
79e19664
JJ
57 ; S3WakingVector :DWORD\r
58 ; AcpiLowMemoryBase :DWORD\r
f4a94a7c 59 push ebp\r
79e19664
JJ
60 mov ebp, esp\r
61 DB 0x8d, 0x5 ; lea eax, AsmTransferControl16\r
62ASM_PFX(AsmFixAddress16): DD 0\r
63 push 0x28 ; CS\r
f4a94a7c 64 push eax\r
79e19664
JJ
65 retf\r
66\r
67global ASM_PFX(AsmTransferControl16)\r
68ASM_PFX(AsmTransferControl16):\r
f4a94a7c
LG
69BITS 16\r
70 mov ax, 0x30\r
71o32 mov ds, eax\r
72o32 mov es, eax\r
73o32 mov fs, eax\r
74o32 mov gs, eax\r
75o32 mov ss, eax\r
76 mov eax, cr0 ; Get control register 0\r
77 and eax, 0fffffffeh ; Clear PE bit (bit #0)\r
78 mov cr0, eax ; Activate real mode\r
79e19664
JJ
79 DB 0xea ; jmp far AsmJmpAddr32\r
80ASM_PFX(AsmJmpAddr32): DD 0\r
81\r
82global ASM_PFX(PageFaultHandlerHook)\r
83ASM_PFX(PageFaultHandlerHook):\r
f4a94a7c 84BITS 64\r
79e19664
JJ
85 push rax ; save all volatile registers\r
86 push rcx\r
87 push rdx\r
88 push r8\r
89 push r9\r
90 push r10\r
91 push r11\r
92 ; save volatile fp registers\r
93 add rsp, -0x68\r
94 stmxcsr [rsp + 0x60]\r
95 movdqa [rsp + 0x0], xmm0\r
96 movdqa [rsp + 0x10], xmm1\r
97 movdqa [rsp + 0x20], xmm2\r
98 movdqa [rsp + 0x30], xmm3\r
99 movdqa [rsp + 0x40], xmm4\r
100 movdqa [rsp + 0x50], xmm5\r
101\r
102 add rsp, -0x20\r
103 call ASM_PFX(PageFaultHandler)\r
104 add rsp, 0x20\r
105\r
106 ; load volatile fp registers\r
107 ldmxcsr [rsp + 0x60]\r
108 movdqa xmm0, [rsp + 0x0]\r
109 movdqa xmm1, [rsp + 0x10]\r
110 movdqa xmm2, [rsp + 0x20]\r
111 movdqa xmm3, [rsp + 0x30]\r
112 movdqa xmm4, [rsp + 0x40]\r
113 movdqa xmm5, [rsp + 0x50]\r
114 add rsp, 0x68\r
115\r
116 test al, al\r
117\r
118 pop r11\r
119 pop r10\r
120 pop r9\r
121 pop r8\r
122 pop rdx\r
123 pop rcx\r
124 pop rax ; restore all volatile registers\r
125 jnz .1\r
f4a94a7c 126 jmp qword [ASM_PFX(mOriginalHandler)]\r
79e19664
JJ
127.1:\r
128 add rsp, 0x8 ; skip error code for PF\r
129 iretq\r
130\r