From 8073bb279f5370ca58e283bbee0aff9aaa92ce24 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Wed, 9 Mar 2022 12:33:21 +0100 Subject: Fixed for good non-dynarec builds --- src/custommem.c | 117 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 58 insertions(+), 59 deletions(-) (limited to 'src') diff --git a/src/custommem.c b/src/custommem.c index c328fdf1..0fe21251 100644 --- a/src/custommem.c +++ b/src/custommem.c @@ -832,65 +832,6 @@ void unprotectDB(uintptr_t addr, size_t size) pthread_mutex_unlock(&mutex_prot); } -void removeMapMem(uintptr_t begin, uintptr_t end) -{ - // granularity is 0x10000, like on x86_64 - begin &=~0xffff; - end = (end&~0xffff)+0xffff; // full granulirity - // sanitize values - if(end==0xffff) return; - if(!begin) begin = 0x1000; - mapmem_t* m = mapmem; - while(beginendnext; - } - if(!m) { - return; - } - if(m->beginbegin <= begin) { - if(m->end>end) { - // whole zone to free if now free, nothing more to do, bye - m->begin = end + 1; - return; - } else { - begin = m->end + 1; - mapmem_t* tmp = m; - m = m->next; - m->prev = tmp->prev; - tmp->prev->next = m; - free(tmp); - } - } else { - if(m->end>end) { - // split the block! - mapmem_t* newm = (mapmem_t*)calloc(1, sizeof(mapmem_t)); - newm->begin = end+1; - newm->end = m->end; - m->end = begin - 1; - newm->next = m->next; - newm->prev = m; - m->next = newm; - } else if(m->end == end) { - m->end = begin - 1; - return; - } else { - //free the block - begin = m->end + 1; - mapmem_t* tmp = m; - m = m->next; - tmp->prev->next = m; - if(m) - m->prev = tmp->prev; - free(tmp); - } - } - } -} - int isprotectedDB(uintptr_t addr, size_t size) { dynarec_log(LOG_DEBUG, "isprotectedDB %p -> %p => ", (void*)addr, (void*)(addr+size-1)); @@ -953,6 +894,64 @@ void addMapMem(uintptr_t begin, uintptr_t end) } // all done! } +void removeMapMem(uintptr_t begin, uintptr_t end) +{ + // granularity is 0x10000, like on x86_64 + begin &=~0xffff; + end = (end&~0xffff)+0xffff; // full granulirity + // sanitize values + if(end==0xffff) return; + if(!begin) begin = 0x1000; + mapmem_t* m = mapmem; + while(beginendnext; + } + if(!m) { + return; + } + if(m->beginbegin <= begin) { + if(m->end>end) { + // whole zone to free if now free, nothing more to do, bye + m->begin = end + 1; + return; + } else { + begin = m->end + 1; + mapmem_t* tmp = m; + m = m->next; + m->prev = tmp->prev; + tmp->prev->next = m; + free(tmp); + } + } else { + if(m->end>end) { + // split the block! + mapmem_t* newm = (mapmem_t*)calloc(1, sizeof(mapmem_t)); + newm->begin = end+1; + newm->end = m->end; + m->end = begin - 1; + newm->next = m->next; + newm->prev = m; + m->next = newm; + } else if(m->end == end) { + m->end = begin - 1; + return; + } else { + //free the block + begin = m->end + 1; + mapmem_t* tmp = m; + m = m->next; + tmp->prev->next = m; + if(m) + m->prev = tmp->prev; + free(tmp); + } + } + } +} void updateProtection(uintptr_t addr, size_t size, uint32_t prot) { -- cgit 1.4.1