Home | History | Annotate | Download | only in X64
      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 
     88