[vmkit-commits] [vmkit] r144690 - in /vmkit/trunk/lib/Mvm/CommonThread: Sigsegv-macos-x64.inc ctthread.cpp
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Tue Nov 15 12:25:38 PST 2011
Author: geoffray
Date: Tue Nov 15 14:25:38 2011
New Revision: 144690
URL: http://llvm.org/viewvc/llvm-project?rev=144690&view=rev
Log:
Use hardware overflow check to implement stack overflow on macos/x64.
Modified:
vmkit/trunk/lib/Mvm/CommonThread/Sigsegv-macos-x64.inc
vmkit/trunk/lib/Mvm/CommonThread/ctthread.cpp
Modified: vmkit/trunk/lib/Mvm/CommonThread/Sigsegv-macos-x64.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/CommonThread/Sigsegv-macos-x64.inc?rev=144690&r1=144689&r2=144690&view=diff
==============================================================================
--- vmkit/trunk/lib/Mvm/CommonThread/Sigsegv-macos-x64.inc (original)
+++ vmkit/trunk/lib/Mvm/CommonThread/Sigsegv-macos-x64.inc Tue Nov 15 14:25:38 2011
@@ -18,6 +18,17 @@
"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() {
@@ -26,7 +37,11 @@
}
void Handler::UpdateRegistersForStackOverflow() {
- UNREACHABLE();
+ word_t alt_stack = mvm::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() {
@@ -34,5 +49,5 @@
}
bool System::SupportsHardwareStackOverflow() {
- return false;
+ return true;
}
Modified: vmkit/trunk/lib/Mvm/CommonThread/ctthread.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/CommonThread/ctthread.cpp?rev=144690&r1=144689&r2=144690&view=diff
==============================================================================
--- vmkit/trunk/lib/Mvm/CommonThread/ctthread.cpp (original)
+++ vmkit/trunk/lib/Mvm/CommonThread/ctthread.cpp Tue Nov 15 14:25:38 2011
@@ -342,6 +342,7 @@
sa.sa_mask = mask;
sa.sa_sigaction = sigsegvHandler;
sigaction(SIGSEGV, &sa, NULL);
+ sigaction(SIGBUS, &sa, NULL);
assert(th->MyVM && "VM not set in a thread");
th->MyVM->rendezvous.addThread(th);
More information about the vmkit-commits
mailing list