📄 machdep.c
字号:
/* * fuword failed (bogus sc_ap value). */ if (flags == -1) return (EINVAL); if (flags == 0 || copyin((caddr_t)rf, (caddr_t)&tstate, sizeof tstate)) return (EJUSTRETURN);#ifdef DEBUG if ((sigdebug & SDB_KSTACK) && p->p_pid == sigpid) printf("sigreturn(%d): ssp %x usp %x scp %x ft %d\n", p->p_pid, &flags, scp->sc_sp, uap->sigcntxp, (flags&SS_RTEFRAME) ? tstate.ss_frame.f_format : -1);#endif /* * Restore most of the users registers except for A6 and SP * which were handled above. */ if (flags & SS_USERREGS) bcopy((caddr_t)tstate.ss_frame.f_regs, (caddr_t)frame->f_regs, sizeof(frame->f_regs)-2*NBPW); /* * Restore long stack frames. Note that we do not copy * back the saved SR or PC, they were picked up above from * the sigcontext structure. */ if (flags & SS_RTEFRAME) { register int sz; /* grab frame type and validate */ sz = tstate.ss_frame.f_format; if (sz > 15 || (sz = exframesize[sz]) < 0) return (EINVAL); frame->f_stackadj -= sz; frame->f_format = tstate.ss_frame.f_format; frame->f_vector = tstate.ss_frame.f_vector; bcopy((caddr_t)&tstate.ss_frame.F_u, (caddr_t)&frame->F_u, sz);#ifdef DEBUG if (sigdebug & SDB_FOLLOW) printf("sigreturn(%d): copy in %d of frame type %d\n", p->p_pid, sz, tstate.ss_frame.f_format);#endif }#ifdef FPCOPROC /* * Finally we restore the original FP context */ if (flags & SS_FPSTATE) m68881_restore(&tstate.ss_fpstate);#ifdef DEBUG if ((sigdebug & SDB_FPSTATE) && *(char *)&tstate.ss_fpstate) printf("sigreturn(%d): copied in FP state (%x) at %x\n", p->p_pid, *(u_int *)&tstate.ss_fpstate, &tstate.ss_fpstate);#endif#endif#ifdef DEBUG if ((sigdebug & SDB_FOLLOW) || ((sigdebug & SDB_KSTACK) && p->p_pid == sigpid)) printf("sigreturn(%d): returns\n", p->p_pid);#endif return (EJUSTRETURN);}int waittime = -1;boot(howto) register int howto;{ /* take a snap shot before clobbering any registers */ if (curproc) savectx(curproc->p_addr, 0); boothowto = howto; if ((howto&RB_NOSYNC) == 0 && waittime < 0) { register struct buf *bp; int iter, nbusy; waittime = 0; (void) spl0(); printf("syncing disks... "); /* * Release vnodes held by texts before sync. */ if (panicstr == 0) vnode_pager_umount(NULL);#ifdef notdef#include "fd.h"#if NFD > 0 fdshutdown();#endif#endif sync(&proc0, (void *)NULL, (int *)NULL); for (iter = 0; iter < 20; iter++) { nbusy = 0; for (bp = &buf[nbuf]; --bp >= buf; ) if ((bp->b_flags & (B_BUSY|B_INVAL)) == B_BUSY) nbusy++; if (nbusy == 0) break; printf("%d ", nbusy); DELAY(40000 * iter); } if (nbusy) printf("giving up\n"); else printf("done\n"); /* * If we've been adjusting the clock, the todr * will be out of synch; adjust it now. */ resettodr(); } splhigh(); /* extreme priority */ if (howto&RB_HALT) { printf("halted\n\n"); asm(" stop #0x2700"); } else { printf("\r\n\n"); if (howto & RB_DUMP) dumpsys(); doboot(); /*NOTREACHED*/ } /*NOTREACHED*/}int dumpmag = 0x8fca0101; /* magic number for savecore */int dumpsize = 0; /* also for savecore */long dumplo = 0;dumpconf(){ int nblks; dumpsize = physmem; if (dumpdev != NODEV && bdevsw[major(dumpdev)].d_psize) { nblks = (*bdevsw[major(dumpdev)].d_psize)(dumpdev); if (dumpsize > btoc(dbtob(nblks - dumplo))) dumpsize = btoc(dbtob(nblks - dumplo)); else if (dumplo == 0) dumplo = nblks - btodb(ctob(physmem)); } /* * Don't dump on the first CLBYTES (why CLBYTES?) * in case the dump device includes a disk label. */ if (dumplo < btodb(CLBYTES)) dumplo = btodb(CLBYTES);}/* * Doadump comes here after turning off memory management and * getting on the dump stack, either when called above, or by * the auto-restart code. */dumpsys(){ msgbufmapped = 0; if (dumpdev == NODEV) return; /* * For dumps during autoconfiguration, * if dump device has already configured... */ if (dumpsize == 0) dumpconf(); if (dumplo < 0) return; printf("\ndumping to dev %x, offset %d\n", dumpdev, dumplo); printf("dump "); switch ((*bdevsw[major(dumpdev)].d_dump)(dumpdev)) { case ENXIO: printf("device bad\n"); break; case EFAULT: printf("device not ready\n"); break; case EINVAL: printf("area improper\n"); break; case EIO: printf("i/o error\n"); break; default: printf("succeeded\n"); break; }}/* * machine dependent system variables. */cpu_sysctl(name, namelen, oldp, oldlenp, newp, newlen, p) int *name; u_int namelen; void *oldp; size_t *oldlenp; void *newp; size_t newlen; struct proc *p;{ /* all sysctl names at this level are terminal */ if (namelen != 1) return (ENOTDIR); /* overloaded */ switch (name[0]) { case CPU_CONSDEV: return (sysctl_rdstruct(oldp, oldlenp, newp, &cn_tty->t_dev, sizeof cn_tty->t_dev)); default: return (EOPNOTSUPP); } /* NOTREACHED */}initcpu(){#ifdef MAPPEDCOPY extern u_int mappedcopysize; /* * Initialize lower bound for doing copyin/copyout using * page mapping (if not already set). We don't do this on * VAC machines as it loses big time. */ if (mappedcopysize == 0) { if (ectype == EC_VIRT) mappedcopysize = (u_int) -1; else mappedcopysize = NBPG; }#endif parityenable();}straytrap(pc, evec) int pc; u_short evec;{ printf("unexpected trap (vector offset %x) from %x\n", evec & 0xFFF, pc);}int *nofault;badaddr(addr) register caddr_t addr;{ register int i; label_t faultbuf;#ifdef lint i = *addr; if (i) return(0);#endif nofault = (int *) &faultbuf; if (setjmp((label_t *)nofault)) { nofault = (int *) 0; return(1); } i = *(volatile short *)addr; nofault = (int *) 0; return(0);}badbaddr(addr) register caddr_t addr;{ register int i; label_t faultbuf;#ifdef lint i = *addr; if (i) return(0);#endif nofault = (int *) &faultbuf; if (setjmp((label_t *)nofault)) { nofault = (int *) 0; return(1); } i = *(volatile char *)addr; nofault = (int *) 0; return(0);}netintr(){#ifdef INET if (netisr & (1 << NETISR_ARP)) { netisr &= ~(1 << NETISR_ARP); arpintr(); } if (netisr & (1 << NETISR_IP)) { netisr &= ~(1 << NETISR_IP); ipintr(); }#endif#ifdef NS if (netisr & (1 << NETISR_NS)) { netisr &= ~(1 << NETISR_NS); nsintr(); }#endif#ifdef ISO if (netisr & (1 << NETISR_ISO)) { netisr &= ~(1 << NETISR_ISO); clnlintr(); }#endif#ifdef CCITT if (netisr & (1 << NETISR_CCITT)) { netisr &= ~(1 << NETISR_CCITT); ccittintr(); }#endif}#ifdef notfdefintrhand(sr) int sr;{ register struct isr *isr; register int found = 0; register int ipl; extern struct isr isrqueue[]; ipl = (sr >> 8) & 7; switch (ipl) { case 3: case 4: case 5: ipl = ISRIPL(ipl); isr = isrqueue[ipl].isr_forw; for (; isr != &isrqueue[ipl]; isr = isr->isr_forw) { if ((isr->isr_intr)(isr->isr_arg)) { found++; break; } } if (found == 0) printf("stray interrupt, sr 0x%x\n", sr); break; case 0: case 1: case 2: case 6: case 7: printf("intrhand: unexpected sr 0x%x\n", sr); break; }}#endif#if defined(DEBUG) && !defined(PANICBUTTON)#define PANICBUTTON#endif#ifdef PANICBUTTONint panicbutton = 1; /* non-zero if panic buttons are enabled */int crashandburn = 0;int candbdelay = 50; /* give em half a second */voidcandbtimer(arg) void *arg;{ crashandburn = 0;}#endif/* * Level 7 interrupts can be caused by the keyboard or parity errors. */nmihand(frame) struct frame frame;{#ifdef PANICBUTTON static int innmihand = 0; /* * Attempt to reduce the window of vulnerability for recursive * NMIs (e.g. someone holding down the keyboard reset button). */ if (innmihand == 0) { innmihand = 1; printf("Got a keyboard NMI\n"); innmihand = 0; } if (panicbutton) { if (crashandburn) { crashandburn = 0; panic(panicstr ? "forced crash, nosync" : "forced crash"); } crashandburn++; timeout(candbtimer, (void *)0, candbdelay); }#endif return;}regdump(fp, sbytes) struct frame *fp; /* must not be register */ int sbytes;{ static int doingdump = 0; register int i; int s; extern char *hexstr(); if (doingdump) return; s = splhigh(); doingdump = 1; printf("pid = %d, pc = %s, ", curproc ? curproc->p_pid : -1, hexstr(fp->f_pc, 8)); printf("ps = %s, ", hexstr(fp->f_sr, 4)); printf("sfc = %s, ", hexstr(getsfc(), 4)); printf("dfc = %s\n", hexstr(getdfc(), 4)); printf("Registers:\n "); for (i = 0; i < 8; i++) printf(" %d", i); printf("\ndreg:"); for (i = 0; i < 8; i++) printf(" %s", hexstr(fp->f_regs[i], 8)); printf("\nareg:"); for (i = 0; i < 8; i++) printf(" %s", hexstr(fp->f_regs[i+8], 8)); if (sbytes > 0) { if (fp->f_sr & PSL_S) { printf("\n\nKernel stack (%s):", hexstr((int)(((int *)&fp)-1), 8)); dumpmem(((int *)&fp)-1, sbytes, 0); } else { printf("\n\nUser stack (%s):", hexstr(fp->f_regs[SP], 8)); dumpmem((int *)fp->f_regs[SP], sbytes, 1); } } doingdump = 0; splx(s);}extern char kstack[];#define KSADDR ((int *)&(kstack[(UPAGES-1)*NBPG]))dumpmem(ptr, sz, ustack) register int *ptr; int sz;{ register int i, val; extern char *hexstr(); for (i = 0; i < sz; i++) { if ((i & 7) == 0) printf("\n%s: ", hexstr((int)ptr, 6)); else printf(" "); if (ustack == 1) { if ((val = fuword(ptr++)) == -1) break; } else { if (ustack == 0 && (ptr < KSADDR || ptr > KSADDR+(NBPG/4-1))) break; val = *ptr++; } printf("%s", hexstr(val, 8)); } printf("\n");}char *hexstr(val, len) register int val;{ static char nbuf[9]; register int x, i; if (len > 8) return(""); nbuf[len] = '\0'; for (i = len-1; i >= 0; --i) { x = val & 0xF; if (x > 9) nbuf[i] = x - 10 + 'A'; else nbuf[i] = x + '0'; val >>= 4; } return(nbuf);}#ifdef DEBUGchar oflowmsg[] = "k-stack overflow";char uflowmsg[] = "k-stack underflow";badkstack(oflow, fr) int oflow; struct frame fr;{#ifdef notdef extern char kstackatbase[]; printf("%s: sp should be %x\n", oflow ? oflowmsg : uflowmsg, kstackatbase - (exframesize[fr.f_format] + 8));#endif printf("%s: sp should be ????????\n", oflow ? oflowmsg : uflowmsg); regdump(&fr, 0); panic(oflow ? oflowmsg : uflowmsg);}#endif/* for LUNA *//* * Enable parity detection */#define PARREG ((volatile short *)0x49000003)#define PARITY_ENABLE 0xCparityenable(){ *PARREG = PARITY_ENABLE;}#ifdef FPCOPROC#define EXT_FPP_ADDR 0x6F000000 /* External 68882 board */#define INT_FPP_ADDR 0x6B000000 /* Internal 68881 chip */#define FPP_ON 0x80 /* selected fpp on */#define FPP_OFF 0x00 /* selected fpp off */#define SET_INT_FPP (*(char *)INT_FPP_ADDR = FPP_ON);(*(char *)EXT_FPP_ADDR = FPP_OFF)#define SET_EXT_FPP (*(char *)INT_FPP_ADDR = FPP_OFF);(*(char *)EXT_FPP_ADDR = FPP_ON)#define FPP68881 1#define FPP68882 2unsigned char fpp_svarea[212];#ifndef OLD_LUNA/* * Check FPP type 68881/68882. */void checkfpp(){#ifdef LUNA2 if (machineid == LUNA_II) { return; }#endif SET_INT_FPP; /* internal = on, external = off */ if( is_68882() ) fpptype = FPP68882; else fpptype = FPP68881; return;}#else/* * Check in/ex-ternal fpp, and determine which we use. * Also set fpp type(MC68881/68882). */void checkfpp(){int internal_exist,external_exist;int external_68882;#ifdef LUNA2 if (machineid == LUNA_II) { return; }#endif SET_INT_FPP; /* internal = on, external = off */ if ( internal_exist = havefpp() && is_68882() ) { /* internal = 68882 */ fpptype = FPP68882; return; } else { /* internal don't exist or it is not 68882 */ SET_EXT_FPP; /* internal = off, external = on */ if ( internal_exist && /* internal = 68882, external <> 68882 */ (!(external_exist = havefpp()) || !(external_68882 = is_68882())) ) { SET_INT_FPP; /* internal = on, external = off */ fpptype = FPP68881; return; } if ( internal_exist ) { /* internal = 68881, external = 68882 */ fpptype = FPP68882; return; } if ( external_exist ) /* internal not exist, external exist */ if ( external_68882 ) { /* external = 68882 */ fpptype = FPP68882; return; } else { /* external = 68881 */ fpptype = FPP68881; return; } else /* in/ex-ternal non exist */ panic("fpp non-existence"); }}#endif#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -