2 ; This is the assembly code for transferring to control to OS S3 waking vector
5 ; Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
7 ; This program and the accompanying materials
8 ; are licensed and made available under the terms and conditions of the BSD License
9 ; which accompanies this distribution. The full text of the license may be found at
10 ; http://opensource.org/licenses/bsd-license.php
12 ; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13 ; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
17 EXTERN mOriginalHandler:QWORD
18 EXTERN PageFaultHandler:PROC
22 PUBLIC AsmFixAddress16
25 AsmTransferControl PROC
26 ; rcx S3WakingVector :DWORD
27 ; rdx AcpiLowMemoryBase :DWORD
38 DB 0b8h, 30h, 0 ; mov ax, 30h as selector
47 and eax, ((NOT 080000001h) AND 0ffffffffh)
56 DB 0eah ; jmp far @jmp_addr
58 AsmTransferControl ENDP
60 AsmTransferControl32 PROC
61 ; S3WakingVector :DWORD
62 ; AcpiLowMemoryBase :DWORD
65 DB 8dh, 05h ; lea eax, AsmTransferControl16
70 AsmTransferControl32 ENDP
72 AsmTransferControl16 PROC
73 DB 0b8h, 30h, 0 ; mov ax, 30h as selector
79 mov rax, cr0 ; Get control register 0
81 DB 83h, 0e0h, 0feh ; and eax, 0fffffffeh ; Clear PE bit (bit #0)
82 DB 0fh, 22h, 0c0h ; mov cr0, eax ; Activate real mode
83 DB 0eah ; jmp far AsmJmpAddr32
85 AsmTransferControl16 ENDP
87 PageFaultHandlerHook PROC
88 push rax ; save all volatile registers
95 ; save volatile fp registers
98 movdqa [rsp + 0h], xmm0
99 movdqa [rsp + 10h], xmm1
100 movdqa [rsp + 20h], xmm2
101 movdqa [rsp + 30h], xmm3
102 movdqa [rsp + 40h], xmm4
103 movdqa [rsp + 50h], xmm5
106 call PageFaultHandler
109 ; load volatile fp registers
111 movdqa xmm0, [rsp + 0h]
112 movdqa xmm1, [rsp + 10h]
113 movdqa xmm2, [rsp + 20h]
114 movdqa xmm3, [rsp + 30h]
115 movdqa xmm4, [rsp + 40h]
116 movdqa xmm5, [rsp + 50h]
127 pop rax ; restore all volatile registers
131 add rsp, 08h ; skip error code for PF
133 PageFaultHandlerHook ENDP