[vmkit-commits] [vmkit] r198293 - install a sigsegv handler

Gael Thomas gael.thomas at lip6.fr
Thu Jan 2 01:30:45 PST 2014


Author: gthomas
Date: Thu Jan  2 03:30:43 2014
New Revision: 198293

URL: http://llvm.org/viewvc/llvm-project?rev=198293&view=rev
Log:
install a sigsegv handler

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

Modified: vmkit/branches/mcjit/include/j3/j3class.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=198293&r1=198292&r2=198293&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3class.h (original)
+++ vmkit/branches/mcjit/include/j3/j3class.h Thu Jan  2 03:30:43 2014
@@ -30,6 +30,7 @@ namespace j3 {
 	class J3Method;
 	class J3Field;
 	class J3Attributes;
+	class J3Attribute;
 
 	class J3InterfaceSlotDescriptor {
 	public:
@@ -210,6 +211,8 @@ namespace j3 {
 	public:
 		J3Class(J3ClassLoader* loader, const vmkit::Name* name, J3ClassBytes* bytes);
 
+		J3ObjectHandle*     extractAttribute(J3Attribute* attr);
+
 		J3StaticLayout*     staticLayout() { return &_staticLayout; }
 
 		size_t              nbInterfaces() { return _nbInterfaces; }

Modified: vmkit/branches/mcjit/include/vmkit/allocator.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/allocator.h?rev=198293&r1=198292&r2=198293&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/vmkit/allocator.h (original)
+++ vmkit/branches/mcjit/include/vmkit/allocator.h Thu Jan  2 03:30:43 2014
@@ -135,6 +135,9 @@ namespace vmkit {
 		void* allocate();
 		void  release(void* thread);
 
+		void*     alternateStackAddr(void* thread);
+		size_t    alternateStackSize(void* thread); 
+
 		void*     stackAddr(void* thread);
 		size_t    stackSize(void* thread); 
 

Modified: vmkit/branches/mcjit/include/vmkit/thread.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/thread.h?rev=198293&r1=198292&r2=198293&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/vmkit/thread.h (original)
+++ vmkit/branches/mcjit/include/vmkit/thread.h Thu Jan  2 03:30:43 2014
@@ -3,6 +3,7 @@
 
 #define UNW_LOCAL_ONLY
 #include <libunwind.h>
+#include <signal.h>
 
 #include "vmkit/allocator.h"
 
@@ -14,6 +15,8 @@ namespace vmkit {
 		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);
 
 	public:
 		Thread(VMKit* vm);

Modified: vmkit/branches/mcjit/include/vmkit/vmkit.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/vmkit.h?rev=198293&r1=198292&r2=198293&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/vmkit/vmkit.h (original)
+++ vmkit/branches/mcjit/include/vmkit/vmkit.h Thu Jan  2 03:30:43 2014
@@ -65,6 +65,8 @@ namespace vmkit {
 		void log(const wchar_t* msg, ...);
 
 		virtual void vinternalError(const wchar_t* msg, va_list va) __attribute__((noreturn));
+		virtual void sigsegv(uintptr_t addr) __attribute__((noreturn));
+		virtual void sigend() __attribute__((noreturn));
 
 		static void internalError(const wchar_t* msg, ...) __attribute__((noreturn));		
 		static void throwException(void* obj) __attribute__((noreturn));

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=198293&r1=198292&r2=198293&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original)
+++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Thu Jan  2 03:30:43 2014
@@ -48,7 +48,23 @@ jobject JNICALL JVM_Clone(JNIEnv* env, j
 /*
  * java.lang.String
  */
-jstring JNICALL JVM_InternString(JNIEnv* env, jstring str) { enterJVM(); NYI(); leaveJVM(); }
+jstring JNICALL JVM_InternString(JNIEnv* env, jstring str) { 
+	jstring res;
+	enterJVM(); 
+
+	J3* vm = J3Thread::get()->vm();
+	J3ObjectHandle* value = str->getObject(vm->stringClassValue);
+	uint32_t length = value->arrayLength();
+	wchar_t copy[length];
+
+	for(uint32_t i=0; i<length; i++)
+		copy[i] = value->getCharAt(length);
+
+	res = vm->nameToString(vm->names()->get(copy));
+
+	leaveJVM(); 
+	return res;
+}
 
 /*
  * java.lang.System
@@ -408,7 +424,6 @@ jobjectArray JNICALL JVM_GetClassDeclare
 	} else
 		res = J3ObjectHandle::doNewArray(type->loader()->vm()->fieldClass->getArray(), 0);
 
-	NYI(); 
 	leaveJVM();
  
 	return res;

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=198293&r1=198292&r2=198293&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Thu Jan  2 03:30:43 2014
@@ -224,7 +224,7 @@ void J3::vinternalError(const wchar_t* m
 	vswprintf(buf, 65536, msg, va);
 	fprintf(stderr, "Internal error: %ls\n", buf);
 	printStackTrace();
-	abort();
+	exit(1);
 }
 
 void J3::printStackTrace() {

Modified: vmkit/branches/mcjit/lib/j3/vm/j3class.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3class.cc?rev=198293&r1=198292&r2=198293&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Thu Jan  2 03:30:43 2014
@@ -292,6 +292,13 @@ J3Class::J3Class(J3ClassLoader* loader,
 	status = LOADED;
 }
 
+J3ObjectHandle* J3Class::extractAttribute(J3Attribute* attr) {
+	if(attr)
+		J3::internalError(L"extract attribute");
+	else
+		return J3ObjectHandle::doNewArray(loader()->vm()->typeByte->getArray(), 0);
+}
+
 J3Method* J3Class::findVirtualMethod(const vmkit::Name* name, const vmkit::Name* sign, bool error) {
 	//loader()->vm()->log(L"Lookup: %ls %ls in %ls (%d)", methName->cStr(), methSign->cStr(), name()->cStr(), nbVirtualMethods);
 	resolve();

Modified: vmkit/branches/mcjit/lib/j3/vm/j3field.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3field.cc?rev=198293&r1=198292&r2=198293&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3field.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3field.cc Thu Jan  2 03:30:43 2014
@@ -4,6 +4,7 @@
 #include "j3/j3.h"
 #include "j3/j3method.h"
 #include "j3/j3thread.h"
+#include "j3/j3attribute.h"
 
 using namespace j3;
 
@@ -11,23 +12,24 @@ J3ObjectHandle* J3Field::javaField() {
 	if(!_javaField) {
 		layout()->lock();
 
-		J3ObjectHandle* prev = J3Thread::get()->tell();
-		_javaField = layout()->loader()->globalReferences()->add(J3ObjectHandle::doNewObject(layout()->loader()->vm()->fieldClass));
+		if(!_javaField) {
+			J3ObjectHandle* prev = J3Thread::get()->tell();
+			_javaField = layout()->loader()->globalReferences()->add(J3ObjectHandle::doNewObject(layout()->loader()->vm()->fieldClass));
+
+			J3* vm = layout()->loader()->vm();
+
+			vm->fieldClassInit->invokeSpecial(_javaField,                       /* this */
+																				layout()->javaClass(),            /* declaring class */
+																				vm->nameToString(name()),         /* name */
+																				type()->javaClass(),              /* type */
+																				access(),                         /* access */
+																				slot(),                           /* slot */
+																				vm->nameToString(type()->name()), /* signature */
+																				layout()
+																				->asClass()->extractAttribute(attributes()->lookup(vm->annotationsAttribute)));/* annotations */
 
-		J3* vm = layout()->loader()->vm();
-
-		vm->fieldClassInit->invokeSpecial(_javaField,                       /* this */
-																			0,//layout()->javaClass(),            /* declaring class */
-																			0,//vm->nameToString(name()),         /* name */
-																			0,//type()->javaClass(),              /* type */
-																			0,//access(),                         /* access */
-																			0,//slot(),                           /* slot */
-																			0,//vm->nameToString(type()->name()), /* signature */
-																			0);                               /* annotations */
-
-
-		J3Thread::get()->restore(prev);
-		J3::internalError(L"implement me: javaField");
+			J3Thread::get()->restore(prev);
+		}
 		layout()->unlock();
 	}
 	return _javaField;

Modified: vmkit/branches/mcjit/lib/vmkit/allocator.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/allocator.cc?rev=198293&r1=198292&r2=198293&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/vmkit/allocator.cc (original)
+++ vmkit/branches/mcjit/lib/vmkit/allocator.cc Thu Jan  2 03:30:43 2014
@@ -95,9 +95,9 @@ ThreadAllocator::ThreadAllocator(uintptr
 	freeThreads.reserve(refill);
 
 	minThreadStruct = ((minThreadStruct - 1) & -PAGE_SIZE) + PAGE_SIZE;
-	baseStack = minThreadStruct;
+	baseStack = minThreadStruct + PAGE_SIZE;
 
-	uintptr_t min = PTHREAD_STACK_MIN + minThreadStruct + PAGE_SIZE;
+	uintptr_t min = PTHREAD_STACK_MIN + minThreadStruct + (PAGE_SIZE<<1);
 	if(minFullSize < min)
 		minFullSize = min;
 
@@ -153,3 +153,11 @@ void* ThreadAllocator::stackAddr(void* t
 size_t ThreadAllocator::stackSize(void* thread) {
 	return topStack - baseStack;
 }
+
+void* ThreadAllocator::alternateStackAddr(void* thread) {
+	return (void*)((uintptr_t)thread + baseStack - PAGE_SIZE);
+}
+
+size_t ThreadAllocator::alternateStackSize(void* thread) {
+	return PAGE_SIZE;
+}

Modified: vmkit/branches/mcjit/lib/vmkit/thread.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/thread.cc?rev=198293&r1=198292&r2=198293&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/vmkit/thread.cc (original)
+++ vmkit/branches/mcjit/lib/vmkit/thread.cc Thu Jan  2 03:30:43 2014
@@ -8,6 +8,14 @@ Thread::Thread(VMKit* vm) {
 	_vm = vm; 
 }
 
+void Thread::sigsegvHandler(int n, siginfo_t* info, void* context) {
+	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();
 }
@@ -30,6 +38,38 @@ uintptr_t Thread::getThreadMask() {
 
 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);
+
+  // Set the SIGSEGV handler to diagnose errors.
+  struct sigaction sa;
+  sigset_t mask;
+  sigfillset(&mask);
+  sa.sa_flags = SA_SIGINFO | SA_ONSTACK | SA_NODEFER;
+  sa.sa_mask = mask;
+  sa.sa_sigaction = sigsegvHandler;
+  sigaction(SIGSEGV, &sa, NULL);
+  sigaction(SIGBUS, &sa, NULL);
+
+  // to handle termination
+  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->run();
 	return 0;
 }

Modified: vmkit/branches/mcjit/lib/vmkit/vmkit.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/vmkit.cc?rev=198293&r1=198292&r2=198293&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/vmkit/vmkit.cc (original)
+++ vmkit/branches/mcjit/lib/vmkit/vmkit.cc Thu Jan  2 03:30:43 2014
@@ -175,6 +175,14 @@ void VMKit::internalError(const wchar_t*
 	abort();
 }
 
+void VMKit::sigsegv(uintptr_t addr) {
+	internalError(L"sigsegv at %p", (void*)addr);
+}
+
+void VMKit::sigend() {
+	internalError(L"sig terminate");
+}
+
 static int fake = 0;
 
 void VMKit::throwException(void* obj) {





More information about the vmkit-commits mailing list