Don't allow MAXMEM or hw.physmem to extend the top of memory if our memory

map was obtained from the SMAP.  SMAP is trustworthy, and the memory
extending feature is a band-aid for older systems where FreeBSD's methods
of detecting memory were not always trustworthy.  This fixes the issue
where using hw.physmem could result in the ACPI tables getting trashed
breaking ACPI.

MFC after:	3 days
Tested on:	i386
This commit is contained in:
jhb 2006-07-27 19:47:22 +00:00
parent 38fbd89386
commit c95747d9a1
2 changed files with 17 additions and 8 deletions

View File

@ -947,17 +947,17 @@ getmemsize(caddr_t kmdp, u_int64_t first)
if (TUNABLE_ULONG_FETCH("hw.physmem", &physmem_tunable)) if (TUNABLE_ULONG_FETCH("hw.physmem", &physmem_tunable))
Maxmem = atop(physmem_tunable); Maxmem = atop(physmem_tunable);
/*
* Don't allow MAXMEM or hw.physmem to extend the amount of memory
* in the system.
*/
if (Maxmem > atop(physmap[physmap_idx + 1]))
Maxmem = atop(physmap[physmap_idx + 1]);
if (atop(physmap[physmap_idx + 1]) != Maxmem && if (atop(physmap[physmap_idx + 1]) != Maxmem &&
(boothowto & RB_VERBOSE)) (boothowto & RB_VERBOSE))
printf("Physical memory use set to %ldK\n", Maxmem * 4); printf("Physical memory use set to %ldK\n", Maxmem * 4);
/*
* If Maxmem has been increased beyond what the system has detected,
* extend the last memory segment to the new limit.
*/
if (atop(physmap[physmap_idx + 1]) < Maxmem)
physmap[physmap_idx + 1] = ptoa((vm_paddr_t)Maxmem);
/* call pmap initialization to make new kernel address space */ /* call pmap initialization to make new kernel address space */
pmap_bootstrap(&first); pmap_bootstrap(&first);

View File

@ -1633,7 +1633,7 @@ static void
getmemsize(int first) getmemsize(int first)
{ {
int i, physmap_idx, pa_indx, da_indx; int i, physmap_idx, pa_indx, da_indx;
int hasbrokenint12; int hasbrokenint12, has_smap;
u_long physmem_tunable; u_long physmem_tunable;
u_int extmem; u_int extmem;
struct vm86frame vmf; struct vm86frame vmf;
@ -1661,6 +1661,7 @@ getmemsize(int first)
bzero(&vmf, sizeof(vmf)); bzero(&vmf, sizeof(vmf));
bzero(physmap, sizeof(physmap)); bzero(physmap, sizeof(physmap));
basemem = 0; basemem = 0;
has_smap = 0;
/* /*
* Some newer BIOSes has broken INT 12H implementation which cause * Some newer BIOSes has broken INT 12H implementation which cause
@ -1742,6 +1743,7 @@ getmemsize(int first)
if (boothowto & RB_VERBOSE) if (boothowto & RB_VERBOSE)
printf("SMAP type=%02x base=%016llx len=%016llx\n", printf("SMAP type=%02x base=%016llx len=%016llx\n",
smap->type, smap->base, smap->length); smap->type, smap->base, smap->length);
has_smap = 1;
if (smap->type != 0x01) if (smap->type != 0x01)
continue; continue;
@ -1883,6 +1885,13 @@ getmemsize(int first)
if (TUNABLE_ULONG_FETCH("hw.physmem", &physmem_tunable)) if (TUNABLE_ULONG_FETCH("hw.physmem", &physmem_tunable))
Maxmem = atop(physmem_tunable); Maxmem = atop(physmem_tunable);
/*
* If we have an SMAP, don't allow MAXMEM or hw.physmem to extend
* the amount of memory in the system.
*/
if (has_smap && Maxmem > atop(physmap[physmap_idx + 1]))
Maxmem = atop(physmap[physmap_idx + 1]);
if (atop(physmap[physmap_idx + 1]) != Maxmem && if (atop(physmap[physmap_idx + 1]) != Maxmem &&
(boothowto & RB_VERBOSE)) (boothowto & RB_VERBOSE))
printf("Physical memory use set to %ldK\n", Maxmem * 4); printf("Physical memory use set to %ldK\n", Maxmem * 4);