Recompiler now uses logical address of 0xffffffff rather than 0 to represent invalid block. Fixes some Unixes when recompiler enabled.
This commit is contained in:
parent
5f0d43f782
commit
c71963727a
4 changed files with 37 additions and 16 deletions
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
|
|
|||
Loading…
Reference in a new issue