| //---------- Sigsegv-macos-x64.inc - Sigsegv handling ---------------------===// |
| // |
| // The VMKit project |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| extern "C" { |
| void HandleNullPointer(void); |
| asm( |
| ".text\n" |
| ".align 8\n" |
| ".globl HandleNullPointer\n" |
| "_HandleNullPointer:\n" |
| // Save the faulting address to fake a real method call. |
| "pushq %rdi\n" |
| "jmp _ThrowNullPointerException\n" |
| ); |
| |
| void HandleStackOverflow(void); |
| asm( |
| ".text\n" |
| ".align 8\n" |
| ".globl HandleStackOverflow\n" |
| "_HandleStackOverflow:\n" |
| "pushq %rbp\n" |
| "movq %rsi, %rbp\n" |
| "callq _ThrowStackOverflowError\n" |
| ); |
| } |
| |
| void Handler::UpdateRegistersForNPE() { |
| ((ucontext_t*)context)->uc_mcontext->__ss.__rdi = ((ucontext_t*)context)->uc_mcontext->__ss.__rip + 1; |
| ((ucontext_t*)context)->uc_mcontext->__ss.__rip = (word_t)HandleNullPointer; |
| } |
| |
| void Handler::UpdateRegistersForStackOverflow() { |
| word_t alt_stack = vmkit::Thread::get()->GetAlternativeStackStart(); |
| ((ucontext_t*)context)->uc_mcontext->__ss.__rdi = System::GetIPFromCallerAddress(((ucontext_t*)context)->uc_mcontext->__ss.__rbp); |
| ((ucontext_t*)context)->uc_mcontext->__ss.__rsi = ((ucontext_t*)context)->uc_mcontext->__ss.__rbp; |
| ((ucontext_t*)context)->uc_mcontext->__ss.__rsp = alt_stack; |
| ((ucontext_t*)context)->uc_mcontext->__ss.__rip = (word_t)HandleStackOverflow; |
| } |
| |
| bool System::SupportsHardwareNullCheck() { |
| return true; |
| } |
| |
| bool System::SupportsHardwareStackOverflow() { |
| return true; |
| } |