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 |
|
} |
669 |
|
return true; |
670 |
|
} |
671 |
|
|
672 |
+ |
#ifdef USE_SDL |
673 |
|
static bool init_sdl() |
674 |
|
{ |
675 |
|
int sdl_flags = 0; |
702 |
|
signal(SIGTERM, SIG_DFL); |
703 |
|
return true; |
704 |
|
} |
705 |
+ |
#endif |
706 |
|
|
707 |
|
int main(int argc, char **argv) |
708 |
|
{ |
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); |
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 |
|
|
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 |
|
|
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" |
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"); |