diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2025-04-02 01:02:07 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-04-01 19:02:07 +0200 |
| commit | 2c7a2082e624a78e42199d90f7d9fa90473c26c2 (patch) | |
| tree | 2da6c474edf66752c1f36250aa8266163b4ba3e7 /src/include | |
| parent | 3230265646a48abef02a5c7873490e10ffc0afb5 (diff) | |
| download | box64-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.h | 12 | ||||
| -rw-r--r-- | src/include/box64cpu_util.h | 111 | ||||
| -rw-r--r-- | src/include/dynarec.h | 8 | ||||
| -rw-r--r-- | src/include/x64emu.h | 28 | ||||
| -rw-r--r-- | src/include/x64run.h | 11 | ||||
| -rw-r--r-- | src/include/x64test.h | 3 |
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); |