## diffname power/trap.c 1990/0227
## diff -e /dev/null /n/bootesdump/1990/0227/sys/src/9/mips/trap.c
0a
#include "u.h"
#include "lib.h"
#include "mem.h"
#include "dat.h"
#include "fns.h"
#include "ureg.h"
#include "io.h"
/*
* vme interrupt routines
*/
void (*vmevec[256])(int);
void notify(Ureg*);
void noted(Ureg**);
void rfnote(Ureg**);
#define LSYS 0x01
#define LUSER 0x02
/*
* CAUSE register
*/
#define EXCCODE(c) ((c>>2)&0x0F)
#define FPEXC 16
char *excname[] =
{
"external interrupt",
"TLB modification",
"TLB miss (load or fetch)",
"TLB miss (store)",
"address error (load or fetch)",
"address error (store)",
"bus error (fetch)",
"bus error (data load or store)",
"system call",
"breakpoint",
"reserved instruction",
"coprocessor unusable",
"arithmetic overflow",
"undefined 13",
"undefined 14",
"undefined 15",
/* the following is made up */
"floating point exception" /* FPEXC */
};
char *fpexcname(ulong);
char *regname[]={
"STATUS", "PC",
"SP", "CAUSE",
"BADADDR", "TLBVIRT",
"HI", "LO",
"R31", "R30",
"R28", "R27",
"R26", "R25",
"R24", "R23",
"R22", "R21",
"R20", "R19",
"R18", "R17",
"R16", "R15",
"R14", "R13",
"R12", "R11",
"R10", "R9",
"R8", "R7",
"R6", "R5",
"R4", "R3",
"R2", "R1",
};
long ticks;
void
trap(Ureg *ur)
{
int ecode;
int user;
ulong x;
char buf[ERRLEN];
ecode = EXCCODE(ur->cause);
user = ur->status&KUP;
if(u)
u->p->pc = ur->pc; /* BUG */
switch(ecode){
case CINT:
m->intrp = 0;
if(u && u->p->state==Running){
if(u->p->fpstate == FPactive) {
if(ur->cause & INTR3){ /* FP trap */
x = clrfpintr();
ecode = FPEXC;
}
savefpregs(&u->fpsave);
u->p->fpstate = FPinactive;
ur->status &= ~CU1;
if(ecode == FPEXC)
goto Default;
}
m->intr = intr;
m->cause = ur->cause;
if(ur->cause & INTR2)
m->intrp = u->p;
sched();
}else
intr(ur->cause);
break;
case CTLBM:
case CTLBL:
case CTLBS:
if(u == 0)
panic("fault");
if(u->p->fpstate == FPactive) {
savefpregs(&u->fpsave);
u->p->fpstate = FPinactive;
ur->status &= ~CU1;
}
spllo();
x = u->p->insyscall;
u->p->insyscall = 1;
fault(ur, user, ecode);
u->p->insyscall = x;
break;
case CCPU:
if(u->p->fpstate == FPinit) {
restfpregs(&initfp);
u->p->fpstate = FPactive;
ur->status |= CU1;
break;
}
if(u->p->fpstate == FPinactive) {
restfpregs(&u->fpsave);
u->p->fpstate = FPactive;
ur->status |= CU1;
break;
}
default:
Default:
/*
* This isn't good enough; can still deadlock because we may hold print's locks
* in this processor.
*/
if(user){
spllo();
if(ecode == FPEXC)
sprint(buf, "fp: %s FCR31 %lux", fpexcname(x), x);
else
sprint(buf, "trap: %s", excname[ecode]);
postnote(u->p, 1, buf, NDebug);
}else{
print("%s %s pc=%lux\n", user? "user": "kernel", excname[ecode], ur->pc);
if(ecode == FPEXC)
print("fp: %s FCR31 %lux\n", fpexcname(x), x);
dumpregs(ur);
if(m->machno == 0)
spllo();
exit();
}
}
if(user && u->nnote)
notify(ur);
splhi();
if(user && u && u->p->fpstate == FPinactive) {
restfpregs(&u->fpsave);
u->p->fpstate = FPactive;
ur->status |= CU1;
}
}
void
intr(ulong cause)
{
int i, pend;
long v;
cause &= INTR5|INTR4|INTR3|INTR2|INTR1;
if(cause & (INTR2|INTR4)){
clock(cause);
cause &= ~(INTR2|INTR4);
}
if(cause & INTR1){
duartintr();
cause &= ~INTR1;
}
if(cause & INTR5){
if(!(*MPBERR1 & (1<<8))){
/* print("MP bus error %lux\n", *MPBERR0); /**/
*MPBERR0 = 0;
i = *SBEADDR;
}
/*
* directions from IO2 manual
* 1. clear all IO2 masks
*/
*IO2CLRMASK = 0xff;
/*
* 2. wait for interrupt in progress
*/
while(!(*INTPENDREG & (1<<5)))
;
/*
* 3. read pending interrupts
*/
pend = SBCCREG->fintpending & 0xff;
/*
* 4. clear pending register
*/
i = SBCCREG->flevel;
/*
* 5a. process lance, scsi
*/
loop:
if(pend & 1) {
v = INTVECREG->i[0].vec;
/* a botch, bit 12 seems to always be on
if(v & (1<<12))
print("io2 mp bus error %d\n", 0);
*/
if(!(v & (1<<2)))
lanceintr();
if(!(v & (1<<1)))
lanceparity();
if(!(v & (1<<0)))
print("SCSI interrupt\n");
}
/*
* 5b. process vme
* i bet i can guess your level
*/
pend >>= 1;
for(i=1; pend; i++) {
if(pend & 1) {
v = INTVECREG->i[i].vec;
/* a botch, bit 12 seems to always be on
if(v & (1<<12))
print("io2 mp bus error %d\n", i);
*/
v &= 0xff;
(*vmevec[v])(v);
}
pend >>= 1;
}
/*
* 6. re-enable interrupts
*/
*IO2SETMASK = 0xff;
cause &= ~INTR5;
}
if(cause)
panic("cause %lux %lux\n", u, cause);
}
char *
fpexcname(ulong x)
{
static char *str[]={
"inexact operation",
"underflow",
"overflow",
"division by zero",
"invalid operation",
"unimplemented operation",
};
int i;
x >>= 12;
for(i=0; i<6; i++, x>>=1)
if(x & 1)
return str[i];
return "no floating point exception";
}
void
dumpstack(void)
{
ulong l, v;
extern ulong etext;
if(u)
for(l=(ulong)&l; l<USERADDR+BY2PG; l+=4){
v = *(ulong*)l;
if(KTZERO < v && v < (ulong)&etext)
print("%lux=%lux\n", l, v);
}
}
void
dumpregs(Ureg *ur)
{
int i;
ulong *l;
int (*pr)(char*, ...);
if(u)
print("registers for %s %d\n", u->p->text, u->p->pid);
else
print("registers for kernel\n");
l = &ur->status;
for(i=0; i<sizeof regname/sizeof(char*); i+=2, l+=2)
print("%s\t%.8lux\t%s\t%.8lux\n", regname[i], l[0], regname[i+1], l[1]);
dumpstack();
}
/*
* Call user, if necessary, with note
*/
void
notify(Ureg *ur)
{
ulong sp;
lock(&u->p->debug);
if(u->nnote==0){
unlock(&u->p->debug);
return;
}
if(u->note[0].flag!=NUser && (u->notified || u->notify==0)){
if(u->note[0].flag == NDebug)
pprint("suicide: %s\n", u->note[0].msg);
Die:
unlock(&u->p->debug);
pexit(u->note[0].msg, u->note[0].flag!=NDebug);
}
if(!u->notified){
if(!u->notify)
goto Die;
sp = ur->sp;
sp -= sizeof(Ureg);
u->ureg = (void*)sp;
memcpy((Ureg*)sp, ur, sizeof(Ureg));
sp -= ERRLEN;
memcpy((char*)sp, u->note[0].msg, ERRLEN);
sp -= 3*BY2WD;
*(ulong*)(sp+2*BY2WD) = sp+3*BY2WD; /* arg 2 is string */
*(ulong*)(sp+1*BY2WD) = (ulong)u->ureg; /* arg 1 is ureg* */
*(ulong*)(sp+0*BY2WD) = 0; /* arg 0 is pc */
ur->sp = sp;
ur->pc = (ulong)u->notify;
u->notified = 1;
u->nnote--;
memcpy(&u->note[0], &u->note[1], u->nnote*sizeof(Note));
}
unlock(&u->p->debug);
}
/*
* Return user to state before notify()
*/
void
noted(Ureg **urp)
{
lock(&u->p->debug);
u->notified = 0;
memcpy(*urp, u->ureg, sizeof(Ureg));
unlock(&u->p->debug);
splhi();
rfnote(urp);
}
#undef CHDIR /* BUG */
#include "/sys/src/libc/mips9sys/sys.h"
typedef long Syscall(ulong*);
Syscall sysaccess, sysbind, sysbrk_, syschdir, sysclose, syscreate;
Syscall sysdup, syserrstr, sysexec, sysexits, sysfork, sysforkpgrp;
Syscall sysfstat, sysfwstat, sysgetpid, syslasterr, sysmount, sysnoted;
Syscall sysnotify, sysopen, syspipe, sysr1, sysread, sysremove, sysseek;
Syscall syssleep, sysstat, sysuserstr, syswait, syswrite, syswstat;
Syscall *systab[]={
[SYSR1] sysr1,
[ACCESS] sysaccess,
[BIND] sysbind,
[CHDIR] syschdir,
[CLOSE] sysclose,
[DUP] sysdup,
[ERRSTR] syserrstr,
[EXEC] sysexec,
[EXITS] sysexits,
[FORK] sysfork,
[FORKPGRP] sysforkpgrp,
[FSTAT] sysfstat,
[LASTERR] syslasterr,
[MOUNT] sysmount,
[OPEN] sysopen,
[READ] sysread,
[SEEK] sysseek,
[SLEEP] syssleep,
[STAT] sysstat,
[WAIT] syswait,
[WRITE] syswrite,
[PIPE] syspipe,
[CREATE] syscreate,
[USERSTR] sysuserstr,
[BRK_] sysbrk_,
[REMOVE] sysremove,
[WSTAT] syswstat,
[FWSTAT] sysfwstat,
[NOTIFY] sysnotify,
[NOTED] sysnoted,
};
long
syscall(Ureg *aur)
{
long ret;
ulong sp;
ulong r1;
Ureg *ur;
u->p->insyscall = 1;
ur = aur;
/*
* since the system call interface does not
* guarantee anything about registers,
*/
if(u->p->fpstate == FPactive) {
u->p->fpstate = FPinit; /* BUG */
ur->status &= ~CU1;
}
spllo();
r1 = ur->r1;
sp = ur->sp;
if(r1 >= sizeof systab/BY2WD)
panic("syscall %d\n", r1);
if(sp & (BY2WD-1))
panic("syscall odd sp");
if(sp<(USTKTOP-BY2PG) || sp>(USTKTOP-4*BY2WD))
validaddr(ur->sp, 4*BY2WD, 0);
u->nerrlab = 0;
ret = -1;
if(!waserror())
ret = (*systab[r1])((ulong*)(sp+2*BY2WD));
ur->pc += 4;
u->nerrlab = 0;
splhi();
if(r1 == NOTED) /* ugly hack */
noted(&aur); /* doesn't return */
if(u->nnote){
ur->r1 = ret;
notify(ur);
}
u->p->insyscall = 0;
return ret;
}
void
error(Chan *c, int code)
{
if(c){
u->error.type = c->type;
u->error.dev = c->dev;
}else{
u->error.type = 0;
u->error.dev = 0;
}
u->error.code = code;
nexterror();
}
void
nexterror(void)
{
gotolabel(&u->errlab[--u->nerrlab]);
}
void
novme(int v)
{
static count = 0;
print("vme intr 0x%.2x\n", v);
count++;
if(count >= 10)
panic("too many vme intr");
}
void
setvmevec(int v, void (*f)(int))
{
void (*g)(int);
v &= 0xff;
g = vmevec[v];
if(g && g != novme)
print("second setvmevec to 0x%.2x\n", v);
vmevec[v] = f;
}
.
## diffname power/trap.c 1990/03091
## diff -e /n/bootesdump/1990/0227/sys/src/9/mips/trap.c /n/bootesdump/1990/03091/sys/src/9/mips/trap.c
454d
447a
u->p->insyscall = 0;
.
281a
.
## diffname power/trap.c 1990/0310
## diff -e /n/bootesdump/1990/03091/sys/src/9/mips/trap.c /n/bootesdump/1990/0310/sys/src/9/mips/trap.c
423a
u->p->pc = ur->pc; /* BUG */
.
## diffname power/trap.c 1990/0427
## diff -e /n/bootesdump/1990/0310/sys/src/9/mips/trap.c /n/bootesdump/1990/0427/sys/src/9/mips/trap.c
152c
sprint(buf, "trap: %s[%d]", excname[ecode], m->machno);
.
## diffname power/trap.c 1990/0511
## diff -e /n/bootesdump/1990/0427/sys/src/9/mips/trap.c /n/bootesdump/1990/0511/sys/src/9/mips/trap.c
446a
}
.
445c
if(!waserror()){
if(r1 >= sizeof systab/BY2WD){
pprint("bad sys call number %d pc %lux\n", r1, ((Ureg*)UREGADDR)->pc);
msg = "bad sys call";
Bad:
postnote(u->p, 1, msg, NDebug);
error(0, Ebadarg);
}
if(sp & (BY2WD-1)){
pprint("odd sp in sys call pc %lux sp %lux\n", ((Ureg*)UREGADDR)->pc, ((Ureg*)UREGADDR)->sp);
msg = "odd stack";
goto Bad;
}
if(sp<(USTKTOP-BY2PG) || sp>(USTKTOP-4*BY2WD))
validaddr(ur->sp, 4*BY2WD, 0);
.
436,442d
420a
char *msg;
.
7a
#include "errno.h"
.
## diffname power/trap.c 1990/0515
## diff -e /n/bootesdump/1990/0511/sys/src/9/mips/trap.c /n/bootesdump/1990/0515/sys/src/9/mips/trap.c
454c
validaddr(sp, 4*BY2WD, 0);
.
## diffname power/trap.c 1990/0619
## diff -e /n/bootesdump/1990/0515/sys/src/9/mips/trap.c /n/bootesdump/1990/0619/sys/src/9/mips/trap.c
363a
if(!u->notified){
unlock(&u->p->debug);
return;
}
.
## diffname power/trap.c 1990/0722
## diff -e /n/bootesdump/1990/0619/sys/src/9/mips/trap.c /n/bootesdump/1990/0722/sys/src/9/mips/trap.c
436c
u->p->fpstate = FPinit;
.
142a
if(u && u->p && u->p->fpstate == FPactive){
savefpregs(&u->fpsave);
u->p->fpstate = FPinactive;
ur->status &= ~CU1;
}
.
140a
goto Default;
.
135c
if(u && u->p && u->p->fpstate == FPinactive) {
.
129c
if(u && u->p && u->p->fpstate == FPinit) {
.
## diffname power/trap.c 1990/0731
## diff -e /n/bootesdump/1990/0722/sys/src/9/mips/trap.c /n/bootesdump/1990/0731/sys/src/9/mips/trap.c
189c
clock(cause, pc);
.
182c
intr(ulong cause, ulong pc)
.
108c
intr(ur->cause, ur->pc);
.
103a
m->pc = ur->pc;
.
## diffname power/trap.c 1990/0802
## diff -e /n/bootesdump/1990/0731/sys/src/9/mips/trap.c /n/bootesdump/1990/0802/sys/src/9/mips/trap.c
116c
panic("fault u==0 pc %lux addr %lux", ur->pc, ur->badvaddr);
.
## diffname power/trap.c 1990/0816
## diff -e /n/bootesdump/1990/0802/sys/src/9/mips/trap.c /n/bootesdump/1990/0816/sys/src/9/mips/trap.c
355c
ur->usp = sp;
.
345c
sp = ur->usp;
.
## diffname power/trap.c 1990/0826
## diff -e /n/bootesdump/1990/0816/sys/src/9/mips/trap.c /n/bootesdump/1990/0826/sys/src/9/mips/trap.c
395c
[___ACCESS___] sysaccess,
.
255d
252,253c
if(!(v & (1<<12)))
.
236,242c
switch(ioid){
case IO2R1:
case IO2R2:
if(!(v & (1<<2)))
lanceintr();
if(!(v & (1<<1)))
lanceparity();
if(!(v & (1<<0)))
print("SCSI interrupt\n");
break;
case IO3R1:
if(v & (1<<2))
lance3intr();
if(v & (1<<1))
print("SCSI 1 interrupt\n");
if(v & (1<<0))
print("SCSI 0 interrupt\n");
break;
}
.
233,234c
if(!(v & (1<<12)))
.
## diffname power/trap.c 1990/0830
## diff -e /n/bootesdump/1990/0826/sys/src/9/mips/trap.c /n/bootesdump/1990/0830/sys/src/9/mips/trap.c
263,264c
if(!(v & (1<<12))){
print("io2 mp bus error %d %lux %lux\n", i,
*MPBERR0, *MPBERR1);
*MPBERR0 = 0;
}
.
233,234c
if(!(v & (1<<12))){
print("io2 mp bus error %d %lux %lux\n", 0,
*MPBERR0, *MPBERR1);
*MPBERR0 = 0;
}
.
200c
print("MP bus error %lux %lux\n", *MPBERR0, *MPBERR1); /**/
.
## diffname power/trap.c 1990/0901
## diff -e /n/bootesdump/1990/0830/sys/src/9/mips/trap.c /n/bootesdump/1990/0901/sys/src/9/mips/trap.c
452a
ur->cause = 15<<2; /* for debugging: system call is undef 15;
.
45c
"undefined 15", /* used as sys call for debugger */
.
## diffname power/trap.c 1990/0905
## diff -e /n/bootesdump/1990/0901/sys/src/9/mips/trap.c /n/bootesdump/1990/0905/sys/src/9/mips/trap.c
279c
*IO2SETMASK = iomask;
.
266,270c
if(!(v & (1<<12)))
mpbuserror();
.
257a
if(pend & (1<<10)) {
v = INTVECREG->i[10].vec;
if(!(v & (1<<12)))
mpbuserror();
lance3intr();
}
if(pend & (1<<8)) {
v = INTVECREG->i[10].vec;
if(!(v & (1<<12)))
mpbuserror();
print("SCSI0 interrupt\n");
}
if(pend & (1<<9)) {
v = INTVECREG->i[10].vec;
if(!(v & (1<<12)))
mpbuserror();
print("SCSI1 interrupt\n");
}
.
233,256c
if(!(v & (1<<12)))
mpbuserror();
if(!(v & (1<<2)))
lanceintr();
if(!(v & (1<<1)))
lanceparity();
if(!(v & (1<<0)))
print("SCSI interrupt\n");
.
230d
182a
mpbuserror(void)
{
print("io2 mp bus error %d %lux %lux\n", 0,
*MPBERR0, *MPBERR1);
*MPBERR0 = 0;
}
void
.
## diffname power/trap.c 1990/0907
## diff -e /n/bootesdump/1990/0905/sys/src/9/mips/trap.c /n/bootesdump/1990/0907/sys/src/9/mips/trap.c
285c
*IO2SETMASK = 0xff;
.
275,276c
if(!(v & (1<<12))){
print("io2 mp bus error %d %lux %lux\n", i,
*MPBERR0, *MPBERR1);
*MPBERR0 = 0;
}
.
249,266d
240,247c
if(!(v & (1<<12))){
print("io2 mp bus error %d %lux %lux\n", 0,
*MPBERR0, *MPBERR1);
*MPBERR0 = 0;
}
switch(ioid){
case IO2R1:
case IO2R2:
if(!(v & (1<<2)))
lanceintr();
if(!(v & (1<<1)))
lanceparity();
if(!(v & (1<<0)))
print("SCSI interrupt\n");
break;
case IO3R1:
if(v & (1<<2))
lance3intr();
if(v & (1<<1))
print("SCSI 1 interrupt\n");
if(v & (1<<0))
print("SCSI 0 interrupt\n");
break;
}
.
237a
loop:
.
208c
iprint("MP bus error %lux %lux\n", *MPBERR0, *MPBERR1); /**/
.
183,190d
## diffname power/trap.c 1990/0911
## diff -e /n/bootesdump/1990/0907/sys/src/9/mips/trap.c /n/bootesdump/1990/0911/sys/src/9/mips/trap.c
255d
250c
lanceintr();
.
247,248c
} else {
.
238,240c
if(ioid < IO3R1){
.
200c
print("MP bus error %lux %lux\n", *MPBERR0, *MPBERR1);
.
## diffname power/trap.c 1990/1110
## diff -e /n/bootesdump/1990/0911/sys/src/9/mips/trap.c /n/bootesdump/1990/1110/sys/src/9/mips/trap.c
473c
msg = "sys: odd stack";
.
466c
msg = "sys: bad sys call";
.
160c
sprint(buf, "sys: trap: %s[%d]", excname[ecode], m->machno);
.
158c
sprint(buf, "sys: fp: %s FCR31 %lux", fpexcname(x), x);
.
## diffname power/trap.c 1990/1113
## diff -e /n/bootesdump/1990/1110/sys/src/9/mips/trap.c /n/bootesdump/1990/1113/sys/src/9/mips/trap.c
387a
(*urp)->r1 = -1; /* return error from the interrupted call */
.
## diffname power/trap.c 1990/11211
## diff -e /n/bootesdump/1990/1113/sys/src/9/mips/trap.c /n/bootesdump/1990/11211/sys/src/9/mips/trap.c
497,504c
strncpy(u->error, errstrtab[code], NAMELEN);
nexterror();
}
void
errors(char *err)
{
strncpy(u->error, err, NAMELEN);
.
495c
error(int code)
.
493a
#include "errstr.h"
.
477,478c
if(sp<(USTKTOP-BY2PG) || sp>(USTKTOP-5*BY2WD))
validaddr(sp, 5*BY2WD, 0);
.
470c
error(Ebadarg);
.
429c
[___USERSTR___] sysdeath,
.
418c
[___LASTERR___] sysdeath,
.
412c
[___ERRSTR___] sysdeath,
.
407c
[ERRSTR] syserrstr,
.
403c
Syscall syssleep, sysstat, syswait, syswrite, syswstat;
.
401c
Syscall sysfstat, sysfwstat, sysgetpid, sysmount, sysnoted;
.
399c
Syscall sysbind, sysbrk_, syschdir, sysclose, syscreate, sysdeath;
.
396c
#include "/sys/src/libc/Nmips9sys/sys.h"
.
330d
## diffname power/trap.c 1990/1122
## diff -e /n/bootesdump/1990/11211/sys/src/9/mips/trap.c /n/bootesdump/1990/1122/sys/src/9/mips/trap.c
395c
#include "/sys/src/libc/mips9sys/sys.h"
.
## diffname power/trap.c 1990/1212
## diff -e /n/bootesdump/1990/1122/sys/src/9/mips/trap.c /n/bootesdump/1990/1212/sys/src/9/mips/trap.c
125c
faultmips(ur, user, ecode);
.
## diffname power/trap.c 1990/1214
## diff -e /n/bootesdump/1990/1212/sys/src/9/mips/trap.c /n/bootesdump/1990/1214/sys/src/9/mips/trap.c
225a
USED(i);
.
202a
USED(i);
.
82a
SET(x);
.
## diffname power/trap.c 1990/1226
## diff -e /n/bootesdump/1990/1214/sys/src/9/mips/trap.c /n/bootesdump/1990/1226/sys/src/9/mips/trap.c
495a
void
execpc(ulong entry)
{
((Ureg*)UREGADDR)->pc = entry - 4; /* syscall advances it */
}
.
## diffname power/trap.c 1991/0115
## diff -e /n/bootesdump/1990/1226/sys/src/9/mips/trap.c /n/bootesdump/1991/0115/sys/src/9/mips/trap.c
507c
strncpy(u->error, errstrtab[code], ERRLEN);
.
## diffname power/trap.c 1991/0209
## diff -e /n/bootesdump/1991/0201/sys/src/9/mips/trap.c /n/bootesdump/1991/0209/sys/src/9/power/trap.c
191c
clock(ur);
.
189c
cause = ur->cause&(INTR5|INTR4|INTR3|INTR2|INTR1);
.
187a
ulong cause;
.
184c
intr(Ureg *ur)
.
103,110c
}
intr(ur);
.
90d
15d
## diffname power/trap.c 1991/0212
## diff -e /n/bootesdump/1991/0209/sys/src/9/power/trap.c /n/bootesdump/1991/0212/sys/src/9/power/trap.c
271c
*IO2SETMASK = 0xff000000;
.
268a
* if nothing else, assume bus error
*/
if(!any){
print("bogus intr lvl 5 pend %lux on %d\n", npend, m->machno);
delay(100);
}
/*
.
266d
264a
any = 1;
.
259,260c
print("io2 mp bus error %d %lux %lux\n",
i, *MPBERR0, *MPBERR1);
.
254,255c
for(i=1; pend>>=1; i++){
.
252c
* i can guess your level
.
241c
}else{
if(v & 7)
any = 1;
.
234a
if(!(v & 7))
any = 1;
.
232a
any = 1;
.
226d
215c
npend = pend = SBCCREG->fintpending;
.
204c
*IO2CLRMASK = 0xff000000;
.
197a
any = 1;
.
192c
any = 0;
.
178c
int i, any;
uchar pend, npend;
.
## diffname power/trap.c 1991/0219
## diff -e /n/bootesdump/1991/0212/sys/src/9/power/trap.c /n/bootesdump/1991/0219/sys/src/9/power/trap.c
276c
if(!any && bogies++<100){
.
181a
static int bogies;
.
## diffname power/trap.c 1991/0314
## diff -e /n/bootesdump/1991/0219/sys/src/9/power/trap.c /n/bootesdump/1991/0314/sys/src/9/power/trap.c
463a
u->fpsave.fpstatus = fcr31();
.
461c
* guarantee anything about registers, we can
* smash them. but we must save fpstatus.
.
169c
restfpregs(&u->fpsave, u->fpsave.fpstatus);
.
130c
restfpregs(&u->fpsave, u->fpsave.fpstatus);
.
124c
restfpregs(&initfp, u->fpsave.fpstatus);
.
## diffname power/trap.c 1991/0316
## diff -e /n/bootesdump/1991/0314/sys/src/9/power/trap.c /n/bootesdump/1991/0316/sys/src/9/power/trap.c
224a
/*
* 4a. attempt to fix problem
*/
if(!(*INTPENDREG & (1<<5)))
print("pause again\n");
while(!(*INTPENDREG & (1<<5)))
;
xxx = SBCCREG->fintpending;
if(xxx){
print("new pend %ux\n", xxx);
npend = pend |= xxx;
i = SBCCREG->flevel;
}
.
218c
pend = SBCCREG->fintpending;
npend = pend;
.
178a
uchar xxx;
.
## diffname power/trap.c 1991/0318
## diff -e /n/bootesdump/1991/0316/sys/src/9/power/trap.c /n/bootesdump/1991/0318/sys/src/9/power/trap.c
411c
memmove(*urp, u->ureg, sizeof(Ureg));
.
394c
memmove(&u->note[0], &u->note[1], u->nnote*sizeof(Note));
.
385c
memmove((char*)sp, u->note[0].msg, ERRLEN);
.
383c
memmove((Ureg*)sp, ur, sizeof(Ureg));
.
## diffname power/trap.c 1991/0322
## diff -e /n/bootesdump/1991/0318/sys/src/9/power/trap.c /n/bootesdump/1991/0322/sys/src/9/power/trap.c
538c
strncpy(u->error, err, ERRLEN);
.
## diffname power/trap.c 1991/0425
## diff -e /n/bootesdump/1991/0322/sys/src/9/power/trap.c /n/bootesdump/1991/0425/sys/src/9/power/trap.c
470a
m->syscall++;
.
239a
USED(i);
.
184a
m->intr++;
.
153a
.
## diffname power/trap.c 1991/0503
## diff -e /n/bootesdump/1991/0425/sys/src/9/power/trap.c /n/bootesdump/1991/0503/sys/src/9/power/trap.c
407a
Ureg *nur;
nur = u->ureg;
validaddr(nur->pc, 1, 0);
validaddr(nur->usp, BY2WD, 0);
if(nur->status!=u->svstatus){
pprint("bad noted ureg status %ux\n", nur->status);
pexit("Suicide", 0);
}
.
382a
u->svstatus = ur->status;
.
## diffname power/trap.c 1991/0513
## diff -e /n/bootesdump/1991/0503/sys/src/9/power/trap.c /n/bootesdump/1991/0513/sys/src/9/power/trap.c
449c
[ALARM] sysalarm,
.
440c
Syscall syssleep, sysstat, syswait, syswrite, syswstat, sysalarm;
.
## diffname power/trap.c 1991/0602
## diff -e /n/bootesdump/1991/0513/sys/src/9/power/trap.c /n/bootesdump/1991/0602/sys/src/9/power/trap.c
413a
poperror();
.
411a
if(waserror()){
pprint("suicide: trap in noted\n");
pexit("Suicide", 0);
}
.
## diffname power/trap.c 1991/0606
## diff -e /n/bootesdump/1991/0602/sys/src/9/power/trap.c /n/bootesdump/1991/0606/sys/src/9/power/trap.c
460c
[LKBRK_] syslkbrk_,
.
445c
Syscall syssleep, sysstat, syswait, syswrite, syswstat, sysalarm, syslkbrk_;
.
## diffname power/trap.c 1991/0621
## diff -e /n/bootesdump/1991/0606/sys/src/9/power/trap.c /n/bootesdump/1991/0621/sys/src/9/power/trap.c
446c
#define LKBRK_ 12
.
## diffname power/trap.c 1991/0625
## diff -e /n/bootesdump/1991/0621/sys/src/9/power/trap.c /n/bootesdump/1991/0625/sys/src/9/power/trap.c
521a
if(((ulong*)ur->pc)[-2] != 0x23bdfffc) /* new calling convention: look for ADD $-4, SP */
sp -= BY2WD;
.
## diffname power/trap.c 1991/0705
## diff -e /n/bootesdump/1991/0625/sys/src/9/power/trap.c /n/bootesdump/1991/0705/sys/src/9/power/trap.c
537a
.
529a
if(u->p->procctl)
procctl(u->p);
.
504a
if(u->p->procctl)
procctl(u->p);
.
477a
[SEGATTACH] syssegattach,
[SEGDETACH] syssegdetach,
[SEGFREE] syssegfree,
[SEGFLUSH] syssegflush,
.
460c
[SEGBRK] syssegbrk,
.
445,446c
Syscall syssleep, sysstat, syswait, syswrite, syswstat, sysalarm, syssegbrk;
Syscall syssegattach, syssegdetach, syssegfree, syssegflush;
.
385a
if(waserror()){
pprint("suicide: trap in notify\n");
pexit("Suicide", 0);
}
validaddr((ulong)u->notify, 1, 0);
validaddr(sp-ERRLEN-3*BY2WD, sizeof(Ureg)+ERRLEN-3*BY2WD, 0);
poperror();
.
166,167c
if(user) {
if(u->p->procctl)
procctl(u->p);
if(u->nnote)
notify(ur);
}
.
153c
sprint(buf, "sys: %s pc=0x%lux", excname[ecode], ur->pc);
.
145,146c
* This isn't good enough; can still deadlock because we may
* hold print's locks in this processor.
.
86a
.
## diffname power/trap.c 1991/0709
## diff -e /n/bootesdump/1991/0705/sys/src/9/power/trap.c /n/bootesdump/1991/0709/sys/src/9/power/trap.c
553d
## diffname power/trap.c 1991/0710
## diff -e /n/bootesdump/1991/0709/sys/src/9/power/trap.c /n/bootesdump/1991/0710/sys/src/9/power/trap.c
572,593d
545,549c
if(((ulong*)ur->pc)[-2] == 0x23bdfffc){ /* old calling convention: look for ADD $-4, SP */
pprint("old system call linkage; recompile\n");
sp += BY2WD;
}
if(sp<(USTKTOP-BY2PG) || sp>(USTKTOP-6*BY2WD))
validaddr(sp, 6*BY2WD, 0);
ret = (*systab[r1])((ulong*)(sp+BY2WD));
.
452c
#include "/sys/src/libc/9syscall/sys.h"
.
## diffname power/trap.c 1991/0711
## diff -e /n/bootesdump/1991/0710/sys/src/9/power/trap.c /n/bootesdump/1991/0711/sys/src/9/power/trap.c
549,550c
if(sp<(USTKTOP-BY2PG) || sp>(USTKTOP-(1+MAXSYSARG)*BY2WD))
validaddr(sp, (1+MAXSYSARG)*BY2WD, 0);
.
## diffname power/trap.c 1991/0717
## diff -e /n/bootesdump/1991/0711/sys/src/9/power/trap.c /n/bootesdump/1991/0717/sys/src/9/power/trap.c
561c
noted(&aur, *(ulong*)(sp+BY2WD)); /* doesn't return */
.
445,447c
switch(arg0){
case NCONT:
splhi();
unlock(&u->p->debug);
rfnote(urp);
break;
/* never returns */
default:
pprint("unknown noted arg 0x%lux\n", arg0);
u->lastnote.flag = NDebug;
/* fall through */
case NTERM:
if(u->lastnote.flag == NDebug)
pprint("suicide: %s\n", u->lastnote.msg);
unlock(&u->p->debug);
pexit(u->lastnote.msg, u->lastnote.flag!=NDebug);
}
.
434c
pprint("bad noted ureg status %lux\n", nur->status);
.
432d
426,429d
421c
noted(Ureg **urp, ulong arg0)
.
411a
memmove(&u->lastnote, &u->note[0], sizeof(Note));
.
15c
void noted(Ureg**, ulong);
.
## diffname power/trap.c 1991/0718
## diff -e /n/bootesdump/1991/0717/sys/src/9/power/trap.c /n/bootesdump/1991/0718/sys/src/9/power/trap.c
454c
case NDFLT:
.
## diffname power/trap.c 1991/0722
## diff -e /n/bootesdump/1991/0718/sys/src/9/power/trap.c /n/bootesdump/1991/0722/sys/src/9/power/trap.c
394a
unlock(&u->p->debug);
.
## diffname power/trap.c 1991/0725
## diff -e /n/bootesdump/1991/0722/sys/src/9/power/trap.c /n/bootesdump/1991/0725/sys/src/9/power/trap.c
575c
if(u->nnote && r1!=FORK){
.
441d
## diffname power/trap.c 1991/0727
## diff -e /n/bootesdump/1991/0725/sys/src/9/power/trap.c /n/bootesdump/1991/0727/sys/src/9/power/trap.c
379a
u->p->notepending = 0;
.
## diffname power/trap.c 1991/0731
## diff -e /n/bootesdump/1991/0727/sys/src/9/power/trap.c /n/bootesdump/1991/0731/sys/src/9/power/trap.c
546c
if(r1 >= sizeof systab/sizeof systab[0]){
.
467,511d
464,465c
#include "../port/systab.h"
.
## diffname power/trap.c 1991/0814
## diff -e /n/bootesdump/1991/0731/sys/src/9/power/trap.c /n/bootesdump/1991/0814/sys/src/9/power/trap.c
443a
if(waserror()){
pprint("suicide: trap in noted\n");
unlock(&u->p->debug);
goto Die;
}
validaddr(nur->pc, 1, 0);
validaddr(nur->usp, BY2WD, 0);
poperror();
.
438c
pprint("call to noted() when not notified\n");
goto Die;
.
432a
Die:
.
429,430d
## diffname power/trap.c 1991/0926
## diff -e /n/bootesdump/1991/0814/sys/src/9/power/trap.c /n/bootesdump/1991/0926/sys/src/9/power/trap.c
535c
if(r1 == NOTED) /* ugly hack */
.
533a
u->p->psstate = 0;
.
525a
u->p->psstate = sysctab[r1];
.
## diffname power/trap.c 1991/1031
## diff -e /n/bootesdump/1991/0926/sys/src/9/power/trap.c /n/bootesdump/1991/1031/sys/src/9/power/trap.c
303c
if(!any && bogies++<10){
.
301c
* if nothing else, what the hell?
.
## diffname power/trap.c 1991/1102
## diff -e /n/bootesdump/1991/1031/sys/src/9/power/trap.c /n/bootesdump/1991/1102/sys/src/9/power/trap.c
304c
/* print("bogus intr lvl 5 pend %lux on %d\n", npend, m->machno);/**/
.
## diffname power/trap.c 1991/1105
## diff -e /n/bootesdump/1991/1102/sys/src/9/power/trap.c /n/bootesdump/1991/1105/sys/src/9/power/trap.c
304c
print("bogus intr lvl 5 pend %lux on %d\n", npend, m->machno);/**/
.
## diffname power/trap.c 1991/1110
## diff -e /n/bootesdump/1991/1105/sys/src/9/power/trap.c /n/bootesdump/1991/1110/sys/src/9/power/trap.c
573a
}
/* This routine must save the values of registers the user is not permitted to write from devproc
* and the restore them before returning
*/
void
setregisters(Ureg *xp, char *pureg, char *uva, int n)
{
ulong status;
status = xp->status;
memmove(pureg, uva, n);
xp->status = status;
.
539c
if(u->p->procctl || (u->nnote && r1!=FORK)){
.
531,532d
500,502d
486a
u->dbgreg = aur;
.
379c
lock(&u->p->debug);
.
375,377c
if(u->p->procctl)
procctl(u->p);
if(u->nnote == 0)
.
168,173c
if(user)
notify(ur);
.
87c
u->dbgreg = ur;
}
.
85c
if(u) {
.
## diffname power/trap.c 1991/1111
## diff -e /n/bootesdump/1991/1110/sys/src/9/power/trap.c /n/bootesdump/1991/1111/sys/src/9/power/trap.c
569,570c
/* This routine must save the values of registers the user is not permitted to write
* from devproc and the restore the saved values before returning
.
## diffname power/trap.c 1991/1114
## diff -e /n/bootesdump/1991/1111/sys/src/9/power/trap.c /n/bootesdump/1991/1114/sys/src/9/power/trap.c
532c
splhi();
if(r1!=FORK && (u->p->procctl || u->nnote)){
.
527d
414a
splx(s);
.
375a
s = spllo();
.
370c
ulong s, sp;
.
173,176c
if(user) {
notify(ur);
if(u->p->fpstate == FPinactive) {
restfpregs(&u->fpsave, u->fpsave.fpstatus);
u->p->fpstate = FPactive;
ur->status |= CU1;
}
.
169,171d
## diffname power/trap.c 1991/1214
## diff -e /n/bootesdump/1991/1114/sys/src/9/power/trap.c /n/bootesdump/1991/1214/sys/src/9/power/trap.c
546c
ulong *sp;
sp = (ulong*)(USTKTOP - ssize);
*--sp = nargs;
((Ureg*)UREGADDR)->usp = (ulong)sp;
((Ureg*)UREGADDR)->pc = entry - 4; /* syscall advances it */
return USTKTOP-BY2WD; /* address of user-level clock */
.
543,544c
long
execregs(ulong entry, ulong ssize, ulong nargs)
.
## diffname power/trap.c 1991/1216
## diff -e /n/bootesdump/1991/1214/sys/src/9/power/trap.c /n/bootesdump/1991/1216/sys/src/9/power/trap.c
466c
qunlock(&u->p->debug);
.
453c
qunlock(&u->p->debug);
.
446c
qunlock(&u->p->debug);
.
436c
qunlock(&u->p->debug);
.
434c
qlock(&u->p->debug);
.
416c
qunlock(&u->p->debug);
.
395c
qunlock(&u->p->debug);
.
384c
qunlock(&u->p->debug);
.
378c
qlock(&u->p->debug);
.
## diffname power/trap.c 1991/1218
## diff -e /n/bootesdump/1991/1216/sys/src/9/power/trap.c /n/bootesdump/1991/1218/sys/src/9/power/trap.c
385c
pexit(n->msg, n->flag!=NDebug);
.
382c
pprint("suicide: %s\n", n->msg);
.
380c
n = &u->note[0];
if(strncmp(n->msg, "sys:", 4) == 0){
l = strlen(n->msg);
if(l > ERRLEN-15) /* " pc=0x12345678\0" */
l = ERRLEN-15;
sprint(n->msg+l, " pc=0x%.8lux", ur->pc);
}
if(n->flag!=NUser && (u->notified || u->notify==0)){
.
374c
if(u->nnote==0)
.
370a
Note *n;
.
369a
int l;
.
155c
sprint(buf, "sys: trap: %s", excname[ecode]);
.
## diffname power/trap.c 1991/1230
## diff -e /n/bootesdump/1991/1218/sys/src/9/power/trap.c /n/bootesdump/1991/1230/sys/src/9/power/trap.c
376c
if(u->nnote == 0)
.
## diffname power/trap.c 1992/0102
## diff -e /n/bootesdump/1991/1230/sys/src/9/power/trap.c /n/bootesdump/1992/0102/sys/src/9/power/trap.c
546a
return ur->r1;
.
545c
u->svr1 = ret;
.
450a
(*urp)->r1 = u->svr1;
.
416c
ur->r1 = (ulong)u->ureg; /* arg 1 is ureg* */
.
155c
sprint(buf, "sys: %s", excname[ecode]);
.
46c
"trap: floating point exception" /* FPEXC */
.
39,44c
"trap: reserved instruction",
"trap: coprocessor unusable",
"trap: arithmetic overflow",
"trap: undefined 13",
"trap: undefined 14",
"trap: undefined 15", /* used as sys call for debugger */
.
29,37c
"trap: external interrupt",
"trap: TLB modification",
"trap: TLB miss (load or fetch)",
"trap: TLB miss (store)",
"trap: address error (load or fetch)",
"trap: address error (store)",
"trap: bus error (fetch)",
"trap: bus error (data load or store)",
"trap: system call",
.
## diffname power/trap.c 1992/0108
## diff -e /n/bootesdump/1992/0102/sys/src/9/power/trap.c /n/bootesdump/1992/0108/sys/src/9/power/trap.c
547,548c
if(notify(ur))
return ur->r1;
.
426a
return 1;
.
377c
return 0;
.
367c
int
.
## diffname power/trap.c 1992/0111
## diff -e /n/bootesdump/1992/0108/sys/src/9/power/trap.c /n/bootesdump/1992/0111/sys/src/9/power/trap.c
8c
#include "../port/error.h"
.
## diffname power/trap.c 1992/0120
## diff -e /n/bootesdump/1992/0111/sys/src/9/power/trap.c /n/bootesdump/1992/0120/sys/src/9/power/trap.c
566a
ulong
userpc(void)
{
return ((Ureg*)UREGADDR)->pc;
}
.
## diffname power/trap.c 1992/0124
## diff -e /n/bootesdump/1992/0120/sys/src/9/power/trap.c /n/bootesdump/1992/0124/sys/src/9/power/trap.c
427c
return sent;
.
398a
sent = 1;
.
395a
sent = 0;
.
370c
int l, sent;
.
## diffname power/trap.c 1992/0319
## diff -e /n/bootesdump/1992/0124/sys/src/9/power/trap.c /n/bootesdump/1992/0319/sys/src/9/power/trap.c
361a
prflush();
}
.
360c
for(i=0; i<sizeof regname/sizeof(char*); i+=2, l+=2){
.
344a
prflush();
delay(250);
}
.
343c
if(KTZERO < v && v < (ulong)&etext){
.
## diffname power/trap.c 1992/0320
## diff -e /n/bootesdump/1992/0319/sys/src/9/power/trap.c /n/bootesdump/1992/0320/sys/src/9/power/trap.c
345,346c
delay(100);
.
## diffname power/trap.c 1992/0321
## diff -e /n/bootesdump/1992/0320/sys/src/9/power/trap.c /n/bootesdump/1992/0321/sys/src/9/power/trap.c
2c
#include "../port/lib.h"
.
## diffname power/trap.c 1992/0325
## diff -e /n/bootesdump/1992/0321/sys/src/9/power/trap.c /n/bootesdump/1992/0325/sys/src/9/power/trap.c
301c
if(0)
print("bogus intr lvl 5 pend %lux on %d\n", npend, m->machno);
USED(npend);
.
## diffname power/trap.c 1992/0407
## diff -e /n/bootesdump/1992/0325/sys/src/9/power/trap.c /n/bootesdump/1992/0407/sys/src/9/power/trap.c
554c
if(r1!=FORK && (u->nnote || p->procctl)){
.
549,550c
p->psstate = 0;
p->insyscall = 0;
.
543c
p->psstate = sysctab[r1];
.
537,540d
529c
postnote(p, 1, msg, NDebug);
.
515c
p->fpstate = FPinit;
.
513c
if(p->fpstate == FPactive) {
.
505c
p->pc = ur->pc; /* BUG */
.
503c
p = u->p;
p->insyscall = 1;
.
500a
Proc *p;
.
## diffname power/trap.c 1992/0409
## diff -e /n/bootesdump/1992/0407/sys/src/9/power/trap.c /n/bootesdump/1992/0409/sys/src/9/power/trap.c
553c
ur->r1 = ret; /* load up for noted() */
.
423a
u->svr1 = ur->r1; /* save away r1 */
.
## diffname power/trap.c 1992/0430
## diff -e /n/bootesdump/1992/0409/sys/src/9/power/trap.c /n/bootesdump/1992/0430/sys/src/9/power/trap.c
553c
if(r1!=RFORK && (p->procctl || u->nnote)){
.
## diffname power/trap.c 1992/0508
## diff -e /n/bootesdump/1992/0430/sys/src/9/power/trap.c /n/bootesdump/1992/0508/sys/src/9/power/trap.c
193a
LEDOFF(LEDclock);
.
192a
LEDON(LEDclock);
.
## diffname power/trap.c 1992/0527
## diff -e /n/bootesdump/1992/0508/sys/src/9/power/trap.c /n/bootesdump/1992/0527/sys/src/9/power/trap.c
177a
LEDOFF(ecode);
.
83a
LEDON(ecode);
.
## diffname power/trap.c 1992/0612
## diff -e /n/bootesdump/1992/0527/sys/src/9/power/trap.c /n/bootesdump/1992/0612/sys/src/9/power/trap.c
602c
if(g && g != novme && g != f)
.
## diffname power/trap.c 1992/0616
## diff -e /n/bootesdump/1992/0612/sys/src/9/power/trap.c /n/bootesdump/1992/0616/sys/src/9/power/trap.c
473,475d
468c
if(!okaddr(nur->pc, 1, 0) || !okaddr(nur->usp, BY2WD, 0)){
.
419,421d
414,415c
if(!okaddr((ulong)u->notify, 1, 0)
|| !okaddr(sp-ERRLEN-3*BY2WD, sizeof(Ureg)+ERRLEN-3*BY2WD, 0)){
pprint("suicide: bad address in notify\n");
.
## diffname power/trap.c 1992/0625
## diff -e /n/bootesdump/1992/0616/sys/src/9/power/trap.c /n/bootesdump/1992/0625/sys/src/9/power/trap.c
542c
ret = (*systab[r1])(u->s.args);
.
539,540c
if(sp<(USTKTOP-BY2PG) || sp>(USTKTOP-sizeof(Sargs)))
validaddr(sp, sizeof(Sargs), 0);
u->s = *((Sargs*)(sp+BY2WD));
.
535,537c
pprint("odd sp in sys call pc %lux sp %lux\n", ur->pc, ur->sp);
postnote(p, 1, "sys: odd stack", NDebug);
error(Ebadarg);
.
533a
.
527,531c
if(r1 >= sizeof systab/sizeof systab[0]) {
pprint("bad sys call number %d pc %lux\n", r1, ur->pc);
postnote(p, 1, "sys: bad sys call", NDebug);
.
500d
## diffname power/trap.c 1992/06271
## diff -e /n/bootesdump/1992/0625/sys/src/9/power/trap.c /n/bootesdump/1992/06271/sys/src/9/power/trap.c
554c
if(u->scallnr!=RFORK && (p->procctl || u->nnote)){
.
551c
if(u->scallnr == NOTED) /* ugly hack */
.
544c
ret = (*systab[u->scallnr])(u->s.args);
.
542c
p->psstate = sysctab[u->scallnr];
.
526,527c
if(u->scallnr >= sizeof systab/sizeof systab[0]) {
pprint("bad sys call number %d pc %lux\n", u->scallnr, ur->pc);
.
521c
u->scallnr = ur->r1;
.
498d
## diffname power/trap.c 1992/0711
## diff -e /n/bootesdump/1992/06271/sys/src/9/power/trap.c /n/bootesdump/1992/0711/sys/src/9/power/trap.c
361d
## diffname power/trap.c 1992/0714
## diff -e /n/bootesdump/1992/0711/sys/src/9/power/trap.c /n/bootesdump/1992/0714/sys/src/9/power/trap.c
399c
if(n->flag == NDebug)
.
## diffname power/trap.c 1992/0802
## diff -e /n/bootesdump/1992/0714/sys/src/9/power/trap.c /n/bootesdump/1992/0802/sys/src/9/power/trap.c
603c
* from devproc and then restore the saved values before returning
.
170a
Return:
.
162c
print("fp: %s FCR31 %lux\n", fpexcname(fcr31), fcr31);
.
154c
sprint(buf, "sys: fp: %s FCR31 %lux", fpexcname(fcr31), fcr31);
.
101,102d
96a
goto Default;
.
95c
fcr31 = clrfpintr();
if(user && fptrap(ur, fcr31))
goto Return;
.
82c
SET(fcr31);
.
78,79c
int user, x;
ulong fcr31;
.
## diffname power/trap.c 1992/0803
## diff -e /n/bootesdump/1992/0802/sys/src/9/power/trap.c /n/bootesdump/1992/0803/sys/src/9/power/trap.c
551c
if(u->scallnr == NOTED) /* ugly hack */
.
548d
544a
poperror();
.
520a
if(p->procctl)
procctl(p);
.
335,337c
if(fcr31 & (1<<17))
return "unimplemented operation";
fcr31 >>= 7; /* trap enable bits */
fcr31 &= (fcr31>>5); /* anded with exceptions */
for(i=0; i<5; i++)
if(fcr31 & (1<<i))
.
331d
322,323c
char*
fpexcname(ulong fcr31)
.
149c
* This isn't good enough; can still deadlock because we may
.
46c
"trap: floating point exception" /* FPEXC */
.
44c
"trap: undefined 15", /* used as sys call for debugger */
.
## diffname power/trap.c 1992/0805
## diff -e /n/bootesdump/1992/0803/sys/src/9/power/trap.c /n/bootesdump/1992/0805/sys/src/9/power/trap.c
576a
u->fpsave.fpstatus = initfp.fpstatus;
.
508c
p->pc = ur->pc;
.
89c
.
86,87c
if(u)
.
## diffname power/trap.c 1992/0806
## diff -e /n/bootesdump/1992/0805/sys/src/9/power/trap.c /n/bootesdump/1992/0806/sys/src/9/power/trap.c
399c
sprint(n->msg+l, " pc=0x%lux", ur->pc);
.
334,340c
s = "unimplemented operation";
else{
fcr31 >>= 7; /* trap enable bits */
fcr31 &= (fcr31>>5); /* anded with exceptions */
for(i=0; i<5; i++)
if(fcr31 & (1<<i))
s = str[i];
}
if(s == 0)
return "no floating point exception";
sprint(buf, "%s fppc=0x%lux", s, fppc);
return buf;
.
332a
fppc = ur->pc;
if(ur->cause & (1<<31)) /* branch delay */
fppc += 4;
s = 0;
.
331a
char *s;
ulong fppc;
.
322c
fpexcname(Ureg *ur, ulong fcr31, char *buf)
.
162c
print("fp: %s\n", fpexcname(ur, fcr31, buf1));
.
154c
sprint(buf, "sys: fp: %s", fpexcname(ur, fcr31, buf1));
.
80c
char buf[2*ERRLEN], buf1[ERRLEN];
.
48c
char *fpexcname(Ureg*, ulong, char*);
.
## diffname power/trap.c 1992/0813
## diff -e /n/bootesdump/1992/0806/sys/src/9/power/trap.c /n/bootesdump/1992/0813/sys/src/9/power/trap.c
166c
exit(1);
.
163a
dumpstack();
.
## diffname power/trap.c 1992/1105
## diff -e /n/bootesdump/1992/0813/sys/src/9/power/trap.c /n/bootesdump/1992/1105/sys/src/9/power/trap.c
383,384c
iprint("%s\t%.8lux\t%s\t%.8lux\n", regname[i], l[0], regname[i+1], l[1]);
/* prflush();/**/
.
380c
iprint("registers for kernel\n");
.
378c
iprint("registers for %s %d\n", u->p->text, u->p->pid);
.
## diffname power/trap.c 1992/1124
## diff -e /n/bootesdump/1992/1105/sys/src/9/power/trap.c /n/bootesdump/1992/1124/sys/src/9/power/trap.c
383,384c
print("%s\t%.8lux\t%s\t%.8lux\n", regname[i], l[0], regname[i+1], l[1]);
prflush();
.
380c
print("registers for kernel\n");
.
378c
print("registers for %s %d\n", u->p->text, u->p->pid);
.
## diffname power/trap.c 1992/1128
## diff -e /n/bootesdump/1992/1124/sys/src/9/power/trap.c /n/bootesdump/1992/1128/sys/src/9/power/trap.c
571c
ur->r1 = ret; /* load up for noted() */
.
452c
return 1;
.
449a
if(!u->notify) {
qunlock(&u->p->debug);
pexit(n->msg, n->flag!=NDebug);
}
u->svstatus = ur->status;
sp = ur->usp;
sp -= sizeof(Ureg);
if(sp&0x3 || !okaddr((ulong)u->notify, 1, 0)
|| !okaddr(sp-ERRLEN-3*BY2WD, sizeof(Ureg)+ERRLEN-3*BY2WD, 0)){
pprint("suicide: bad address or sp in notify\n");
qunlock(&u->p->debug);
pexit("Suicide", 0);
}
u->ureg = (void*)sp;
memmove((Ureg*)sp, ur, sizeof(Ureg));
sp -= ERRLEN;
memmove((char*)sp, u->note[0].msg, ERRLEN);
sp -= 3*BY2WD;
*(ulong*)(sp+2*BY2WD) = sp+3*BY2WD; /* arg 2 is string */
u->svr1 = ur->r1; /* save away r1 */
ur->r1 = (ulong)u->ureg; /* arg 1 is ureg* */
*(ulong*)(sp+0*BY2WD) = 0; /* arg 0 is pc */
ur->usp = sp;
ur->pc = (ulong)u->notify;
u->notified = 1;
u->nnote--;
memmove(&u->lastnote, &u->note[0], sizeof(Note));
memmove(&u->note[0], &u->note[1], u->nnote*sizeof(Note));
.
420,448c
if(u->notified) {
qunlock(&u->p->debug);
splx(s);
return 0;
.
416c
.
412a
.
410a
.
317a
if(cause & (INTR2|INTR4)){
LEDON(LEDclock);
clock(ur);
LEDOFF(LEDclock);
cause &= ~(INTR2|INTR4);
}
.
261,262c
print("ioberr %lux %lux\n", *MPBERR0, *MPBERR1);
print("PC %lux R31 %lux\n", ur->pc, ur->r31);
.
209a
print("PC %lux R31 %lux\n", ur->pc, ur->r31);
.
205a
.
196,201c
.
180a
*LED=~0;
.
179a
*LED=~17;
.
174a
*LED=~16;
.
173a
*LED=~15;
.
172d
169a
*LED=~14;
.
168a
print("kernel %s pc=%lux\n", excname[ecode], ur->pc);
dumpregs(ur);
dumpstack();
if(m->machno == 0)
spllo();
exit(1);
.
159,167c
break;
.
153,157c
sprint(buf, "sys: %s", excname[ecode]);
.
141,151c
if(user) {
.
132,138c
*LED=~13;
/* Fallthrough */
.
126,130c
*LED=~12;
cop = (ur->cause>>28)&3;
if(u && cop == 1) {
if(u->p->fpstate == FPinit) {
restfpregs(&initfp, u->fpsave.fpstatus);
u->p->fpstate = FPactive;
ur->status |= CU1;
break;
}
if(u->p->fpstate == FPinactive) {
restfpregs(&u->fpsave, u->fpsave.fpstatus);
u->p->fpstate = FPactive;
ur->status |= CU1;
break;
}
.
122a
*LED=~11;
.
113,117c
*LED=~10;
.
110a
*LED=~9;
.
105a
*LED=~8;
.
103a
*LED=~7;
.
91,102c
*LED=~4;
if(ur->cause&INTR3) { /* FP trap */
*LED=~5;
if(u == 0 || u->p->fpstate != FPinactive)
panic("fp intr3 no u or not inactive pc=%lux", ur->pc);
fcr31 = clrfpintr();
if(user == 0)
panic("kernel floating point trap pc=%lux", ur->pc);
*LED=~6;
ur->cause &= ~INTR3;
if(!fptrap(ur, fcr31)) {
intr(ur);
spllo();
fpexcep = fpexcname(ur, fcr31, buf1);
sprint(buf, "sys: fp: %s", fpexcep);
postnote(u->p, 1, buf, NDebug);
break;
.
88a
if(u && u->p->fpstate == FPactive) {
savefpregs(&u->fpsave);
u->p->fpstate = FPinactive;
ur->status &= ~CU1;
}
*LED=~3;
.
87a
*LED=~2;
.
80,82c
char buf[2*ERRLEN], buf1[ERRLEN], *fpexcep;
*LED=~1;
.
78c
int user, cop, x;
.
## diffname power/trap.c 1992/1129
## diff -e /n/bootesdump/1992/1128/sys/src/9/power/trap.c /n/bootesdump/1992/1129/sys/src/9/power/trap.c
589a
.
552a
.
548a
if((ur->status&CU1) == 0)
panic("syscall: FPactive but no CU1");
.
510d
504c
pexit("Suicide", 0);
.
499c
switch(arg0) {
.
494c
pexit("Suicide", 0);
.
491c
if(!u->notified) {
.
487d
485c
if(nur->status!=u->svstatus) {
.
472c
splhi();
.
454a
.
449,450c
if(sp&0x3 || !okaddr((ulong)u->notify, BY2WD, 0)
|| !okaddr(sp-ERRLEN-3*BY2WD, sizeof(Ureg)+ERRLEN-3*BY2WD, 1)) {
.
446,447c
sp = ur->usp - sizeof(Ureg);
.
437c
splhi();
.
427c
if(n->flag != NUser && (u->notified || u->notify==0)) {
.
419c
if(strncmp(n->msg, "sys:", 4) == 0) {
.
415c
spllo();
.
406,407c
int l;
ulong sp;
.
400,402d
392a
.
380a
}
.
373,379c
if(u == 0)
return;
for(l=(ulong)&l; l<USERADDR+BY2PG; l+=4){
v = *(ulong*)l;
if(KTZERO < v && v < (ulong)&etext){
print("%lux=%lux\n", l, v);
delay(100);
.
362a
.
359c
s = fpcause[i];
.
337,343d
323c
if(cause & (INTR2|INTR4)) {
.
187,188c
splhi();
if(!user)
return;
notify(ur);
if(u->p->fpstate == FPinactive) {
restfpregs(&u->fpsave, u->fpsave.fpstatus&~FPEXPMASK);
u->p->fpstate = FPactive;
ur->status |= CU1;
}
.
185d
175,183c
if(fpchk) {
fcr31 = u->fpsave.fpstatus;
if((fcr31>>12) & ((fcr31>>7)|0x20) & 0x3f) {
spllo();
fpexcep = fpexcname(ur, fcr31, buf1);
sprint(buf, "sys: fp: %s", fpexcep);
postnote(u->p, 1, buf, NDebug);
.
173d
156d
154d
149,152c
if(u->p->fpstate == FPinactive)
.
144,146c
u->p->fpstate = FPinactive;
fcr31 = u->fpsave.fpstatus;
u->fpsave = initfp;
u->fpsave.fpstatus = fcr31;
.
142c
if(user && u && cop == 1) {
.
140d
136d
130c
.
127d
121d
110,118d
100,108c
clrfpintr();
.
98d
94d
92a
savefpregs(&u->fpsave);
fptrap(ur);
fpchk = 1;
.
90c
if((ur->status&CU1) == 0) /* Paranoid */
panic("FPactive but no CU1");
.
88a
fpchk = 0;
.
87d
85c
if(user)
.
81,83c
ecode = (ur->cause>>2)&0xf;
.
79a
int user, cop, x, fpchk;
.
78d
72,73d
48a
#define FPEXPMASK (0x3f<<12) /* Floating exception bits in fcr31 */
.
47a
char *fpcause[] =
{
"inexact operation",
"underflow",
"overflow",
"division by zero",
"invalid operation",
};
.
45,46d
18,26d
14d
10,12d
## diffname power/trap.c 1992/1130
## diff -e /n/bootesdump/1992/1129/sys/src/9/power/trap.c /n/bootesdump/1992/1130/sys/src/9/power/trap.c
529a
sp = ur->sp;
.
528d
508,513c
ur->cause = 15<<2; /* for debugging: system call is undef 15; */
.
453c
if(nur->status != u->svstatus) {
.
173a
uchar pend, npend, xxx;
.
171a
int i, any;
.
168,170d
108a
spllo();
.
106d
## diffname power/trap.c 1992/1201
## diff -e /n/bootesdump/1992/1130/sys/src/9/power/trap.c /n/bootesdump/1992/1201/sys/src/9/power/trap.c
285d
## diffname power/trap.c 1992/1202
## diff -e /n/bootesdump/1992/1201/sys/src/9/power/trap.c /n/bootesdump/1992/1202/sys/src/9/power/trap.c
74a
m->ur = ur;
.
## diffname power/trap.c 1992/1208
## diff -e /n/bootesdump/1992/1202/sys/src/9/power/trap.c /n/bootesdump/1992/1208/sys/src/9/power/trap.c
418c
|| !okaddr(sp-ERRLEN-3*BY2WD, sizeof(Ureg)+ERRLEN+3*BY2WD, 1)) {
.
263c
scsiintr(0);
.
261c
scsiintr(1);
.
## diffname power/trap.c 1992/1209
## diff -e /n/bootesdump/1992/1208/sys/src/9/power/trap.c /n/bootesdump/1992/1209/sys/src/9/power/trap.c
295c
if(any == 0)
cause &= ~INTR5;
.
284,291d
185c
while(cause & INTR5) {
.
## diffname power/trap.c 1992/1217
## diff -e /n/bootesdump/1992/1209/sys/src/9/power/trap.c /n/bootesdump/1992/1217/sys/src/9/power/trap.c
230d
212d
175c
uchar pend, xxx;
.
## diffname power/trap.c 1993/0106
## diff -e /n/bootesdump/1992/1217/sys/src/9/power/trap.c /n/bootesdump/1993/0106/sys/src/9/power/trap.c
118c
if(user && cop == 1) {
.
83,90c
if(user) {
u->dbgreg = ur;
if(u->p->fpstate == FPactive) {
if((ur->status&CU1) == 0) /* Paranoid */
panic("FPactive but no CU1");
u->p->fpstate = FPinactive;
ur->status &= ~CU1;
savefpregs(&u->fpsave);
fptrap(ur);
fpchk = 1;
}
.
79,81d
## diffname power/trap.c 1993/0107
## diff -e /n/bootesdump/1993/0106/sys/src/9/power/trap.c /n/bootesdump/1993/0107/sys/src/9/power/trap.c
162c
restfpregs(&u->fpsave, u->fpsave.fpstatus);
.
## diffname power/trap.c 1993/0211
## diff -e /n/bootesdump/1993/0107/sys/src/9/power/trap.c /n/bootesdump/1993/0211/sys/src/9/power/trap.c
292d
290d
287a
if(limit == 0) {
print("intr: unable to identify and clear level5\n");
cause &= ~INTR5;
}
.
185c
for(limit = 50; (cause&INTR5) && limit; limit--) {
.
172c
int i, any, limit;
.
## diffname power/trap.c 1993/0212
## diff -e /n/bootesdump/1993/0211/sys/src/9/power/trap.c /n/bootesdump/1993/0212/sys/src/9/power/trap.c
290a
LEDOFF(LED5);
.
288a
LEDON(LED5);
.
## diffname power/trap.c 1993/0225
## diff -e /n/bootesdump/1993/0212/sys/src/9/power/trap.c /n/bootesdump/1993/0225/sys/src/9/power/trap.c
426c
ur->r1 = (ulong)u->ureg; /* arg 1 (R1) is ureg* */
*(ulong*)(sp+1*BY2WD) = (ulong)u->ureg; /* arg 1 0(FP) is ureg* */
.
## diffname power/trap.c 1993/0501
## diff -e /n/bootesdump/1993/0225/sys/src/9/power/trap.c /n/fornaxdump/1993/0501/sys/src/brazil/power/trap.c
605,606c
/* This routine must save the values of registers the user is not permitted to
* write from devproc and then restore the saved values before returning
.
579c
Ureg *ur;
ur = (Ureg*)up->dbgreg;
return ur->pc;
.
570,572c
ur = (Ureg*)up->dbgreg;
ur->usp = (ulong)sp;
ur->pc = entry - 4; /* syscall advances it */
up->fpsave.fpstatus = initfp.fpstatus;
.
565a
Ureg *ur;
.
562a
void
forkchild(Proc *p, Ureg *ur)
{
Ureg *cur;
p->sched.sp = (ulong)p->kstack+KSTACK-(sizeof(Ureg)+2*BY2WD);
p->sched.pc = (ulong)forkret;
cur = (Ureg*)(p->sched.sp+2*BY2WD);
memmove(cur, ur, sizeof(Ureg));
cur->pc += 4;
/* Things from bottom of syscall we never got to execute */
p->psstate = 0;
p->insyscall = 0;
}
static
void
linkproc(void)
{
spllo();
(*up->kpfun)(up->kparg);
}
void
kprocchild(Proc *p, void (*func)(void*), void *arg)
{
p->sched.pc = (ulong)linkproc;
p->sched.sp = (ulong)p->kstack+KSTACK;
p->kpfun = func;
p->kparg = arg;
}
.
554c
if(up->scallnr!=RFORK && (up->procctl || up->nnote)){
.
547,550c
up->nerrlab = 0;
up->psstate = 0;
up->insyscall = 0;
if(up->scallnr == NOTED) /* ugly hack */
.
543c
ret = (*systab[up->scallnr])(up->s.args);
.
540,541c
up->s = *((Sargs*)(sp+BY2WD));
up->psstate = sysctab[up->scallnr];
.
537c
if(sp < (USTKTOP-BY2PG) || sp > (USTKTOP-sizeof(Sargs)))
.
533c
postnote(up, 1, "sys: odd stack", NDebug);
.
525,527c
if(up->scallnr >= sizeof systab/sizeof systab[0]) {
pprint("bad sys call number %d pc %lux\n",
up->scallnr, ur->pc);
postnote(up, 1, "sys: bad sys call", NDebug);
.
520,521c
up->scallnr = ur->r1;
up->nerrlab = 0;
.
517,518c
if(up->procctl)
procctl(up);
.
510,511c
up->fpsave.fpstatus = fcr31();
up->fpstate = FPinit;
.
507c
if(up->fpstate == FPactive) {
.
503,505c
up->pc = ur->pc;
up->dbgreg = aur;
ur->cause = 15<<2; /* for debugging: system call is undef 15; */
.
500,501c
up->insyscall = 1;
.
497d
481,484c
if(up->lastnote.flag == NDebug)
pprint("suicide: %s\n", up->lastnote.msg);
qunlock(&up->debug);
pexit(up->lastnote.msg, up->lastnote.flag != NDebug);
.
477c
up->lastnote.flag = NDebug;
.
471c
qunlock(&up->debug);
.
467c
qunlock(&up->debug);
.
460,462c
up->notified = 0;
memmove(*urp, up->ureg, sizeof(Ureg));
(*urp)->r1 = up->svr1;
.
454,456c
qlock(&up->debug);
if(!up->notified) {
qunlock(&up->debug);
.
449,450c
nur = up->ureg;
if(nur->status != up->svstatus) {
.
436c
qunlock(&up->debug);
.
430,434c
ur->pc = (ulong)up->notify;
up->notified = 1;
up->nnote--;
memmove(&up->lastnote, &up->note[0], sizeof(Note));
memmove(&up->note[0], &up->note[1], up->nnote*sizeof(Note));
.
425,427c
up->svr1 = ur->r1; /* save away r1 */
ur->r1 = (ulong)up->ureg; /* arg 1 is ureg* */
.
422c
memmove((char*)sp, up->note[0].msg, ERRLEN);
.
419c
up->ureg = (void*)sp;
.
415c
qunlock(&up->debug);
.
412c
if(sp&0x3 || !okaddr((ulong)up->notify, BY2WD, 0)
.
409c
up->svstatus = ur->status;
.
405,406c
if(!up->notify) {
qunlock(&up->debug);
.
399,400c
if(up->notified) {
qunlock(&up->debug);
.
395c
qunlock(&up->debug);
.
391c
if(n->flag != NUser && (up->notified || up->notify==0)) {
.
380,382c
qlock(&up->debug);
up->notepending = 0;
n = &up->note[0];
.
374,376c
if(up->procctl)
procctl(up);
if(up->nnote == 0)
.
361,362c
for(i=0; i<sizeof regname/sizeof(char*); i+=2) {
print("%s\t%.8lux\t%s\t%.8lux\n",
regname[i], l[0], regname[i+1], l[1]);
l += 2;
.
355,356c
if(up)
print("registers for %s %d\n", up->text, up->pid);
.
342c
if(KTZERO < v && v < (ulong)&etext) {
.
340c
top = (ulong)up->kstack + KSTACK;
for(l=(ulong)&l; l < top; l += BY2WD) {
.
337c
if(up == 0)
.
334c
ulong l, v, top;
.
301c
panic("cause %lux %lux\n", up, cause);
.
296a
LEDOFF(LEDclock);
.
295a
LEDON(LEDclock);
.
288,293d
185c
while(cause & INTR5) {
.
172c
int i, any;
.
161,163c
if(up->fpstate == FPinactive) {
restfpregs(&up->fpsave, up->fpsave.fpstatus);
up->fpstate = FPactive;
.
152c
postnote(up, 1, buf, NDebug);
.
147c
fcr31 = up->fpsave.fpstatus;
.
135c
postnote(up, 1, buf, NDebug);
.
126c
if(up->fpstate == FPinactive)
.
119,123c
if(up->fpstate == FPinit) {
up->fpstate = FPinactive;
fcr31 = up->fpsave.fpstatus;
up->fpsave = initfp;
up->fpsave.fpstatus = fcr31;
.
113c
up->insyscall = x;
.
108,109c
x = up->insyscall;
up->insyscall = 1;
.
105,106c
if(up == 0)
panic("kfault pc %lux addr %lux", ur->pc, ur->badvaddr);
.
92d
87c
savefpregs(&up->fpsave);
.
85c
up->fpstate = FPinactive;
.
81,82c
up->dbgreg = ur;
if(up->fpstate == FPactive) {
.
78a
ecode = (ur->cause>>2)&0xf;
.
75,77d
72c
int user, cop, x, fpchk, ecode;
.
70d
45,64c
char*
regname[]=
{
"STATUS", "PC", "SP", "CAUSE",
"BADADDR", "TLBVIRT", "HI", "LO",
"R31", "R30", "R28", "R27",
"R26", "R25", "R24", "R23",
"R22", "R21", "R20", "R19",
"R18", "R17", "R16", "R15",
"R14", "R13", "R12", "R11",
"R10", "R9", "R8", "R7",
"R6", "R5", "R4", "R3",
"R2", "R1"
.
43c
#define FPEXPMASK (0x3f<<12) /* Floating exception bits in fcr31 */
.
31c
"trap: undefined 15", /* used as sys call for debugger */
.
## diffname power/trap.c 1993/0806
## diff -e /n/fornaxdump/1993/0501/sys/src/brazil/power/trap.c /n/fornaxdump/1993/0806/sys/src/brazil/power/trap.c
251a
*/
.
247a
/*
.
## diffname power/trap.c 1993/0818
## diff -e /n/fornaxdump/1993/0806/sys/src/brazil/power/trap.c /n/fornaxdump/1993/0818/sys/src/brazil/power/trap.c
82a
.
## diffname power/trap.c 1993/1008
## diff -e /n/fornaxdump/1993/0818/sys/src/brazil/power/trap.c /n/fornaxdump/1993/1008/sys/src/brazil/power/trap.c
418a
*(ulong*)(sp+1*BY2WD) = (ulong)up->ureg;/* arg 1 0(FP) is ureg* (for Alef) */
.
## diffname power/trap.c 1993/1022
## diff -e /n/fornaxdump/1993/1008/sys/src/brazil/power/trap.c /n/fornaxdump/1993/1022/sys/src/brazil/power/trap.c
649a
/* Give enough context in the ureg to produce a kernel stack for
* a sleeping process
*/
void
setkernur(Ureg *xp, Proc *p)
{
xp->pc = p->sched.pc;
xp->sp = p->sched.sp;
xp->r31 = (ulong)sched;
}
.
## diffname power/trap.c 1993/1201
## diff -e /n/fornaxdump/1993/1022/sys/src/brazil/power/trap.c /n/fornaxdump/1993/1201/sys/src/brazil/power/trap.c
520a
up->syscall[up->scallnr]++;
.
## diffname power/trap.c 1994/0407
## diff -e /n/fornaxdump/1993/1201/sys/src/brazil/power/trap.c /n/fornaxdump/1994/0407/sys/src/brazil/power/trap.c
515c
if(up->scallnr >= nsyscall) {
.
## diffname power/trap.c 1994/0513
## diff -e /n/fornaxdump/1994/0407/sys/src/brazil/power/trap.c /n/fornaxdump/1994/0513/sys/src/brazil/power/trap.c
452a
nur = up->ureg;
if(nur->status != up->svstatus) {
qunlock(&up->debug);
pprint("bad noted ureg status %lux\n", nur->status);
pexit("Suicide", 0);
}
.
441,445d
## diffname power/trap.c 1995/0108
## diff -e /n/fornaxdump/1994/0513/sys/src/brazil/power/trap.c /n/fornaxdump/1995/0108/sys/src/brazil/power/trap.c
524d
## diffname power/trap.c 1995/02021
## diff -e /n/fornaxdump/1995/0108/sys/src/brazil/power/trap.c /n/fornaxdump/1995/02021/sys/src/brazil/power/trap.c
545c
noted(ur, &aur, *(ulong*)(sp+BY2WD)); /* doesn't return */
.
469a
case NSAVE:
if(!okaddr(nur->pc, BY2WD, 0) || !okaddr(nur->usp, BY2WD, 0)){
pprint("suicide: trap in noted\n");
qunlock(&up->debug);
pexit("Suicide", 0);
}
qunlock(&up->debug);
sp = oureg-4*BY2WD-ERRLEN;
splhi();
(*urp)->sp = sp;
((ulong*)sp)[1] = oureg; /* arg 1 0(FP) is ureg* */
((ulong*)sp)[0] = 0; /* arg 0 is pc */
(*urp)->r1 = oureg; /* arg 1 is ureg* */
rfnote(urp);
break;
.
459a
case NRSTR:
.
457d
451a
pexit("Suicide", 0);
}
if(!validstatus(kur->status, nur->status)) {
qunlock(&up->debug);
.
450c
oureg = (ulong)nur;
if((oureg & (BY2WD-1))
|| !okaddr((ulong)oureg-BY2WD, BY2WD+sizeof(Ureg), 0)){
pprint("bad ureg in noted or call to noted() when not notified\n");
.
442c
if(arg0!=NRSTR && !up->notified) {
.
439a
ulong oureg, sp;
.
437c
noted(Ureg *kur, Ureg **urp, ulong arg0)
.
433a
* Check that status is OK to return from note.
*/
int
validstatus(ulong kstatus, ulong ustatus)
{
if((kstatus & INTMASK) != (ustatus & INTMASK))
return 0;
if((ustatus&(KUO|IEO|KUP|IEP|KUC|IE)) != (KUP|IEP))
return 0;
if(ustatus & (0xFFFF0000&~(CU1|CM|PE))) /* no CU3, CU2, CU0, BEV, TS, PZ, SWC, ISC */
return 0;
return 1;
}
/*
.
417d
413c
*(Ureg**)(sp-BY2WD) = up->ureg; /* word under Ureg is old up->ureg */
up->ureg = (void*)sp;
sp -= BY2WD+ERRLEN;
.
411d
404,405c
if(sp&(BY2WD-1) || !okaddr((ulong)up->notify, BY2WD, 0)
|| !okaddr(sp-ERRLEN-4*BY2WD, sizeof(Ureg)+ERRLEN+4*BY2WD, 1)) {
.
401d
11c
void noted(Ureg*, Ureg**, ulong);
.
## diffname power/trap.c 1995/1024
## diff -e /n/fornaxdump/1995/02021/sys/src/brazil/power/trap.c /n/fornaxdump/1995/1024/sys/src/brazil/power/trap.c
703a
ulong
dbgpc(Proc *p)
{
Ureg *ur;
ur = p->dbgreg;
if(ur == 0)
return 0;
return ur->pc;
}
.
## diffname power/trap.c 1997/0327 # deleted
## diff -e /n/fornaxdump/1995/1024/sys/src/brazil/power/trap.c /n/emeliedump/1997/0327/sys/src/brazil/power/trap.c
1,715d
|