diff options
| -rw-r--r-- | src/core.c | 2 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_functions.c | 2 | ||||
| -rw-r--r-- | src/dynarec/dynarec_native.c | 4 | ||||
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_functions.c | 2 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_functions.c | 2 | ||||
| -rw-r--r-- | src/include/env.h | 9 | ||||
| -rw-r--r-- | src/tools/env.c | 22 | ||||
| -rw-r--r-- | src/tools/gdbjit.c | 16 |
8 files changed, 41 insertions, 18 deletions
diff --git a/src/core.c b/src/core.c index 8bb1d78d..5c4dcac5 100644 --- a/src/core.c +++ b/src/core.c @@ -488,7 +488,7 @@ static void hookMangoHud() #endif if (!homedir) return; - static char config_base[512]; + static char config_base[256]; snprintf(config_base, sizeof(config_base), "%s%s", configdir ? configdir : homedir, configdir ? "" : "/.config"); diff --git a/src/dynarec/arm64/dynarec_arm64_functions.c b/src/dynarec/arm64/dynarec_arm64_functions.c index 5c2de040..7af0a97c 100644 --- a/src/dynarec/arm64/dynarec_arm64_functions.c +++ b/src/dynarec/arm64/dynarec_arm64_functions.c @@ -736,7 +736,7 @@ void inst_name_pass3(dynarec_native_t* dyn, int ninst, const char* name, rex_t r { if (!BOX64DRENV(dynarec_dump) && !BOX64ENV(dynarec_gdbjit) && !BOX64ENV(dynarec_perf_map)) return; - static char buf[512]; + static char buf[256]; int length = sprintf(buf, "barrier=%d state=%d/%d/%d(%d:%d->%d:%d), %s=%X/%X, use=%X, need=%X/%X, sm=%d(%d/%d)", dyn->insts[ninst].x64.barrier, dyn->insts[ninst].x64.state_flags, diff --git a/src/dynarec/dynarec_native.c b/src/dynarec/dynarec_native.c index c0c7acc8..6f4eb595 100644 --- a/src/dynarec/dynarec_native.c +++ b/src/dynarec/dynarec_native.c @@ -789,7 +789,7 @@ void* FillBlock64(dynablock_t* block, uintptr_t addr, int alternate, int is32bit printFunctionAddr(helper.start, " => "); dynarec_log(LOG_NONE, "%s\n", (BOX64DRENV(dynarec_dump)>1)?"\e[m":""); } - if (BOX64ENV(dynarec_gdbjit)) { + if (BOX64ENV(dynarec_gdbjit) && (!BOX64ENV(dynarec_gdbjit_end) || (addr >= BOX64ENV(dynarec_gdbjit_start) && addr < BOX64ENV(dynarec_gdbjit_end)))) { GdbJITNewBlock(helper.gdbjit_block, (GDB_CORE_ADDR)block->actual_block, (GDB_CORE_ADDR)block->actual_block + native_size, helper.start); } int oldtable64size = helper.table64size; @@ -834,7 +834,7 @@ 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 (BOX64ENV(dynarec_gdbjit)) { + if (BOX64ENV(dynarec_gdbjit) && (!BOX64ENV(dynarec_gdbjit_end) || (addr >= BOX64ENV(dynarec_gdbjit_start) && addr < BOX64ENV(dynarec_gdbjit_end)))) { GdbJITBlockReady(helper.gdbjit_block); } ClearCache(actual_p+sizeof(void*), native_size); // need to clear the cache before execution... diff --git a/src/dynarec/la64/dynarec_la64_functions.c b/src/dynarec/la64/dynarec_la64_functions.c index 22925c28..0bfe78b7 100644 --- a/src/dynarec/la64/dynarec_la64_functions.c +++ b/src/dynarec/la64/dynarec_la64_functions.c @@ -335,7 +335,7 @@ void inst_name_pass3(dynarec_native_t* dyn, int ninst, const char* name, rex_t r { if (!BOX64DRENV(dynarec_dump) && !BOX64ENV(dynarec_gdbjit) && !BOX64ENV(dynarec_perf_map)) return; - static char buf[512]; + static char buf[256]; int length = sprintf(buf, "barrier=%d state=%d/%d(%d), %s=%X/%X, use=%X, need=%X/%X, fuse=%d, sm=%d(%d/%d)", dyn->insts[ninst].x64.barrier, dyn->insts[ninst].x64.state_flags, diff --git a/src/dynarec/rv64/dynarec_rv64_functions.c b/src/dynarec/rv64/dynarec_rv64_functions.c index be48d2e4..cf64352b 100644 --- a/src/dynarec/rv64/dynarec_rv64_functions.c +++ b/src/dynarec/rv64/dynarec_rv64_functions.c @@ -700,7 +700,7 @@ void inst_name_pass3(dynarec_native_t* dyn, int ninst, const char* name, rex_t r { if (!BOX64DRENV(dynarec_dump) && !BOX64ENV(dynarec_gdbjit) && !BOX64ENV(dynarec_perf_map)) return; - static char buf[512]; + static char buf[256]; int length = sprintf(buf, "barrier=%d state=%d/%d(%d), %s=%X/%X, use=%X, need=%X/%X, fuse=%d, sm=%d(%d/%d), sew@entry=%d, sew@exit=%d", dyn->insts[ninst].x64.barrier, dyn->insts[ninst].x64.state_flags, diff --git a/src/include/env.h b/src/include/env.h index c6f3b39f..a35efa65 100644 --- a/src/include/env.h +++ b/src/include/env.h @@ -46,7 +46,7 @@ extern char* ftrace_name; BOOLEAN(BOX64_DYNAREC_FASTNAN, dynarec_fastnan, 1) \ INTEGER(BOX64_DYNAREC_FASTROUND, dynarec_fastround, 1, 0, 2) \ INTEGER(BOX64_DYNAREC_FORWARD, dynarec_forward, 128, 0, 1024) \ - INTEGER(BOX64_DYNAREC_GDBJIT, dynarec_gdbjit, 0, 0, 2) \ + STRING(BOX64_DYNAREC_GDBJIT, dynarec_gdbjit_str) \ INTEGER(BOX64_DYNAREC_LOG, dynarec_log, 0, 0, 3) \ INTEGER(BOX64_DYNAREC_MISSING, dynarec_missing, 0, 0, 2) \ BOOLEAN(BOX64_DYNAREC_NATIVEFLAGS, dynarec_nativeflags, 1) \ @@ -96,7 +96,7 @@ extern char* ftrace_name; STRING(BOX64_RCFILE, envfile) \ BOOLEAN(BOX64_RDTSC_1GHZ, rdtsc_1ghz, 0) \ BOOLEAN(BOX64_RESERVE_HIGH, reserve_high, 0) \ - BOOLEAN(BOX64_ROLLING_LOG, cycle_log, 0) \ + BOOLEAN(BOX64_ROLLING_LOG, cycle_log, 0) \ BOOLEAN(BOX64_SDL2_JGUID, sdl2_jguid, 0) \ BOOLEAN(BOX64_SHAEXT, shaext, 1) \ BOOLEAN(BOX64_SHOWBT, showbt, 0) \ @@ -187,11 +187,14 @@ typedef struct box64env_s { int dynarec_test; int avx2; int rolling_log; + int dynarec_perf_map_fd; + int dynarec_gdbjit; uintptr_t dynarec_test_start; uintptr_t dynarec_test_end; uintptr_t nodynarec_start; uintptr_t nodynarec_end; - int dynarec_perf_map_fd; + uintptr_t dynarec_gdbjit_start; + uintptr_t dynarec_gdbjit_end; uint64_t is_any_overridden : 1; uint64_t is_dynarec_perf_map_fd_overridden : 1; diff --git a/src/tools/env.c b/src/tools/env.c index e1840f29..c41d9b42 100644 --- a/src/tools/env.c +++ b/src/tools/env.c @@ -127,6 +127,28 @@ static void applyCustomRules() } } + if (box64env.is_dynarec_gdbjit_str_overridden) { + if (strlen(box64env.dynarec_gdbjit_str) == 1) { + if (box64env.dynarec_gdbjit_str[0] >= '0' && box64env.dynarec_gdbjit_str[0] <= '2') + box64env.dynarec_gdbjit = box64env.dynarec_gdbjit_str[0] - '0'; + + box64env.dynarec_gdbjit_start = 0x0; + box64env.dynarec_gdbjit_end = 0x0; + } else if (strchr(box64env.dynarec_gdbjit_str, '-')) { + if (sscanf(box64env.dynarec_gdbjit_str, "%ld-%ld", &box64env.dynarec_gdbjit_start, &box64env.dynarec_gdbjit_end) != 2) { + if (sscanf(box64env.dynarec_gdbjit_str, "0x%lX-0x%lX", &box64env.dynarec_gdbjit_start, &box64env.dynarec_gdbjit_end) != 2) { + if (sscanf(box64env.dynarec_gdbjit_str, "0x%lx-0x%lx", &box64env.dynarec_gdbjit_start, &box64env.dynarec_gdbjit_end) != 2) + sscanf(box64env.dynarec_gdbjit_str, "%lx-%lx", &box64env.dynarec_gdbjit_start, &box64env.dynarec_gdbjit_end); + } + } + if (box64env.dynarec_gdbjit_end > box64env.dynarec_gdbjit_start) { + box64env.dynarec_gdbjit = 2; + } else { + box64env.dynarec_gdbjit = 0; + } + } + } + if (box64env.is_nodynarec_overridden) { if(box64env.nodynarec) { if (strchr(box64env.nodynarec,'-')) { diff --git a/src/tools/gdbjit.c b/src/tools/gdbjit.c index 07731e9f..5813f562 100644 --- a/src/tools/gdbjit.c +++ b/src/tools/gdbjit.c @@ -48,9 +48,9 @@ EXPORT gdbjit_descriptor_t __jit_debug_descriptor = { 1, GDBJIT_NOACTION, NULL, void GdbJITNewBlock(gdbjit_block_t* block, GDB_CORE_ADDR start, GDB_CORE_ADDR end, uintptr_t x64start) { - if (!block) - return; + if (!block) return; + size_t alloced = block->alloced; memset(block, 0, sizeof(gdbjit_block_t)); strcpy(block->filename, "/tmp/box64gdbjit-XXXXXX.S"); @@ -60,13 +60,13 @@ void GdbJITNewBlock(gdbjit_block_t* block, GDB_CORE_ADDR start, GDB_CORE_ADDR en block->start = start; block->end = end; block->x64start = x64start; - block->alloced = block->nlines = 0; + block->alloced = alloced; + block->nlines = 0; } static size_t GdbJITLinesAvailable(gdbjit_block_t* block) { - if (!block) - return 0; + if (!block) return 0; return block->alloced > block->nlines; } @@ -88,10 +88,10 @@ static gdbjit_block_t* GdbJITMakeRoom(gdbjit_block_t* block) gdbjit_block_t* GdbJITBlockAddLine(gdbjit_block_t* block, GDB_CORE_ADDR addr, const char* line) { + if (!block || !block->file) return NULL; + block->nlines++; block = GdbJITMakeRoom(block); - if (!block) return NULL; - block->lines[block->nlines-1].pc = addr; block->lines[block->nlines-1].line = block->nlines; fprintf(block->file, "%s\n", line); @@ -104,14 +104,12 @@ void GdbJITBlockReady(gdbjit_block_t* block) if (block->nlines == 0) { fclose(block->file); - box_free(block); return; } gdbjit_code_entry_t* entry = (gdbjit_code_entry_t*)box_malloc(sizeof(gdbjit_code_entry_t)); if (!entry) { fclose(block->file); - box_free(block); return; } |