ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/SheepShaver/src/Unix/main_unix.cpp
(Generate patch)

Comparing SheepShaver/src/Unix/main_unix.cpp (file contents):
Revision 1.95 by asvitkine, 2011-12-28T23:24:30Z vs.
Revision 1.96 by asvitkine, 2011-12-28T23:30:25Z

# Line 611 | Line 611 | static bool load_mac_rom(void)
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];
# Line 757 | Line 813 | int main(int argc, char **argv)
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();

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines