diff options
Diffstat (limited to 'examples/standalone/x86-testapp.c')
| -rw-r--r-- | examples/standalone/x86-testapp.c | 87 | 
1 files changed, 87 insertions, 0 deletions
| diff --git a/examples/standalone/x86-testapp.c b/examples/standalone/x86-testapp.c new file mode 100644 index 000000000..e8603d9ba --- /dev/null +++ b/examples/standalone/x86-testapp.c @@ -0,0 +1,87 @@ +#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; +} |