123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- #include <stddef.h>
- #include <stdio.h>
- #include <string.h>
- void *func[8], **pfunc;
- typedef struct xxx xxx_t;
- struct xxx {
- int dummy;
- void **pfunc;
- } q;
- #define XF_strcpy 3
- #define XF_printf 4
- #define LABEL(x) \
- asm volatile ( \
- #if defined(__i386__)
- #define EXPORT_FUNC(x) \
- asm volatile ( \
- " .globl mon_" #x "\n" \
- "mon_" #x ":\n" \
- " movl %0, %%eax\n" \
- " movl pfunc, %%ecx\n" \
- " jmp *(%%ecx,%%eax)\n" \
- : : "i"(XF_ ## x * sizeof(void *)) : "eax", "ecx");
- #elif defined(__powerpc__)
- #define EXPORT_FUNC(x) \
- asm volatile ( \
- " .globl mon_" #x "\n" \
- "mon_" #x ":\n" \
- " lwz %%r11, %0(%%r2)\n" \
- " lwz %%r11, %1(%%r11)\n" \
- " mtctr %%r11\n" \
- " bctr\n" \
- : : "i"(offsetof(xxx_t, pfunc)), "i"(XF_ ## x * sizeof(void *)) : "r11", "r2");
- #elif defined(__arm__)
- #define EXPORT_FUNC(x) \
- asm volatile ( \
- " .globl mon_" #x "\n" \
- "mon_" #x ":\n" \
- " ldr ip, [r8, %0]\n" \
- " ldr pc, [ip, %1]\n" \
- : : "i"(offsetof(xxx_t, pfunc)), "i"(XF_ ## x * sizeof(void *)) : "ip");
- #elif defined(__mips__)
- #define EXPORT_FUNC(x) \
- asm volatile ( \
- " .globl mon_" #x "\n" \
- "mon_" #x ":\n" \
- " lw $25, %0($26)\n" \
- " lw $25, %1($25)\n" \
- " jr $25\n" \
- : : "i"(offsetof(xxx_t, pfunc)), "i"(XF_ ## x * sizeof(void *)) : "t9");
- #else
- #error [No stub code for this arch]
- #endif
- void dummy(void)
- {
- EXPORT_FUNC(printf)
- EXPORT_FUNC(strcpy)
- }
- int main(void)
- {
- #if defined(__i386__)
- xxx_t *pq;
- #elif defined(__powerpc__)
- register volatile xxx_t *pq asm("r2");
- #elif defined(__arm__)
- register volatile xxx_t *pq asm("r8");
- #elif defined(__mips__)
- register volatile xxx_t *pq asm("k0");
- #endif
- char buf[32];
- func[XF_strcpy] = strcpy;
- func[XF_printf] = printf;
- pq = &q;
- pq->pfunc = pfunc = func;
- mon_strcpy(buf, "test");
- mon_printf("hi %s %d z\n", buf, 444);
- return 0;
- }
|