summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mp.c30
1 files changed, 13 insertions, 17 deletions
diff --git a/mp.c b/mp.c
index c9a6172..ee74734 100644
--- a/mp.c
+++ b/mp.c
@@ -72,8 +72,7 @@ mp_search(void)
if((p = (bda[0x0F]<<8)|bda[0x0E])){
if((mp = mp_scan((uchar*) p, 1024)))
return mp;
- }
- else{
+ }else{
p = ((bda[0x14]<<8)|bda[0x13])*1024;
if((mp = mp_scan((uchar*)p-1024, 1024)))
return mp;
@@ -94,19 +93,20 @@ mp_detect(void)
uint length;
if((mp = mp_search()) == 0 || mp->physaddr == 0)
- return 1;
+ return -1;
pcmp = (struct mpctb*) mp->physaddr;
- if(memcmp(pcmp, "PCMP", 4))
- return 2;
+ if(memcmp(pcmp, "PCMP", 4) != 0)
+ return -1;
+ if(pcmp->version != 1 && pcmp->version != 4)
+ return -1;
length = pcmp->length;
sum = 0;
for(p = (uchar*)pcmp; length; length--)
sum += *p++;
-
- if(sum || (pcmp->version != 1 && pcmp->version != 4))
- return 3;
+ if(sum != 0)
+ return -1;
return 0;
}
@@ -114,20 +114,17 @@ mp_detect(void)
void
mp_init(void)
{
- int r;
+ int i, r;
uchar *p, *e;
struct mpctb *mpctb;
struct mppe *proc;
struct mpbe *bus;
struct mpioapic *ioapic;
struct mpie *intr;
- int i;
- uchar byte;
ncpu = 0;
- if((r = mp_detect()) != 0) {
+ if(mp_detect() < 0)
return;
- }
ismp = 1;
@@ -179,11 +176,10 @@ mp_init(void)
}
if(mp->imcrp) {
- // It appears that Bochs doesn't support IMCR, so code won't run.
+ // Bochs doesn't support IMCR, so this doesn't run on Bochs.
+ // But it would on real hardware.
outb(0x22, 0x70); // Select IMCR
- byte = inb(0x23); // Current contents
- byte |= 0x01; // Mask external INTR
- outb(0x23, byte); // Disconnect 8259s/NMI
+ outb(0x23, inb(0x23) | 1); // Mask external interrupts.
}
}