diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c index e5c69ed91fac..e65434cbbf28 100644 --- a/sys/amd64/amd64/machdep.c +++ b/sys/amd64/amd64/machdep.c @@ -1247,15 +1247,6 @@ getmemsize(caddr_t kmdp, u_int64_t first) basemem = 640; } - /* - * Make hole for "AP -> long mode" bootstrap code. The - * mp_bootaddress vector is only available when the kernel - * is configured to support APs and APs for the system start - * in real mode mode (e.g. SMP bare metal). - */ - if (init_ops.mp_bootaddress) - init_ops.mp_bootaddress(physmap, &physmap_idx); - /* * Maxmem isn't the "maximum memory", it's one larger than the * highest page of the physical address space. It should be @@ -1294,6 +1285,15 @@ getmemsize(caddr_t kmdp, u_int64_t first) (boothowto & RB_VERBOSE)) printf("Physical memory use set to %ldK\n", Maxmem * 4); + /* + * Make hole for "AP -> long mode" bootstrap code. The + * mp_bootaddress vector is only available when the kernel + * is configured to support APs and APs for the system start + * in real mode mode (e.g. SMP bare metal). + */ + if (init_ops.mp_bootaddress) + init_ops.mp_bootaddress(physmap, &physmap_idx); + /* call pmap initialization to make new kernel address space */ pmap_bootstrap(&first); diff --git a/sys/amd64/amd64/mp_machdep.c b/sys/amd64/amd64/mp_machdep.c index 301461420874..0e03ba26e2d5 100644 --- a/sys/amd64/amd64/mp_machdep.c +++ b/sys/amd64/amd64/mp_machdep.c @@ -113,12 +113,16 @@ mp_bootaddress(vm_paddr_t *physmap, unsigned int *physmap_idx) allocated = false; for (i = *physmap_idx; i <= *physmap_idx; i -= 2) { /* - * Find a memory region big enough below the 4GB boundary to - * store the initial page tables. Note that it needs to be - * aligned to a page boundary. + * Find a memory region big enough below the 4GB + * boundary to store the initial page tables. Region + * must be mapped by the direct map. + * + * Note that it needs to be aligned to a page + * boundary. */ - if (physmap[i] >= GiB(4) || - (physmap[i + 1] - round_page(physmap[i])) < (PAGE_SIZE * 3)) + if (physmap[i] >= GiB(4) || physmap[i + 1] - + round_page(physmap[i]) < PAGE_SIZE * 3 || + physmap[i + 1] > Maxmem) continue; allocated = true;