about summary refs log tree commit diff stats
path: root/src/tools/box64stack.c
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-02 14:14:17 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-02 14:14:17 +0100
commita6143f33ce443c16a773816c2255936a39aee129 (patch)
tree38681b32ac61dc1bba63bfd491afcc53ff455917 /src/tools/box64stack.c
parent9ae5d6121295599bff75012b44adebabd0908ead (diff)
downloadbox64-a6143f33ce443c16a773816c2255936a39aee129.tar.gz
box64-a6143f33ce443c16a773816c2255936a39aee129.zip
More x64emu preparation
Diffstat (limited to 'src/tools/box64stack.c')
-rwxr-xr-xsrc/tools/box64stack.c227
1 files changed, 121 insertions, 106 deletions
diff --git a/src/tools/box64stack.c b/src/tools/box64stack.c
index 12be1b7d..dab38474 100755
--- a/src/tools/box64stack.c
+++ b/src/tools/box64stack.c
@@ -7,9 +7,9 @@
 #include "box64context.h"
 #include "elfloader.h"
 #include "debug.h"
-//#include "emu/x64emu_private.h"
-//#include "emu/x86run_private.h"
-//#include "auxval.h"
+#include "emu/x64emu_private.h"
+#include "emu/x64run_private.h"
+#include "auxval.h"
 
 EXPORTDYN
 int CalcStackSize(box64context_t *context)
@@ -29,110 +29,125 @@ int CalcStackSize(box64context_t *context)
     return 0;
 }
 
-//uint16_t Pop16(x64emu_t *emu)
-//{
-//    uint16_t* st = ((uint16_t*)(R_ESP));
-//    R_ESP += 2;
-//    return *st;
-//}
+uint16_t Pop16(x64emu_t *emu)
+{
+    uint16_t* st = ((uint16_t*)(R_RSP));
+    R_RSP += 2;
+    return *st;
+}
 
-//void Push16(x64emu_t *emu, uint16_t v)
-//{
-//    R_ESP -= 2;
-//    *((uint16_t*)R_ESP) = v;
-//}
-//uint32_t Pop32(x64emu_t *emu)
-//{
-//    uint32_t* st = ((uint32_t*)(R_ESP));
-//    R_ESP += 4;
-//    return *st;
-//}
+void Push16(x64emu_t *emu, uint16_t v)
+{
+    R_RSP -= 2;
+    *((uint16_t*)R_RSP) = v;
+}
+
+uint32_t Pop32(x64emu_t *emu)
+{
+    uint32_t* st = ((uint32_t*)(R_RSP));
+    R_RSP += 4;
+    return *st;
+}
+
+void Push32(x64emu_t *emu, uint32_t v)
+{
+    R_RSP -= 4;
+    *((uint32_t*)R_RSP) = v;
+}
+
+uint64_t Pop64(x64emu_t *emu)
+{
+    uint64_t* st = ((uint64_t*)(R_RSP));
+    R_RSP += 8;
+    return *st;
+}
 
