diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2022-10-29 09:41:46 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2022-10-29 09:41:46 +0200 |
| commit | ee63a9f368f5e0002dab0ad4247458171b4ae426 (patch) | |
| tree | f2fca4372dd701e8815fa015c0f7577e7887796b /src | |
| parent | 9a73c15b8493911000683683bb2a49f7c466fab6 (diff) | |
| download | box64-ee63a9f368f5e0002dab0ad4247458171b4ae426.tar.gz box64-ee63a9f368f5e0002dab0ad4247458171b4ae426.zip | |
Imrpoved Bridges, again
Diffstat (limited to 'src')
| -rwxr-xr-x | src/tools/bridge.c | 35 |
1 files changed, 21 insertions, 14 deletions
diff --git a/src/tools/bridge.c b/src/tools/bridge.c index 6e18496b..f30c5360 100755 --- a/src/tools/bridge.c +++ b/src/tools/bridge.c @@ -21,14 +21,21 @@ KHASH_MAP_INIT_INT64(bridgemap, uintptr_t) -//onebridge is 32 bytes -#define NBRICK 4096/32 typedef struct brick_s brick_t; typedef struct brick_s { onebridge_t *b; int sz; brick_t *next; } brick_t; +#ifdef PAGE8K +#define NBRICK (8192/sizeof(onebridge_t)) +#elif defined(PAGE16K) +#define NBRICK (16384/sizeof(onebridge_t)) +#elif defined(PAGE64K) +#define NBRICK (65536/sizeof(onebridge_t)) +#else +#define NBRICK (4096/sizeof(onebridge_t)) +#endif typedef struct bridge_s { brick_t *head; @@ -40,13 +47,18 @@ typedef struct bridge_s { void* my_mmap(x64emu_t* emu, void* addr, unsigned long length, int prot, int flags, int fd, int64_t offset); int my_munmap(x64emu_t* emu, void* addr, unsigned long length); -brick_t* NewBrick() +brick_t* NewBrick(void* old) { brick_t* ret = (brick_t*)box_calloc(1, sizeof(brick_t)); - void* ptr = my_mmap(thread_get_emu(), NULL, NBRICK * sizeof(onebridge_t), PROT_READ | PROT_WRITE, MAP_PRIVATE | 0x40 | MAP_ANONYMOUS, -1, 0); // 0x40 is MAP_32BIT + if(old) + old = old + NBRICK * sizeof(onebridge_t); + void* ptr = my_mmap(thread_get_emu(), old, NBRICK * sizeof(onebridge_t), PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | 0x40 | MAP_ANONYMOUS, -1, 0); // 0x40 is MAP_32BIT + if(ptr == MAP_FAILED) + ptr = my_mmap(thread_get_emu(), NULL, NBRICK * sizeof(onebridge_t), PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | 0x40 | MAP_ANONYMOUS, -1, 0); if(ptr == MAP_FAILED) { printf_log(LOG_NONE, "Warning, cannot allocate 0x%lx aligned bytes for bridge, will probably crash later\n", NBRICK*sizeof(onebridge_t)); } + dynarec_log(LOG_INFO, "New Bridge brick at %p (size 0x%x)\n", ptr, NBRICK*sizeof(onebridge_t)); ret->b = ptr; return ret; } @@ -54,7 +66,7 @@ brick_t* NewBrick() bridge_t *NewBridge() { bridge_t *b = (bridge_t*)box_calloc(1, sizeof(bridge_t)); - b->head = NewBrick(); + b->head = NewBrick(NULL); b->last = b->head; b->bridgemap = kh_init(bridgemap); @@ -96,7 +108,7 @@ uintptr_t AddBridge(bridge_t* bridge, wrapper_t w, void* fnc, int N, const char* pthread_mutex_lock(&my_context->mutex_bridge); b = bridge->last; if(b->sz == NBRICK) { - b->next = NewBrick(); + b->next = NewBrick(b->b); b = b->next; bridge->last = b; } @@ -106,9 +118,7 @@ uintptr_t AddBridge(bridge_t* bridge, wrapper_t w, void* fnc, int N, const char* if(box64_dynarec) { prot=(getProtection((uintptr_t)b->b)&(PROT_DYNAREC|PROT_DYNAREC_R))?1:0; if(prot) - unprotectDB((uintptr_t)b->b, NBRICK*sizeof(onebridge_t), 1); - else // only add DB if there is no protection - addDBFromAddressRange((uintptr_t)&b->b[b->sz].CC, sizeof(onebridge_t)); + unprotectDB((uintptr_t)b->b, NBRICK*sizeof(onebridge_t), 0); // don't mark blocks, it's only new one } } while(sz!=b->sz); // this while loop if someone took the slot when the bridge mutex was unlocked doing memory protection managment pthread_mutex_lock(&my_context->mutex_bridge); @@ -125,10 +135,7 @@ uintptr_t AddBridge(bridge_t* bridge, wrapper_t w, void* fnc, int N, const char* khint_t k = kh_put(bridgemap, bridge->bridgemap, (uintptr_t)fnc, &ret); kh_value(bridge->bridgemap, k) = (uintptr_t)&b->b[sz].CC; pthread_mutex_unlock(&my_context->mutex_bridge); - #ifdef DYNAREC - if(box64_dynarec) - protectDB((uintptr_t)b->b, NBRICK*sizeof(onebridge_t)); - #endif + // no need to reprotect the block, it will be protected later if needed #ifdef HAVE_TRACE if(name) addBridgeName(fnc, name); @@ -229,7 +236,7 @@ uintptr_t AddVSyscall(bridge_t* bridge, int num) pthread_mutex_lock(&my_context->mutex_bridge); b = bridge->last; if(b->sz == NBRICK) { - b->next = NewBrick(); + b->next = NewBrick(b->b); b = b->next; bridge->last = b; } |