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.98 by asvitkine, 2011-12-30T17:38:39Z vs.
Revision 1.101 by asvitkine, 2012-01-01T19:11:31Z

# Line 527 | Line 527 | static void get_system_info(void)
527                  }
528                  fclose(proc_file);
529          } else {
530 +                char str[256];
531                  sprintf(str, GetString(STR_PROC_CPUINFO_WARN), strerror(errno));
532                  WarningAlert(str);
533          }
# Line 668 | Line 669 | static bool install_signal_handlers(void
669          return true;
670   }
671  
672 + #ifdef USE_SDL
673   static bool init_sdl()
674   {
675          int sdl_flags = 0;
# Line 700 | Line 702 | static bool init_sdl()
702          signal(SIGTERM, SIG_DFL);
703          return true;
704   }
705 + #endif
706  
707   int main(int argc, char **argv)
708   {
# Line 1115 | Line 1118 | static void Quit(void)
1118          if (dr_cache_area_mapped)
1119                  vm_mac_release(DR_CACHE_BASE, DR_CACHE_SIZE);
1120  
1118        // Delete Kernel Data area
1119        kernel_data_exit();
1120
1121          // Delete Low Memory area
1122          if (lm_area_mapped)
1123                  vm_mac_release(0, 0x3000);
# Line 1160 | Line 1160 | static void Quit(void)
1160   static bool kernel_data_init(void)
1161   {
1162          char str[256];
1163 +        void *kernel_addr1 = NULL;
1164 +        void *kernel_addr2 = NULL;
1165          uint32 kernel_area_size = (KERNEL_AREA_SIZE + SHMLBA - 1) & -SHMLBA;
1166  
1167          kernel_area = shmget(IPC_PRIVATE, kernel_area_size, 0600);
1168          if (kernel_area == -1) {
1169                  sprintf(str, GetString(STR_KD_SHMGET_ERR), strerror(errno));
1170 <                ErrorAlert(str);
1169 <                return false;
1170 >                goto fail_shmget;
1171          }
1172 <        void *kernel_addr = Mac2HostAddr(KERNEL_DATA_BASE & -SHMLBA);
1173 <        if (shmat(kernel_area, kernel_addr, 0) != kernel_addr) {
1172 >        kernel_addr1 = Mac2HostAddr(KERNEL_DATA_BASE & -SHMLBA);
1173 >        if (shmat(kernel_area, kernel_addr1, 0) != kernel_addr1) {
1174                  sprintf(str, GetString(STR_KD_SHMAT_ERR), strerror(errno));
1175 <                ErrorAlert(str);
1175 <                return false;
1175 >                goto fail_shmat1;
1176          }
1177 <        kernel_addr = Mac2HostAddr(KERNEL_DATA2_BASE & -SHMLBA);
1178 <        if (shmat(kernel_area, kernel_addr, 0) != kernel_addr) {
1177 >        kernel_addr2 = Mac2HostAddr(KERNEL_DATA2_BASE & -SHMLBA);
1178 >        if (shmat(kernel_area, kernel_addr2, 0) != kernel_addr2) {
1179                  sprintf(str, GetString(STR_KD2_SHMAT_ERR), strerror(errno));
1180 <                ErrorAlert(str);
1181 <                return false;
1180 >                goto fail_shmat2;
1181          }
1182 +        atexit(kernel_data_exit);
1183          return true;
1184 +
1185 + fail_shmat2:
1186 +        shmdt(kernel_addr1);
1187 + fail_shmat1:
1188 +        shmctl(kernel_area, IPC_RMID, NULL);
1189 + fail_shmget:
1190 +        ErrorAlert(str);
1191 +        return false;
1192   }
1193  
1194  
# Line 1194 | Line 1202 | static void kernel_data_exit(void)
1202                  shmdt(Mac2HostAddr(KERNEL_DATA_BASE & -SHMLBA));
1203                  shmdt(Mac2HostAddr(KERNEL_DATA2_BASE & -SHMLBA));
1204                  shmctl(kernel_area, IPC_RMID, NULL);
1205 +                kernel_area = NULL;
1206          }
1207   }
1208  
# Line 1377 | Line 1386 | static void *tick_func(void *arg)
1386                          sigregs *r = &sigsegv_regs;
1387                          char str[256];
1388                          if (crash_reason == NULL)
1389 <                                crash_reason = "SIGSEGV";
1389 >                                crash_reason = "SIGSEGV!";
1390                          sprintf(str, "%s\n"
1391                                  "   pc %08lx     lr %08lx    ctr %08lx    msr %08lx\n"
1392                                  "  xer %08lx     cr %08lx  \n"
# Line 1403 | Line 1412 | static void *tick_func(void *arg)
1412                          printf(str);
1413                          VideoQuitFullScreen();
1414  
1415 +                        {
1416 +                                static int (*backtrace_fn)(void**, int);
1417 +                                static char** (*backtrace_symbols_fn)(void* const*, int);
1418 +                                backtrace_fn = dlsym(RTLD_DEFAULT, "backtrace");
1419 +                                backtrace_symbols_fn = dlsym(RTLD_DEFAULT, "backtrace_symbols");
1420 +        void *frame_ptrs[64];
1421 +        int count = backtrace_fn(frame_ptrs, 64);
1422 +        char **fnames = backtrace_symbols_fn(frame_ptrs, count);
1423 +        int i;
1424 +        for (i = 0; i < count; i++)
1425 +                printf("%s", fnames[i]);
1426 +        free(fnames);
1427 +                        }
1428 +
1429   #ifdef ENABLE_MON
1430                          // Start up mon in real-mode
1431                          printf("Welcome to the sheep factory.\n");

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines