]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/9/pc/archmp.c
kernel: cleanup the software mouse cursor mess
[plan9front.git] / sys / src / 9 / pc / archmp.c
index 18e19e120dbf5f8e25e8a2e60a878327b8d871d2..edf256256ddae95b913fb78d0c78e3f34f1fd6e5 100644 (file)
@@ -383,6 +383,7 @@ identify(void)
 {
        char *cp;
        _MP_ *_mp_;
+       ulong pa, len;
 
        if((cp = getconf("*nomp")) != nil && strcmp(cp, "0") != 0)
                return 1;
@@ -394,16 +395,34 @@ 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;
+       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;