[vmkit-commits] [vmkit] r198568 - The JVM is now bootstraped! Execute 109080 instructions.

Gael Thomas gael.thomas at lip6.fr
Sun Jan 5 12:26:32 PST 2014


Author: gthomas
Date: Sun Jan  5 14:26:32 2014
New Revision: 198568

URL: http://llvm.org/viewvc/llvm-project?rev=198568&view=rev
Log:
The JVM is now bootstraped! Execute 109080 instructions.


Modified:
    vmkit/branches/mcjit/include/vmkit/thread.h
    vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc
    vmkit/branches/mcjit/lib/j3/vm/j3.cc
    vmkit/branches/mcjit/lib/vmkit/thread.cc

Modified: vmkit/branches/mcjit/include/vmkit/thread.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/thread.h?rev=198568&r1=198567&r2=198568&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/vmkit/thread.h (original)
+++ vmkit/branches/mcjit/include/vmkit/thread.h Sun Jan  5 14:26:32 2014
@@ -11,13 +11,17 @@ namespace vmkit {
 	class VMKit;
 
 	class Thread {
+	public:
+		typedef void (*sa_action_t)(int, siginfo_t *, void *);
+
+	private:
 		VMKit*               _vm;
 		pthread_t            _tid;
 
 		static void* doRun(void* thread);
 		static void sigsegvHandler(int n, siginfo_t* info, void* context);
-		static void sigendHandler(int n, siginfo_t* info, void* context);
 
+		void registerSignalInternal(int n, sa_action_t handler, bool altStack);
 	public:
 		Thread(VMKit* vm);
 		virtual ~Thread() {}
@@ -33,9 +37,10 @@ namespace vmkit {
 		static Thread* get(void* ptr);
 		static Thread* get();
 
+		bool registerSignal(int n, sa_action_t handler);
+
 		void start();
 		void join();
-
 	};
 
 	class StackWalker {

Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc?rev=198568&r1=198567&r2=198568&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original)
+++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Sun Jan  5 14:26:32 2014
@@ -793,8 +793,20 @@ jobject JNICALL JVM_GetStackAccessContro
  * Other platform-dependent signal values may also be supported.
  */
 
-void * JNICALL JVM_RegisterSignal(jint sig, void *handler) { enterJVM(); NYI(); leaveJVM(); }
+void* JNICALL JVM_RegisterSignal(jint sig, void *handler) {
+	void* res;
+	enterJVM(); 
+	if(sig == SIGINT || sig == SIGTERM || sig == SIGHUP) {
+		J3Thread::get()->registerSignal(sig, (J3Thread::sa_action_t)handler);		
+		res = handler;
+	} else
+		res = (void*)-1;
+	leaveJVM(); 
+	return res;
+}
+
 jboolean JNICALL JVM_RaiseSignal(jint sig) { enterJVM(); NYI(); leaveJVM(); }
+
 jint JNICALL JVM_FindSignal(const char *name) { 
 	jint res = 0;
 

Modified: vmkit/branches/mcjit/lib/j3/vm/j3.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3.cc?rev=198568&r1=198567&r2=198568&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Sun Jan  5 14:26:32 2014
@@ -74,6 +74,8 @@ void J3::start(int argc, char** argv) {
 	J3Thread* thread = new J3ThreadBootstrap(this);
 
 	vmkitBootstrap(thread, options()->selfBitCodePath);	
+
+	fprintf(stderr, "  vm is bootstraped, congratulation!\n");
 }
 
 void J3::run() {

Modified: vmkit/branches/mcjit/lib/vmkit/thread.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/thread.cc?rev=198568&r1=198567&r2=198568&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/vmkit/thread.cc (original)
+++ vmkit/branches/mcjit/lib/vmkit/thread.cc Sun Jan  5 14:26:32 2014
@@ -12,10 +12,6 @@ void Thread::sigsegvHandler(int n, sigin
 	get()->vm()->sigsegv((uintptr_t)info->si_addr);
 }
 
-void Thread::sigendHandler(int n, siginfo_t* info, void* context) {
-	get()->vm()->sigend();
-}
-
 void* Thread::operator new(size_t n) {
 	return ThreadAllocator::allocator()->allocate();
 }
@@ -36,39 +32,39 @@ uintptr_t Thread::getThreadMask() {
 	return ThreadAllocator::allocator()->magic();
 }
 
-void* Thread::doRun(void* _thread) {
-	Thread* thread = (Thread*)_thread;
-
-  // Set the alternate stack as the second page of the thread's
-  // stack.
-  stack_t st;
-  st.ss_sp = ThreadAllocator::allocator()->alternateStackAddr(thread);
-  st.ss_flags = 0;
-  st.ss_size = ThreadAllocator::allocator()->alternateStackSize(thread);
-  sigaltstack(&st, NULL);
-
+void Thread::registerSignalInternal(int n, sa_action_t handler, bool altStack) {
   // Set the SIGSEGV handler to diagnose errors.
   struct sigaction sa;
   sigset_t mask;
   sigfillset(&mask);
   sa.sa_flags = SA_SIGINFO | SA_ONSTACK | SA_NODEFER;
+	if(altStack)
+		sa.sa_flags = SA_ONSTACK;
   sa.sa_mask = mask;
-  sa.sa_sigaction = sigsegvHandler;
-  sigaction(SIGSEGV, &sa, NULL);
-  sigaction(SIGBUS, &sa, NULL);
+  sa.sa_sigaction = handler;
+  sigaction(n, &sa, NULL);
+}
+
+bool Thread::registerSignal(int n, sa_action_t handler) {
+	if(n == SIGSEGV || n == SIGBUS)
+		return 0;
+	registerSignalInternal(n, handler, 0);
+	return 1;
+}
 
-  // to handle termination
+void* Thread::doRun(void* _thread) {
+	Thread* thread = (Thread*)_thread;
+
+  // Set the alternate stack as the second page of the thread's
+  // stack.
+  stack_t st;
   st.ss_sp = ThreadAllocator::allocator()->alternateStackAddr(thread);
   st.ss_flags = 0;
   st.ss_size = ThreadAllocator::allocator()->alternateStackSize(thread);
   sigaltstack(&st, NULL);
-  sigfillset(&mask);
-  sa.sa_flags = SA_SIGINFO | SA_ONSTACK | SA_NODEFER;
-  sa.sa_mask = mask;
-  sa.sa_sigaction = sigendHandler;
-  //sigaction(SIGHUP, &sa, NULL);
-	//sigaction(SIGINT, &sa, NULL);
-  //sigaction(SIGTERM, &sa, NULL);
+
+	thread->registerSignalInternal(SIGSEGV, sigsegvHandler, 1);
+	thread->registerSignalInternal(SIGBUS, sigsegvHandler, 1);
 
 	thread->run();
 	return 0;





More information about the vmkit-commits mailing list