about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/core.c2
-rw-r--r--src/dynarec/arm64/dynarec_arm64_functions.c2
-rw-r--r--src/dynarec/dynarec_native.c4
-rw-r--r--src/dynarec/la64/dynarec_la64_functions.c2
-rw-r--r--src/dynarec/rv64/dynarec_rv64_functions.c2
-rw-r--r--src/include/env.h9
-rw-r--r--src/tools/env.c22
-rw-r--r--src/tools/gdbjit.c16
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;
     }