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 init_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
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);
@ -1637,9 +1637,19 @@ static void sigsegv_handler(int sig, siginfo_t *sip, void *scp)
#endif
#if ENABLE_VOSF
// Handle screen fault.
extern bool Screen_fault_handler(sigsegv_address_t fault_address, sigsegv_address_t fault_instruction);
if (Screen_fault_handler((sigsegv_address_t)addr, (sigsegv_address_t)r->pc()))
// Handle screen fault
// XXX: don't redefine locally?
#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;
#endif

View File

@ -114,7 +114,7 @@ static void jump_to_rom(uint32 entry);
extern void emul_ppc(uint32 start);
extern void init_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);
// 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()
@ -730,16 +730,16 @@ static void dump_log(void)
* 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
// Handle screen fault
extern bool Screen_fault_handler(sigsegv_address_t, sigsegv_address_t);
if (Screen_fault_handler(fault_address, fault_instruction))
extern bool Screen_fault_handler(sigsegv_info_t *sip);
if (Screen_fault_handler(sip))
return SIGSEGV_RETURN_SUCCESS;
#endif
const uintptr addr = (uintptr)fault_address;
const uintptr addr = (uintptr)sigsegv_get_fault_address(sip);
#if HAVE_SIGSEGV_SKIP_INSTRUCTION
// Ignore writes to ROM
if ((addr - (uintptr)ROMBaseHost) < ROM_SIZE)
@ -790,8 +790,8 @@ sigsegv_return_t sigsegv_handler(sigsegv_address_t fault_address, sigsegv_addres
#endif
fprintf(stderr, "SIGSEGV\n");
fprintf(stderr, " pc %p\n", fault_instruction);
fprintf(stderr, " ea %p\n", fault_address);
fprintf(stderr, " pc %p\n", sigsegv_get_fault_instruction_address(sip));
fprintf(stderr, " ea %p\n", sigsegv_get_fault_address(sip));
dump_registers();
ppc_cpu->dump_log();
enter_mon();