/* Exit back to monitor, with the given status code. */ void hardware_exit_hook (int status) { outbyte ('\r'); outbyte ('\n'); cfe_exit (CFE_FLG_WARMSTART, status); }
void platform_reset(void) { struct bcm_platform *bp; bool bcm4785war; printf("bcm::platform_reset()\n"); intr_disable(); #ifdef CFE /* Fall back on CFE if reset requested during platform * data initialization */ if (!bcm_platform_data_avail) { cfe_exit(0, 0); while (1); } #endif bp = bcm_get_platform(); bcm4785war = false; /* Handle BCM4785-specific behavior */ if (bp->cid.chip_id == BHND_CHIPID_BCM4785) { bcm4785war = true; /* Switch to async mode */ bcm_bmips_wr_pllcfg3(BMIPS_BCMCFG_PLLCFG3_SM); } /* Set watchdog (PMU or ChipCommon) */ if (bp->pmu_addr != 0x0) { BCM_PMU_WRITE_4(bp, BHND_PMU_WATCHDOG, 1); } else BCM_CHIPC_WRITE_4(bp, CHIPC_WATCHDOG, 1); /* BCM4785 */ if (bcm4785war) { mips_sync(); __asm __volatile("wait"); } while (1); }
void __init cfe_die(char *fmt, ...) { char msg[128]; va_list ap; int handle; unsigned int count; va_start(ap, fmt); vsprintf(msg, fmt, ap); strcat(msg, "\r\n"); if (cfe_seal != CFE_EPTSEAL) goto no_cfe; /* disable XKS01 so that CFE can access the registers */ #if defined(CONFIG_BMIPS4380) __write_32bit_c0_register($22, 3, __read_32bit_c0_register($22, 3) & ~BIT(12)); #elif defined(CONFIG_BMIPS5000) __write_32bit_c0_register($22, 5, __read_32bit_c0_register($22, 5) & ~BIT(8)); #endif handle = cfe_getstdhandle(CFE_STDHANDLE_CONSOLE); if (handle < 0) goto no_cfe; cfe_write(handle, msg, strlen(msg)); for (count = 0; count < 0x7fffffff; count++) mb(); cfe_exit(0, 1); while (1) ; no_cfe: /* probably won't print anywhere useful */ printk(KERN_ERR "%s", msg); BUG(); va_end(ap); }
static void ATTRIB_NORET cfe_linux_exit(void *arg) { int warm = *(int *)arg; if (smp_processor_id()) { static int reboot_smp; /* Don't repeat the process from another CPU */ if (!reboot_smp) { /* Get CPU 0 to do the cfe_exit */ reboot_smp = 1; smp_call_function(cfe_linux_exit, arg, 1, 0); } } else { printk("Passing control back to CFE...\n"); cfe_exit(warm, 0); printk("cfe_exit returned??\n"); } while (1); }
static void cfe_linux_exit(void) { #ifdef CONFIG_SMP if (smp_processor_id()) { if (reboot_smp) { /* Don't repeat the process from another CPU */ for (;;); } else { /* Get CPU 0 to do the cfe_exit */ reboot_smp = 1; smp_call_function((void *)_machine_restart, NULL, 1, 0); for (;;); } } #endif printk("passing control back to CFE\n"); cfe_exit(1, 0); printk("cfe_exit returned??\n"); while(1); }
void cpu_reboot(int howto, char *bootstr) { /* Take a snapshot before clobbering any registers. */ if (curlwp) savectx((struct user *)curpcb); if (cold) { howto |= RB_HALT; goto haltsys; } /* If "always halt" was specified as a boot flag, obey. */ if (boothowto & RB_HALT) howto |= RB_HALT; boothowto = howto; if ((howto & RB_NOSYNC) == 0 && (waittime < 0)) { waittime = 0; vfs_shutdown(); /* * If we've been adjusting the clock, the todr * will be out of synch; adjust it now. */ resettodr(); } splhigh(); if (howto & RB_DUMP) dumpsys(); haltsys: doshutdownhooks(); if (howto & RB_HALT) { printf("\n"); printf("The operating system has halted.\n"); printf("Please press any key to reboot.\n\n"); cnpollc(1); /* For proper keyboard command handling */ cngetc(); cnpollc(0); } printf("rebooting...\n\n"); if (cfe_present) { /* * XXX * For some reason we can't return to CFE with * and do a warm start. Need to look into this... */ cfe_exit(0, (howto & RB_DUMP) ? 1 : 0); printf("cfe_exit didn't!\n"); } printf("WARNING: reboot failed!\n"); for (;;); }
extern "C" void platform_exit(void) { cfe_exit(CFE_FLG_WARMSTART, 0); panic("cfe_exit() failed."); }
extern "C" void start(uint64 cfeHandle, uint64 cfeEntry) { char bootargs[512]; // stage2 args - might be set via the command line one day stage2_args args; args.heap_size = HEAP_SIZE; args.arguments = NULL; cfe_init(cfeHandle, cfeEntry); // check for arguments #if 0//OF if (of_getprop(gChosen, "bootargs", bootargs, sizeof(bootargs)) != OF_FAILED) { static const char *sArgs[] = { NULL, NULL }; sArgs[0] = (const char *)bootargs; args.arguments = sArgs; args.arguments_count = 1; } #endif #if 0//OF determine_machine(); #endif console_init(); // XXX:FIXME: doesn't even land here. dprintf("testing...\n"); while (true); #if 0//OF if ((gMachine & MACHINE_QEMU) != 0) dprintf("OpenBIOS (QEMU?) OpenFirmware machine detected\n"); else if ((gMachine & MACHINE_PEGASOS) != 0) dprintf("Pegasos PowerPC machine detected\n"); else dprintf("Apple PowerPC machine assumed\n"); #endif // Initialize and take over MMU and set the OpenFirmware callbacks - it // will ask us for memory after that instead of maintaining it itself // (the kernel will need to adjust the callback later on as well) arch_mmu_init(); if (boot_arch_cpu_init() != B_OK) cfe_exit(CFE_FLG_WARMSTART, 1); #if 0//OF FIXME if (init_real_time_clock() != B_OK) cfe_exit(CFE_FLG_WARMSTART, 1); #endif // check for key presses once sBootOptions = 0; int key = console_check_for_key(); if (key == 32) { // space bar: option menu sBootOptions |= BOOT_OPTION_MENU; } else if (key == 27) { // ESC: debug output sBootOptions |= BOOT_OPTION_DEBUG_OUTPUT; } gKernelArgs.platform_args.cfe_entry = cfeEntry; main(&args); // if everything goes fine, main() never returns cfe_exit(CFE_FLG_WARMSTART, 1); }