X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=ffi%2Ftrap.c;h=f6281d013ad770c7a23aebdebcaa284049dbca98;hb=34939ca19d5f608efb04dcb2cdd97dd3f922d4a6;hp=60b8048cb9c410d0078f0236d9c02d9a1f823277;hpb=8a8d82b07b7ff61f8e9fce4612721ce4b5c6eebf;p=mate.git diff --git a/ffi/trap.c b/ffi/trap.c index 60b8048..f6281d0 100644 --- a/ffi/trap.c +++ b/ffi/trap.c @@ -1,7 +1,6 @@ #include #include - -#include "../debug.h" +#include /* TODO(bernhard): use {u,}int* types */ @@ -21,8 +20,7 @@ #include -unsigned int mallocObject(int); -unsigned int mateHandler(unsigned int, unsigned int, unsigned int, unsigned int); +ptrdiff_t mateHandler(ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t); #ifdef DBG_TRAP #define dprintf(args...) do { printf (args); } while (0); @@ -30,24 +28,32 @@ unsigned int mateHandler(unsigned int, unsigned int, unsigned int, unsigned int) #define dprintf(args...) #endif -void mainresult(unsigned int a) -{ - dprintf("mainresult: 0x%08x\n", a); -} - void chandler(int nSignal, siginfo_t *info, void *ctx) { mcontext_t *mctx = &((ucontext_t *) ctx)->uc_mcontext; + greg_t *regs = mctx->gregs; - unsigned int eip = (unsigned int) mctx->gregs[REG_EIP]; - unsigned int eax = (unsigned int) mctx->gregs[REG_EAX]; - unsigned int ebx = (unsigned int) mctx->gregs[REG_EBX]; - unsigned int esp = (unsigned int) 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, *(unsigned int*) esp); + ptrdiff_t eip = (ptrdiff_t) regs[REG_EIP]; + ptrdiff_t eax = (ptrdiff_t) regs[REG_EAX]; + ptrdiff_t ebx = (ptrdiff_t) regs[REG_EBX]; + ptrdiff_t esp = (ptrdiff_t) regs[REG_ESP]; + ptrdiff_t esi = (ptrdiff_t) regs[REG_ESI]; + ptrdiff_t ebp = (ptrdiff_t) regs[REG_EBP]; + dprintf("trap: type %d, eip 0x%08x, eax 0x%08x, ebx 0x%08x, \n" + "esp 0x%08x, *esp 0x%08x, *(ebp+8) 0x%08x\n", nSignal, eip, + eax, ebx, esp, *(ptrdiff_t*) esp, *(ptrdiff_t *) (ebp + 8)); - mctx->gregs[REG_EIP] = mateHandler(eip, eax, ebx, esp); + ptrdiff_t ret = mateHandler(eip, eax, ebx, esi, esp); + if (ret == -1) { + dprintf("regdump @ EIP: 0x%08x\n", regs[REG_EIP]); + dprintf("\tEAX: 0x%08lx EBX: 0x%08lx ECX: 0x%08lx EDX: 0x%08lx\n", + regs[REG_EAX], regs[REG_EBX], regs[REG_ECX], regs[REG_EDX]); + dprintf("\tESI: 0x%08lx EDI: 0x%08lx EBP: 0x%08lx ESP: 0x%08lx\n", + regs[REG_ESI], regs[REG_EDI], regs[REG_EBP], regs[REG_ESP]); + mctx->gregs[REG_EIP] = eip + 6; + } else { + mctx->gregs[REG_EIP] = ret; + } } void register_signal(void) @@ -64,13 +70,3 @@ void register_signal(void) segvaction.sa_flags = SA_SIGINFO | SA_RESTART | SA_NODEFER; sigaction(SIGSEGV, &segvaction, NULL); } - -unsigned int getaddr(void) -{ - return (unsigned int) mainresult; -} - -unsigned int getMallocObjectAddr(void) -{ - return (unsigned int) mallocObject; -}