89 |
|
// Pointer to Kernel Data |
90 |
|
static KernelData * const kernel_data = (KernelData *)KERNEL_DATA_BASE; |
91 |
|
|
92 |
+ |
// SIGSEGV handler |
93 |
+ |
static sigsegv_return_t sigsegv_handler(sigsegv_address_t, sigsegv_address_t); |
94 |
+ |
|
95 |
|
|
96 |
|
/** |
97 |
|
* PowerPC emulator glue with special 'sheep' opcodes |
139 |
|
// FIXME: really make surre array allocation fail at link time? |
140 |
|
void *operator new[](size_t); |
141 |
|
void operator delete[](void *p); |
142 |
+ |
|
143 |
+ |
// Make sure the SIGSEGV handler can access CPU registers |
144 |
+ |
friend sigsegv_return_t sigsegv_handler(sigsegv_address_t, sigsegv_address_t); |
145 |
|
}; |
146 |
|
|
147 |
|
lazy_allocator< sheepshaver_cpu > allocator_helper< sheepshaver_cpu, lazy_allocator >::allocator; |
560 |
|
if ((addr - ROM_BASE) < ROM_SIZE) |
561 |
|
return SIGSEGV_RETURN_SKIP_INSTRUCTION; |
562 |
|
|
563 |
< |
// Ignore all other faults, if requested |
564 |
< |
if (PrefsFindBool("ignoresegv")) |
565 |
< |
return SIGSEGV_RETURN_FAILURE; |
563 |
> |
// Get program counter of target CPU |
564 |
> |
sheepshaver_cpu * const cpu = current_cpu; |
565 |
> |
const uint32 pc = cpu->pc(); |
566 |
> |
|
567 |
> |
// Fault in Mac ROM or RAM? |
568 |
> |
bool mac_fault = (pc >= ROM_BASE) && (pc < (ROM_BASE + ROM_AREA_SIZE)) || (pc >= RAMBase) && (pc < (RAMBase + RAMSize)); |
569 |
> |
if (mac_fault) { |
570 |
> |
|
571 |
> |
// "VM settings" during MacOS 8 installation |
572 |
> |
if (pc == ROM_BASE + 0x488160 && cpu->gpr(20) == 0xf8000000) |
573 |
> |
return SIGSEGV_RETURN_SKIP_INSTRUCTION; |
574 |
> |
|
575 |
> |
// MacOS 8.5 installation |
576 |
> |
else if (pc == ROM_BASE + 0x488140 && cpu->gpr(16) == 0xf8000000) |
577 |
> |
return SIGSEGV_RETURN_SKIP_INSTRUCTION; |
578 |
> |
|
579 |
> |
// MacOS 8 serial drivers on startup |
580 |
> |
else if (pc == ROM_BASE + 0x48e080 && (cpu->gpr(8) == 0xf3012002 || cpu->gpr(8) == 0xf3012000)) |
581 |
> |
return SIGSEGV_RETURN_SKIP_INSTRUCTION; |
582 |
> |
|
583 |
> |
// MacOS 8.1 serial drivers on startup |
584 |
> |
else if (pc == ROM_BASE + 0x48c5e0 && (cpu->gpr(20) == 0xf3012002 || cpu->gpr(20) == 0xf3012000)) |
585 |
> |
return SIGSEGV_RETURN_SKIP_INSTRUCTION; |
586 |
> |
else if (pc == ROM_BASE + 0x4a10a0 && (cpu->gpr(20) == 0xf3012002 || cpu->gpr(20) == 0xf3012000)) |
587 |
> |
return SIGSEGV_RETURN_SKIP_INSTRUCTION; |
588 |
> |
|
589 |
> |
// Ignore all other faults, if requested |
590 |
> |
if (PrefsFindBool("ignoresegv")) |
591 |
> |
return SIGSEGV_RETURN_SKIP_INSTRUCTION; |
592 |
> |
} |
593 |
|
#else |
594 |
|
#error "FIXME: You don't have the capability to skip instruction within signal handlers" |
595 |
|
#endif |