/*===========================================================================* * shutdown * *===========================================================================*/ void minix_shutdown(minix_timer_t *tp) { /* This function is called from prepare_shutdown or stop_sequence to bring * down MINIX. */ int how; #ifdef CONFIG_SMP /* * FIXME * * we will need to stop timers on all cpus if SMP is enabled and put them in * such a state that we can perform the whole boot process once restarted from * monitor again */ if (ncpus > 1) smp_shutdown_aps(); #endif hw_intr_disable_all(); stop_local_timer(); how = tp ? tmr_arg(tp)->ta_int : 0; /* Show shutdown message */ direct_cls(); if((how & RB_POWERDOWN) == RB_POWERDOWN) direct_print("MINIX has halted and will now power off.\n"); else if(how & RB_HALT) direct_print("MINIX has halted. " "It is safe to turn off your computer.\n"); else direct_print("MINIX will now reset.\n"); arch_shutdown(how); }
__dead void arch_shutdown(int how) { unsigned char unused_ch; /* Mask all interrupts, including the clock. */ outb( INT_CTLMASK, ~0); /* Empty buffer */ while(direct_read_char(&unused_ch)) ; if(kinfo.minix_panicing) { /* Printing is done synchronously over serial. */ if (kinfo.do_serial_debug) reset(); /* Print accumulated diagnostics buffer and reset. */ direct_cls(); direct_print("Minix panic. System diagnostics buffer:\n\n"); direct_print(kmess.kmess_buf); direct_print("\nSystem has panicked, press any key to reboot"); while (!direct_read_char(&unused_ch)) ; reset(); } switch (how) { case RBT_HALT: /* Hang */ for (; ; ) halt_cpu(); NOT_REACHABLE; case RBT_POWEROFF: /* Power off if possible, hang otherwise */ poweroff(); NOT_REACHABLE; default: case RBT_DEFAULT: case RBT_REBOOT: case RBT_RESET: /* Reset the system by forcing a processor shutdown. * First stop the BIOS memory test by setting a soft * reset flag. */ reset(); NOT_REACHABLE; } NOT_REACHABLE; }
/*===========================================================================* * shutdown * *===========================================================================*/ void minix_shutdown(timer_t *tp) { /* This function is called from prepare_shutdown or stop_sequence to bring * down MINIX. How to shutdown is in the argument: RBT_HALT (return to the * monitor), RBT_RESET (hard reset). */ int how; #ifdef CONFIG_SMP /* * FIXME * * we will need to stop timers on all cpus if SMP is enabled and put them in * such a state that we can perform the whole boot process once restarted from * monitor again */ if (ncpus > 1) smp_shutdown_aps(); #endif hw_intr_disable_all(); stop_local_timer(); how = tp ? tmr_arg(tp)->ta_int : RBT_PANIC; /* Show shutdown message */ direct_cls(); switch(how) { case RBT_HALT: direct_print("MINIX has halted. " "It is safe to turn off your computer.\n"); break; case RBT_POWEROFF: direct_print("MINIX has halted and will now power off.\n"); break; case RBT_DEFAULT: case RBT_REBOOT: case RBT_RESET: default: direct_print("MINIX will now reset.\n"); break; } arch_shutdown(how); }