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 PageFaultHandler:PROC
     17 
     18     .code
     19 
     20 PageFaultHandlerHook PROC
     21     add     rsp, -10h
     22     ; save rax
     23     mov     [rsp + 08h], rax
     24 
     25     ;push    rax                         ; save all volatile registers
     26     push    rcx
     27     push    rdx
     28     push    r8
     29     push    r9
     30     push    r10
     31     push    r11
     32     ; save volatile fp registers
     33     ; 68h + 08h(for alignment)
     34     add     rsp, -70h
     35     stmxcsr [rsp + 60h]
     36     movdqa  [rsp + 0h], xmm0
     37     movdqa  [rsp + 10h], xmm1
     38     movdqa  [rsp + 20h], xmm2
     39     movdqa  [rsp + 30h], xmm3
     40     movdqa  [rsp + 40h], xmm4
     41     movdqa  [rsp + 50h], xmm5
     42 
     43     add     rsp, -20h
     44     call    PageFaultHandler
     45     add     rsp, 20h
     46 
     47     ; load volatile fp registers
     48     ldmxcsr [rsp + 60h]
     49     movdqa  xmm0,  [rsp + 0h]
     50     movdqa  xmm1,  [rsp + 10h]
     51     movdqa  xmm2,  [rsp + 20h]
     52     movdqa  xmm3,  [rsp + 30h]
     53     movdqa  xmm4,  [rsp + 40h]
     54     movdqa  xmm5,  [rsp + 50h]
     55     add     rsp, 70h
     56 
     57     pop     r11
     58     pop     r10
     59     pop     r9
     60     pop     r8
     61     pop     rdx
     62     pop     rcx
     63     ;pop     rax                         ; restore all volatile registers
     64 
     65     add     rsp, 10h
     66 
     67     ; rax returned from PageFaultHandler is NULL or OriginalHandler address
     68     ; NULL if the page fault is handled by PageFaultHandler
     69     ; OriginalHandler address if the page fault is not handled by PageFaultHandler
     70     test    rax, rax
     71 
     72     ; save OriginalHandler address
     73     mov     [rsp - 10h], rax
     74     ; restore rax
     75     mov     rax, [rsp - 08h]
     76 
     77     jz      @F
     78 
     79     ; jump to OriginalHandler
     80     jmp     qword ptr [rsp - 10h]
     81 
     82 @@:
     83     add     rsp, 08h                    ; skip error code for PF
     84     iretq
     85 PageFaultHandlerHook ENDP
     86 
     87     END
     88