about summary refs log tree commit diff stats
path: root/src/os/os_linux.c
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-10-15 20:52:16 +0200
committerptitSeb <sebastien.chev@gmail.com>2025-10-15 20:52:16 +0200
commitd0045b158b30434c2077693d970e2167a1089e84 (patch)
treeb2951427e4870055cf79f6388d9755a227e843f7 /src/os/os_linux.c
parent1d4a9e8863d7e32f0bb1472674a94f05df1409b5 (diff)
downloadbox64-d0045b158b30434c2077693d970e2167a1089e84.tar.gz
box64-d0045b158b30434c2077693d970e2167a1089e84.zip
Some Segments/Selector handling refactoring , removing some pthread_getspecific use
Diffstat (limited to 'src/os/os_linux.c')
-rw-r--r--src/os/os_linux.c25
1 files changed, 13 insertions, 12 deletions
diff --git a/src/os/os_linux.c b/src/os/os_linux.c
index 235d43ee..17ba33cc 100644
--- a/src/os/os_linux.c
+++ b/src/os/os_linux.c
@@ -22,6 +22,7 @@
 #include "debug.h"
 #include "x64tls.h"
 #include "librarian.h"
+#include "emu/x64emu_private.h"
 
 int GetTID(void)
 {
@@ -65,33 +66,33 @@ void EmuX86Syscall(void* emu)
 
 extern int box64_is32bits;
 
-void* GetSeg43Base()
+void* GetSeg43Base(void* emu)
 {
-    tlsdatasize_t* ptr = getTLSData(my_context);
+    tlsdatasize_t* ptr = getTLSData((x64emu_t*)emu);
     return ptr->data;
 }
 
-void* GetSegmentBase(uint32_t desc)
+void* GetSegmentBase(void* emu, uint32_t desc)
 {
     if (!desc) {
         printf_log(LOG_NONE, "Warning, accessing segment NULL\n");
         return NULL;
     }
     int base = desc >> 3;
-    if (!box64_is32bits && base == 0x8 && !my_context->segtls[base].key_init)
-        return GetSeg43Base();
-    if (box64_is32bits && (base == 0x6))
-        return GetSeg43Base();
+    int is_ldt = !!(desc&4);
+    base_segment_t* segs = is_ldt?((x64emu_t*)emu)->segldt:((base>5)?((x64emu_t*)emu)->seggdt:my_context->seggdt);
+    if(!box64_nolibs) {
+        if (!box64_is32bits && (base == 0x8) )
+            return GetSeg43Base((x64emu_t*)emu);
+        if (box64_is32bits && (base == 0x6))
+            return GetSeg43Base((x64emu_t*)emu);
+        }
     if (base > 15) {
         printf_log(LOG_NONE, "Warning, accessing segment unknown 0x%x or unset\n", desc);
         return NULL;
     }
-    if (my_context->segtls[base].key_init) {
-        void* ptr = pthread_getspecific(my_context->segtls[base].key);
-        return ptr;
-    }
 
-    void* ptr = (void*)my_context->segtls[base].base;
+    void* ptr = (void*)segs[base].base;
     return ptr;
 }