+++ /dev/null
-#------------------------------------------------------------------------------\r
-#\r
-# Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>\r
-# This program and the accompanying materials\r
-# are licensed and made available under the terms and conditions of the BSD License\r
-# which accompanies this distribution. The full text of the license may be found at\r
-# http://opensource.org/licenses/bsd-license.php\r
-#\r
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-#\r
-# Module Name:\r
-#\r
-# PageFaultHandler.S\r
-#\r
-# Abstract:\r
-#\r
-# Defines page fault handler used to hook SMM IDT\r
-#\r
-#------------------------------------------------------------------------------\r
-\r
-ASM_GLOBAL ASM_PFX(PageFaultHandlerHook)\r
-ASM_PFX(PageFaultHandlerHook):\r
- pushq %rax # save all volatile registers\r
- pushq %rcx\r
- pushq %rdx\r
- pushq %r8\r
- pushq %r9\r
- pushq %r10\r
- pushq %r11\r
-\r
- addq $-0x68, %rsp # reserve memory to store XMM registers and make address 16-byte alignment\r
- movdqa %xmm0, 0(%rsp) \r
- movdqa %xmm1, 0x10(%rsp)\r
- movdqa %xmm2, 0x20(%rsp)\r
- movdqa %xmm3, 0x30(%rsp)\r
- movdqa %xmm4, 0x40(%rsp)\r
- movdqa %xmm5, 0x50(%rsp)\r
-\r
- addq $-0x20, %rsp\r
- call ASM_PFX(PageFaultHandler)\r
- addq $0x20, %rsp\r
-\r
- movdqa 0(%rsp), %xmm0\r
- movdqa 0x10(%rsp), %xmm1\r
- movdqa 0x20(%rsp), %xmm2\r
- movdqa 0x30(%rsp), %xmm3\r
- movdqa 0x40(%rsp), %xmm4\r
- movdqa 0x50(%rsp), %xmm5\r
- addq $0x68, %rsp\r
-\r
- testb %al, %al # set ZF flag\r
- popq %r11\r
- popq %r10\r
- popq %r9\r
- popq %r8\r
- popq %rdx\r
- popq %rcx\r
- popq %rax # restore all volatile registers\r
- jnz L1 # check ZF flag\r
-#ifdef __APPLE__\r
- int $3\r
-#else\r
- jmpq *ASM_PFX(mOriginalHandler)\r
-#endif\r
-L1:\r
- addq $0x08, %rsp # skip error code for PF\r
- iretq\r