X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=ffi%2Ftrap.c;h=301f2060ce47f5252bb4d2dfd73112efa069d9a7;hb=13cf9f65321881050edb99776f29eea8580ec457;hp=897fa7f522194f777cc8d436ba6247c34a8d810b;hpb=73099439d888ced6806791d0e24b2ffae4086f51;p=mate.git diff --git a/ffi/trap.c b/ffi/trap.c index 897fa7f..301f206 100644 --- a/ffi/trap.c +++ b/ffi/trap.c @@ -1,65 +1,61 @@ #include #include -#include -#include +#include -unsigned int getMethodEntry(void *, char *); -void *method_map = NULL; +#include "../debug.h" -void set_mmap(void *mmap) -{ - printf("set_mmap: 0x%08x\n", (unsigned int) mmap); - method_map = mmap; -} +/* TODO(bernhard): use {u,}int* types */ -void *get_mmap() -{ - printf("get_mmap: 0x%08x\n", (unsigned int) method_map); - return method_map; -} +#define __USE_GNU +// Note by hs: my signal.h includes sys/uconctext which conflicts with +// asm/ucontext - this hack kinda solves the problem for me ;-) +// so feel free to blame me for that s**t +#if defined __USE_XOPEN2K8 +#undef __USE_XOPEN2K8 +#define RESTORE +#warning hs-hack: undefining __USE_XOPEN2K8 for signal.h +#endif +#include +#ifdef RESTORE +#define __USE_XOPEN2K8 +#endif +#include -void mainresult(unsigned int a) -{ - printf("mainresult: 0x%08x\n", a); -} +ptrdiff_t mateHandler(ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t); + +#ifdef DBG_TRAP +#define dprintf(args...) do { printf (args); } while (0); +#else +#define dprintf(args...) +#endif -void callertrap(int nSignal, siginfo_t *info, void *ctx) +void chandler(int nSignal, siginfo_t *info, void *ctx) { - struct ucontext *uctx = (struct ucontext *) ctx; - unsigned int patchme = getMethodEntry(method_map, "fib"); + mcontext_t *mctx = &((ucontext_t *) ctx)->uc_mcontext; - printf("callertrap(mctx) by 0x%08x\n", (unsigned int) uctx->uc_mcontext.eip); - // printf("callertrap(addr) by 0x%08x\n", info->si_addr); - // printf("callertrap(*esp) by 0x%08x\n", * (unsigned int *) uctx->uc_mcontext.esp); + ptrdiff_t eip = (ptrdiff_t) mctx->gregs[REG_EIP]; + ptrdiff_t eax = (ptrdiff_t) mctx->gregs[REG_EAX]; + ptrdiff_t ebx = (ptrdiff_t) mctx->gregs[REG_EBX]; + ptrdiff_t esp = (ptrdiff_t) mctx->gregs[REG_ESP]; + dprintf("trap: type %d, eip 0x%08x, eax 0x%08x, ebx 0x%08x, " + "esp 0x%08x, *esp 0x%08x\n", nSignal, eip, + eax, ebx, esp, *(ptrdiff_t*) esp); - unsigned int *to_patch = (unsigned int *) (uctx->uc_mcontext.eip + 2); - unsigned char *insn = (unsigned char *) (uctx->uc_mcontext.eip); - *insn = 0x90; // nop - insn++; - *insn = 0xe8; // call - printf(" to_patch: 0x%08x\n", (unsigned int) to_patch); - printf("*to_patch: 0x%08x\n", *to_patch); - if (*to_patch != 0x00000000) { - printf("something is wrong here. abort\n"); - exit(0); - } - *to_patch = (unsigned int) patchme - ((unsigned int) insn + 5); - printf("*to_patch: 0x%08x\n", *to_patch); - uctx->uc_mcontext.eip = (unsigned long) insn; - // while (1) ; + mctx->gregs[REG_EIP] = mateHandler(eip, eax, ebx, esp); } void register_signal(void) { + struct sigaction illaction; + illaction.sa_sigaction = chandler; + sigemptyset(&illaction.sa_mask); + illaction.sa_flags = SA_SIGINFO | SA_RESTART | SA_NODEFER; + sigaction(SIGILL, &illaction, NULL); + struct sigaction segvaction; - segvaction.sa_sigaction = callertrap; + segvaction.sa_sigaction = chandler; sigemptyset(&segvaction.sa_mask); - segvaction.sa_flags = SA_SIGINFO | SA_RESTART; + segvaction.sa_flags = SA_SIGINFO | SA_RESTART | SA_NODEFER; sigaction(SIGSEGV, &segvaction, NULL); } - -unsigned int getaddr(void) -{ - return (unsigned int) mainresult; -}