]> 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 b5eb898053a01a211e4c2903f06208b99880b977..fec5f76383d6c9c1f8baecc68b3a341b904cbd1f 100644 (file)
@@ -41,7 +41,6 @@ mpgetbus(int busno)
                        return bus;
 
        print("mpgetbus: can't find bus %d\n", busno);
-
        return 0;
 }
 
@@ -262,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;
@@ -292,11 +291,12 @@ pcmpinit(void)
         * 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);
@@ -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);
@@ -323,28 +323,28 @@ pcmpinit(void)
                        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;
        }
 
@@ -354,12 +354,22 @@ pcmpinit(void)
        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,
@@ -373,6 +383,7 @@ identify(void)
 {
        char *cp;
        _MP_ *_mp_;
+       ulong len;
 
        if((cp = getconf("*nomp")) != nil && strcmp(cp, "0") != 0)
                return 1;
@@ -384,16 +395,32 @@ identify(void)
         * 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;
+       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;