From 0551f13f0ee258d6325285e20833328950e18bbc Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Thu, 18 Mar 2021 15:07:53 +0100 Subject: Fixed Protection handling --- src/custommem.c | 67 +++++++++++++++++++++++++++------------------------------ 1 file changed, 32 insertions(+), 35 deletions(-) (limited to 'src') diff --git a/src/custommem.c b/src/custommem.c index 62f15664..d3dc4b62 100644 --- a/src/custommem.c +++ b/src/custommem.c @@ -40,6 +40,7 @@ static uintptr_t* box64_jmptbldefault1[1< %p\n", (void*)addr, (void*)(addr+size-1)); uintptr_t idx = (addr>>MEMPROT_SHIFT); - uintptr_t end = ((addr+size-1)>>MEMPROT_SHIFT); + uintptr_t end = ((addr+size-1LL)>>MEMPROT_SHIFT); int ret; pthread_mutex_lock(&mutex_prot); for (uintptr_t i=idx; i<=end; ++i) { - const uint32_t key = (i>>16)&0xffffffff; + const uint32_t key = (i>>MEMPROT_SHIFT2)&0xffffffff; khint_t k = kh_put(memprot, memprot, key, &ret); if(ret) { uint8_t *m = (uint8_t*)calloc(1, MEMPROT_SIZE); @@ -661,7 +662,7 @@ void protectDBnolock(uintptr_t addr, uintptr_t size) uintptr_t end = ((addr+size-1)>>MEMPROT_SHIFT); int ret; for (uintptr_t i=idx; i<=end; ++i) { - const uint32_t key = (i>>16)&0xffffffff; + const uint32_t key = (i>>MEMPROT_SHIFT2)&0xffffffff; khint_t k = kh_put(memprot, memprot, key, &ret); if(ret) { uint8_t *m = (uint8_t*)calloc(1, MEMPROT_SIZE); @@ -693,11 +694,11 @@ void unprotectDB(uintptr_t addr, uintptr_t size) { dynarec_log(LOG_DEBUG, "unprotectDB %p -> %p\n", (void*)addr, (void*)(addr+size-1)); uintptr_t idx = (addr>>MEMPROT_SHIFT); - uintptr_t end = ((addr+size-1)>>MEMPROT_SHIFT); + uintptr_t end = ((addr+size-1LL)>>MEMPROT_SHIFT); int ret; pthread_mutex_lock(&mutex_prot); for (uintptr_t i=idx; i<=end; ++i) { - const uint32_t key = (i>>16)&0xffffffff; + const uint32_t key = (i>>MEMPROT_SHIFT2)&0xffffffff; khint_t k = kh_put(memprot, memprot, key, &ret); if(ret) { uint8_t *m = (uint8_t*)calloc(1, MEMPROT_SIZE); @@ -718,47 +719,43 @@ void unprotectDB(uintptr_t addr, uintptr_t size) void updateProtection(uintptr_t addr, uintptr_t size, uint32_t prot) { - if((addr+size)>>32 != (addr)>>32) { - setProtection((addr&0xffffffff00000000)+0x100000000, size-(addr&0xffffffff), prot); - size-=(addr&0xffffffff); - } - const uint32_t key = (addr>>32)&0xffffffff; - const uintptr_t idx = ((addr&0xffffffff)>>MEMPROT_SHIFT); - const uintptr_t end = (((addr&0xffffffff)+size-1)>>MEMPROT_SHIFT); - pthread_mutex_lock(&mutex_prot); + dynarec_log(LOG_DEBUG, "updateProtection %p:%p 0x%x\n", (void*)addr, (void*)(addr+size-1), prot); + uintptr_t idx = (addr>>MEMPROT_SHIFT); + uintptr_t end = ((addr+size-1LL)>>MEMPROT_SHIFT); int ret; - khint_t k = kh_put(memprot, memprot, key, &ret); - if(ret) { - uint8_t *m = (uint8_t*)calloc(1, MEMPROT_SIZE); - kh_value(memprot, k) = m; - } + pthread_mutex_lock(&mutex_prot); for (uintptr_t i=idx; i<=end; ++i) { - uint32_t dyn=(kh_value(memprot, k)[i]&PROT_DYNAREC); + const uint32_t key = (i>>MEMPROT_SHIFT2)&0xffffffff; + khint_t k = kh_put(memprot, memprot, key, &ret); + if(ret) { + uint8_t *m = (uint8_t*)calloc(1, MEMPROT_SIZE); + kh_value(memprot, k) = m; + } + const uintptr_t ii = i&(MEMPROT_SIZE-1); + uint32_t dyn = kh_value(memprot, k)[ii]&PROT_DYNAREC; if(dyn && (prot&PROT_WRITE)) // need to remove the write protection from this block - mprotect((void*)(i<>32 != (addr)>>32) { - setProtection((addr&0xffffffff00000000)+0x100000000, size-(addr&0xffffffff), prot); - size-=(addr&0xffffffff); - } - const uint32_t key = (addr>>32)&0xffffffff; - const uintptr_t idx = ((addr&0xffffffff)>>MEMPROT_SHIFT); - const uintptr_t end = (((addr&0xffffffff)+size-1)>>MEMPROT_SHIFT); - pthread_mutex_lock(&mutex_prot); + dynarec_log(LOG_DEBUG, "setProtection %p:%p 0x%x\n", (void*)addr, (void*)(addr+size-1), prot); + uintptr_t idx = (addr>>MEMPROT_SHIFT); + uintptr_t end = ((addr+size-1LL)>>MEMPROT_SHIFT); int ret; - khint_t k = kh_put(memprot, memprot, key, &ret); - if(ret) { - uint8_t *m = (uint8_t*)calloc(1, MEMPROT_SIZE); - kh_value(memprot, k) = m; - } + pthread_mutex_lock(&mutex_prot); for (uintptr_t i=idx; i<=end; ++i) { - kh_value(memprot, k)[i] = prot; + const uint32_t key = (i>>MEMPROT_SHIFT2)&0xffffffff; + khint_t k = kh_put(memprot, memprot, key, &ret); + if(ret) { + uint8_t *m = (uint8_t*)calloc(1, MEMPROT_SIZE); + kh_value(memprot, k) = m; + } + const uintptr_t ii = i&(MEMPROT_SIZE-1); + kh_value(memprot, k)[ii] = prot; } pthread_mutex_unlock(&mutex_prot); } -- cgit 1.4.1