[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