]> git.proxmox.com Git - mirror_edk2.git/blob - MdeModulePkg/Universal/CapsulePei/X64/PageFaultHandler.nasm
IntelSiliconPkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdeModulePkg / Universal / CapsulePei / X64 / PageFaultHandler.nasm
1 ;; @file
2 ; This is the assembly code for page fault handler hook.
3 ;
4 ; Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
5 ;
6 ; This program and the accompanying materials
7 ; are licensed and made available under the terms and conditions of the BSD License
8 ; which accompanies this distribution. The full text of the license may be found at
9 ; http://opensource.org/licenses/bsd-license.php
10 ;
11 ; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 ; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13 ;
14 ;;
15
16 extern ASM_PFX(PageFaultHandler)
17
18 DEFAULT REL
19 SECTION .text
20
21 global ASM_PFX(PageFaultHandlerHook)
22 ASM_PFX(PageFaultHandlerHook):
23 add rsp, -0x10
24 ; save rax
25 mov [rsp + 0x8], rax
26
27 ;push rax ; save all volatile registers
28 push rcx
29 push rdx
30 push r8
31 push r9
32 push r10
33 push r11
34 ; save volatile fp registers
35 ; 68h + 08h(for alignment)
36 add rsp, -0x70
37 stmxcsr [rsp + 0x60]
38 movdqa [rsp + 0x0], xmm0
39 movdqa [rsp + 0x10], xmm1
40 movdqa [rsp + 0x20], xmm2
41 movdqa [rsp + 0x30], xmm3
42 movdqa [rsp + 0x40], xmm4
43 movdqa [rsp + 0x50], xmm5
44
45 add rsp, -0x20
46 call ASM_PFX(PageFaultHandler)
47 add rsp, 0x20
48
49 ; load volatile fp registers
50 ldmxcsr [rsp + 0x60]
51 movdqa xmm0, [rsp + 0x0]
52 movdqa xmm1, [rsp + 0x10]
53 movdqa xmm2, [rsp + 0x20]
54 movdqa xmm3, [rsp + 0x30]
55 movdqa xmm4, [rsp + 0x40]
56 movdqa xmm5, [rsp + 0x50]
57 add rsp, 0x70
58
59 pop r11
60 pop r10
61 pop r9
62 pop r8
63 pop rdx
64 pop rcx
65 ;pop rax ; restore all volatile registers
66
67 add rsp, 0x10
68
69 ; rax returned from PageFaultHandler is NULL or OriginalHandler address
70 ; NULL if the page fault is handled by PageFaultHandler
71 ; OriginalHandler address if the page fault is not handled by PageFaultHandler
72 test rax, rax
73
74 ; save OriginalHandler address
75 mov [rsp - 0x10], rax
76 ; restore rax
77 mov rax, [rsp - 0x8]
78
79 jz .0
80
81 ; jump to OriginalHandler
82 jmp qword [rsp - 0x10]
83
84 .0:
85 add rsp, 0x8 ; skip error code for PF
86 iretq
87