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