[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