[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