mp_probe(): Return physical address of the MP float pointer struct
authorMichael Neumann <mneumann@ntecs.de>
Sat, 2 Oct 2010 14:21:33 +0000 (16:21 +0200)
committerMichael Neumann <mneumann@ntecs.de>
Sat, 2 Oct 2010 14:21:33 +0000 (16:21 +0200)
Apply commit aeb48299996ead8f1c328436e93b1836326c2bf6 for x86_64.

sys/platform/pc64/x86_64/mp_machdep.c

index b761614..f468740 100644 (file)
@@ -350,28 +350,22 @@ mp_probe(void)
        if (ebda_addr != 0) {
                /* search first 1K of EBDA */
                target = (u_int32_t)ebda_addr;
        if (ebda_addr != 0) {
                /* search first 1K of EBDA */
                target = (u_int32_t)ebda_addr;
-               if ((x = search_for_sig(target, 1024 / 4)) != -1L)
-                       goto found;
+               if ((x = search_for_sig(target, 1024 / 4)) > 0)
+                       return x;
        } else {
                /* last 1K of base memory, effective 'top of base' passed in */
        } else {
                /* last 1K of base memory, effective 'top of base' passed in */
-               target = (u_int32_t) (base_memory - 0x400);
-               if ((x = search_for_sig(target, 1024 / 4)) != -1L)
-                       goto found;
+               target = (u_int32_t)(base_memory - 0x400);
+               if ((x = search_for_sig(target, 1024 / 4)) > 0)
+                       return x;
        }
 
        /* search the BIOS */
        }
 
        /* search the BIOS */
-       target = (u_int32_t) BIOS_BASE;
-       if ((x = search_for_sig(target, BIOS_COUNT)) != -1L)
-               goto found;
+       target = (u_int32_t)BIOS_BASE;
+       if ((x = search_for_sig(target, BIOS_COUNT)) > 0)
+               return x;
 
        /* nothing found */
 
        /* nothing found */
-       mpfps = (mpfps_t)0;
        return 0;
        return 0;
-
-found:
-       mpfps = (mpfps_t)x;
-
-       return 1;
 }
 
 
 }
 
 
@@ -537,7 +531,8 @@ mp_enable(u_int boot_addr)
 
        POSTCODE(MP_ENABLE_POST);
 
 
        POSTCODE(MP_ENABLE_POST);
 
-       if (!mp_probe())
+       mpfps = (mpfps_t)mp_probe();
+       if (mpfps == NULL)
                panic("mp_enable: mp_probe failed\n");
 
 #if 0 /* JGXXX */
                panic("mp_enable: mp_probe failed\n");
 
 #if 0 /* JGXXX */
@@ -631,10 +626,12 @@ search_for_sig(u_int32_t target, int count)
        u_int32_t *addr;
        int x, ret;
 
        u_int32_t *addr;
        int x, ret;
 
+       KKASSERT(target != 0);
+
        map_size = count * sizeof(u_int32_t);
        addr = pmap_mapdev((vm_paddr_t)target, map_size);
 
        map_size = count * sizeof(u_int32_t);
        addr = pmap_mapdev((vm_paddr_t)target, map_size);
 
-       ret = -1;
+       ret = 0;
        for (x = 0; x < count; NEXT(x)) {
                if (addr[x] == MP_SIG) {
                        /* make array index a byte index */
        for (x = 0; x < count; NEXT(x)) {
                if (addr[x] == MP_SIG) {
                        /* make array index a byte index */
@@ -642,6 +639,7 @@ search_for_sig(u_int32_t target, int count)
                        break;
                }
        }
                        break;
                }
        }
+
        pmap_unmapdev((vm_offset_t)addr, map_size);
        return ret;
 }
        pmap_unmapdev((vm_offset_t)addr, map_size);
        return ret;
 }