From 00f6271ec8bdad2e17473183259ddccdfd19f51a Mon Sep 17 00:00:00 2001 From: TomW Date: Sat, 6 Dec 2014 16:35:45 +0000 Subject: [PATCH] Recompiled code blocks are no longer allowed to cross pages. Recompiling of blocks is aborted if the code page becomes dirty. Fixes Windows 98 setup. --- src/386_dynarec.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/386_dynarec.c b/src/386_dynarec.c index 779687d..03ae713 100644 --- a/src/386_dynarec.c +++ b/src/386_dynarec.c @@ -1296,6 +1296,8 @@ inrecomp=0; } else if (!abrt) { + uint32_t start_page = pc >> 12; + // pclog("Hash %08x %i\n", codeblock_hash_pc[HASH(cs + pc)], codeblock_page_dirty[(cs + pc) >> 12]); cpu_block_end = 0; @@ -1338,6 +1340,9 @@ inrecomp=0; if (((cs + pc) >> 12) != pccache) CPU_BLOCK_END(); + + if ((pc >> 12) != start_page) + CPU_BLOCK_END(); pc++; /* if (opcode == 0xf2 || opcode == 0xf3 || ((opcode & ~7) == 0xd8)*/ @@ -1352,6 +1357,11 @@ inrecomp=0; if (((cs + pc) >> 12) != pccache) CPU_BLOCK_END(); + + if (codeblock_page_dirty[phys_addr >> 12]) + CPU_BLOCK_END(); + + //pclog("cpu_block_end=%d %p\n", cpu_block_end, (void *)&cpu_block_end); /* if (ssegs) { @@ -1361,7 +1371,7 @@ inrecomp=0; codegen_generate_seg_restore(); }*/ //codegen_check_abrt(); - if (abrt) + if (abrt || codeblock_page_dirty[phys_addr >> 12]) { codegen_block_remove(); CPU_BLOCK_END(); @@ -1372,7 +1382,7 @@ inrecomp=0; insc++; } - if (!abrt) + if (!abrt && !codeblock_page_dirty[phys_addr >> 12]) codegen_block_end(); // output &= ~2; }