]> git.proxmox.com Git - mirror_edk2.git/blob - MdeModulePkg/Universal/CapsulePei/X64/PageFaultHandler.nasm
MdeModulePkg: 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 ; SPDX-License-Identifier: BSD-2-Clause-Patent
7 ;
8 ;;
9
10 extern ASM_PFX(PageFaultHandler)
11
12 DEFAULT REL
13 SECTION .text
14
15 global ASM_PFX(PageFaultHandlerHook)
16 ASM_PFX(PageFaultHandlerHook):
17 add rsp, -0x10
18 ; save rax
19 mov [rsp + 0x8], rax
20
21 ;push rax ; save all volatile registers
22 push rcx
23 push rdx
24 push r8
25 push r9
26 push r10
27 push r11
28 ; save volatile fp registers
29 ; 68h + 08h(for alignment)
30 add rsp, -0x70
31 stmxcsr [rsp + 0x60]
32 movdqa [rsp + 0x0], xmm0
33 movdqa [rsp + 0x10], xmm1
34 movdqa [rsp + 0x20], xmm2
35 movdqa [rsp + 0x30], xmm3
36 movdqa [rsp + 0x40], xmm4
37 movdqa [rsp + 0x50], xmm5
38
39 add rsp, -0x20
40 call ASM_PFX(PageFaultHandler)
41 add rsp, 0x20
42
43 ; load volatile fp registers
44 ldmxcsr [rsp + 0x60]
45 movdqa xmm0, [rsp + 0x0]
46 movdqa xmm1, [rsp + 0x10]
47 movdqa xmm2, [rsp + 0x20]
48 movdqa xmm3, [rsp + 0x30]
49 movdqa xmm4, [rsp + 0x40]
50 movdqa xmm5, [rsp + 0x50]
51 add rsp, 0x70
52
53 pop r11
54 pop r10
55 pop r9
56 pop r8
57 pop rdx
58 pop rcx
59 ;pop rax ; restore all volatile registers
60
61 add rsp, 0x10
62
63 ; rax returned from PageFaultHandler is NULL or OriginalHandler address
64 ; NULL if the page fault is handled by PageFaultHandler
65 ; OriginalHandler address if the page fault is not handled by PageFaultHandler
66 test rax, rax
67
68 ; save OriginalHandler address
69 mov [rsp - 0x10], rax
70 ; restore rax
71 mov rax, [rsp - 0x8]
72
73 jz .0
74
75 ; jump to OriginalHandler
76 jmp qword [rsp - 0x10]
77
78 .0:
79 add rsp, 0x8 ; skip error code for PF
80 iretq
81