/* * kdb_trap - field a TRACE or BPT trap */ int kdb_trap(int type, db_regs_t *regs) { int s; switch (type) { case T_BREAKPOINT: /* breakpoint */ case -1: /* keyboard interrupt */ break; default: if (db_recover != 0) { /* This will longjmp back into db_command_loop() */ db_error("Faulted in DDB; continuing...\n"); /*NOTREACHED*/ } } /* Should switch to kdb`s own stack here. */ ddb_regs = *regs; s = splhigh(); db_active++; cnpollc(TRUE); db_trap(type, 0/*code*/); cnpollc(FALSE); db_active--; splx(s); *regs = ddb_regs; return (1); }
void cpu_reboot(int howto, char *bootstr) { extern void exit(int); extern void abort(void); splhigh(); if ((howto & RB_POWERDOWN) == RB_POWERDOWN) exit(0); if (howto & RB_HALT) { printf("\n"); printf("The operating system has halted.\n"); printf("Please press any key to reboot.\n\n"); cnpollc(1); cngetc(); cnpollc(0); } printf("rebooting...\n"); /* * XXXJDM If we've panic'd, make sure we dump a core */ abort(); /* NOTREACHED */ }
rcoff() { spl_t s = splhigh(); cnpollc(FALSE); rcline = 0; cnpollc(TRUE); splx(s); }
void boot(int howto) { if (cold) { if ((howto & RB_USERREQ) == 0) howto |= RB_HALT; goto haltsys; } boothowto = howto; if ((howto & RB_NOSYNC) == 0) { vfs_shutdown(); /* * If we've been adjusting the clock, the todr * will be out of synch; adjust it now. */ if ((howto & RB_TIMEBAD) == 0) resettodr(); else printf("WARNING: not updating battery clock\n"); } uvm_shutdown(); splhigh(); /* Disable interrupts. */ /* Do a dump if requested. */ if (howto & RB_DUMP) dumpsys(); haltsys: doshutdownhooks(); if ((howto & RB_POWERDOWN) == RB_POWERDOWN) { _reg_write_1(LANDISK_PWRMNG, PWRMNG_POWEROFF); delay(1 * 1000 * 1000); printf("POWEROFF FAILED!\n"); howto |= RB_HALT; } if (howto & RB_HALT) { printf("\n"); printf("The operating system has halted.\n"); printf("Please press any key to reboot.\n\n"); cnpollc(1); cngetc(); cnpollc(0); } printf("rebooting...\n"); machine_reset(); /*NOTREACHED*/ for (;;) { continue; } }
void cpu_reboot(int howto, char *bootstr) { /* Take a snapshot before clobbering any registers. */ savectx(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(); pmf_system_shutdown(boothowto); 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"); delay(500000); *(volatile char *)MIPS_PHYS_TO_KSEG1(LED_ADDR) = LED_RESET; printf("WARNING: reboot failed!\n"); for (;;) ; }
/* * kdb_trap - field a TRACE or BPT trap * Return non-zero if we "handled" the trap. */ int kdb_trap(int type, db_regs_t *regs) { switch (type) { case T_TRACE: /* single-step */ case T_BREAKPOINT: /* breakpoint */ /* case T_WATCHPOINT:*/ break; case -1: break; default: kdbprinttrap(type, 0); if (db_recover != 0) { /* This will longjmp back to db_command_loop */ db_error("Caught exception in ddb.\n"); /*NOTREACHED*/ } /* * Tell caller "We did NOT handle the trap." * Caller should panic or whatever. */ return 0; } /* * We'd like to be on a separate debug stack here, but * that's easier to do in locore.s before we get here. * See sun3/locore.s:T_TRACE for stack switch code. */ ddb_regs = *regs; db_active++; cnpollc(true); /* set polling mode, unblank video */ db_trap(type, 0); /* where the work happens */ cnpollc(false); /* resume interrupt mode */ db_active--; *regs = ddb_regs; /* * Indicate that single_step is for KDB. * But lock out interrupts to prevent TRACE_KDB from setting the * trace bit in the current SR (and trapping while exiting KDB). */ (void)spl7(); /* * Tell caller "We HAVE handled the trap." * Caller will return to locore and rte. */ return 1; }
/* * db_ktrap - field a TRACE or BPT trap */ int db_ktrap(int type, int code, db_regs_t *regs) { int s; #if NWSDISPLAY > 0 wsdisplay_switchtoconsole(); #endif switch (type) { case T_BPTFLT: /* breakpoint */ case T_TRCTRAP: /* single_step */ case T_NMI: /* NMI */ case -1: /* keyboard interrupt */ break; default: if (!db_panic) return (0); db_printtrap(type, code); if (db_recover != 0) { db_error("Faulted in DDB; continuing...\n"); /*NOTREACHED*/ } } #ifdef MULTIPROCESSOR mtx_enter(&ddb_mp_mutex); if (ddb_state == DDB_STATE_EXITING) ddb_state = DDB_STATE_NOT_RUNNING; mtx_leave(&ddb_mp_mutex); while (db_enter_ddb()) { #endif ddb_regs = *regs; ddb_regs.tf_cs &= 0xffff; ddb_regs.tf_ss &= 0xffff; s = splhigh(); db_active++; cnpollc(TRUE); db_trap(type, code); cnpollc(FALSE); db_active--; splx(s); *regs = ddb_regs; #ifdef MULTIPROCESSOR if (!db_switch_cpu) ddb_state = DDB_STATE_EXITING; } #endif return (1); }
__dead void boot(int howto) { if (cold) { if ((howto & RB_USERREQ) == 0) howto |= RB_HALT; goto haltsys; } /* * If RB_NOSYNC was not specified sync the discs. * Note: Unless cold is set to 1 here, syslogd will die during the * unmount. It looks like syslogd is getting woken up only to find * that it cannot page part of the binary in as the filesystem has * been unmounted. */ if ((howto & RB_NOSYNC) == 0) bootsync(howto); if_downall(); uvm_shutdown(); splhigh(); cold = 1; if ((howto & (RB_DUMP | RB_HALT)) == RB_DUMP) dumpsys(); haltsys: config_suspend_all(DVACT_POWERDOWN); /* Make sure IRQ's are disabled */ IRQdisable; if ((howto & RB_HALT) != 0) { if ((howto & RB_POWERDOWN) != 0) { board_powerdown(); printf("WARNING: powerdown failed!\n"); } printf("The operating system has halted.\n"); printf("Please press any key to reboot.\n\n"); cnpollc(1); cngetc(); cnpollc(0); } printf("rebooting...\n"); board_reset(); cpu_reset(); printf("reboot failed; spinning\n"); for (;;) ; /* NOTREACHED */ }
/* * Mountroot hook: prompt the user to enter the root file system * floppy. */ void fd_mountroot_hook(device_t dev) { int c; printf("Insert filesystem floppy and press return."); cnpollc(1); for (;;) { c = cngetc(); if ((c == '\r') || (c == '\n')) { printf("\n"); break; } } cnpollc(0); }
int cngetsn(char *cp, int size) { char *lp; int c, len; cnpollc(1); lp = cp; len = 0; for (;;) { c = cngetc(); switch (c) { case '\n': case '\r': printf("\n"); *lp++ = '\0'; cnpollc(0); return (len); case '\b': case '\177': case '#': if (len) { --len; --lp; printf("\b \b"); } continue; case '@': case 'u'&037: /* CTRL-u */ len = 0; lp = cp; printf("\n"); continue; default: if (len + 1 >= size || c < ' ') { printf("\007"); continue; } printf("%c", c); ++len; *lp++ = c; } } }
int kdb_trap(int type, int code, db_regs_t *regs) { int s; switch (type) { case EXPEVT_TRAPA: /* FALLTHROUGH */ case EXPEVT_BREAK: break; default: if (!db_onpanic && db_recover == NULL) return 0; kdb_printtrap(type, code); if (db_recover != NULL) { db_printf("[pc %x, pr %x]: ", regs->tf_spc, regs->tf_pr); db_error("Faulted in DDB; continuing...\n"); /*NOTREACHED*/ } } /* XXX: Should switch to ddb's own stack here. */ ddb_regs = *regs; s = splhigh(); db_active++; cnpollc(true); db_trap(type, code); cnpollc(false); db_active--; splx(s); *regs = ddb_regs; return 1; }
/* main guts */ void cpu_reboot(int howto, char *bootstr) { extern void usermode_reboot(void); if (cold) howto |= RB_HALT; if ((howto & RB_NOSYNC) == 0) vfs_shutdown(); else suspendsched(); doshutdownhooks(); pmf_system_shutdown(boothowto); if ((howto & RB_POWERDOWN) == RB_POWERDOWN) thunk_exit(0); splhigh(); if (howto & RB_DUMP) thunk_abort(); if (howto & RB_HALT) { printf("\n"); printf("The operating system has halted.\n"); printf("Please press any key to reboot.\n\n"); cnpollc(1); cngetc(); cnpollc(0); } printf("rebooting...\n"); usermode_reboot(); /* NOTREACHED */ cpu_unreachable(); }
int kdb_trap(int type, int code, db_regs_t *regs) { extern label_t *db_recover; int s; switch (type) { case EXPEVT_TRAPA: /* trapa instruction */ case EXPEVT_BREAK: /* UBC */ case -1: /* keyboard interrupt */ break; default: if (!db_panic && db_recover == NULL) return 0; kdb_printtrap(type, code); if (db_recover != NULL) { db_error("Faulted in DDB; continuing...\n"); /*NOTREACHED*/ } } /* XXX Should switch to kdb's own stack here. */ ddb_regs = *regs; s = splhigh(); db_active++; cnpollc(TRUE); db_trap(type, code); cnpollc(FALSE); db_active--; splx(s); *regs = ddb_regs; return 1; }
int ddb_trap_glue(struct trapframe *frame) { if (!(frame->srr1 & PSL_PR) && (frame->exc == EXC_TRC || (frame->exc == EXC_PGM && (frame->srr1 & 0x20000)) || frame->exc == EXC_BPT)) { bcopy(frame->fixreg, DDB_REGS->tf.fixreg, 32 * sizeof(u_int32_t)); DDB_REGS->tf.srr0 = frame->srr0; DDB_REGS->tf.srr1 = frame->srr1; cnpollc(TRUE); db_trap(T_BREAKPOINT, 0); cnpollc(FALSE); bcopy(DDB_REGS->tf.fixreg, frame->fixreg, 32 * sizeof(u_int32_t)); return 1; } return 0; }
int kdb_trap(int type, void *v) { struct trapframe *frame = v; #ifdef DDB if (db_recover != 0 && (type != -1 && type != T_BREAKPOINT)) { db_error("Faulted in DDB; continuing...\n"); /* NOTREACHED */ } #endif /* XXX Should switch to kdb's own stack here. */ memcpy(DDB_REGS->r, frame->fixreg, 32 * sizeof(u_int32_t)); DDB_REGS->iar = frame->srr0; DDB_REGS->msr = frame->srr1; DDB_REGS->lr = frame->lr; DDB_REGS->ctr = frame->ctr; DDB_REGS->cr = frame->cr; DDB_REGS->xer = frame->xer; #ifdef PPC_OEA DDB_REGS->mq = frame->tf_xtra[TF_MQ]; #endif #ifdef PPC_IBM4XX DDB_REGS->dear = frame->dar; DDB_REGS->esr = frame->tf_xtra[TF_ESR]; DDB_REGS->pid = frame->tf_xtra[TF_PID]; #endif #ifdef DDB db_active++; cnpollc(1); db_trap(type, 0); cnpollc(0); db_active--; #elif defined(KGDB) if (!kgdb_trap(type, DDB_REGS)) return 0; #endif /* KGDB isn't smart about advancing PC if we * take a breakpoint trap after kgdb_active is set. * Therefore, we help out here. */ if (IS_BREAKPOINT_TRAP(type, 0)) { int bkpt; db_read_bytes(PC_REGS(DDB_REGS),BKPT_SIZE,(void *)&bkpt); if (bkpt== BKPT_INST) { PC_REGS(DDB_REGS) += BKPT_SIZE; } } memcpy(frame->fixreg, DDB_REGS->r, 32 * sizeof(u_int32_t)); frame->srr0 = DDB_REGS->iar; frame->srr1 = DDB_REGS->msr; frame->lr = DDB_REGS->lr; frame->ctr = DDB_REGS->ctr; frame->cr = DDB_REGS->cr; frame->xer = DDB_REGS->xer; #ifdef PPC_OEA frame->tf_xtra[TF_MQ] = DDB_REGS->mq; #endif #ifdef PPC_IBM4XX frame->dar = DDB_REGS->dear; frame->tf_xtra[TF_ESR] = DDB_REGS->esr; frame->tf_xtra[TF_PID] = DDB_REGS->pid; #endif return 1; }
void boot(int howto) { struct device *mainbus; if (cold) { /* * If the system is cold, just halt, unless the user * explicitely asked for reboot. */ if ((howto & RB_USERREQ) == 0) howto |= RB_HALT; goto haltsys; } /* * If RB_NOSYNC was not specified sync the discs. * Note: Unless cold is set to 1 here, syslogd will die during the * unmount. It looks like syslogd is getting woken up only to find * that it cannot page part of the binary in as the filesystem has * been unmounted. */ if (!(howto & RB_NOSYNC)) bootsync(howto); if_downall(); uvm_shutdown(); /* Say NO to interrupts */ splhigh(); /* Do a dump if requested. */ if ((howto & (RB_DUMP | RB_HALT)) == RB_DUMP) dumpsys(); haltsys: doshutdownhooks(); mainbus = device_mainbus(); if (mainbus != NULL) config_suspend(mainbus, DVACT_POWERDOWN); /* Make sure IRQ's are disabled */ IRQdisable; if (howto & RB_HALT) { if (howto & RB_POWERDOWN) { board_powerdown(); printf("WARNING: powerdown failed!\n"); } printf("The operating system has halted.\n"); printf("Please press any key to reboot.\n\n"); cnpollc(1); cngetc(); cnpollc(0); } printf("rebooting...\n"); board_reset(); cpu_reset(); printf("reboot failed; spinning\n"); while(1); /*NOTREACHED*/ }
void cpu_reboot(int howto, char *bootstr) { static int waittime = -1; const struct alchemy_board *board; /* Take a snapshot before clobbering any registers. */ if (curproc) savectx((struct user *)curpcb); board = board_info(); KASSERT(board != NULL); /* If "always halt" was specified as a boot flag, obey. */ if (boothowto & RB_HALT) howto |= RB_HALT; boothowto = howto; /* If system is cold, just halt. */ if (cold) { boothowto |= RB_HALT; goto haltsys; } if ((boothowto & RB_NOSYNC) == 0 && waittime < 0) { waittime = 0; /* * Synchronize the disks.... */ vfs_shutdown(); /* * If we've been adjusting the clock, the todr * will be out of synch; adjust it now. */ resettodr(); } /* Disable interrupts. */ splhigh(); if (boothowto & RB_DUMP) dumpsys(); haltsys: /* Run any shutdown hooks. */ doshutdownhooks(); if ((boothowto & RB_POWERDOWN) == RB_POWERDOWN) if (board && board->ab_poweroff) board->ab_poweroff(); /* * YAMON may autoboot (depending on settings), and we cannot pass * flags to it (at least I haven't figured out how to yet), so * we "pseudo-halt" now. */ if (boothowto & 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("reseting board...\n\n"); /* * Try to use board-specific reset logic, which might involve a better * hardware reset. */ if (board->ab_reboot) board->ab_reboot(); #if 1 /* XXX * For some reason we are leaving the ethernet MAC in a state where * YAMON isn't happy with it. So just call the reset vector (grr, * Alchemy YAMON doesn't have a "reset" command). */ mips_icache_sync_all(); mips_dcache_wbinv_all(); __asm volatile("jr %0" :: "r"(MIPS_RESET_EXC_VEC)); #else printf("%s\n\n", ((howto & RB_HALT) != 0) ? "halted." : "rebooting..."); yamon_exit(boothowto); printf("Oops, back from yamon_exit()\n\nSpinning..."); #endif for (;;) /* spin forever */ ; /* XXX */ /*NOTREACHED*/ }
/* * kdb_trap - field a TRACE or BPT trap */ int kdb_trap(int type, struct trapframe *tf) { db_regs_t dbregs; int s; #if NFB > 0 fb_unblank(); #endif switch (type) { case T_BREAKPOINT: /* breakpoint */ case -1: /* keyboard interrupt */ break; default: if (!db_onpanic && db_recover==0) return (0); printf("kernel: %s trap\n", trap_type[type & 0xff]); if (db_recover != 0) { db_error("Faulted in DDB; continuing...\n"); /*NOTREACHED*/ } } #ifdef MULTIPROCESSOR if (!db_suspend_others()) { ddb_suspend(tf); return 1; } #endif /* Initialise local dbregs storage from trap frame */ dbregs.db_tf = *tf; dbregs.db_fr = *(struct frame *)tf->tf_out[6]; /* Setup current CPU & reg pointers */ ddb_cpuinfo = curcpu(); curcpu()->ci_ddb_regs = ddb_regp = &dbregs; /* Should switch to kdb`s own stack here. */ s = splhigh(); db_active++; cnpollc(true); db_trap(type, 0/*code*/); cnpollc(false); db_active--; splx(s); /* Update trap frame from local dbregs storage */ *(struct frame *)tf->tf_out[6] = dbregs.db_fr; *tf = dbregs.db_tf; curcpu()->ci_ddb_regs = ddb_regp = 0; ddb_cpuinfo = NULL; #ifdef MULTIPROCESSOR db_resume_others(); #endif return (1); }
void cpu_reboot(int howto, char *bootstr) { /* * If we are still cold then hit the air brakes * and crash to earth fast */ if (cold) { doshutdownhooks(); pmf_system_shutdown(boothowto); printf("Halted while still in the ICE age.\n"); printf("The operating system has halted.\n"); printf("Please press any key to reboot.\n\n"); cngetc(); printf("rebooting...\n"); ixp12x0_reset(); } /* Disable console buffering */ cnpollc(1); /* * If RB_NOSYNC was not specified sync the discs. * Note: Unless cold is set to 1 here, syslogd will die during the unmount. * It looks like syslogd is getting woken up only to find that it cannot * page part of the binary in as the filesystem has been unmounted. */ if (!(howto & RB_NOSYNC)) bootsync(); /* Say NO to interrupts */ splhigh(); /* Do a dump if requested. */ if ((howto & (RB_DUMP | RB_HALT)) == RB_DUMP) dumpsys(); /* Run any shutdown hooks */ doshutdownhooks(); pmf_system_shutdown(boothowto); /* Make sure IRQ's are disabled */ IRQdisable; if (howto & RB_HALT) { printf("The operating system has halted.\n"); printf("Please press any key to reboot.\n\n"); cngetc(); } printf("rebooting...\n"); /* all interrupts are disabled */ disable_interrupts(I32_bit); ixp12x0_reset(); /* ...and if that didn't work, just croak. */ printf("RESET FAILED!\n"); for (;;); }
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 (;;); }
/* * kdb_trap - field a TRACE or BPT trap */ int kdb_trap(int type, struct trapframe64 *tf) { int s; extern int trap_trace_dis; extern int doing_shutdown; trap_trace_dis++; doing_shutdown++; #if NFB > 0 fb_unblank(); #endif switch (type) { case T_BREAKPOINT: /* breakpoint */ break; case -1: /* keyboard interrupt */ printf("kdb tf=%p\n", tf); break; default: if (!db_onpanic && db_recover==0) return (0); printf("kernel trap %x: %s\n", type, trap_type[type & 0x1ff]); if (db_recover != 0) { prom_abort(); db_error("Faulted in DDB; continuing...\n"); prom_abort(); /*NOTREACHED*/ } db_recover = (label_t *)1; } /* Should switch to kdb`s own stack here. */ write_all_windows(); #if defined(MULTIPROCESSOR) if (!db_suspend_others()) { ddb_suspend(tf); return 1; } #endif /* Initialise local dbregs storage from trap frame */ fill_ddb_regs_from_tf(tf); s = splhigh(); db_active++; cnpollc(TRUE); /* Need to do spl stuff till cnpollc works */ db_dump_ts(0, 0, 0, 0); db_trap(type, 0/*code*/); ddb_restore_state(); cnpollc(FALSE); db_active--; splx(s); *tf = DDB_REGS->db_tf; curcpu()->ci_ddb_regs = NULL; trap_trace_dis--; doing_shutdown--; #if defined(MULTIPROCESSOR) db_resume_others(); #endif return (1); }
void boot(int howto) { if (cold) { /* * If the system is cold, just halt, unless the user * explicitly asked for reboot. */ if ((howto & RB_USERREQ) == 0) howto |= RB_HALT; goto haltsys; } boothowto = howto; if ((howto & RB_NOSYNC) == 0 && waittime < 0) { waittime = 0; if (curproc == NULL) curproc = &proc0; /* XXX */ vfs_shutdown(); /* * If we've been adjusting the clock, the todr * will be out of synch; adjust it now. */ if ((howto & RB_TIMEBAD) == 0) { resettodr(); } else { printf("WARNING: not updating battery clock\n"); } } /* Disable interrupts. */ splhigh(); /* Do a dump if requested. */ if (howto & RB_DUMP) dumpsys(); haltsys: doshutdownhooks(); #ifdef MULTIPROCESSOR x86_broadcast_ipi(X86_IPI_HALT); #endif if (howto & RB_HALT) { #if NACPI > 0 && !defined(SMALL_KERNEL) extern int acpi_s5, acpi_enabled; if (acpi_enabled) { delay(500000); if (howto & RB_POWERDOWN || acpi_s5) acpi_powerdown(); } #endif 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"); if (cpureset_delay > 0) delay(cpureset_delay * 1000); cpu_reset(); for(;;) ; /*NOTREACHED*/ }
boolean_t kdb_trap( int type, int code, struct i386_saved_state *regs) { spl_t s; s = splhigh(); saved_ipl[cpu_number()] = s; switch (type) { case T_DEBUG: /* single_step */ { int addr; int status = get_dr6(); if (status & 0xf) { /* hmm hdw break */ addr = status & 0x8 ? get_dr3() : status & 0x4 ? get_dr2() : status & 0x2 ? get_dr1() : get_dr0(); regs->efl |= EFL_RF; db_single_step_cmd(addr, 0, 1, "p"); } } case T_INT3: /* breakpoint */ case T_WATCHPOINT: /* watchpoint */ case -1: /* keyboard interrupt */ break; default: if (db_recover) { i386_nested_saved_state = *regs; db_printf("Caught %s (%d), code = %x, pc = %x\n", trap_name(type), type, code, regs->eip); db_error(""); /*NOTREACHED*/ } kdbprinttrap(type, code); } #if NCPUS > 1 if (db_enter()) #endif /* NCPUS > 1 */ { i386_last_saved_statep = regs; i386_last_kdb_sp = (unsigned) &type; /* XXX Should switch to ddb`s own stack here. */ ddb_regs = *regs; if ((regs->cs & 0x3) == KERNEL_RING) { /* * Kernel mode - esp and ss not saved */ ddb_regs.uesp = (int)®s->uesp; /* kernel stack pointer */ ddb_regs.ss = KERNEL_DS; } cnpollc(TRUE); db_task_trap(type, code, (regs->cs & 0x3) != 0); cnpollc(FALSE); regs->eip = ddb_regs.eip; regs->efl = ddb_regs.efl; regs->eax = ddb_regs.eax; regs->ecx = ddb_regs.ecx; regs->edx = ddb_regs.edx; regs->ebx = ddb_regs.ebx; if ((regs->cs & 0x3) != KERNEL_RING) { /* * user mode - saved esp and ss valid */ regs->uesp = ddb_regs.uesp; /* user stack pointer */ regs->ss = ddb_regs.ss & 0xffff; /* user stack segment */ } regs->ebp = ddb_regs.ebp; regs->esi = ddb_regs.esi; regs->edi = ddb_regs.edi; regs->es = ddb_regs.es & 0xffff; regs->cs = ddb_regs.cs & 0xffff; regs->ds = ddb_regs.ds & 0xffff; regs->fs = ddb_regs.fs & 0xffff; regs->gs = ddb_regs.gs & 0xffff; if ((type == T_INT3) && (db_get_task_value(regs->eip, BKPT_SIZE, FALSE, TASK_NULL) == BKPT_INST)) regs->eip += BKPT_SIZE; } #if NCPUS > 1 db_leave(); #endif /* NCPUS > 1 */ splx(s); return 1; }
void kdb_kentry( struct int_regs *int_regs) { struct i386_interrupt_state *is = int_regs->is; spl_t s = splhigh(); #if NCPUS > 1 if (db_enter()) #endif /* NCPUS > 1 */ { if ((is->cs & 0x3) != KERNEL_RING) { ddb_regs.uesp = ((int *)(is+1))[0]; ddb_regs.ss = ((int *)(is+1))[1]; } else { ddb_regs.ss = KERNEL_DS; ddb_regs.uesp= (int)(is+1); } ddb_regs.efl = is->efl; ddb_regs.cs = is->cs; ddb_regs.eip = is->eip; ddb_regs.eax = is->eax; ddb_regs.ecx = is->ecx; ddb_regs.edx = is->edx; ddb_regs.ebx = int_regs->ebx; ddb_regs.ebp = int_regs->ebp; ddb_regs.esi = int_regs->esi; ddb_regs.edi = int_regs->edi; ddb_regs.ds = is->ds; ddb_regs.es = is->es; ddb_regs.fs = is->fs; ddb_regs.gs = is->gs; cnpollc(TRUE); db_task_trap(-1, 0, (ddb_regs.cs & 0x3) != 0); cnpollc(FALSE); if ((ddb_regs.cs & 0x3) != KERNEL_RING) { ((int *)(is+1))[0] = ddb_regs.uesp; ((int *)(is+1))[1] = ddb_regs.ss & 0xffff; } is->efl = ddb_regs.efl; is->cs = ddb_regs.cs & 0xffff; is->eip = ddb_regs.eip; is->eax = ddb_regs.eax; is->ecx = ddb_regs.ecx; is->edx = ddb_regs.edx; int_regs->ebx = ddb_regs.ebx; int_regs->ebp = ddb_regs.ebp; int_regs->esi = ddb_regs.esi; int_regs->edi = ddb_regs.edi; is->ds = ddb_regs.ds & 0xffff; is->es = ddb_regs.es & 0xffff; is->fs = ddb_regs.fs & 0xffff; is->gs = ddb_regs.gs & 0xffff; } #if NCPUS > 1 db_leave(); #endif /* NCPUS > 1 */ (void) splx(s); }
void cpu_reboot(int howto, char *bootstr) { static int waittime = -1; /* Take a snapshot before clobbering any registers. */ savectx(curpcb); /* If "always halt" was specified as a boot flag, obey. */ if (boothowto & RB_HALT) howto |= RB_HALT; boothowto = howto; /* If system is cold, just halt. */ if (cold) { boothowto |= RB_HALT; goto haltsys; } if ((boothowto & RB_NOSYNC) == 0 && waittime < 0) { waittime = 0; /* * Synchronize the disks.... */ vfs_shutdown(); /* * If we've been adjusting the clock, the todr * will be out of synch; adjust it now. */ resettodr(); } /* Disable interrupts. */ splhigh(); if (boothowto & RB_DUMP) dumpsys(); haltsys: /* Run any shutdown hooks. */ doshutdownhooks(); pmf_system_shutdown(boothowto); #if 0 if ((boothowto & RB_POWERDOWN) == RB_POWERDOWN) if (board && board->ab_poweroff) board->ab_poweroff(); #endif /* * Firmware may autoboot (depending on settings), and we cannot pass * flags to it (at least I haven't figured out how to yet), so * we "pseudo-halt" now. */ if (boothowto & 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("reseting board...\n\n"); mips_icache_sync_all(); mips_dcache_wbinv_all(); atheros_reset(); __asm volatile("jr %0" :: "r"(MIPS_RESET_EXC_VEC)); printf("Oops, back from reset\n\nSpinning..."); for (;;) /* spin forever */ ; /* XXX */ /*NOTREACHED*/ }