return bus;
print("mpgetbus: can't find bus %d\n", busno);
-
return 0;
}
uchar* p;
char* s;
- size = atoi(getconf("*mp"));
- if(size == 0) panic("mpoverride: invalid size in *mp");
+ size = strtol(getconf("*mp"), 0, 0);
+ if(size <= 0) panic("mpoverride: invalid size in *mp");
*newp = p = xalloc(size);
if(p == nil) panic("mpoverride: can't allocate memory");
*e = p + size;
* Map the local APIC.
*/
va = vmap(pcmp->lapicbase, 1024);
- print("LAPIC: %.8lux %.8lux\n", pcmp->lapicbase, (ulong)va);
+
+ print("LAPIC: %.8lux %#p\n", pcmp->lapicbase, va);
if(va == nil)
panic("pcmpinit: cannot map lapic %.8lux", pcmp->lapicbase);
- p = ((uchar*)pcmp)+sizeof(PCMP);
+ p = ((uchar*)pcmp)+PCMPsz;
e = ((uchar*)pcmp)+pcmp->length;
if(getconf("*dumpmp") != nil)
dumpmp(p, e);
*/
while(p < e) switch(*p){
default:
- print("pcmpinit: unknown PCMP type 0x%uX (e-p 0x%luX)\n",
+ print("pcmpinit: unknown PCMP type 0x%uX (e-p 0x%zuX)\n",
*p, e-p);
while(p < e){
print("%uX ", *p);
apic->addr = va;
apic->paddr = pcmp->lapicbase;
}
- p += sizeof(PCMPprocessor);
+ p += PCMPprocessorsz;
continue;
case PcmpBUS:
mkbus((PCMPbus*)p);
- p += sizeof(PCMPbus);
+ p += PCMPbussz;
continue;
case PcmpIOAPIC:
if(apic = mkioapic((PCMPioapic*)p))
ioapicinit(apic, apic->apicno);
- p += sizeof(PCMPioapic);
+ p += PCMPioapicsz;
continue;
case PcmpIOINTR:
mkiointr((PCMPintr*)p);
- p += sizeof(PCMPintr);
+ p += PCMPintrsz;
continue;
case PcmpLINTR:
mklintr((PCMPintr*)p);
- p += sizeof(PCMPintr);
+ p += PCMPintrsz;
continue;
}
mpinit();
}
+static void
+mpreset(void)
+{
+ /* stop application processors */
+ mpshutdown();
+
+ /* do generic reset */
+ archreset();
+}
+
static int identify(void);
PCArch archmp = {
.id= "_MP_",
.ident= identify,
-.reset= mpshutdown,
+.reset= mpreset,
.intrinit= pcmpinit,
.intrenable= mpintrenable,
.intron= lapicintron,
{
char *cp;
_MP_ *_mp_;
+ ulong pa, len;
if((cp = getconf("*nomp")) != nil && strcmp(cp, "0") != 0)
return 1;
* if correct, check the version.
* To do: check extended table checksum.
*/
- if((_mp_ = sigsearch("_MP_")) == 0 || checksum(_mp_, sizeof(_MP_)) ||
- (_mp_->physaddr == 0))
+ if((_mp_ = sigsearch("_MP_", _MP_sz)) == nil || _mp_->physaddr == 0)
return 1;
- pcmp = KADDR(_mp_->physaddr);
- if(memcmp(pcmp, "PCMP", 4) || checksum(pcmp, pcmp->length) ||
- (pcmp->version != 1 && pcmp->version != 4)) {
+ len = PCMPsz;
+ pa = _mp_->physaddr;
+ if(pa + len-1 < pa)
+ return 1;
+
+ memreserve(pa, len);
+ if((pcmp = vmap(pa, len)) == nil)
+ return 1;
+ if(pcmp->length < PCMPsz
+ || pa + pcmp->length-1 < pa
+ || memcmp(pcmp, "PCMP", 4) != 0
+ || (pcmp->version != 1 && pcmp->version != 4)){
+Bad:
+ vunmap(pcmp, len);
pcmp = nil;
return 1;
}
+ len = pcmp->length;
+ memreserve(pa, len);
+ vunmap(pcmp, PCMPsz);
+ if((pcmp = vmap(pa, len)) == nil)
+ return 1;
+
+ if(checksum(pcmp, len) != 0)
+ goto Bad;
+
+ if(m->havetsc && getconf("*notsc") == nil)
+ archmp.fastclock = tscticks;
return 0;
}