x86-testapp.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #include <stddef.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. void *func[8], **pfunc;
  5. typedef struct xxx xxx_t;
  6. struct xxx {
  7. int dummy;
  8. void **pfunc;
  9. } q;
  10. #define XF_strcpy 3
  11. #define XF_printf 4
  12. #define LABEL(x) \
  13. asm volatile ( \
  14. #if defined(__i386__)
  15. #define EXPORT_FUNC(x) \
  16. asm volatile ( \
  17. " .globl mon_" #x "\n" \
  18. "mon_" #x ":\n" \
  19. " movl %0, %%eax\n" \
  20. " movl pfunc, %%ecx\n" \
  21. " jmp *(%%ecx,%%eax)\n" \
  22. : : "i"(XF_ ## x * sizeof(void *)) : "eax", "ecx");
  23. #elif defined(__powerpc__)
  24. #define EXPORT_FUNC(x) \
  25. asm volatile ( \
  26. " .globl mon_" #x "\n" \
  27. "mon_" #x ":\n" \
  28. " lwz %%r11, %0(%%r2)\n" \
  29. " lwz %%r11, %1(%%r11)\n" \
  30. " mtctr %%r11\n" \
  31. " bctr\n" \
  32. : : "i"(offsetof(xxx_t, pfunc)), "i"(XF_ ## x * sizeof(void *)) : "r11", "r2");
  33. #elif defined(__arm__)
  34. #define EXPORT_FUNC(x) \
  35. asm volatile ( \
  36. " .globl mon_" #x "\n" \
  37. "mon_" #x ":\n" \
  38. " ldr ip, [r8, %0]\n" \
  39. " ldr pc, [ip, %1]\n" \
  40. : : "i"(offsetof(xxx_t, pfunc)), "i"(XF_ ## x * sizeof(void *)) : "ip");
  41. #elif defined(__mips__)
  42. #define EXPORT_FUNC(x) \
  43. asm volatile ( \
  44. " .globl mon_" #x "\n" \
  45. "mon_" #x ":\n" \
  46. " lw $25, %0($26)\n" \
  47. " lw $25, %1($25)\n" \
  48. " jr $25\n" \
  49. : : "i"(offsetof(xxx_t, pfunc)), "i"(XF_ ## x * sizeof(void *)) : "t9");
  50. #elif defined(__nds32__)
  51. #define EXPORT_FUNC(x) \
  52. asm volatile ( \
  53. " .globl mon_" #x "\n" \
  54. "mon_" #x ":\n" \
  55. " lwi $r16, [$gp + (%0)]\n" \
  56. " lwi $r16, [$r16 + (%1)]\n" \
  57. " jr $r16\n" \
  58. : : "i"(offsetof(xxx_t, pfunc)), \
  59. "i"(XF_ ## x * sizeof(void *)) : "$r16");
  60. #else
  61. #error [No stub code for this arch]
  62. #endif
  63. void dummy(void)
  64. {
  65. EXPORT_FUNC(printf)
  66. EXPORT_FUNC(strcpy)
  67. }
  68. int main(void)
  69. {
  70. #if defined(__i386__)
  71. xxx_t *pq;
  72. #elif defined(__powerpc__)
  73. register volatile xxx_t *pq asm("r2");
  74. #elif defined(__arm__)
  75. register volatile xxx_t *pq asm("r8");
  76. #elif defined(__mips__)
  77. register volatile xxx_t *pq asm("k0");
  78. #elif defined(__nds32__)
  79. register volatile xxx_t *pq asm("$r16");
  80. #endif
  81. char buf[32];
  82. func[XF_strcpy] = strcpy;
  83. func[XF_printf] = printf;
  84. pq = &q;
  85. pq->pfunc = pfunc = func;
  86. mon_strcpy(buf, "test");
  87. mon_printf("hi %s %d z\n", buf, 444);
  88. return 0;
  89. }