diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-08 18:34:07 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-08 18:34:07 +0100 |
| commit | 62c22e55e704edd4cd5fdb0b95eb9f9f79bc37fe (patch) | |
| tree | 3b8aa89489eec843737a8942b5e3c20109fc8f76 /src/include | |
| parent | 23eef578f76ef2bd1bf03726e227129fdcc7ec6e (diff) | |
| download | box64-62c22e55e704edd4cd5fdb0b95eb9f9f79bc37fe.tar.gz box64-62c22e55e704edd4cd5fdb0b95eb9f9f79bc37fe.zip | |
Attempts at conversion of va_list
Diffstat (limited to 'src/include')
| -rwxr-xr-x | src/include/myalign.h | 35 |
1 files changed, 33 insertions, 2 deletions
diff --git a/src/include/myalign.h b/src/include/myalign.h index 9789894f..29de8c4f 100755 --- a/src/include/myalign.h +++ b/src/include/myalign.h @@ -1,5 +1,15 @@ #include <stdint.h> +typedef struct x64_va_list_s { + unsigned int gp_offset; + unsigned int fp_offset; + void *overflow_arg_area; + void *reg_save_area; +} x64_va_list_t[1]; + +#define X64_VA_MAX_REG (6*8) +#define X64_VA_MAX_XMM ((6*8)+(8*16)) + #ifdef __x86_64__ // x86_64, 6 64bits general regs and 16 or 8? 128bits float regs /* @@ -13,10 +23,19 @@ typedef struct { */ #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->gp_offset=X64_VA_MAX_REG; \ + sysv_varargs->fp_offset=X64_VA_MAX_XMM; \ sysv_varargs->reg_save_area=A; \ sysv_varargs->overflow_arg_area=A; + +#define CONVERT_VALIST(A) \ + va_list sysv_varargs; \ + sysv_varargs->gp_offset=A->gp_offset; \ + sysv_varargs->fp_offset=A->fp_offset; \ + sysv_varargs->reg_save_area=A->reg_save_area; \ + sysv_varargs->overflow_arg_area=A->overflow_arg_area; + + #elif defined(__aarch64__) // aarch64: 8 64bits general regs and 8 128bits float regs /* @@ -34,6 +53,15 @@ typedef struct va_list { sysv_varargs.__gr_offs=(8*8); \ sysv_varargs.__vr_offs=(8*16); \ sysv_varargs.__stack=A; + +#define CONVERT_VALIST(A) \ + va_list sysv_varargs; \ + sysv_varargs.__gr_offs=(2+A->gp_offset)*8; \ + sysv_varargs.__vr_offs=A->fp_offset; \ + sysv_varargs.stack=A->overflow_arg_area; \ + sysv_varargs.gr_top=A->reg_save_area + X64_VA_MAX_REG; \ + sysv_varargs.vr_top=A->reg_save_area + X64_VA_MAX_XMM; + #elif defined(__powerpc64__) // TODO, is this correct? #define CREATE_SYSV_VALIST(A) \ @@ -41,6 +69,9 @@ typedef struct va_list { sysv_varargs->gpr=8; \ sysv_varargs->fpr=8; \ sysv_varargs->overflow_arg_area=A; + +#define CONVERT_VALIST(A) \ + #error TODO! #else #error Unknown architecture! #endif |