diff options
Diffstat (limited to 'src/include')
| -rwxr-xr-x | src/include/myalign.h | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/src/include/myalign.h b/src/include/myalign.h new file mode 100755 index 00000000..1d5a6b72 --- /dev/null +++ b/src/include/myalign.h @@ -0,0 +1,43 @@ +#include <stdint.h> + +#ifdef __x86_64__ +// x86_64, 6 64bits general regs and 16 or 8? 128bits float regs +#define CREATE_SYSV_VALIST(A) \ + va_list sysv_varargs; \ + sysv_varargs->gp_offset=(6*8); \ + sysv_varargs->fp_offset=(6*8)+(16*16); \ + sysv_varargs->overflow_arg_area=A; +#elif defined(__aarch64__) +// aarch64: 8 64bits general regs and 8 128bits float regs +#define CREATE_SYSV_VALIST(A) \ + va_list sysv_varargs; \ + sysv_varargs->gp_offset=(8*8); \ + sysv_varargs->fp_offset=(8*8)+(8*16); \ + sysv_varargs->overflow_arg_area=A; +#elif defined(__powerpc64__) +// TODO, is this correct? +#define CREATE_SYSV_VALIST(A) \ + va_list sysv_varargs; \ + sysv_varargs->gpr=8; \ + sysv_varargs->fpr=8; \ + sysv_varargs->overflow_arg_area=A; +#else +#error Unknown architecture! +#endif + + +#define VARARGS sysv_varargs +#define PREPARE_VALIST CREATE_SYSV_VALIST(emu->scratch) +#define VARARGS_(A) sysv_varargs +#define PREPARE_VALIST_(A) CREATE_SYSV_VALIST(A) + +typedef struct x64emu_s x64emu_t; + +// 1st pos is of vaarg is 0, not 1! +void myStackAlign(x64emu_t* emu, const char* fmt, uint64_t* st, uint64_t* mystack, int xmm, int pos); +void myStackAlignGVariantNew(x64emu_t* emu, const char* fmt, uint64_t* st, uint64_t* mystack, int xmm, int pos); +void myStackAlignW(x64emu_t* emu, const char* fmt, uint64_t* st, uint64_t* mystack, int xmm, int pos); + +// defined in wrapperlibc.c +int of_convert(int); // x86->arm +int of_unconvert(int); // arm->x86 |