about summary refs log tree commit diff stats
path: root/src/include
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2025-04-02 01:02:07 +0800
committerGitHub <noreply@github.com>2025-04-01 19:02:07 +0200
commit2c7a2082e624a78e42199d90f7d9fa90473c26c2 (patch)
tree2da6c474edf66752c1f36250aa8266163b4ba3e7 /src/include
parent3230265646a48abef02a5c7873490e10ffc0afb5 (diff)
downloadbox64-2c7a2082e624a78e42199d90f7d9fa90473c26c2.tar.gz
box64-2c7a2082e624a78e42199d90f7d9fa90473c26c2.zip
Introduced box64cpu.h for exported interpreter and dynarec functions (#2490)
Diffstat (limited to 'src/include')
-rw-r--r--src/include/box64cpu.h12
-rw-r--r--src/include/box64cpu_util.h111
-rw-r--r--src/include/dynarec.h8
-rw-r--r--src/include/x64emu.h28
-rw-r--r--src/include/x64run.h11
-rw-r--r--src/include/x64test.h3
6 files changed, 127 insertions, 46 deletions
diff --git a/src/include/box64cpu.h b/src/include/box64cpu.h
new file mode 100644
index 00000000..72df2c69
--- /dev/null
+++ b/src/include/box64cpu.h
@@ -0,0 +1,12 @@
+#ifndef __BOX64CPU_H_
+#define __BOX64CPU_H_
+
+typedef struct x64emu_s x64emu_t;
+
+int Run(x64emu_t *emu, int step);
+void EmuCall(x64emu_t* emu, uintptr_t addr);
+void StopEmu(x64emu_t* emu, const char* reason, int is32bits);
+void DynaRun(x64emu_t *emu);
+void DynaCall(x64emu_t* emu, uintptr_t addr);
+
+#endif // __BOX64CPU_H_
diff --git a/src/include/box64cpu_util.h b/src/include/box64cpu_util.h
new file mode 100644
index 00000000..9f774a19
--- /dev/null
+++ b/src/include/box64cpu_util.h
@@ -0,0 +1,111 @@
+#ifndef __BOX64CPU_UTIL_H_
+#define __BOX64CPU_UTIL_H_
+
+#include <stdint.h>
+#include "emu/x64emu_private.h"
+#include "box64context.h"
+#include "regs.h"
+
+static inline uint8_t Peek(x64emu_t *emu, int offset)
+{
+    return *(uint8_t*)(R_RIP + offset);
+}
+
+#ifdef TEST_INTERPRETER
+#define Push16(E, V)  do{E->regs[_SP].q[0] -=2; test->memsize = 2; *(uint16_t*)test->mem = (V); test->memaddr = E->regs[_SP].q[0];}while(0)
+#define Push32(E, V)  do{E->regs[_SP].q[0] -=4; test->memsize = 4; *(uint32_t*)test->mem = (V); test->memaddr = E->regs[_SP].q[0];}while(0)
+#define Push64(E, V)  do{E->regs[_SP].q[0] -=8; test->memsize = 8; *(uint64_t*)test->mem = (V); test->memaddr = E->regs[_SP].q[0];}while(0)
+#else
+static inline void Push16(x64emu_t *emu, uint16_t v)
+{
+    R_RSP -= 2;
+    *((uint16_t*)R_RSP) = v;
+}
+
+static inline void Push_32(x64emu_t *emu, uint32_t v)
+{
+    R_ESP -= 4;
+    *((uint32_t*)(uintptr_t)R_ESP) = v;
+}
+
+static inline void Push32(x64emu_t *emu, uint32_t v)
+{
+    R_RSP -= 4;
+    *((uint32_t*)R_RSP) = v;
+}
+
+static inline void Push64(x64emu_t *emu, uint64_t v)
+{
+    R_RSP -= 8;
+    *((uint64_t*)R_RSP) = v;
+}
+#endif
+
+static inline uint16_t Pop16(x64emu_t *emu)
+{
+    uint16_t* st = (uint16_t*)R_RSP;
+    R_RSP += 2;
+    return *st;
+}
+
+static inline uint32_t Pop_32(x64emu_t *emu)
+{
+    uint32_t* st = (uint32_t*)(uintptr_t)R_RSP;
+    R_ESP += 4;
+    return *st;
+}
+
+static inline uint32_t Pop32(x64emu_t *emu)
+{
+    uint32_t* st = (uint32_t*)R_RSP;
+    R_RSP += 4;
+    return *st;
+}
+
+static inline uint64_t Pop64(x64emu_t *emu)
+{
+    uint64_t* st = (uint64_t*)R_RSP;
+    R_RSP += 8;
+    return *st;
+}
+
+static inline void PushExit(x64emu_t* emu)
+{
+    R_RSP -= 8;
+    *((uint64_t*)R_RSP) = my_context->exit_bridge;
+}
+
+#ifdef BOX32
+static inline void PushExit_32(x64emu_t* emu)
+{
+    R_ESP -= 4;
+    *((ptr_t*)(uintptr_t)R_ESP) = my_context->exit_bridge;
+}
+#endif
+
+uint32_t GetEAX(x64emu_t *emu);
+uint64_t GetRAX(x64emu_t *emu);
+void SetEAX(x64emu_t *emu, uint32_t v);
+void SetEBX(x64emu_t *emu, uint32_t v);
+void SetECX(x64emu_t *emu, uint32_t v);
+void SetEDX(x64emu_t *emu, uint32_t v);
+void SetEDI(x64emu_t *emu, uint32_t v);
+void SetESI(x64emu_t *emu, uint32_t v);
+void SetEBP(x64emu_t *emu, uint32_t v);
+void SetESP(x64emu_t *emu, uint32_t v);
+void SetEIP(x64emu_t *emu, uint32_t v);
+void SetRAX(x64emu_t *emu, uint64_t v);
+void SetRBX(x64emu_t *emu, uint64_t v);
+void SetRCX(x64emu_t *emu, uint64_t v);
+void SetRDX(x64emu_t *emu, uint64_t v);
+void SetRDI(x64emu_t *emu, uint64_t v);
+void SetRSI(x64emu_t *emu, uint64_t v);
+void SetRBP(x64emu_t *emu, uint64_t v);
+void SetRSP(x64emu_t *emu, uint64_t v);
+void SetRIP(x64emu_t *emu, uint64_t v);
+void SetFS(x64emu_t *emu, uint16_t v);
+uint16_t GetFS(x64emu_t *emu);
+uint64_t GetRSP(x64emu_t *emu);
+uint64_t GetRBP(x64emu_t *emu);
+
+#endif // __BOX64CPU_UTIL_H_
diff --git a/src/include/dynarec.h b/src/include/dynarec.h
deleted file mode 100644
index 39360841..00000000
--- a/src/include/dynarec.h
+++ /dev/null
@@ -1,8 +0,0 @@
-#ifndef __DYNAREC_H_
-#define __DYNAREC_H_
-
-typedef struct x64emu_s x64emu_t;
-
-void DynaCall(x64emu_t* emu, uintptr_t addr); // try to use DynaRec... Fallback to EmuCall if no dynarec available
-
-#endif // __DYNAREC_H_
diff --git a/src/include/x64emu.h b/src/include/x64emu.h
index 8b6fa4cb..e06620af 100644
--- a/src/include/x64emu.h
+++ b/src/include/x64emu.h
@@ -16,36 +16,10 @@ void SetTraceEmu(uintptr_t trace_start, uintptr_t trace_end);
 
 box64context_t* GetEmuContext(x64emu_t* emu);
 
-uint32_t GetEAX(x64emu_t *emu);
-uint64_t GetRAX(x64emu_t *emu);
-void SetEAX(x64emu_t *emu, uint32_t v);
-void SetEBX(x64emu_t *emu, uint32_t v);
-void SetECX(x64emu_t *emu, uint32_t v);
-void SetEDX(x64emu_t *emu, uint32_t v);
-void SetEDI(x64emu_t *emu, uint32_t v);
-void SetESI(x64emu_t *emu, uint32_t v);
-void SetEBP(x64emu_t *emu, uint32_t v);
-void SetESP(x64emu_t *emu, uint32_t v);
-void SetEIP(x64emu_t *emu, uint32_t v);
-void SetRAX(x64emu_t *emu, uint64_t v);
-void SetRBX(x64emu_t *emu, uint64_t v);
-void SetRCX(x64emu_t *emu, uint64_t v);
-void SetRDX(x64emu_t *emu, uint64_t v);
-void SetRDI(x64emu_t *emu, uint64_t v);
-void SetRSI(x64emu_t *emu, uint64_t v);
-void SetRBP(x64emu_t *emu, uint64_t v);
-void SetRSP(x64emu_t *emu, uint64_t v);
-void SetRIP(x64emu_t *emu, uint64_t v);
-void SetFS(x64emu_t *emu, uint16_t v);
-uint16_t GetFS(x64emu_t *emu);
-uint64_t GetRSP(x64emu_t *emu);
-uint64_t GetRBP(x64emu_t *emu);
 void ResetFlags(x64emu_t *emu);
 void ResetSegmentsCache(x64emu_t *emu);
 const char* DumpCPURegs(x64emu_t* emu, uintptr_t ip, int is32bits);
 
-void StopEmu(x64emu_t* emu, const char* reason, int is32bits);
-void EmuCall(x64emu_t* emu, uintptr_t addr);
 void AddCleanup(x64emu_t *emu, void *p);
 void AddCleanup1Arg(x64emu_t *emu, void *p, void* a, elfheader_t* h);
 void CallCleanup(x64emu_t *emu, elfheader_t* h);
@@ -63,4 +37,4 @@ void D2LD(void* d, void* ld);   // double (64bits) -> long double (64bits)
 int printFunctionAddr(uintptr_t nextaddr, const char* text); // 0 if nothing was found
 const char* getAddrFunctionName(uintptr_t addr);
 
-#endif //__X86EMU_H_
\ No newline at end of file
+#endif //__X86EMU_H_
diff --git a/src/include/x64run.h b/src/include/x64run.h
deleted file mode 100644
index c89e0786..00000000
--- a/src/include/x64run.h
+++ /dev/null
@@ -1,11 +0,0 @@
-#ifndef __X64RUN_H_
-#define __X64RUN_H_
-#include <stdint.h>
-
-typedef struct x64emu_s x64emu_t;
-typedef struct x64test_s x64test_t;
-int Run(x64emu_t *emu, int step); // 0 if run was successfull, 1 if error in x86 world
-int RunTest(x64test_t *test);
-void DynaRun(x64emu_t *emu);
-
-#endif //__X64RUN_H_
diff --git a/src/include/x64test.h b/src/include/x64test.h
index 48e2a935..be417ce4 100644
--- a/src/include/x64test.h
+++ b/src/include/x64test.h
@@ -1,6 +1,9 @@
 #ifndef __X64TEST_H_
 #define __X64TEST_H_
 
+typedef struct x64test_s x64test_t;
+int RunTest(x64test_t* test);
+
 void x64test_step(x64emu_t* ref, uintptr_t ip);
 void x64test_check(x64emu_t* ref, uintptr_t ip);