diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2024-12-18 05:01:33 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-12-17 22:01:33 +0100 |
| commit | 6e0f32f4ca4b35bda036caa6ad3abcae4ae64cdc (patch) | |
| tree | 39a144624b528deba4421d7b71098db69d99eb80 /src/dynarec | |
| parent | 62eca11beef3f211a93235b18d556332fafc74de (diff) | |
| download | box64-6e0f32f4ca4b35bda036caa6ad3abcae4ae64cdc.tar.gz box64-6e0f32f4ca4b35bda036caa6ad3abcae4ae64cdc.zip | |
Added initial GDBJIT support (#2162)
* Added GDBJIT support * fix * fix
Diffstat (limited to 'src/dynarec')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_functions.c | 6 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_private.h | 1 | ||||
| -rw-r--r-- | src/dynarec/dynablock_private.h | 2 | ||||
| -rw-r--r-- | src/dynarec/dynarec_native.c | 11 | ||||
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_functions.c | 4 | ||||
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_private.h | 1 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_functions.c | 4 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_private.h | 1 |
8 files changed, 29 insertions, 1 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_functions.c b/src/dynarec/arm64/dynarec_arm64_functions.c index 590000bf..e473e6ca 100644 --- a/src/dynarec/arm64/dynarec_arm64_functions.c +++ b/src/dynarec/arm64/dynarec_arm64_functions.c @@ -25,6 +25,7 @@ #include "dynarec_arm64_functions.h" #include "custommem.h" #include "bridge.h" +#include "gdbjit.h" // Get a FPU scratch reg int fpu_get_scratch(dynarec_arm_t* dyn, int ninst) @@ -748,6 +749,11 @@ void inst_name_pass3(dynarec_native_t* dyn, int ninst, const char* name, rex_t r dynarec_log(LOG_NONE, " %s:%d/%d", dyn->insts[ninst].n.swapped?"SWP":"CMB", dyn->insts[ninst].n.combined1, dyn->insts[ninst].n.combined2); dynarec_log(LOG_NONE, "%s\n", (box64_dynarec_dump>1)?"\e[m":""); } + if (box64_dynarec_gdbjit) { + zydis_dec_t* dec = rex.is32bits?my_context->dec32:my_context->dec; + const char *inst_name = dec ? DecodeX64Trace(dec, dyn->insts[ninst].x64.addr) : name; + dyn->gdbjit_block = GdbJITBlockAddLine(dyn->gdbjit_block, (dyn->native_start + dyn->insts[ninst].address), inst_name); + } } void print_opcode(dynarec_native_t* dyn, int ninst, uint32_t opcode) diff --git a/src/dynarec/arm64/dynarec_arm64_private.h b/src/dynarec/arm64/dynarec_arm64_private.h index 113e4341..8f10b0f5 100644 --- a/src/dynarec/arm64/dynarec_arm64_private.h +++ b/src/dynarec/arm64/dynarec_arm64_private.h @@ -164,6 +164,7 @@ typedef struct dynarec_arm_s { uint8_t doublepop; uint8_t always_test; uint8_t abort; // abort the creation of the block + void* gdbjit_block; } dynarec_arm_t; void add_next(dynarec_arm_t *dyn, uintptr_t addr); diff --git a/src/dynarec/dynablock_private.h b/src/dynarec/dynablock_private.h index 4bf7dd7a..a152bd4e 100644 --- a/src/dynarec/dynablock_private.h +++ b/src/dynarec/dynablock_private.h @@ -24,4 +24,4 @@ typedef struct dynablock_s { void* jmpnext; // a branch jmpnext code when block is marked } dynablock_t; -#endif //__DYNABLOCK_PRIVATE_H_ \ No newline at end of file +#endif //__DYNABLOCK_PRIVATE_H_ diff --git a/src/dynarec/dynarec_native.c b/src/dynarec/dynarec_native.c index ece7baa0..011815bc 100644 --- a/src/dynarec/dynarec_native.c +++ b/src/dynarec/dynarec_native.c @@ -1,3 +1,4 @@ +#include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> @@ -22,6 +23,7 @@ #include "dynarec_native.h" #include "dynarec_arch.h" #include "dynarec_next.h" +#include "gdbjit.h" void printf_x64_instruction(zydis_dec_t* dec, instruction_x64_t* inst, const char* name) { uint8_t *ip = (uint8_t*)inst->addr; @@ -574,6 +576,9 @@ void* FillBlock64(dynablock_t* block, uintptr_t addr, int alternate, int is32bit protectDB(addr, 1); // init the helper dynarec_native_t helper = {0}; +#ifdef GDBJIT + helper.gdbjit_block = box_calloc(1, sizeof(gdbjit_block_t)); +#endif current_helper = &helper; helper.dynablock = block; helper.start = addr; @@ -748,6 +753,9 @@ void* FillBlock64(dynablock_t* block, uintptr_t addr, int alternate, int is32bit printFunctionAddr(helper.start, " => "); dynarec_log(LOG_NONE, "%s\n", (box64_dynarec_dump>1)?"\e[m":""); } + if (box64_dynarec_gdbjit) { + GdbJITNewBlock(helper.gdbjit_block, (GDB_CORE_ADDR)block->actual_block, (GDB_CORE_ADDR)block->actual_block + native_size); + } int oldtable64size = helper.table64size; size_t oldnativesize = helper.native_size; size_t oldinstsize = helper.insts_size; @@ -782,6 +790,9 @@ void* FillBlock64(dynablock_t* block, uintptr_t addr, int alternate, int is32bit //block->x64_addr = (void*)start; block->x64_size = end-start; // all done... + if (box64_dynarec_gdbjit) { + GdbJITBlockReady(helper.gdbjit_block); + } __clear_cache(actual_p, actual_p+sz); // need to clear the cache before execution... block->hash = X31_hash_code(block->x64_addr, block->x64_size); // Check if something changed, to abort if it is diff --git a/src/dynarec/la64/dynarec_la64_functions.c b/src/dynarec/la64/dynarec_la64_functions.c index 925113f0..bdb60094 100644 --- a/src/dynarec/la64/dynarec_la64_functions.c +++ b/src/dynarec/la64/dynarec_la64_functions.c @@ -25,6 +25,7 @@ #include "dynarec_la64_functions.h" #include "custommem.h" #include "bridge.h" +#include "gdbjit.h" #define XMM0 0 #define XMM8 16 @@ -306,6 +307,9 @@ void inst_name_pass3(dynarec_native_t* dyn, int ninst, const char* name, rex_t r dynarec_log(LOG_NONE, " %s:%d/%d", dyn->insts[ninst].lsx.swapped ? "SWP" : "CMB", dyn->insts[ninst].lsx.combined1, dyn->insts[ninst].lsx.combined2); dynarec_log(LOG_NONE, "%s\n", (box64_dynarec_dump > 1) ? "\e[m" : ""); } + if (box64_dynarec_gdbjit) { + dyn->gdbjit_block = GdbJITBlockAddLine(dyn->gdbjit_block, dyn->insts[ninst].address, name); + } } // will go badly if address is unaligned diff --git a/src/dynarec/la64/dynarec_la64_private.h b/src/dynarec/la64/dynarec_la64_private.h index a9578fc6..4f57d366 100644 --- a/src/dynarec/la64/dynarec_la64_private.h +++ b/src/dynarec/la64/dynarec_la64_private.h @@ -133,6 +133,7 @@ typedef struct dynarec_la64_s { uint8_t smwrite; // for strongmem model emulation uint8_t always_test; uint8_t abort; + void* gdbjit_block; } dynarec_la64_t; void add_next(dynarec_la64_t *dyn, uintptr_t addr); diff --git a/src/dynarec/rv64/dynarec_rv64_functions.c b/src/dynarec/rv64/dynarec_rv64_functions.c index 3930d6ea..e14be4f2 100644 --- a/src/dynarec/rv64/dynarec_rv64_functions.c +++ b/src/dynarec/rv64/dynarec_rv64_functions.c @@ -27,6 +27,7 @@ #include "custommem.h" #include "bridge.h" #include "rv64_lock.h" +#include "gdbjit.h" #define XMM0 0 #define X870 XMM0 + 16 @@ -722,6 +723,9 @@ void inst_name_pass3(dynarec_native_t* dyn, int ninst, const char* name, rex_t r dynarec_log(LOG_NONE, " %s:%d/%d", dyn->insts[ninst].e.swapped ? "SWP" : "CMB", dyn->insts[ninst].e.combined1, dyn->insts[ninst].e.combined2); dynarec_log(LOG_NONE, "%s\n", (box64_dynarec_dump > 1) ? "\e[m" : ""); } + if (box64_dynarec_gdbjit) { + dyn->gdbjit_block = GdbJITBlockAddLine(dyn->gdbjit_block, dyn->insts[ninst].address, name); + } } void print_opcode(dynarec_native_t* dyn, int ninst, uint32_t opcode) diff --git a/src/dynarec/rv64/dynarec_rv64_private.h b/src/dynarec/rv64/dynarec_rv64_private.h index 9e876fd3..aecea9e9 100644 --- a/src/dynarec/rv64/dynarec_rv64_private.h +++ b/src/dynarec/rv64/dynarec_rv64_private.h @@ -180,6 +180,7 @@ typedef struct dynarec_rv64_s { uint8_t inst_sew; // sew inside current instruction, for vsetvli elimination uint8_t inst_vl; // vl inside current instruction, for vsetvli elimination uint8_t inst_vlmul; // vlmul inside current instruction + void* gdbjit_block; } dynarec_rv64_t; // v0 is hardware wired to vector mask register, which should be always reserved |