From 880f2f0304f7e31b7c6b3eb0d8d9b03591607714 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 1 Apr 2021 03:06:26 +0200 Subject: [PATCH] Added some sanity checks to mem_invalidate_range(), fixes OS/2 2.0 segmentation faulting the emulator on IBM PS/2 Model 80 on the Dev builds. --- src/mem/mem.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/mem/mem.c b/src/mem/mem.c index b895cfb5b..a3ff49148 100644 --- a/src/mem/mem.c +++ b/src/mem/mem.c @@ -2156,12 +2156,20 @@ mem_invalidate_range(uint32_t start_addr, uint32_t end_addr) page_add_to_evict_list(p); for (i = start_addr; (i <= end_addr) && (i < (start_addr + (1 << PAGE_MASK_SHIFT))); i++) { - byte_offset = (i >> PAGE_BYTE_MASK_SHIFT) & PAGE_BYTE_MASK_OFFSET_MASK; - byte_mask = (uint64_t)1 << (i & PAGE_BYTE_MASK_MASK); + /* Do not look at the byte stuff if start_addr >= (mem_size * 1024), as we do not allocate the + byte dirty and code present mask arrays beyond the end of RAM. */ + if (i < (mem_size << 10)) { + byte_offset = (i >> PAGE_BYTE_MASK_SHIFT) & PAGE_BYTE_MASK_OFFSET_MASK; + byte_mask = (uint64_t)1 << (i & PAGE_BYTE_MASK_MASK); - p->byte_dirty_mask[byte_offset] |= byte_mask; - if ((p->byte_code_present_mask[byte_offset] & byte_mask) && !page_in_evict_list(p)) - page_add_to_evict_list(p); + if (p) { + if (p->byte_dirty_mask) + p->byte_dirty_mask[byte_offset] |= byte_mask; + if (p->byte_code_present_mask && (p->byte_code_present_mask[byte_offset] & byte_mask) && + !page_in_evict_list(p)) + page_add_to_evict_list(p); + } + } } } #else