1;------------------------------------------------------------------------------ 2; 3; Copyright (c) 2010 - 2012, Intel Corporation. All rights reserved.<BR> 4; This program and the accompanying materials 5; are licensed and made available under the terms and conditions of the BSD License 6; which accompanies this distribution. The full text of the license may be found at 7; http://opensource.org/licenses/bsd-license.php 8; 9; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 10; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 11; 12; Module Name: 13; 14; PageFaultHandler.asm 15; 16; Abstract: 17; 18; Defines page fault handler used to hook SMM IDT 19; 20;------------------------------------------------------------------------------ 21 22EXTERN mOriginalHandler:QWORD 23EXTERN PageFaultHandler:PROC 24 25 .code 26 27PageFaultHandlerHook PROC 28 push rax ; save all volatile registers 29 push rcx 30 push rdx 31 push r8 32 push r9 33 push r10 34 push r11 35 36 add rsp, -10h * 6 - 8 ; reserve memory to store XMM registers and make address 16-byte alignment 37 movdqa [rsp], xmm0 38 movdqa [rsp + 10h], xmm1 39 movdqa [rsp + 20h], xmm2 40 movdqa [rsp + 30h], xmm3 41 movdqa [rsp + 40h], xmm4 42 movdqa [rsp + 50h], xmm5 43 44 add rsp, -20h 45 call PageFaultHandler 46 add rsp, 20h 47 48 movdqa xmm0, [rsp] 49 movdqa xmm1, [rsp + 10h] 50 movdqa xmm2, [rsp + 20h] 51 movdqa xmm3, [rsp + 30h] 52 movdqa xmm4, [rsp + 40h] 53 movdqa xmm5, [rsp + 50h] 54 add rsp, 10h * 6 + 8 55 56 test al, al ; set ZF flag 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 jnz @F ; check ZF flag 65 jmp mOriginalHandler 66@@: 67 add rsp, 08h ; skip error code for PF 68 iretq 69PageFaultHandlerHook ENDP 70 END 71