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

View File

@ -455,7 +455,13 @@ void* dc_run(void*)
do { do {
reset_requested = false; reset_requested = false;
try {
sh4_cpu.Run(); 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/")); SaveRomFiles(get_writable_data_path("/data/"));
if (reset_requested) if (reset_requested)
@ -949,6 +955,7 @@ void dc_loadstate()
#ifndef NO_MMU #ifndef NO_MMU
mmu_flush_table(); mmu_flush_table();
#endif #endif
bm_Reset();
if ( ! dc_unserialize(&data_ptr, &total_size) ) if ( ! dc_unserialize(&data_ptr, &total_size) )
{ {
@ -959,7 +966,6 @@ void dc_loadstate()
} }
mmu_set_state(); mmu_set_state();
bm_Reset();
sh4_cpu.ResetCache(); sh4_cpu.ResetCache();
dsp.dyndirty = true; dsp.dyndirty = true;
sh4_sched_ffts(); sh4_sched_ffts();

View File

@ -671,8 +671,8 @@ extern Sh4RegType div_som_reg3;
//extern u8 SH4_TCB[CODE_SIZE+4096]; //extern u8 SH4_TCB[CODE_SIZE+4096];
//one time ptr set //one time ptr set
//extern u8* CodeCache; //extern u8* CodeCache;
extern u32 LastAddr; //extern u32 LastAddr;
extern u32 LastAddr_min; //extern u32 LastAddr_min;
//temp storage only //temp storage only
//extern u32* emit_ptr; //extern u32* emit_ptr;
extern char block_hash[1024]; 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_reg2);
REICAST_S(div_som_reg3); REICAST_S(div_som_reg3);
REICAST_S(LastAddr); REICAST_S(i); //LastAddr
REICAST_S(LastAddr_min); REICAST_S(i); //LastAddr_min
REICAST_SA(block_hash,1024); REICAST_SA(block_hash,1024);
REICAST_SA(RegisterWrite,sh4_reg_count); 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(CodeCache,CODE_SIZE) ;
//REICAST_USA(SH4_TCB,CODE_SIZE+4096); //REICAST_USA(SH4_TCB,CODE_SIZE+4096);
REICAST_US(LastAddr); REICAST_US(i); //LastAddr
REICAST_US(LastAddr_min); REICAST_US(i); //LastAddr_min
REICAST_USA(block_hash,1024); 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(CodeCache,CODE_SIZE) ;
//REICAST_USA(SH4_TCB,CODE_SIZE+4096); //REICAST_USA(SH4_TCB,CODE_SIZE+4096);
REICAST_US(LastAddr); REICAST_US(i); //LastAddr
REICAST_US(LastAddr_min); REICAST_US(i); //LastAddr_min);
REICAST_USA(block_hash,1024); REICAST_USA(block_hash,1024);
REICAST_USA(RegisterWrite,sh4_reg_count); REICAST_USA(RegisterWrite,sh4_reg_count);