From df9fac4e61aec3e71f70e82ba508be244115421d Mon Sep 17 00:00:00 2001 From: krcroft Date: Wed, 15 Jan 2020 07:43:10 -0800 Subject: [PATCH] Fix NULL issues in CPU emulation code --- src/cpu/core_dyn_x86.cpp | 2 +- src/cpu/core_dyn_x86/cache.h | 22 ++++++++++++++++++++-- src/cpu/core_dyn_x86/decoder.h | 15 ++++++++++++--- 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/cpu/core_dyn_x86.cpp b/src/cpu/core_dyn_x86.cpp index be572528..a93d2ac8 100644 --- a/src/cpu/core_dyn_x86.cpp +++ b/src/cpu/core_dyn_x86.cpp @@ -361,7 +361,7 @@ run_block: CodePageHandler * temp_handler=(CodePageHandler *)get_tlb_readhandler(temp_ip); if (temp_handler->flags & (cpu.code.big ? PFLAG_HASCODE32:PFLAG_HASCODE16)) { block=temp_handler->FindCacheBlock(temp_ip & 4095); - if (!block) goto restart_core; + if (!block || !cache.block.running) goto restart_core; cache.block.running->LinkTo(ret==BR_Link2,block); goto run_block; } diff --git a/src/cpu/core_dyn_x86/cache.h b/src/cpu/core_dyn_x86/cache.h index 3dca3eb1..ccf809af 100644 --- a/src/cpu/core_dyn_x86/cache.h +++ b/src/cpu/core_dyn_x86/cache.h @@ -121,6 +121,9 @@ public: return; } else if (!invalidation_map) { invalidation_map=(Bit8u*)malloc(4096); + if (!invalidation_map) { + E_Exit("wb:failed to allocate invalidation_map's memory"); + } memset(invalidation_map,0,4096); } invalidation_map[addr]++; @@ -141,6 +144,9 @@ public: return; } else if (!invalidation_map) { invalidation_map=(Bit8u*)malloc(4096); + if (!invalidation_map) { + E_Exit("ww:failed to allocate invalidation_map's memory"); + } memset(invalidation_map,0,4096); } (*(Bit16u*)&invalidation_map[addr])+=0x101; @@ -161,6 +167,9 @@ public: return; } else if (!invalidation_map) { invalidation_map=(Bit8u*)malloc(4096); + if (!invalidation_map) { + E_Exit("wd:failed to allocate invalidation_map's memory"); + } memset(invalidation_map,0,4096); } (*(Bit32u*)&invalidation_map[addr])+=0x1010101; @@ -181,6 +190,9 @@ public: } else { if (!invalidation_map) { invalidation_map=(Bit8u*)malloc(4096); + if (!invalidation_map) { + E_Exit("cb:failed to allocate invalidation_map's memory"); + } memset(invalidation_map,0,4096); } invalidation_map[addr]++; @@ -207,6 +219,9 @@ public: } else { if (!invalidation_map) { invalidation_map=(Bit8u*)malloc(4096); + if (!invalidation_map) { + E_Exit("cw:failed to allocate invalidation_map's memory"); + } memset(invalidation_map,0,4096); } (*(Bit16u*)&invalidation_map[addr])+=0x101; @@ -233,6 +248,9 @@ public: } else { if (!invalidation_map) { invalidation_map=(Bit8u*)malloc(4096); + if (!invalidation_map) { + E_Exit("cd:failed to allocate invalidation_map's memory"); + } memset(invalidation_map,0,4096); } (*(Bit32u*)&invalidation_map[addr])+=0x1010101; @@ -428,10 +446,10 @@ static void cache_closeblock(void) { if (written>block->cache.size) { if (!block->cache.next) { if (written>block->cache.size+CACHE_MAXSIZE) - E_Exit("CacheBlock overrun 1 %lu", + E_Exit("CacheBlock overrun 1 %" PRIuPTR, written-block->cache.size); } else { - E_Exit("CacheBlock overrun 2 written %lu size %lu", + E_Exit("CacheBlock overrun 2 written %" PRIuPTR " size %" PRIuPTR, written, block->cache.size); } } else { diff --git a/src/cpu/core_dyn_x86/decoder.h b/src/cpu/core_dyn_x86/decoder.h index 3d33e04b..273925a3 100644 --- a/src/cpu/core_dyn_x86/decoder.h +++ b/src/cpu/core_dyn_x86/decoder.h @@ -86,10 +86,11 @@ static bool MakeCodePage(Bitu lin_addr,CodePageHandler * &cph) { cph=0; return false; } /* Find a free CodePage */ - if (!cache.free_pages) { - if (cache.used_pages!=decode.page.code) cache.used_pages->ClearRelease(); + if (!cache.free_pages && cache.used_pages) { + if (cache.used_pages != decode.page.code) + cache.used_pages->ClearRelease(); else { - if ((cache.used_pages->next) && (cache.used_pages->next!=decode.page.code)) + if ((cache.used_pages->next) && (cache.used_pages->next != decode.page.code)) cache.used_pages->next->ClearRelease(); else { LOG_MSG("DYNX86:Invalid cache links"); @@ -97,6 +98,10 @@ static bool MakeCodePage(Bitu lin_addr,CodePageHandler * &cph) { } } } + if (!cache.free_pages) { + LOG_MSG("DYNX86:cache.free_pages is not useable"); + return false; + } CodePageHandler * cpagehandler=cache.free_pages; cache.free_pages=cache.free_pages->next; cpagehandler->prev=cache.last_page; @@ -176,6 +181,10 @@ static INLINE void decode_increase_wmapmask(Bitu size) { Bitu newmasklen=activecb->cache.masklen*4; if (newmasklencache.wmapmask,activecb->cache.masklen); free(activecb->cache.wmapmask);