M gnot/clock.c => gnot/clock.c +6 -2
@@ 35,8 35,12 @@ clock(Ureg *ur)
kbdclock();
mouseclock();
if((ur->sr&SPL(7)) == 0 && p && p->state==Running){
- if(anyready())
- sched();
+ if(anyready()){
+ if(p->hasspin)
+ p->hasspin = 0;
+ else
+ sched();
+ }
if(u->nnote && (ur->sr&SUPER)==0)
notify(ur);
}
M gnot/devduart.c => gnot/devduart.c +1 -1
@@ 747,8 747,8 @@ duartoput(Queue *q, Block *bp)
(*cq->puts)(cq, bp->rptr, n);
bp->rptr += n;
}
- freeb(bp);
poperror();
+ freeb(bp);
}
/*
M gnot/lock.c => gnot/lock.c +8 -0
@@ 28,12 28,16 @@ lock(Lock *l)
if(ll->key >= 0){
ll->key |= 0x80;
ll->pc = ((ulong*)&l)[PCOFF];
+ if(u && u->p)
+ u->p->hasspin = 1;
return;
}
for(i=0; i<10000000; i++)
if(ll->key >= 0){
ll->key |= 0x80;
ll->pc = ((ulong*)&l)[PCOFF];
+ if(u && u->p)
+ u->p->hasspin = 1;
return;
}
ll->key = 0;
@@ 47,6 51,8 @@ canlock(Lock *l)
if(ll->key >= 0){
ll->key |= 0x80;
ll->pc = ((ulong*)&l)[PCOFF];
+ if(u && u->p)
+ u->p->hasspin = 1;
return 1;
}
return 0;
@@ 57,6 63,8 @@ unlock(Lock *l)
{
l->pc = 0;
l->key = 0;
+ if(u && u->p)
+ u->p->hasspin = 0;
}
void
M gnot/trap.c => gnot/trap.c +10 -3
@@ 250,6 250,7 @@ Syscall *systab[]={
long
syscall(Ureg *aur)
{
+ int i;
long ret;
ulong sp;
ulong r0;
@@ 292,11 293,17 @@ syscall(Ureg *aur)
msg = "sys: odd stack";
goto Bad;
}
- if(sp<(USTKTOP-BY2PG) || sp>(USTKTOP-5*BY2WD))
- validaddr(sp, 5*BY2WD, 0);
+ if(sp<(USTKTOP-BY2PG) || sp>(USTKTOP-(1+MAXSYSARG)*BY2WD))
+ validaddr(sp, (1+MAXSYSARG)*BY2WD, 0);
ret = (*systab[r0])((ulong*)(sp+BY2WD));
+ poperror();
+ }
+ if(u->nerrlab){
+ print("unbalanced error stack: %d extra\n", u->nerrlab);
+ for(i = 0; i < NERR; i++)
+ print("sp=%lux pc=%lux\n", u->errlab[i].sp, u->errlab[i].pc);
+ panic("bad rob");
}
- u->nerrlab = 0;
u->p->insyscall = 0;
if(r0 == NOTED) /* ugly hack */
noted(aur); /* doesn't return */
M pc/dat.h => pc/dat.h +0 -20
@@ 27,26 27,6 @@ struct Label
{
ulong sp;
ulong pc;
- ushort sr;
-};
-
-/*
- * floating point registers
- */
-enum
-{
- FPinit,
- FPactive,
- FPdirty,
-};
-
-struct FPsave
-{
- uchar type;
- uchar size;
- short reserved;
- char junk[212]; /* 68881: sizes 24, 180; 68882: 56, 212 */
- char reg[3*4+8*12];
};
struct Conf
A pc/fns.h => pc/fns.h +2 -0
@@ 0,0 1,2 @@
+void restregs(void);
+void saveregs(void);
A pc/l.s => pc/l.s +292 -0
@@ 0,0 1,292 @@
+
+/*
+ * Boot first processor
+ */
+TEXT start(SB),$0
+
+ /* clear bss */
+ CALL main(SB)
+ /* never returns */
+
+
+TEXT traptab(SB),$0
+
+ CALL noerrcode(SB) /* divide */
+ CALL noerrcode(SB) /* debug */
+ CALL noerrcode(SB) /* non maskable interrupt */
+ CALL noerrcode(SB) /* breakpoint */
+ CALL noerrcode(SB) /* overflow */
+ CALL noerrcode(SB) /* bounds check */
+ CALL noerrcode(SB) /* invalid opcode */
+ CALL noerrcode(SB) /* coprocessor not available */
+ CALL errcode(SB) /* double fault */
+ CALL noerrcode(SB) /* coprocessor segment overrun */
+ CALL errcode(SB) /* invalid tss */
+ CALL errcode(SB) /* segment not present */
+ CALL errcode(SB) /* stack exception */
+ CALL errcode(SB) /* general protection exception */
+ CALL errcode(SB) /* page fault */
+ CALL noerrcode(SB) /* coprocessor error */
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+ CALL noerrcode(SB)
+
+TEXT noerrcode(SB),$0
+ PUSH EAX
+ /* drop through */
+TEXT errcode(SB),$0
+ PUSH EAX
+ PUSH EBX
+ PUSH ECX
+ PUSH EDX
+ PUSH EBP
+ PUSH ESI
+ PUSH EDI
+ CALL trap(SB)
+ POP EDI
+ POP ESI
+ POP EBP
+ POP EDX
+ POP ECX
+ POP EBX
+ POP EAX
+ ADD $8,ESP /* jump over error code + return addr */
+ IRET
M pc/mem.h => pc/mem.h +1 -1
@@ 37,7 37,7 @@ struct Segdesc
/*
* segment descriptor initializers
*/
-#define DATASEG(p) { SEGG|(0xF<<16)|SEGP|SEGPL(p)|SEGDATA|SEGW, 0xFFFF }
+#define DATASEG(p) { SEGG|SEGB|(0xF<<16)|SEGP|SEGPL(p)|SEGDATA|SEGW, 0xFFFF }
#define EXECSEG(p) { SEGG|SEGD|(0xF<<16)|SEGP|SEGPL(p)|SEGEXEC|SEGR, 0xFFFF }
/*
M pc/trap.c => pc/trap.c +20 -1
@@ 43,7 43,7 @@ enum {
};
/*
- * exception/trap gates
+ * trap/interrupt gates
*/
Segdesc ilt[256] =
{
@@ 63,3 63,22 @@ Segdesc ilt[256] =
[Efault] TRAPGATE(KESEL, efault, 3),
[Eco] TRAPGATE(KESEL, eco, 3),
};
+
+/*
+ * trap table
+ */
+uchar traptab[4096];
+
+/*
+ * set up some basic vectored interrupts
+ */
+trapinit(
+
+/*
+ * j-random uncaught trap or interrupt
+ */
+void
+trap(void)
+{
+ panic("unknown trap");
+}
M port/devbit.c => port/devbit.c +1 -0
@@ 1017,6 1017,7 @@ bitwrite(Chan *c, void *va, long n, ulong offset)
break;
}
+ poperror();
if(isoff)
cursoron(1);
return n;
M port/devcons.c => port/devcons.c +1 -0
@@ 497,6 497,7 @@ consread(Chan *c, void *buf, long n, ulong offset)
*cbuf++ = ch;
--n;
}
+ poperror();
qunlock(&kbdq);
return i;
M port/devproc.c => port/devproc.c +3 -0
@@ 328,6 328,7 @@ procread(Chan *c, void *va, long n, ulong offset)
n = ERRLEN;
}
kunmap(k);
+ poperror();
unlock(&p->debug);
return n;
@@ 387,6 388,7 @@ procwrite(Chan *c, void *va, long n, ulong offset)
goto Died;
}
pgrpnote(pg, va, n, NUser);
+ poperror();
qunlock(&pg->debug);
return n;
}
@@ 429,6 431,7 @@ procwrite(Chan *c, void *va, long n, ulong offset)
pprint("unknown qid in procwrite\n");
error(Egreg);
}
+ poperror();
unlock(&p->debug);
return n;
}
M port/portdat.h => port/portdat.h +2 -0
@@ 400,6 400,7 @@ struct Proc
int kp; /* true if a kernel process */
Proc *palarm; /* Next alarm time */
ulong alarm; /* Time of call */
+ int hasspin;
/*
* machine specific MMU goo
@@ 491,6 492,7 @@ enum {
Streambhi= 32, /* block count high water mark */
};
+#define MAXSYSARG 6 /* for mount(fd, mpt, flag, arg, srv, authfd) */
#define PRINTSIZE 256
#define NUMSIZE 12 /* size of formatted number */
M port/qlock.c => port/qlock.c +4 -1
@@ 10,8 10,11 @@ qlock(QLock *q)
{
Proc *p;
- if(canlock(&q->use))
+ if(canlock(&q->use)){
+ if(u)
+ u->p->hasspin = 0;
return;
+ }
lock(&q->queue);
if(canlock(&q->use)){
unlock(&q->queue);
M port/stream.c => port/stream.c +1 -0
@@ 419,6 419,7 @@ popq(Stream *s)
(*q->info->close)(RD(q));
s->procq->next = q->next;
RD(q->next)->next = RD(s->procq);
+ poperror();
qunlock(s);
freeq(q);
}
M port/sysfile.c => port/sysfile.c +7 -2
@@ 243,6 243,7 @@ sysread(ulong *arg)
else
n = (*devtab[c->type].read)(c, (void*)arg[1], n, c->offset);
c->offset += n;
+ poperror();
qunlock(&c->rdl);
return n;
}
@@ 265,6 266,7 @@ syswrite(ulong *arg)
error(Eisdir);
n = (*devtab[c->type].write)(c, (void*)arg[1], arg[2], c->offset);
c->offset += n;
+ poperror();
qunlock(&c->wrl);
return n;
}
@@ 305,9 307,9 @@ sysseek(ulong *arg)
break;
}
off = c->offset;
+ poperror();
qunlock(&c->rdl);
qunlock(&c->wrl);
- poperror();
return off;
}
@@ 412,8 414,10 @@ bindmount(ulong *arg, int ismount)
if(flag && !(c0->qid.path&CHDIR))
error(Ebadmount);
ret = mount(c0, c1, flag);
- close(c0);
+ poperror();
close(c1);
+ poperror();
+ close(c0);
if(ismount){
close(bogus.chan);
fdclose(arg[0]);
@@ 465,6 469,7 @@ sysremove(ulong *arg)
* so fake it up. rootclose() is known to be a nop.
*/
c->type = 0;
+ poperror();
close(c);
return 0;
}
M port/sysproc.c => port/sysproc.c +4 -1
@@ 204,8 204,8 @@ sysexec(ulong *arg)
arg[1] += BY2WD;
file = progarg[0];
progarg[0] = elem;
- close(tc);
poperror();
+ close(tc);
goto Header;
Binary:
@@ 335,6 335,7 @@ sysexec(ulong *arg)
s->maxva = b;
s->mod = 0;
+ poperror();
close(tc);
p->seg[BSEG].endseg = bssend;
@@ 435,6 436,7 @@ sysexits(ulong *arg)
validaddr((ulong)status, 1, 0);
vmemchr(status, 0, ERRLEN);
}
+ poperror();
}
pexit(status, 1);
}
@@ 496,6 498,7 @@ sysforkpgrp(ulong *arg)
memset(u->note, 0, sizeof(u->note));
}
+ poperror();
closepgrp(u->p->pgrp);
u->p->pgrp = pg;
return pg->pgrpid;
M power/clock.c => power/clock.c +6 -2
@@ 109,8 109,12 @@ clock(Ureg *ur)
}
checkalarms();
if(u && (ur->status&IEP) && u->p && u->p->state==Running){
- if(anyready())
- sched();
+ if(anyready()){
+ if(u->p->hasspin)
+ u->p->hasspin = 0; /* just in case */
+ else
+ sched();
+ }
if(u->nnote && (ur->status&KUP))
notify(ur);
}
M power/lock.c => power/lock.c +8 -0
@@ 135,11 135,15 @@ lock(Lock *ll)
*/
if((*sbsem&1) == 0){
l->pc = ((ulong*)&ll)[PCOFF];
+ if(u && u->p)
+ u->p->hasspin = 1;
return;
}
for(i=0; i<10000000; i++)
if((*sbsem&1) == 0){
l->pc = ((ulong*)&ll)[PCOFF];
+ if(u && u->p)
+ u->p->hasspin = 1;
return;
}
*sbsem = 0;
@@ 168,6 172,8 @@ canlock(Lock *l)
}
if(*sbsem & 1)
return 0;
+ if(u && u->p)
+ u->p->hasspin = 1;
return 1;
}
@@ 176,6 182,8 @@ unlock(Lock *l)
{
l->pc = 0;
*l->sbsem = 0;
+ if(u && u->p)
+ u->p->hasspin = 0;
}
void
M ss/trap.c => ss/trap.c +10 -3
@@ 309,6 309,7 @@ Syscall *systab[]={
long
syscall(Ureg *aur)
{
+ int i;
long ret;
ulong sp;
ulong r7;
@@ 349,13 350,19 @@ syscall(Ureg *aur)
msg = "sys: odd stack";
goto Bad;
}
- if(sp<(USTKTOP-BY2PG) || sp>(USTKTOP-5*BY2WD))
- validaddr(sp, 5*BY2WD, 0);
+ if(sp<(USTKTOP-BY2PG) || sp>(USTKTOP-(2+MAXSYSARG)*BY2WD))
+ validaddr(sp, ((2+MAXSYSARG)*BY2WD), 0);
ret = (*systab[r7])((ulong*)(sp+2*BY2WD));
+ poperror();
}
ur->pc += 4;
ur->npc = ur->pc+4;
- u->nerrlab = 0;
+ if(u->nerrlab){
+ print("unbalanced error stack: %d extra\n", u->nerrlab);
+ for(i = 0; i < NERR; i++)
+ print("sp=%lux pc=%lux\n", u->errlab[i].sp, u->errlab[i].pc);
+ panic("bad rob");
+ }
u->p->insyscall = 0;
if(r7 == NOTED) /* ugly hack */
noted(&aur); /* doesn't return */