M pc/devfloppy.c => pc/devfloppy.c +1 -1
@@ 13,7 13,7 @@ typedef struct Drive Drive;
typedef struct Controller Controller;
typedef struct Type Type;
-#define DPRINT if(floppydebug)kprint
+#define DPRINT if(floppydebug)print
int floppydebug;
/* bits in the registers */
M pc/fns.h => pc/fns.h +3 -1
@@ 97,7 97,7 @@ int xchgw(ushort*, int);
#define waserror() (up->nerrlab++, setlabel(&up->errlab[up->nerrlab-1]))
#define kmapperm(x) kmap(x)
-#define getcallerpc(x) (*(ulong*)(x))
+#define getcallerpc(x) (((ulong*)(&x))[-1])
#define KADDR(a) ((void*)((ulong)(a)|KZERO))
#define PADDR(a) ((ulong)(a)&~KZERO)
@@ 123,3 123,5 @@ Block* iallocb(int);
void* ifroute(ulong);
ulong ifunroute(ulong);
void parseip(char*, char*);
+
+#define dcflush(a, b)
M pc/kbd.c => pc/kbd.c +1 -1
@@ 188,7 188,7 @@ mousecmd(int cmd)
c = inb(Data);
} while(c == 0xFE || c == 0);
if(c != 0xFA){
- kprint("mouse returns %2.2ux to the %2.2ux command\n", c, cmd);
+ print("mouse returns %2.2ux to the %2.2ux command\n", c, cmd);
return -1;
}
return 0;
M pc/mem.h => pc/mem.h +1 -0
@@ 119,5 119,6 @@
* flag register bits that we care about
*/
#define IFLAG 0x200
+#define IE 0x200
#define getpgcolor(a) 0
M pc/trap.c => pc/trap.c +5 -6
@@ 466,9 466,9 @@ syscall(Ureg *ur, void *arg)
*/
ur->ax = ret;
- splhi();
if(up->scallnr == NOTED)
noted(ur, *(ulong*)(sp+BY2WD));
+ splhi();
if(up->scallnr!=RFORK && (up->procctl || up->nnote))
notify(ur);
@@ 556,7 556,7 @@ noted(Ureg *ur, ulong arg0)
if(!up->notified) {
qunlock(&up->debug);
pprint("call to noted() when not notified\n");
- return;
+ pexit("Suicide", 0);
}
up->notified = 0;
@@ 571,15 571,15 @@ noted(Ureg *ur, ulong arg0)
nur->flags = (up->svflags&0xffffff00) | (nur->flags&0xff);
memmove(ur, nur, sizeof(Ureg));
+ qunlock(&up->debug);
+
switch(arg0){
case NCONT:
if(!okaddr(nur->pc, 1, 0) || !okaddr(nur->usp, BY2WD, 0)){
pprint("suicide: trap in noted\n");
- qunlock(&up->debug);
pexit("Suicide", 0);
}
- qunlock(&up->debug);
- return;
+ break;
default:
pprint("unknown noted arg 0x%lux\n", arg0);
@@ 589,7 589,6 @@ noted(Ureg *ur, ulong arg0)
case NDFLT:
if(up->lastnote.flag == NDebug)
pprint("suicide: %s\n", up->lastnote.msg);
- qunlock(&up->debug);
pexit(up->lastnote.msg, up->lastnote.flag!=NDebug);
}
}
M port/devproc.c => port/devproc.c +6 -4
@@ 812,11 812,13 @@ procctlmemio(Proc *p, ulong offset, int n, void *va, int read)
k = kmap(pg);
b = (char*)VA(k);
+ b += offset&(BY2PG-1);
if(read == 1)
- memmove(a, b+(offset&(BY2PG-1)), n);
- else
- memmove(b+(offset&(BY2PG-1)), a, n);
-
+ memmove(a, b, n);
+ else {
+ memmove(b, a, n);
+ dcflush(b, n);
+ }
kunmap(k);
/* Ensure the process sees text page changes */
M port/proc.c => port/proc.c +13 -8
@@ 29,7 29,6 @@ typedef struct
int n;
} Schedq;
-int nrdy;
Schedq runq;
int priconst[NiceMax];
@@ 107,14 106,21 @@ sched(void)
int
anyready(void)
{
- return nrdy;
+ return runq.n;
}
int
anyhigher(void)
{
+ Proc *p;
+ int pri;
- return nrdy;
+ pri = up->pri;
+ for(p=runq.head; p; p=p->rnext)
+ if(p->pri < pri)
+ if(p->wired == 0 || p->wired == m)
+ return runq.n;
+ return 0;
}
void
@@ 132,7 138,6 @@ ready(Proc *p)
runq.head = p;
runq.tail = p;
runq.n++;
- nrdy++;
p->state = Ready;
unlock(&runq);
splx(s);
@@ 200,7 205,6 @@ found:
bp->rnext = 0;
runq.n--;
- nrdy--;
if(bp->state != Ready)
print("runproc %s %d %s\n", bp->text, bp->pid, statename[bp->state]);
@@ 769,7 773,7 @@ procdump(void)
print(" %d(%d)", p->pid, p->pri);
print("\n");
}
- print("nrdy %d\n", nrdy);
+ print("nrdy %d\n", runq.n);
}
void
@@ 849,15 853,16 @@ procctl(Proc *p)
state = p->psstate;
p->psstate = "Stopped";
/* free a waiting debugger */
+ spllo();
qlock(&p->debug);
if(p->pdbg) {
wakeup(&p->pdbg->sleep);
p->pdbg = 0;
}
qunlock(&p->debug);
+ splhi();
p->state = Stopped;
sched(); /* sched returns spllo() */
- splhi();
p->psstate = state;
return;
}
@@ 964,7 969,7 @@ accounttime(void)
pri = nrun;
nrun = 0;
- pri = (nrdy+pri)*1000;
+ pri = (runq.n+pri)*1000;
m->load = (m->load*19+pri)/20;
/*
M port/sysproc.c => port/sysproc.c +0 -1
@@ 397,7 397,6 @@ sysexec(ulong *arg)
/*
* '/' processes are higher priority (hack to make /ip more responsive).
*/
- up->nice = NiceNormal;
if(devchar[tc->type] == L'/') {
up->nice = NiceRoot;
up->pri = 0;