about summary refs log tree commit diff stats
path: root/src/tools/alternate.c
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2025-04-04 01:12:33 +0800
committerGitHub <noreply@github.com>2025-04-03 19:12:33 +0200
commitfb955a39752a82c219fa401415892bd4facb5845 (patch)
treea12a9e55015cf900cbbc321f7fb7d4f6e278a0e4 /src/tools/alternate.c
parent8cd3ba8c9e4840541370905b1306ad57e946e288 (diff)
downloadbox64-fb955a39752a82c219fa401415892bd4facb5845.tar.gz
box64-fb955a39752a82c219fa401415892bd4facb5845.zip
Decoupled alternate functions from bridge (#2500)
Diffstat (limited to 'src/tools/alternate.c')
-rw-r--r--src/tools/alternate.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/src/tools/alternate.c b/src/tools/alternate.c
new file mode 100644
index 00000000..223a9eb5
--- /dev/null
+++ b/src/tools/alternate.c
@@ -0,0 +1,47 @@
+#include "alternate.h"
+#include "custommem.h"
+#include "khash.h"
+
+// Alternate address handling
+KHASH_MAP_INIT_INT64(alternate, void*)
+static kh_alternate_t *my_alternates = NULL;
+
+int hasAlternate(void* addr) {
+    if(!my_alternates)
+        return 0;
+    khint_t k = kh_get(alternate, my_alternates, (uintptr_t)addr);
+    if(k==kh_end(my_alternates))
+        return 0;
+    return 1;
+}
+
+void* getAlternate(void* addr) {
+    if(!my_alternates)
+        return addr;
+    khint_t k = kh_get(alternate, my_alternates, (uintptr_t)addr);
+    if(k!=kh_end(my_alternates))
+        return kh_value(my_alternates, k);
+    return addr;
+}
+void addAlternate(void* addr, void* alt) {
+    if(!my_alternates) {
+        my_alternates = kh_init(alternate);
+    }
+    int ret;
+    khint_t k = kh_put(alternate, my_alternates, (uintptr_t)addr, &ret);
+    if(!ret)    // already there
+        return;
+    kh_value(my_alternates, k) = alt;
+}
+
+void addCheckAlternate(void* addr, void* alt) {
+    if(!hasAlternate(addr))
+        addAlternate(addr, alt);
+}
+
+void cleanAlternate() {
+    if(my_alternates) {
+        kh_destroy(alternate, my_alternates);
+        my_alternates = NULL;
+    }
+}