• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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; 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
11;
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.
14;
15;;
16
17EXTERN mOriginalHandler:QWORD
18EXTERN PageFaultHandler:PROC
19
20    .code
21
22EXTERNDEF   AsmFixAddress16:DWORD
23EXTERNDEF   AsmJmpAddr32:DWORD
24
25AsmTransferControl  PROC
26    ; rcx S3WakingVector    :DWORD
27    ; rdx AcpiLowMemoryBase :DWORD
28    lea   eax, @F
29    mov   r8, 2800000000h
30    or    rax, r8
31    push  rax
32    shrd  ebx, ecx, 20
33    and   ecx, 0fh
34    mov   bx, cx
35    mov   @jmp_addr, ebx
36    retf
37@@:
38    DB    0b8h, 30h, 0      ; mov ax, 30h as selector
39    mov   ds, eax
40    mov   es, eax
41    mov   fs, eax
42    mov   gs, eax
43    mov   ss, eax
44    mov   rax, cr0
45    mov   rbx, cr4
46    DB    66h
47    and   eax, ((NOT 080000001h) AND 0ffffffffh)
48    and   bl, NOT (1 SHL 5)
49    mov   cr0, rax
50    DB    66h
51    mov   ecx, 0c0000080h
52    rdmsr
53    and   ah, NOT 1
54    wrmsr
55    mov   cr4, rbx
56    DB    0eah              ; jmp far @jmp_addr
57@jmp_addr DD  ?
58AsmTransferControl  ENDP
59
60AsmTransferControl32  PROC
61    ; S3WakingVector    :DWORD
62    ; AcpiLowMemoryBase :DWORD
63    push  rbp
64    mov   ebp, esp
65    DB    8dh, 05h          ;  lea   eax, AsmTransferControl16
66AsmFixAddress16  DD ?
67    push  28h               ; CS
68    push  rax
69    retf
70AsmTransferControl32  ENDP
71
72AsmTransferControl16  PROC
73    DB    0b8h, 30h, 0      ; mov ax, 30h as selector
74    mov   ds, ax
75    mov   es, ax
76    mov   fs, ax
77    mov   gs, ax
78    mov   ss, ax
79    mov   rax, cr0          ; Get control register 0
80    DB    66h
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
84AsmJmpAddr32 DD  ?
85AsmTransferControl16  ENDP
86
87PageFaultHandlerHook PROC
88    push    rax                         ; save all volatile registers
89    push    rcx
90    push    rdx
91    push    r8
92    push    r9
93    push    r10
94    push    r11
95    ; save volatile fp registers
96    add     rsp, -68h
97    stmxcsr [rsp + 60h]
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
104
105    add     rsp, -20h
106    call    PageFaultHandler
107    add     rsp, 20h
108
109    ; load volatile fp registers
110    ldmxcsr [rsp + 60h]
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]
117    add     rsp, 68h
118
119    test    al, al
120
121    pop     r11
122    pop     r10
123    pop     r9
124    pop     r8
125    pop     rdx
126    pop     rcx
127    pop     rax                         ; restore all volatile registers
128    jnz     @F
129    jmp     mOriginalHandler
130@@:
131    add     rsp, 08h                    ; skip error code for PF
132    iretq
133PageFaultHandlerHook ENDP
134
135    END
136