429 |
|
} |
430 |
|
fclose(proc_file); |
431 |
|
} else { |
432 |
+ |
char str[256]; |
433 |
|
sprintf(str, GetString(STR_PROC_CPUINFO_WARN), strerror(errno)); |
434 |
|
WarningAlert(str); |
435 |
|
} |
612 |
|
return true; |
613 |
|
} |
614 |
|
|
615 |
< |
int main(int argc, char **argv) |
615 |
> |
static bool install_signal_handlers(void) |
616 |
|
{ |
617 |
|
char str[256]; |
618 |
< |
bool memory_mapped_from_zero, ram_rom_areas_contiguous; |
619 |
< |
const char *vmdir = NULL; |
618 |
> |
#if !EMULATED_PPC |
619 |
> |
// Create and install stacks for signal handlers |
620 |
> |
sig_stack.ss_sp = malloc(SIG_STACK_SIZE); |
621 |
> |
D(bug("Signal stack at %p\n", sig_stack.ss_sp)); |
622 |
> |
if (sig_stack.ss_sp == NULL) { |
623 |
> |
ErrorAlert(GetString(STR_NOT_ENOUGH_MEMORY_ERR)); |
624 |
> |
return false; |
625 |
> |
} |
626 |
> |
sig_stack.ss_flags = 0; |
627 |
> |
sig_stack.ss_size = SIG_STACK_SIZE; |
628 |
> |
if (sigaltstack(&sig_stack, NULL) < 0) { |
629 |
> |
sprintf(str, GetString(STR_SIGALTSTACK_ERR), strerror(errno)); |
630 |
> |
ErrorAlert(str); |
631 |
> |
return false; |
632 |
> |
} |
633 |
> |
extra_stack.ss_sp = malloc(SIG_STACK_SIZE); |
634 |
> |
D(bug("Extra stack at %p\n", extra_stack.ss_sp)); |
635 |
> |
if (extra_stack.ss_sp == NULL) { |
636 |
> |
ErrorAlert(GetString(STR_NOT_ENOUGH_MEMORY_ERR)); |
637 |
> |
return false; |
638 |
> |
} |
639 |
> |
extra_stack.ss_flags = 0; |
640 |
> |
extra_stack.ss_size = SIG_STACK_SIZE; |
641 |
> |
|
642 |
> |
// Install SIGSEGV and SIGBUS handlers |
643 |
> |
sigemptyset(&sigsegv_action.sa_mask); // Block interrupts during SEGV handling |
644 |
> |
sigaddset(&sigsegv_action.sa_mask, SIGUSR2); |
645 |
> |
sigsegv_action.sa_sigaction = sigsegv_handler; |
646 |
> |
sigsegv_action.sa_flags = SA_ONSTACK | SA_SIGINFO; |
647 |
> |
#ifdef HAVE_SIGNAL_SA_RESTORER |
648 |
> |
sigsegv_action.sa_restorer = NULL; |
649 |
> |
#endif |
650 |
> |
if (sigaction(SIGSEGV, &sigsegv_action, NULL) < 0) { |
651 |
> |
sprintf(str, GetString(STR_SIG_INSTALL_ERR), "SIGSEGV", strerror(errno)); |
652 |
> |
ErrorAlert(str); |
653 |
> |
return false; |
654 |
> |
} |
655 |
> |
if (sigaction(SIGBUS, &sigsegv_action, NULL) < 0) { |
656 |
> |
sprintf(str, GetString(STR_SIG_INSTALL_ERR), "SIGBUS", strerror(errno)); |
657 |
> |
ErrorAlert(str); |
658 |
> |
return false; |
659 |
> |
} |
660 |
> |
#else |
661 |
> |
// Install SIGSEGV handler for CPU emulator |
662 |
> |
if (!sigsegv_install_handler(sigsegv_handler)) { |
663 |
> |
sprintf(str, GetString(STR_SIG_INSTALL_ERR), "SIGSEGV", strerror(errno)); |
664 |
> |
ErrorAlert(str); |
665 |
> |
return false; |
666 |
> |
} |
667 |
> |
#endif |
668 |
> |
return true; |
669 |
> |
} |
670 |
> |
|
671 |
> |
static bool init_sdl() |
672 |
> |
{ |
673 |
> |
int sdl_flags = 0; |
674 |
> |
#ifdef USE_SDL_VIDEO |
675 |
> |
sdl_flags |= SDL_INIT_VIDEO; |
676 |
> |
#endif |
677 |
> |
#ifdef USE_SDL_AUDIO |
678 |
> |
sdl_flags |= SDL_INIT_AUDIO; |
679 |
> |
#endif |
680 |
> |
assert(sdl_flags != 0); |
681 |
|
|
682 |
|
#ifdef USE_SDL_VIDEO |
683 |
|
// Don't let SDL block the screensaver |
687 |
|
setenv("SDL_HAS3BUTTONMOUSE", "1", TRUE); |
688 |
|
#endif |
689 |
|
|
690 |
+ |
if (SDL_Init(sdl_flags) == -1) { |
691 |
+ |
char str[256]; |
692 |
+ |
sprintf(str, "Could not initialize SDL: %s.\n", SDL_GetError()); |
693 |
+ |
ErrorAlert(str); |
694 |
+ |
return false; |
695 |
+ |
} |
696 |
+ |
atexit(SDL_Quit); |
697 |
+ |
|
698 |
+ |
// Don't let SDL catch SIGINT and SIGTERM signals |
699 |
+ |
signal(SIGINT, SIG_DFL); |
700 |
+ |
signal(SIGTERM, SIG_DFL); |
701 |
+ |
return true; |
702 |
+ |
} |
703 |
+ |
|
704 |
+ |
int main(int argc, char **argv) |
705 |
+ |
{ |
706 |
+ |
char str[256]; |
707 |
+ |
bool memory_mapped_from_zero, ram_rom_areas_contiguous; |
708 |
+ |
const char *vmdir = NULL; |
709 |
+ |
|
710 |
|
// Initialize variables |
711 |
|
RAMBase = 0; |
712 |
|
tzset(); |
797 |
|
|
798 |
|
#ifdef USE_SDL |
799 |
|
// Initialize SDL system |
800 |
< |
int sdl_flags = 0; |
719 |
< |
#ifdef USE_SDL_VIDEO |
720 |
< |
sdl_flags |= SDL_INIT_VIDEO; |
721 |
< |
#endif |
722 |
< |
#ifdef USE_SDL_AUDIO |
723 |
< |
sdl_flags |= SDL_INIT_AUDIO; |
724 |
< |
#endif |
725 |
< |
assert(sdl_flags != 0); |
726 |
< |
if (SDL_Init(sdl_flags) == -1) { |
727 |
< |
char str[256]; |
728 |
< |
sprintf(str, "Could not initialize SDL: %s.\n", SDL_GetError()); |
729 |
< |
ErrorAlert(str); |
800 |
> |
if (!init_sdl()) |
801 |
|
goto quit; |
731 |
– |
} |
732 |
– |
atexit(SDL_Quit); |
733 |
– |
|
734 |
– |
// Don't let SDL catch SIGINT and SIGTERM signals |
735 |
– |
signal(SIGINT, SIG_DFL); |
736 |
– |
signal(SIGTERM, SIG_DFL); |
802 |
|
#endif |
803 |
|
|
804 |
|
#ifndef USE_SDL_VIDEO |
822 |
|
mon_init(); |
823 |
|
#endif |
824 |
|
|
825 |
< |
#if !EMULATED_PPC |
826 |
< |
// 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); |
797 |
< |
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); |
825 |
> |
// Install signal handlers |
826 |
> |
if (!install_signal_handlers()) |
827 |
|
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 |
828 |
|
|
829 |
|
// Initialize VM system |
830 |
|
vm_init(); |