210 |
|
|
211 |
|
|
212 |
|
/* |
213 |
+ |
* SIGSEGV handler |
214 |
+ |
*/ |
215 |
+ |
|
216 |
+ |
static sigsegv_return_t sigsegv_handler(sigsegv_address_t fault_address, sigsegv_address_t fault_instruction) |
217 |
+ |
{ |
218 |
+ |
#if ENABLE_VOSF |
219 |
+ |
// Handle screen fault |
220 |
+ |
extern bool Screen_fault_handler(sigsegv_address_t, sigsegv_address_t); |
221 |
+ |
if (Screen_fault_handler(fault_address, fault_instruction)) |
222 |
+ |
return SIGSEGV_RETURN_SUCCESS; |
223 |
+ |
#endif |
224 |
+ |
|
225 |
+ |
#ifdef HAVE_SIGSEGV_SKIP_INSTRUCTION |
226 |
+ |
// Ignore writes to ROM |
227 |
+ |
if (((uintptr)fault_address - (uintptr)ROMBaseHost) < ROMSize) |
228 |
+ |
return SIGSEGV_RETURN_SKIP_INSTRUCTION; |
229 |
+ |
|
230 |
+ |
// Ignore all other faults, if requested |
231 |
+ |
if (PrefsFindBool("ignoresegv")) |
232 |
+ |
return SIGSEGV_RETURN_SKIP_INSTRUCTION; |
233 |
+ |
#endif |
234 |
+ |
|
235 |
+ |
return SIGSEGV_RETURN_FAILURE; |
236 |
+ |
} |
237 |
+ |
|
238 |
+ |
/* |
239 |
|
* Dump state when everything went wrong after a SEGV |
240 |
|
*/ |
241 |
|
|
383 |
|
if (!PrefsEditor()) |
384 |
|
QuitEmulator(); |
385 |
|
|
386 |
< |
// Register request to ignore all segmentation faults |
387 |
< |
#ifdef HAVE_SIGSEGV_SKIP_INSTRUCTION |
388 |
< |
if (PrefsFindBool("ignoresegv")) |
389 |
< |
sigsegv_add_ignore_range(0, ~(0UL), SIGSEGV_TRANSFER_LOAD | SIGSEGV_TRANSFER_STORE); |
364 |
< |
#endif |
365 |
< |
|
386 |
> |
// Install the handler for SIGSEGV |
387 |
> |
if (!sigsegv_install_handler(sigsegv_handler)) |
388 |
> |
return false; |
389 |
> |
|
390 |
|
// Register dump state function when we got mad after a segfault |
391 |
|
sigsegv_set_dump_state(sigsegv_dump_state); |
392 |
|
|