wince: fix load state hanging

This commit is contained in:
Flyinghead 2019-06-21 13:17:34 +02:00
parent af2ba55bac
commit 3e8cdc76f3
3 changed files with 20 additions and 13 deletions

View File

@ -56,7 +56,7 @@ extern int vmem_fd;
#define VMEM32_ERROR_NOT_MAPPED 0x100
static const u64 VMEM32_SIZE = 0x100000000L;
static const u64 KERNEL_SPACE = 0x80000000L;
static const u64 USER_SPACE = 0x80000000L;
static const u64 AREA7_ADDRESS = 0x7C000000L;
#define VRAM_PROT_SEGMENT (1024 * 1024) // vram protection regions are grouped by 1MB segment
@ -67,7 +67,7 @@ struct vram_lock {
u32 end;
};
static std::vector<vram_lock> vram_blocks[VRAM_SIZE / VRAM_PROT_SEGMENT];
static u8 sram_mapped_pages[KERNEL_SPACE / PAGE_SIZE / 8]; // bit set to 1 if page is mapped
static u8 sram_mapped_pages[USER_SPACE / PAGE_SIZE / 8]; // bit set to 1 if page is mapped
bool vmem32_inited;
@ -368,7 +368,7 @@ void vmem32_flush_mmu()
//vmem32_flush++;
vram_mapped_pages.clear();
memset(sram_mapped_pages, 0, sizeof(sram_mapped_pages));
vmem32_unmap_buffer(0, KERNEL_SPACE);
vmem32_unmap_buffer(0, USER_SPACE);
// TODO flush P3?
}
@ -380,6 +380,7 @@ bool vmem32_init()
if (settings.dynarec.disable_vmem32 || !_nvmem_4gb_space())
return false;
vmem32_inited = true;
vmem32_flush_mmu();
return true;
#endif
}

View File

@ -455,7 +455,13 @@ void* dc_run(void*)
do {
reset_requested = false;
try {
sh4_cpu.Run();
} catch (const FatalError& error) {
printf("FATAL: %s in %s:%d: %s\n", error.message.c_str(), error.file.c_str(), error.line, error.function.c_str());
reset_requested = false;
sh4_cpu.Stop();
}
SaveRomFiles(get_writable_data_path("/data/"));
if (reset_requested)
@ -949,6 +955,7 @@ void dc_loadstate()
#ifndef NO_MMU
mmu_flush_table();
#endif
bm_Reset();
if ( ! dc_unserialize(&data_ptr, &total_size) )
{
@ -959,7 +966,6 @@ void dc_loadstate()
}
mmu_set_state();
bm_Reset();
sh4_cpu.ResetCache();
dsp.dyndirty = true;
sh4_sched_ffts();

View File

@ -671,8 +671,8 @@ extern Sh4RegType div_som_reg3;
//extern u8 SH4_TCB[CODE_SIZE+4096];
//one time ptr set
//extern u8* CodeCache;
extern u32 LastAddr;
extern u32 LastAddr_min;
//extern u32 LastAddr;
//extern u32 LastAddr_min;
//temp storage only
//extern u32* emit_ptr;
extern char block_hash[1024];
@ -1097,8 +1097,8 @@ bool dc_serialize(void **data, unsigned int *total_size)
REICAST_S(div_som_reg2);
REICAST_S(div_som_reg3);
REICAST_S(LastAddr);
REICAST_S(LastAddr_min);
REICAST_S(i); //LastAddr
REICAST_S(i); //LastAddr_min
REICAST_SA(block_hash,1024);
REICAST_SA(RegisterWrite,sh4_reg_count);
@ -1492,8 +1492,8 @@ static bool dc_unserialize_libretro(void **data, unsigned int *total_size)
//REICAST_USA(CodeCache,CODE_SIZE) ;
//REICAST_USA(SH4_TCB,CODE_SIZE+4096);
REICAST_US(LastAddr);
REICAST_US(LastAddr_min);
REICAST_US(i); //LastAddr
REICAST_US(i); //LastAddr_min
REICAST_USA(block_hash,1024);
@ -1870,8 +1870,8 @@ bool dc_unserialize(void **data, unsigned int *total_size)
//REICAST_USA(CodeCache,CODE_SIZE) ;
//REICAST_USA(SH4_TCB,CODE_SIZE+4096);
REICAST_US(LastAddr);
REICAST_US(LastAddr_min);
REICAST_US(i); //LastAddr
REICAST_US(i); //LastAddr_min);
REICAST_USA(block_hash,1024);
REICAST_USA(RegisterWrite,sh4_reg_count);