diff --git a/src/386_dynarec.c b/src/386_dynarec.c index 7411ad3..144177e 100644 --- a/src/386_dynarec.c +++ b/src/386_dynarec.c @@ -612,7 +612,7 @@ void exec386_dynarec(int cycs) { codegen_check_flush(page, page->dirty_mask[(phys_addr >> 10) & 3], phys_addr); page->dirty_mask[(phys_addr >> 10) & 3] = 0; - if (!block->pc) + if (block->pc == BLOCK_PC_INVALID) valid_block = 0; } if (valid_block && block->page_mask2) @@ -632,7 +632,7 @@ void exec386_dynarec(int cycs) { codegen_check_flush(page_2, page_2->dirty_mask[(phys_addr_2 >> 10) & 3], phys_addr_2); page_2->dirty_mask[(phys_addr_2 >> 10) & 3] = 0; - if (!block->pc) + if (block->pc == BLOCK_PC_INVALID) valid_block = 0; } } diff --git a/src/codegen.h b/src/codegen.h index 8eaab36..3a8a955 100644 --- a/src/codegen.h +++ b/src/codegen.h @@ -74,6 +74,8 @@ typedef struct codeblock_t /*Code block is always entered with the same FPU top-of-stack*/ #define CODEBLOCK_STATIC_TOP 2 +#define BLOCK_PC_INVALID 0xffffffff + static inline codeblock_t *codeblock_tree_find(uint32_t phys, uint32_t _cs) { codeblock_t *block = pages[phys >> 12].head; diff --git a/src/codegen_x86-64.c b/src/codegen_x86-64.c index 7220966..0c21a3a 100644 --- a/src/codegen_x86-64.c +++ b/src/codegen_x86-64.c @@ -61,6 +61,8 @@ static int last_ssegs; void codegen_init() { + int c; + #ifdef __linux__ void *start; size_t len; @@ -78,6 +80,9 @@ void codegen_init() memset(codeblock, 0, BLOCK_SIZE * sizeof(codeblock_t)); memset(codeblock_hash, 0, HASH_SIZE * sizeof(codeblock_t *)); + for (c = 0; c < BLOCK_SIZE; c++) + codeblock[c].pc = BLOCK_PC_INVALID; + #ifdef __linux__ start = (void *)((long)codeblock & pagemask); len = ((BLOCK_SIZE * sizeof(codeblock_t)) + pagesize) & pagemask; @@ -92,9 +97,14 @@ void codegen_init() void codegen_reset() { + int c; + memset(codeblock, 0, BLOCK_SIZE * sizeof(codeblock_t)); memset(codeblock_hash, 0, HASH_SIZE * sizeof(codeblock_t *)); mem_reset_page_blocks(); + + for (c = 0; c < BLOCK_SIZE; c++) + codeblock[c].pc = BLOCK_PC_INVALID; } void dump_block() @@ -136,8 +146,8 @@ static void add_to_block_list(codeblock_t *block) if (block->next) { - if (!block->next->pc) - fatal("block->next->pc=0 %p %p %x %x\n", (void *)block->next, (void *)codeblock, block_current, block_pos); + if (block->next->pc == BLOCK_PC_INVALID) + fatal("block->next->pc=BLOCK_PC_INVALID %p %p %x %x\n", (void *)block->next, (void *)codeblock, block_current, block_pos); } if (block->page_mask2) @@ -208,9 +218,9 @@ static void delete_block(codeblock_t *block) if (block == codeblock_hash[HASH(block->phys)]) codeblock_hash[HASH(block->phys)] = NULL; - if (!block->pc) + if (block->pc == BLOCK_PC_INVALID) fatal("Deleting deleted block\n"); - block->pc = 0; + block->pc = BLOCK_PC_INVALID; codeblock_tree_delete(block); remove_from_block_list(block, old_pc); @@ -260,7 +270,7 @@ void codegen_block_init(uint32_t phys_addr) // if (block->pc == 0xb00b4ff5) // pclog("Init target block\n"); - if (block->pc != 0) + if (block->pc != BLOCK_PC_INVALID) { // pclog("Reuse block : was %08x now %08x\n", block->pc, cs+pc); delete_block(block); @@ -453,8 +463,8 @@ void codegen_block_generate_end_mask() if (block->next_2) { // pclog(" next_2->pc=%08x\n", block->next_2->pc); - if (!block->next_2->pc) - fatal("block->next_2->pc=0 %p\n", (void *)block->next_2); + if (block->next_2->pc == BLOCK_PC_INVALID) + fatal("block->next_2->pc=BLOCK_PC_INVALID %p\n", (void *)block->next_2); } block->dirty_mask2 = &page_2->dirty_mask[(block->phys_2 >> PAGE_MASK_INDEX_SHIFT) & PAGE_MASK_INDEX_MASK]; diff --git a/src/codegen_x86.c b/src/codegen_x86.c index 14f076e..688a363 100644 --- a/src/codegen_x86.c +++ b/src/codegen_x86.c @@ -1123,6 +1123,7 @@ static uint32_t gen_MEM_CHECK_WRITE_L() void codegen_init() { + int c; #ifdef __linux__ void *start; size_t len; @@ -1140,6 +1141,9 @@ void codegen_init() memset(codeblock, 0, (BLOCK_SIZE+1) * sizeof(codeblock_t)); memset(codeblock_hash, 0, HASH_SIZE * sizeof(codeblock_t *)); + for (c = 0; c < BLOCK_SIZE; c++) + codeblock[c].pc = BLOCK_PC_INVALID; + #ifdef __linux__ start = (void *)((long)codeblock & pagemask); len = (((BLOCK_SIZE+1) * sizeof(codeblock_t)) + pagesize) & pagemask; @@ -1205,9 +1209,14 @@ void codegen_init() void codegen_reset() { + int c; + memset(codeblock, 0, BLOCK_SIZE * sizeof(codeblock_t)); memset(codeblock_hash, 0, HASH_SIZE * sizeof(codeblock_t *)); mem_reset_page_blocks(); + + for (c = 0; c < BLOCK_SIZE; c++) + codeblock[c].pc = BLOCK_PC_INVALID; } void dump_block() @@ -1249,8 +1258,8 @@ static void add_to_block_list(codeblock_t *block) if (block->next) { - if (!block->next->pc) - fatal("block->next->pc=0 %p %p %x %x\n", (void *)block->next, (void *)codeblock, block_current, block_pos); + if (block->next->pc == BLOCK_PC_INVALID) + fatal("block->next->pc=BLOCK_PC_INVALID %p %p %x %x\n", (void *)block->next, (void *)codeblock, block_current, block_pos); } if (block->page_mask2) @@ -1321,9 +1330,9 @@ static void delete_block(codeblock_t *block) if (block == codeblock_hash[HASH(block->phys)]) codeblock_hash[HASH(block->phys)] = NULL; - if (!block->pc) + if (block->pc == BLOCK_PC_INVALID) fatal("Deleting deleted block\n"); - block->pc = 0; + block->pc = BLOCK_PC_INVALID; codeblock_tree_delete(block); remove_from_block_list(block, old_pc); @@ -1373,7 +1382,7 @@ void codegen_block_init(uint32_t phys_addr) // if (block->pc == 0xb00b4ff5) // pclog("Init target block\n"); - if (block->pc != 0) + if (block->pc != BLOCK_PC_INVALID) { // pclog("Reuse block : was %08x now %08x\n", block->pc, cs+pc); delete_block(block); @@ -1540,8 +1549,8 @@ void codegen_block_generate_end_mask() if (block->next_2) { // pclog(" next_2->pc=%08x\n", block->next_2->pc); - if (!block->next_2->pc) - fatal("block->next_2->pc=0 %p\n", (void *)block->next_2); + if (block->next_2->pc == BLOCK_PC_INVALID) + fatal("block->next_2->pc=BLOCK_PC_INVALID %p\n", (void *)block->next_2); } block->dirty_mask2 = &page_2->dirty_mask[(block->phys_2 >> PAGE_MASK_INDEX_SHIFT) & PAGE_MASK_INDEX_MASK];