Sync with new SIGSEGV API.

This commit is contained in:
gbeauche 2007-12-30 09:18:40 +00:00
parent 7e7827a886
commit 19e145ad16
3 changed files with 22 additions and 12 deletions

View File

@ -253,7 +253,7 @@ static void *tick_func(void *arg);
extern void emul_ppc(uint32 start); extern void emul_ppc(uint32 start);
extern void init_emul_ppc(void); extern void init_emul_ppc(void);
extern void exit_emul_ppc(void); extern void exit_emul_ppc(void);
sigsegv_return_t sigsegv_handler(sigsegv_address_t, sigsegv_address_t); sigsegv_return_t sigsegv_handler(sigsegv_info_t *sip);
#else #else
extern "C" void sigusr2_handler_init(int sig, siginfo_t *sip, void *scp); extern "C" void sigusr2_handler_init(int sig, siginfo_t *sip, void *scp);
extern "C" void sigusr2_handler(int sig, siginfo_t *sip, void *scp); extern "C" void sigusr2_handler(int sig, siginfo_t *sip, void *scp);
@ -1637,9 +1637,19 @@ static void sigsegv_handler(int sig, siginfo_t *sip, void *scp)
#endif #endif
#if ENABLE_VOSF #if ENABLE_VOSF
// Handle screen fault. // Handle screen fault
extern bool Screen_fault_handler(sigsegv_address_t fault_address, sigsegv_address_t fault_instruction); // XXX: don't redefine locally?
if (Screen_fault_handler((sigsegv_address_t)addr, (sigsegv_address_t)r->pc())) #if SIGSEGV_CHECK_VERSION(1,0,0)
struct sigsegv_info_t {
sigsegv_address_t addr;
sigsegv_address_t pc;
};
sigsegv_info_t si;
si.addr = (sigsegv_address_t)addr;
si.pc = (sigsegv_address_t)r->pc();
#endif
extern bool Screen_fault_handler(sigsegv_info_t *sip);
if (Screen_fault_handler(&si))
return; return;
#endif #endif

View File

@ -114,7 +114,7 @@ static void jump_to_rom(uint32 entry);
extern void emul_ppc(uint32 start); extern void emul_ppc(uint32 start);
extern void init_emul_ppc(void); extern void init_emul_ppc(void);
extern void exit_emul_ppc(void); extern void exit_emul_ppc(void);
sigsegv_return_t sigsegv_handler(sigsegv_address_t, sigsegv_address_t); sigsegv_return_t sigsegv_handler(sigsegv_info_t *sip);
/* /*

View File

@ -171,7 +171,7 @@ public:
void interrupt(uint32 entry); void interrupt(uint32 entry);
// Make sure the SIGSEGV handler can access CPU registers // Make sure the SIGSEGV handler can access CPU registers
friend sigsegv_return_t sigsegv_handler(sigsegv_address_t, sigsegv_address_t); friend sigsegv_return_t sigsegv_handler(sigsegv_info_t *sip);
}; };
sheepshaver_cpu::sheepshaver_cpu() sheepshaver_cpu::sheepshaver_cpu()
@ -730,16 +730,16 @@ static void dump_log(void)
* Initialize CPU emulation * Initialize CPU emulation
*/ */
sigsegv_return_t sigsegv_handler(sigsegv_address_t fault_address, sigsegv_address_t fault_instruction) sigsegv_return_t sigsegv_handler(sigsegv_info_t *sip)
{ {
#if ENABLE_VOSF #if ENABLE_VOSF
// Handle screen fault // Handle screen fault
extern bool Screen_fault_handler(sigsegv_address_t, sigsegv_address_t); extern bool Screen_fault_handler(sigsegv_info_t *sip);
if (Screen_fault_handler(fault_address, fault_instruction)) if (Screen_fault_handler(sip))
return SIGSEGV_RETURN_SUCCESS; return SIGSEGV_RETURN_SUCCESS;
#endif #endif
const uintptr addr = (uintptr)fault_address; const uintptr addr = (uintptr)sigsegv_get_fault_address(sip);
#if HAVE_SIGSEGV_SKIP_INSTRUCTION #if HAVE_SIGSEGV_SKIP_INSTRUCTION
// Ignore writes to ROM // Ignore writes to ROM
if ((addr - (uintptr)ROMBaseHost) < ROM_SIZE) if ((addr - (uintptr)ROMBaseHost) < ROM_SIZE)
@ -790,8 +790,8 @@ sigsegv_return_t sigsegv_handler(sigsegv_address_t fault_address, sigsegv_addres
#endif #endif
fprintf(stderr, "SIGSEGV\n"); fprintf(stderr, "SIGSEGV\n");
fprintf(stderr, " pc %p\n", fault_instruction); fprintf(stderr, " pc %p\n", sigsegv_get_fault_instruction_address(sip));
fprintf(stderr, " ea %p\n", fault_address); fprintf(stderr, " ea %p\n", sigsegv_get_fault_address(sip));
dump_registers(); dump_registers();
ppc_cpu->dump_log(); ppc_cpu->dump_log();
enter_mon(); enter_mon();