X-Git-Url: http://wien.tomnetworks.com/gitweb/?p=mate.git;a=blobdiff_plain;f=ffi%2Ftrap.c;h=75d4c1729081a95d8ce857084d153b9eae472763;hp=301f2060ce47f5252bb4d2dfd73112efa069d9a7;hb=8981d77c48cc12673620159b4f6b8274b07abddf;hpb=717a866d25642626b22b9b3abbd8f98ce95c5e10 diff --git a/ffi/trap.c b/ffi/trap.c index 301f206..75d4c17 100644 --- a/ffi/trap.c +++ b/ffi/trap.c @@ -22,7 +22,7 @@ #include -ptrdiff_t mateHandler(ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t); +ptrdiff_t mateHandler(ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t); #ifdef DBG_TRAP #define dprintf(args...) do { printf (args); } while (0); @@ -33,16 +33,28 @@ ptrdiff_t mateHandler(ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t); void chandler(int nSignal, siginfo_t *info, void *ctx) { mcontext_t *mctx = &((ucontext_t *) ctx)->uc_mcontext; + greg_t *regs = mctx->gregs; - 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]; + 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]; 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); - mctx->gregs[REG_EIP] = mateHandler(eip, eax, ebx, esp); + ptrdiff_t ret = mateHandler(eip, eax, ebx, esp, esi); + 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)