M port/sysproc.c => port/sysproc.c +2 -1
@@ 474,7 474,8 @@ sysforkpgrp(ulong *arg)
long
sysnotify(ulong *arg)
{
- validaddr(arg[0], sizeof(ulong), 0);
+ if(arg[0] != 0)
+ validaddr(arg[0], sizeof(ulong), 0);
u->notify = (int(*)(void*, char*))(arg[0]);
return 0;
}
M power/devhotrod.c => power/devhotrod.c +14 -10
@@ 422,22 422,26 @@ hotrodintr(int vec)
{
Hotrod *h;
Hotmsg *hm;
+ ulong l;
h = &hotrod[vec - Vmevec];
- if(h < hotrod || h > &hotrod[Nhotrod]){
+ if(h<hotrod || h>&hotrod[Nhotrod]){
print("bad hotrod vec\n");
return;
}
h->addr->lcsr3 &= ~INT_VME;
- hm = (Hotmsg*)VME2MP(h->rq[h->ri]);
- h->rq[h->ri] = 0;
- h->ri++;
- if(h->ri >= NRQ)
- h->ri = 0;
- hm->intr = 1;
- if(hm->abort)
- return;
- wakeup(&hm->r);
+ while(l = h->rq[h->ri]){ /* assign = */
+ hm = (Hotmsg*)(VME2MP(l));
+ h->rq[h->ri] = 0;
+ h->ri++;
+ if(h->ri >= NRQ)
+ h->ri = 0;
+ hm->intr = 1;
+ if(hm->abort)
+ print("abort wakeup\n");
+ else
+ wakeup(&hm->r);
+ }
}
#ifdef ENABMEMTEST