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;
*/
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);
{
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_, _MP_sz) ||
- (_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;