Save EBDA address before mp_probe()
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Fri, 12 Jun 2009 08:06:13 +0000 (16:06 +0800)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Fri, 12 Jun 2009 11:07:54 +0000 (19:07 +0800)
sys/platform/pc32/i386/machdep.c
sys/platform/pc32/i386/mp_machdep.c

index 4a90a14..900f625 100644 (file)
@@ -158,6 +158,8 @@ SYSCTL_INT(_debug, OID_AUTO, tlb_flush_count,
 
 int physmem = 0;
 
+u_long ebda_addr = 0;
+
 static int
 sysctl_hw_physmem(SYSCTL_HANDLER_ARGS)
 {
@@ -1654,6 +1656,10 @@ physmap_done:
        /* make hole for AP bootstrap code YYY */
        physmap[1] = mp_bootaddress(physmap[1]);
 
+       /* Save EBDA address, if any */
+       ebda_addr = (u_long)(*(u_short *)(KERNBASE + 0x40e));
+       ebda_addr <<= 4;
+
        /* look for the MP hardware - needed for apic addresses */
        mp_probe();
 #endif
index 3a649f4..e042a13 100644 (file)
@@ -238,6 +238,8 @@ u_int32_t cpu_apic_versions[MAXCPU];
 int64_t tsc0_offset;
 extern int64_t tsc_offsets[];
 
+extern u_long ebda_addr;
+
 #ifdef APIC_IO
 struct apic_intmapinfo int_to_apicintpin[APIC_INTMAPSIZE];
 #endif
@@ -327,7 +329,6 @@ int
 mp_probe(void)
 {
        int     x;
-       u_long  segment;
        u_int32_t target;
  
        /*
@@ -339,9 +340,9 @@ mp_probe(void)
        POSTCODE(MP_PROBE_POST);
 
        /* see if EBDA exists */
-       if ((segment = (u_long) * (u_short *) (KERNBASE + 0x40e)) != 0) {
+       if (ebda_addr != 0) {
                /* search first 1K of EBDA */
-               target = (u_int32_t) (segment << 4);
+               target = (u_int32_t)ebda_addr;
                if ((x = search_for_sig(target, 1024 / 4)) >= 0)
                        goto found;
        } else {