-//void Push32(x64emu_t *emu, uint32_t v)
-//{
-//    R_ESP -= 4;
-//    *((uint32_t*)R_ESP) = v;
-//}
+void Push64(x64emu_t *emu, uint64_t v)
+{
+    R_RSP -= 8;
+    *((uint64_t*)R_RSP) = v;
+}
+
+void PushString(x64emu_t *emu, const char* s)
+{
+    int sz = strlen(s) + 1;
+    // round to 4 bytes boundary
+    R_RSP -= sz;
+    memcpy((void*)R_RSP, s, sz);
+}
+
+EXPORTDYN
+void SetupInitialStack(x64emu_t *emu)
+{
+    // start with 0
+    Push(emu, 0);
+    // push program executed
+    PushString(emu, emu->context->argv[0]);
+    uintptr_t p_arg0 = R_RSP;
+    // push envs
+    uintptr_t p_envv[emu->context->envc];
+    for (int i=emu->context->envc-1; i>=0; --i) {
+        PushString(emu, emu->context->envv[i]);
+        p_envv[i] = R_RSP;
+    }
+    // push args, also, free the argv[] string and point to the one in the main stack
+    uintptr_t p_argv[emu->context->argc];
+    for (int i=emu->context->argc-1; i>=0; --i) {
+        PushString(emu, emu->context->argv[i]);
+        p_argv[i] = R_RSP;
+        free(emu->context->argv[i]);
+        emu->context->argv[i] = (char*)p_argv[i];
+    }
+    // align
+    uintptr_t tmp = (R_RSP)&~(emu->context->stackalign-1);
+    memset((void*)tmp, 0, R_RSP-tmp);
+    R_RSP=tmp;
+
+    // push some AuxVector stuffs
+    PushString(emu, "x86_64");
+    uintptr_t p_x86_64 = R_RSP;
+    uintptr_t p_random = real_getauxval(25);
+    if(!p_random) {
+        for (int i=0; i<4; ++i)
+            Push(emu, random());
+        p_random = R_RSP;
+    }
+    // align
+    tmp = (R_RSP)&~(emu->context->stackalign-1);
+    memset((void*)tmp, 0, R_RSP-tmp);
+    R_RSP=tmp;
 
-//void PushString(x64emu_t *emu, const char* s)
-//{
-//    int sz = strlen(s) + 1;
-//    // round to 4 bytes boundary
-//    R_ESP -= sz;
-//    memcpy((void*)R_ESP, s, sz);
-//}
+    // push the AuxVector themselves
+    Push(emu, 0); Push(emu, 0);             //AT_NULL(0)=0
+    Push(emu, p_x86_64); Push(emu, 15);     //AT_PLATFORM(15)=p_x86_64*
+    Push(emu, 0); Push(emu, 66);            //AT_HWCAP2(26)=0
+    // Push HWCAP:
+    //  FPU: 1<<0 ; VME: 1<<1 ; DE : 1<<2 ; PSE: 1<<3 ; TSC: 1<<4
+    //  MSR: 1<<5 : PAE: 1<<6 : MCE: 1<<7 ; CX8: 1<<8 : APIC:1<<9
+    //  SEP: 1<<11: MTRR:1<<12: PGE: 1<<13: MCA: 1<<14; CMOV:1<<15; FCMOV: 1<<16
+    //  MMX: 1<<23:OSFXR:1<<24: XMM: 1<<25:XMM2: 1<<26;AMD3D:1<<31
+    Push(emu, (1<<0) | (1<<1) | (1<<2) | (1<<3) | (1<<4) | (1<<8)  | (1<<15) | (1<<16) | (1<<23) | (1<<25) | (1<<26));
+    Push(emu, 16);                      //AT_HWCAP(16)=...
+    Push(emu, p_arg0); Push(emu, 31);   //AT_EXECFN(31)=p_arg0
+    Push(emu, p_random); Push(emu, 25); //AT_RANDOM(25)=p_random
+    Push(emu, real_getauxval(23)); Push(emu, 23);     //AT_SECURE(23)=0
+    Push(emu, real_getauxval(14)); Push(emu, 14);     //AT_EGID(14)
+    Push(emu, real_getauxval(13)); Push(emu, 13);     //AT_GID(13)
+    Push(emu, real_getauxval(12)); Push(emu, 12);     //AT_EUID(12)
+    Push(emu, real_getauxval(11)); Push(emu, 11);     //AT_UID(11)
+    Push(emu, box64_pagesize); Push(emu, 6);          //AT_PAGESZ(6)
+    Push(emu, R_RIP); Push(emu, 9);     //AT_ENTRY(9)=entrypoint
+    Push(emu, 0/*emu->context->vsyscall*/); Push(emu, 32);      //AT_SYSINFO(32)=vsyscall
+    if(!emu->context->auxval_start)       // store auxval start if needed
+        emu->context->auxval_start = (uintptr_t*)R_RSP;
+    // TODO: continue
 
-//EXPORTDYN
-//void SetupInitialStack(x64emu_t *emu)
-//{
-//    // start with 0
-//    Push(emu, 0);
-//    // push program executed
-//    PushString(emu, emu->context->argv[0]);
-//    uintptr_t p_arg0 = R_ESP;
-//    // push envs
-//    uintptr_t p_envv[emu->context->envc];
-//    for (int i=emu->context->envc-1; i>=0; --i) {
-//        PushString(emu, emu->context->envv[i]);
-//        p_envv[i] = R_ESP;
-//    }
-//    // push args, also, free the argv[] string and point to the one in the main stack
-//    uintptr_t p_argv[emu->context->argc];
-//    for (int i=emu->context->argc-1; i>=0; --i) {
-//        PushString(emu, emu->context->argv[i]);
-//        p_argv[i] = R_ESP;
-//        free(emu->context->argv[i]);
-//        emu->context->argv[i] = (char*)p_argv[i];
-//    }
-//    // align
-//    uintptr_t tmp = (R_ESP)&~(emu->context->stackalign-1);
-//    memset((void*)tmp, 0, R_ESP-tmp);
-//    R_ESP=tmp;
-//
-//    // push some AuxVector stuffs
-//    PushString(emu, "i686");
-//    uintptr_t p_386 = R_ESP;
-//    uintptr_t p_random = real_getauxval(25);
-//    if(!p_random) {
-//        for (int i=0; i<4; ++i)
-//            Push(emu, random());
-//        p_random = R_ESP;
-//    }
-//    // align
-//    tmp = (R_ESP)&~(emu->context->stackalign-1);
-//    memset((void*)tmp, 0, R_ESP-tmp);
-//    R_ESP=tmp;
-//
-//    // push the AuxVector themselves
-//    Push(emu, 0); Push(emu, 0);         //AT_NULL(0)=0
-//    Push(emu, p_386); Push(emu, 15);    //AT_PLATFORM(15)=p_386*
-//    Push(emu, 0); Push(emu, 66);        //AT_HWCAP2(26)=0
-//    // Push HWCAP:
-//    //  FPU: 1<<0 ; VME: 1<<1 ; DE : 1<<2 ; PSE: 1<<3 ; TSC: 1<<4
-//    //  MSR: 1<<5 : PAE: 1<<6 : MCE: 1<<7 ; CX8: 1<<8 : APIC:1<<9
-//    //  SEP: 1<<11: MTRR:1<<12: PGE: 1<<13: MCA: 1<<14; CMOV:1<<15; FCMOV: 1<<16
-//    //  MMX: 1<<23:OSFXR:1<<24: XMM: 1<<25:XMM2: 1<<26;AMD3D:1<<31
-//    Push(emu, (1<<0) | (1<<1) | (1<<2) | (1<<3) | (1<<4) | (1<<8)  | (1<<15) | (1<<16) | (1<<23) | (1<<25) | (1<<26));
-//    Push(emu, 16);                      //AT_HWCAP(16)=...
-//    Push(emu, p_arg0); Push(emu, 31);   //AT_EXECFN(31)=p_arg0
-//    Push(emu, p_random); Push(emu, 25); //AT_RANDOM(25)=p_random
-//    Push(emu, real_getauxval(23)); Push(emu, 23);        //AT_SECURE(23)=0
-//    Push(emu, real_getauxval(14)); Push(emu, 14);     //AT_EGID(14)
-//    Push(emu, real_getauxval(13)); Push(emu, 13);     //AT_GID(13)
-//    Push(emu, real_getauxval(12)); Push(emu, 12);     //AT_EUID(12)
-//    Push(emu, real_getauxval(11)); Push(emu, 11);     //AT_UID(11)
-//    Push(emu, R_EIP); Push(emu, 9);     //AT_ENTRY(9)=entrypoint
-//    Push(emu, 0/*emu->context->vsyscall*/); Push(emu, 32);      //AT_SYSINFO(32)=vsyscall
-//    if(!emu->context->auxval_start)       // store auxval start if needed
-//        emu->context->auxval_start = (uintptr_t*)R_ESP;
-//    // TODO: continue
-//
-//    // push nil / envs / nil / args / argc
-//    Push(emu, 0);
-//    for (int i=emu->context->envc-1; i>=0; --i)
-//        Push(emu, p_envv[i]);
-//    Push(emu, 0);
-//    for (int i=emu->context->argc-1; i>=0; --i)
-//        Push(emu, p_argv[i]);
-//    Push(emu, emu->context->argc);
-//}
\ No newline at end of file
+    // push nil / envs / nil / args / argc
+    Push(emu, 0);
+    for (int i=emu->context->envc-1; i>=0; --i)
+        Push(emu, p_envv[i]);
+    Push(emu, 0);
+    for (int i=emu->context->argc-1; i>=0; --i)
+        Push(emu, p_argv[i]);
+    Push(emu, emu->context->argc);
+}
\ No newline at end of file