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);
|
codegen_check_flush(page, page->dirty_mask[(phys_addr >> 10) & 3], phys_addr);
|
||||||
page->dirty_mask[(phys_addr >> 10) & 3] = 0;
|
page->dirty_mask[(phys_addr >> 10) & 3] = 0;
|
||||||
if (!block->pc)
|
if (block->pc == BLOCK_PC_INVALID)
|
||||||
valid_block = 0;
|
valid_block = 0;
|
||||||
}
|
}
|
||||||
if (valid_block && block->page_mask2)
|
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);
|
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;
|
page_2->dirty_mask[(phys_addr_2 >> 10) & 3] = 0;
|
||||||
if (!block->pc)
|
if (block->pc == BLOCK_PC_INVALID)
|
||||||
valid_block = 0;
|
valid_block = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -74,6 +74,8 @@ typedef struct codeblock_t
|
||||||
/*Code block is always entered with the same FPU top-of-stack*/
|
/*Code block is always entered with the same FPU top-of-stack*/
|
||||||
#define CODEBLOCK_STATIC_TOP 2
|
#define CODEBLOCK_STATIC_TOP 2
|
||||||
|
|
||||||
|
#define BLOCK_PC_INVALID 0xffffffff
|
||||||
|
|
||||||
static inline codeblock_t *codeblock_tree_find(uint32_t phys, uint32_t _cs)
|
static inline codeblock_t *codeblock_tree_find(uint32_t phys, uint32_t _cs)
|
||||||
{
|
{
|
||||||
codeblock_t *block = pages[phys >> 12].head;
|
codeblock_t *block = pages[phys >> 12].head;
|
||||||
|
|
|
||||||
|
|
@ -61,6 +61,8 @@ static int last_ssegs;
|
||||||
|
|
||||||
void codegen_init()
|
void codegen_init()
|
||||||
{
|
{
|
||||||
|
int c;
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
void *start;
|
void *start;
|
||||||
size_t len;
|
size_t len;
|
||||||
|
|
@ -78,6 +80,9 @@ void codegen_init()
|
||||||
memset(codeblock, 0, BLOCK_SIZE * sizeof(codeblock_t));
|
memset(codeblock, 0, BLOCK_SIZE * sizeof(codeblock_t));
|
||||||
memset(codeblock_hash, 0, HASH_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__
|
#ifdef __linux__
|
||||||
start = (void *)((long)codeblock & pagemask);
|
start = (void *)((long)codeblock & pagemask);
|
||||||
len = ((BLOCK_SIZE * sizeof(codeblock_t)) + pagesize) & pagemask;
|
len = ((BLOCK_SIZE * sizeof(codeblock_t)) + pagesize) & pagemask;
|
||||||
|
|
@ -92,9 +97,14 @@ void codegen_init()
|
||||||
|
|
||||||
void codegen_reset()
|
void codegen_reset()
|
||||||
{
|
{
|
||||||
|
int c;
|
||||||
|
|
||||||
memset(codeblock, 0, BLOCK_SIZE * sizeof(codeblock_t));
|
memset(codeblock, 0, BLOCK_SIZE * sizeof(codeblock_t));
|
||||||
memset(codeblock_hash, 0, HASH_SIZE * sizeof(codeblock_t *));
|
memset(codeblock_hash, 0, HASH_SIZE * sizeof(codeblock_t *));
|
||||||
mem_reset_page_blocks();
|
mem_reset_page_blocks();
|
||||||
|
|
||||||
|
for (c = 0; c < BLOCK_SIZE; c++)
|
||||||
|
codeblock[c].pc = BLOCK_PC_INVALID;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dump_block()
|
void dump_block()
|
||||||
|
|
@ -136,8 +146,8 @@ static void add_to_block_list(codeblock_t *block)
|
||||||
|
|
||||||
if (block->next)
|
if (block->next)
|
||||||
{
|
{
|
||||||
if (!block->next->pc)
|
if (block->next->pc == BLOCK_PC_INVALID)
|
||||||
fatal("block->next->pc=0 %p %p %x %x\n", (void *)block->next, (void *)codeblock, block_current, block_pos);
|
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)
|
if (block->page_mask2)
|
||||||
|
|
@ -208,9 +218,9 @@ static void delete_block(codeblock_t *block)
|
||||||
if (block == codeblock_hash[HASH(block->phys)])
|
if (block == codeblock_hash[HASH(block->phys)])
|
||||||
codeblock_hash[HASH(block->phys)] = NULL;
|
codeblock_hash[HASH(block->phys)] = NULL;
|
||||||
|
|
||||||
if (!block->pc)
|
if (block->pc == BLOCK_PC_INVALID)
|
||||||
fatal("Deleting deleted block\n");
|
fatal("Deleting deleted block\n");
|
||||||
block->pc = 0;
|
block->pc = BLOCK_PC_INVALID;
|
||||||
|
|
||||||
codeblock_tree_delete(block);
|
codeblock_tree_delete(block);
|
||||||
remove_from_block_list(block, old_pc);
|
remove_from_block_list(block, old_pc);
|
||||||
|
|
@ -260,7 +270,7 @@ void codegen_block_init(uint32_t phys_addr)
|
||||||
|
|
||||||
// if (block->pc == 0xb00b4ff5)
|
// if (block->pc == 0xb00b4ff5)
|
||||||
// pclog("Init target block\n");
|
// 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);
|
// pclog("Reuse block : was %08x now %08x\n", block->pc, cs+pc);
|
||||||
delete_block(block);
|
delete_block(block);
|
||||||
|
|
@ -453,8 +463,8 @@ void codegen_block_generate_end_mask()
|
||||||
if (block->next_2)
|
if (block->next_2)
|
||||||
{
|
{
|
||||||
// pclog(" next_2->pc=%08x\n", block->next_2->pc);
|
// pclog(" next_2->pc=%08x\n", block->next_2->pc);
|
||||||
if (!block->next_2->pc)
|
if (block->next_2->pc == BLOCK_PC_INVALID)
|
||||||
fatal("block->next_2->pc=0 %p\n", (void *)block->next_2);
|
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];
|
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()
|
void codegen_init()
|
||||||
{
|
{
|
||||||
|
int c;
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
void *start;
|
void *start;
|
||||||
size_t len;
|
size_t len;
|
||||||
|
|
@ -1140,6 +1141,9 @@ void codegen_init()
|
||||||
memset(codeblock, 0, (BLOCK_SIZE+1) * sizeof(codeblock_t));
|
memset(codeblock, 0, (BLOCK_SIZE+1) * sizeof(codeblock_t));
|
||||||
memset(codeblock_hash, 0, HASH_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__
|
#ifdef __linux__
|
||||||
start = (void *)((long)codeblock & pagemask);
|
start = (void *)((long)codeblock & pagemask);
|
||||||
len = (((BLOCK_SIZE+1) * sizeof(codeblock_t)) + pagesize) & pagemask;
|
len = (((BLOCK_SIZE+1) * sizeof(codeblock_t)) + pagesize) & pagemask;
|
||||||
|
|
@ -1205,9 +1209,14 @@ void codegen_init()
|
||||||
|
|
||||||
void codegen_reset()
|
void codegen_reset()
|
||||||
{
|
{
|
||||||
|
int c;
|
||||||
|
|
||||||
memset(codeblock, 0, BLOCK_SIZE * sizeof(codeblock_t));
|
memset(codeblock, 0, BLOCK_SIZE * sizeof(codeblock_t));
|
||||||
memset(codeblock_hash, 0, HASH_SIZE * sizeof(codeblock_t *));
|
memset(codeblock_hash, 0, HASH_SIZE * sizeof(codeblock_t *));
|
||||||
mem_reset_page_blocks();
|
mem_reset_page_blocks();
|
||||||
|
|
||||||
|
for (c = 0; c < BLOCK_SIZE; c++)
|
||||||
|
codeblock[c].pc = BLOCK_PC_INVALID;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dump_block()
|
void dump_block()
|
||||||
|
|
@ -1249,8 +1258,8 @@ static void add_to_block_list(codeblock_t *block)
|
||||||
|
|
||||||
if (block->next)
|
if (block->next)
|
||||||
{
|
{
|
||||||
if (!block->next->pc)
|
if (block->next->pc == BLOCK_PC_INVALID)
|
||||||
fatal("block->next->pc=0 %p %p %x %x\n", (void *)block->next, (void *)codeblock, block_current, block_pos);
|
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)
|
if (block->page_mask2)
|
||||||
|
|
@ -1321,9 +1330,9 @@ static void delete_block(codeblock_t *block)
|
||||||
if (block == codeblock_hash[HASH(block->phys)])
|
if (block == codeblock_hash[HASH(block->phys)])
|
||||||
codeblock_hash[HASH(block->phys)] = NULL;
|
codeblock_hash[HASH(block->phys)] = NULL;
|
||||||
|
|
||||||
if (!block->pc)
|
if (block->pc == BLOCK_PC_INVALID)
|
||||||
fatal("Deleting deleted block\n");
|
fatal("Deleting deleted block\n");
|
||||||
block->pc = 0;
|
block->pc = BLOCK_PC_INVALID;
|
||||||
|
|
||||||
codeblock_tree_delete(block);
|
codeblock_tree_delete(block);
|
||||||
remove_from_block_list(block, old_pc);
|
remove_from_block_list(block, old_pc);
|
||||||
|
|
@ -1373,7 +1382,7 @@ void codegen_block_init(uint32_t phys_addr)
|
||||||
|
|
||||||
// if (block->pc == 0xb00b4ff5)
|
// if (block->pc == 0xb00b4ff5)
|
||||||
// pclog("Init target block\n");
|
// 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);
|
// pclog("Reuse block : was %08x now %08x\n", block->pc, cs+pc);
|
||||||
delete_block(block);
|
delete_block(block);
|
||||||
|
|
@ -1540,8 +1549,8 @@ void codegen_block_generate_end_mask()
|
||||||
if (block->next_2)
|
if (block->next_2)
|
||||||
{
|
{
|
||||||
// pclog(" next_2->pc=%08x\n", block->next_2->pc);
|
// pclog(" next_2->pc=%08x\n", block->next_2->pc);
|
||||||
if (!block->next_2->pc)
|
if (block->next_2->pc == BLOCK_PC_INVALID)
|
||||||
fatal("block->next_2->pc=0 %p\n", (void *)block->next_2);
|
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];
|
block->dirty_mask2 = &page_2->dirty_mask[(block->phys_2 >> PAGE_MASK_INDEX_SHIFT) & PAGE_MASK_INDEX_MASK];
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue