]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/9/pc/archmp.c
pc, pc64: clear debug watchpoint registers on exec and exit
[plan9front.git] / sys / src / 9 / pc / archmp.c
index 723433db8a4b9744a5a19d28e0e99a4816263083..fec5f76383d6c9c1f8baecc68b3a341b904cbd1f 100644 (file)
@@ -261,8 +261,8 @@ mpoverride(uchar** newp, uchar** e)
        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;
@@ -310,7 +310,7 @@ pcmpinit(void)
         */
        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);
@@ -383,6 +383,7 @@ identify(void)
 {
        char *cp;
        _MP_ *_mp_;
+       ulong len;
 
        if((cp = getconf("*nomp")) != nil && strcmp(cp, "0") != 0)
                return 1;
@@ -394,16 +395,32 @@ identify(void)
         * 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;
+       if(_mp_->physaddr < MemMin)
+               pcmp = KADDR(_mp_->physaddr);
+       else if((pcmp = vmap(_mp_->physaddr, len)) == nil)
+               return 1;
+       if(pcmp->length < len
+       || memcmp(pcmp, "PCMP", 4) != 0
+       || (pcmp->version != 1 && pcmp->version != 4)){
+Bad:
+               if((uintptr)pcmp < KZERO)
+                       vunmap(pcmp, len);
                pcmp = nil;
                return 1;
        }
+       len = pcmp->length;
+       if((uintptr)pcmp < KZERO)
+               vunmap(pcmp, PCMPsz);
+       if(_mp_->physaddr < MemMin)
+               pcmp = KADDR(_mp_->physaddr);
+       else if((pcmp = vmap(_mp_->physaddr, len)) == nil)
+               return 1;
+       if(checksum(pcmp, len) != 0)
+               goto Bad;
 
        if(m->havetsc && getconf("*notsc") == nil)
                archmp.fastclock = tscticks;