diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2025-04-04 01:12:33 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-04-03 19:12:33 +0200 |
| commit | fb955a39752a82c219fa401415892bd4facb5845 (patch) | |
| tree | a12a9e55015cf900cbbc321f7fb7d4f6e278a0e4 /src/tools/alternate.c | |
| parent | 8cd3ba8c9e4840541370905b1306ad57e946e288 (diff) | |
| download | box64-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.c | 47 |
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; + } +} |