about summary refs log tree commit diff stats
path: root/src/include/myalign.h
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-05 10:16:02 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-05 10:16:02 +0100
commit7716633bf762db3e57e51e325d045d4a3eebdb50 (patch)
tree9a2bf4df911a4ed1c4acc2cfe8fb5f9faceb3342 /src/include/myalign.h
parent2e3c25f8e17fd73edd59d3e818e48e56f373c058 (diff)
downloadbox64-7716633bf762db3e57e51e325d045d4a3eebdb50.tar.gz
box64-7716633bf762db3e57e51e325d045d4a3eebdb50.zip
Added printf wrapped function and some VA_ARG work
Diffstat (limited to 'src/include/myalign.h')
-rwxr-xr-xsrc/include/myalign.h43
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