mirror of
https://github.com/kanjitalk755/macemu.git
synced 2025-02-04 14:33:47 +00:00
Sync with new SIGSEGV API.
This commit is contained in:
parent
7e7827a886
commit
19e145ad16
@ -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
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -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();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user