611 |
|
return true; |
612 |
|
} |
613 |
|
|
614 |
+ |
static bool install_signal_handlers(void) |
615 |
+ |
{ |
616 |
+ |
char str[256]; |
617 |
+ |
#if !EMULATED_PPC |
618 |
+ |
// Create and install stacks for signal handlers |
619 |
+ |
sig_stack.ss_sp = malloc(SIG_STACK_SIZE); |
620 |
+ |
D(bug("Signal stack at %p\n", sig_stack.ss_sp)); |
621 |
+ |
if (sig_stack.ss_sp == NULL) { |
622 |
+ |
ErrorAlert(GetString(STR_NOT_ENOUGH_MEMORY_ERR)); |
623 |
+ |
return false; |
624 |
+ |
} |
625 |
+ |
sig_stack.ss_flags = 0; |
626 |
+ |
sig_stack.ss_size = SIG_STACK_SIZE; |
627 |
+ |
if (sigaltstack(&sig_stack, NULL) < 0) { |
628 |
+ |
sprintf(str, GetString(STR_SIGALTSTACK_ERR), strerror(errno)); |
629 |
+ |
ErrorAlert(str); |
630 |
+ |
return false; |
631 |
+ |
} |
632 |
+ |
extra_stack.ss_sp = malloc(SIG_STACK_SIZE); |
633 |
+ |
D(bug("Extra stack at %p\n", extra_stack.ss_sp)); |
634 |
+ |
if (extra_stack.ss_sp == NULL) { |
635 |
+ |
ErrorAlert(GetString(STR_NOT_ENOUGH_MEMORY_ERR)); |
636 |
+ |
return false; |
637 |
+ |
} |
638 |
+ |
extra_stack.ss_flags = 0; |
639 |
+ |
extra_stack.ss_size = SIG_STACK_SIZE; |
640 |
+ |
|
641 |
+ |
// Install SIGSEGV and SIGBUS handlers |
642 |
+ |
sigemptyset(&sigsegv_action.sa_mask); // Block interrupts during SEGV handling |
643 |
+ |
sigaddset(&sigsegv_action.sa_mask, SIGUSR2); |
644 |
+ |
sigsegv_action.sa_sigaction = sigsegv_handler; |
645 |
+ |
sigsegv_action.sa_flags = SA_ONSTACK | SA_SIGINFO; |
646 |
+ |
#ifdef HAVE_SIGNAL_SA_RESTORER |
647 |
+ |
sigsegv_action.sa_restorer = NULL; |
648 |
+ |
#endif |
649 |
+ |
if (sigaction(SIGSEGV, &sigsegv_action, NULL) < 0) { |
650 |
+ |
sprintf(str, GetString(STR_SIG_INSTALL_ERR), "SIGSEGV", strerror(errno)); |
651 |
+ |
ErrorAlert(str); |
652 |
+ |
return false; |
653 |
+ |
} |
654 |
+ |
if (sigaction(SIGBUS, &sigsegv_action, NULL) < 0) { |
655 |
+ |
sprintf(str, GetString(STR_SIG_INSTALL_ERR), "SIGBUS", strerror(errno)); |
656 |
+ |
ErrorAlert(str); |
657 |
+ |
return false; |
658 |
+ |
} |
659 |
+ |
#else |
660 |
+ |
// Install SIGSEGV handler for CPU emulator |
661 |
+ |
if (!sigsegv_install_handler(sigsegv_handler)) { |
662 |
+ |
sprintf(str, GetString(STR_SIG_INSTALL_ERR), "SIGSEGV", strerror(errno)); |
663 |
+ |
ErrorAlert(str); |
664 |
+ |
return false; |
665 |
+ |
} |
666 |
+ |
#endif |
667 |
+ |
return true; |
668 |
+ |
} |
669 |
+ |
|
670 |
|
int main(int argc, char **argv) |
671 |
|
{ |
672 |
|
char str[256]; |
813 |
|
mon_init(); |
814 |
|
#endif |
815 |
|
|
816 |
< |
#if !EMULATED_PPC |
817 |
< |
// Create and install stacks for signal handlers |
762 |
< |
sig_stack.ss_sp = malloc(SIG_STACK_SIZE); |
763 |
< |
D(bug("Signal stack at %p\n", sig_stack.ss_sp)); |
764 |
< |
if (sig_stack.ss_sp == NULL) { |
765 |
< |
ErrorAlert(GetString(STR_NOT_ENOUGH_MEMORY_ERR)); |
766 |
< |
goto quit; |
767 |
< |
} |
768 |
< |
sig_stack.ss_flags = 0; |
769 |
< |
sig_stack.ss_size = SIG_STACK_SIZE; |
770 |
< |
if (sigaltstack(&sig_stack, NULL) < 0) { |
771 |
< |
sprintf(str, GetString(STR_SIGALTSTACK_ERR), strerror(errno)); |
772 |
< |
ErrorAlert(str); |
773 |
< |
goto quit; |
774 |
< |
} |
775 |
< |
extra_stack.ss_sp = malloc(SIG_STACK_SIZE); |
776 |
< |
D(bug("Extra stack at %p\n", extra_stack.ss_sp)); |
777 |
< |
if (extra_stack.ss_sp == NULL) { |
778 |
< |
ErrorAlert(GetString(STR_NOT_ENOUGH_MEMORY_ERR)); |
779 |
< |
goto quit; |
780 |
< |
} |
781 |
< |
extra_stack.ss_flags = 0; |
782 |
< |
extra_stack.ss_size = SIG_STACK_SIZE; |
783 |
< |
#endif |
784 |
< |
|
785 |
< |
#if !EMULATED_PPC |
786 |
< |
// Install SIGSEGV and SIGBUS handlers |
787 |
< |
sigemptyset(&sigsegv_action.sa_mask); // Block interrupts during SEGV handling |
788 |
< |
sigaddset(&sigsegv_action.sa_mask, SIGUSR2); |
789 |
< |
sigsegv_action.sa_sigaction = sigsegv_handler; |
790 |
< |
sigsegv_action.sa_flags = SA_ONSTACK | SA_SIGINFO; |
791 |
< |
#ifdef HAVE_SIGNAL_SA_RESTORER |
792 |
< |
sigsegv_action.sa_restorer = NULL; |
793 |
< |
#endif |
794 |
< |
if (sigaction(SIGSEGV, &sigsegv_action, NULL) < 0) { |
795 |
< |
sprintf(str, GetString(STR_SIG_INSTALL_ERR), "SIGSEGV", strerror(errno)); |
796 |
< |
ErrorAlert(str); |
816 |
> |
// Install signal handlers |
817 |
> |
if (!install_signal_handlers()) |
818 |
|
goto quit; |
798 |
– |
} |
799 |
– |
if (sigaction(SIGBUS, &sigsegv_action, NULL) < 0) { |
800 |
– |
sprintf(str, GetString(STR_SIG_INSTALL_ERR), "SIGBUS", strerror(errno)); |
801 |
– |
ErrorAlert(str); |
802 |
– |
goto quit; |
803 |
– |
} |
804 |
– |
#else |
805 |
– |
// Install SIGSEGV handler for CPU emulator |
806 |
– |
if (!sigsegv_install_handler(sigsegv_handler)) { |
807 |
– |
sprintf(str, GetString(STR_SIG_INSTALL_ERR), "SIGSEGV", strerror(errno)); |
808 |
– |
ErrorAlert(str); |
809 |
– |
goto quit; |
810 |
– |
} |
811 |
– |
#endif |
819 |
|
|
820 |
|
// Initialize VM system |
821 |
|
vm_init(); |