4 // Note by hs: my signal.h includes sys/uconctext which conflicts with
5 // asm/ucontext - this hack kinda solves the problem for me ;-)
6 // so feel free to blame me for that s**t
7 #if defined __USE_XOPEN2K8
10 #warning hs-hack: undefining __USE_XOPEN2K8 for signal.h
14 #define __USE_XOPEN2K8
17 #include <asm/ucontext.h>
19 unsigned int getMethodEntry(unsigned int, void *, void *);
21 #define NEW_MAP(prefix) \
22 void* prefix ## _map = NULL; \
23 void set_ ## prefix ## map(void *map) \
25 printf("set_%s: 0x%08x\n", #prefix , (unsigned int) map); \
26 prefix ## _map = map; \
28 void *get_ ## prefix ## map() \
30 printf("get_%s: 0x%08x\n", #prefix , (unsigned int) prefix ## _map); \
31 return prefix ## _map; \
39 void mainresult(unsigned int a)
41 printf("mainresult: 0x%08x\n", a);
44 void callertrap(int nSignal, siginfo_t *info, void *ctx)
46 struct ucontext *uctx = (struct ucontext *) ctx;
47 unsigned int from = (unsigned int) uctx->uc_mcontext.eip - 2;
48 unsigned int patchme = getMethodEntry(from, method_map, caller_map);
50 printf("callertrap(mctx) by 0x%08x\n", from);
52 unsigned int *to_patch = (unsigned int *) (from + 1);
53 unsigned char *insn = (unsigned char *) from;
54 *insn = 0xe8; // call opcode
55 printf(" to_patch: 0x%08x\n", (unsigned int) to_patch);
56 printf("*to_patch: 0x%08x\n", *to_patch);
57 if (*to_patch != 0x90ffff90) {
58 printf("something is wrong here. abort\n");
61 *to_patch = patchme - (from + 5);
62 printf("*to_patch: 0x%08x\n", *to_patch);
63 uctx->uc_mcontext.eip = (unsigned long) insn;
67 void register_signal(void)
69 struct sigaction segvaction;
70 segvaction.sa_sigaction = callertrap;
71 sigemptyset(&segvaction.sa_mask);
72 segvaction.sa_flags = SA_SIGINFO | SA_RESTART;
73 sigaction(SIGILL, &segvaction, NULL);
76 unsigned int getaddr(void)
78 return (unsigned int) mainresult;