M pc/main.c => pc/main.c +3 -2
@@ 264,6 264,7 @@ confinit(void)
l--;
if(*l != x)
break;
+ memset((char*)(KZERO|((i-1)*MB)), 0, MB);
x += 0x3141526;
}
i--;
@@ 275,8 276,8 @@ confinit(void)
pcnt = (1<<conf.ldepth)-1; /* Calculate % of memory for page pool */
pcnt = 70 - (pcnt*10);
conf.upages = (conf.npage*pcnt)/100;
- if(conf.npage - conf.upages < (2*MB)/BY2PG)
- conf.upages = conf.npage - (2*MB)/BY2PG;
+ if(conf.npage - conf.upages < ((3*MB)/4)/BY2PG)
+ conf.upages = conf.npage - ((3*MB)/4)/BY2PG;
ktop = PGROUND((ulong)end);
ktop = PADDR(ktop);
M pc/trap.c => pc/trap.c +33 -4
@@ 32,6 32,8 @@ enum
Int1aux= 0xA1, /* everything else (ICW2, ICW3, ICW4, OCW1) */
EOI= 0x20, /* non-specific end of interrupt */
+
+ Maxhandler= 128, /* max number of interrupt handlers */
};
int int0mask = 0xff; /* interrupts enabled for first 8259 */
@@ 41,7 43,21 @@ int int1mask = 0xff; /* interrupts enabled for second 8259 */
* trap/interrupt gates
*/
Segdesc ilt[256];
-void (*ivec[256])(void*);
+
+typedef struct Handler Handler;
+struct Handler
+{
+ void (*r)(void*);
+ Handler *next;
+};
+
+struct
+{
+ Lock;
+ Handler *ivec[256];
+ Handler h[Maxhandler];
+ int free;
+} halloc;
void
sethvec(int v, void (*r)(void), int type, int pri)
@@ 53,7 69,16 @@ sethvec(int v, void (*r)(void), int type, int pri)
void
setvec(int v, void (*r)(Ureg*))
{
- ivec[v] = r;
+ Handler *h;
+
+ lock(&halloc);
+ if(halloc.free >= Maxhandler)
+ panic("out of interrupt handlers");
+ h = &halloc.h[halloc.free++];
+ h->next = halloc.ivec[v];
+ h->r = r;
+ halloc.ivec[v] = h;
+ unlock(&halloc);
/*
* enable corresponding interrupt in 8259
@@ 201,6 226,7 @@ trap(Ureg *ur)
int v, user;
int c;
char buf[ERRLEN];
+ Handler *h;
v = ur->trap;
@@ 222,7 248,7 @@ trap(Ureg *ur)
uartintr0(ur);
}
- if(v>=256 || ivec[v] == 0){
+ if(v>=256 || (h = halloc.ivec[v]) == 0){
if(v == 13)
return;
if(v <= 16){
@@ 239,7 265,10 @@ trap(Ureg *ur)
return;
}
- (*ivec[v])(ur);
+ do {
+ (*h->r)(ur);
+ h = h->next;
+ } while(h);
/*
* check user since syscall does its own notifying
M ss/screen.c => ss/screen.c +1 -1
@@ 69,7 69,7 @@ struct screens
}screens[] = {
{ "bwtwo", 1152, 900, 0, 0x400000 },
{ "cgsix", 1152, 900, 3, 0x200000 },
- { "cgthree", 1152, 900, 3, 0x200000 }, /* PURE GUESS! */
+ { "cgthree", 1152, 900, 3, 0x400000 }, /* data from rwolff */
0
};