Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F151201174
D12368.id33063.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
9 KB
Referenced Files
None
Subscribers
None
D12368.id33063.diff
View Options
Index: sys/boot/i386/libi386/biosmem.c
===================================================================
--- sys/boot/i386/libi386/biosmem.c
+++ sys/boot/i386/libi386/biosmem.c
@@ -63,150 +63,166 @@
* memory correctly. You need both maker and product as
* reported by smbios.
*/
-#define BQ_DISTRUST_E820_EXTMEM 0x1 /* e820 might not return useful
- extended memory */
+/* e820 might not return useful extended memory */
+#define BQ_DISTRUST_E820_EXTMEM 0x1
struct bios_getmem_quirks {
- const char* bios_vendor;
- const char* maker;
- const char* product;
- int quirk;
+ const char *bios_vendor;
+ const char *maker;
+ const char *product;
+ int quirk;
};
static struct bios_getmem_quirks quirks[] = {
- {"coreboot", "Acer", "Peppy", BQ_DISTRUST_E820_EXTMEM},
- {NULL, NULL, NULL, 0}
+ {"coreboot", "Acer", "Peppy", BQ_DISTRUST_E820_EXTMEM},
+ {NULL, NULL, NULL, 0}
};
static int
bios_getquirks(void)
{
- int i;
+ int i;
- for (i=0; quirks[i].quirk != 0; ++i)
- if (smbios_match(quirks[i].bios_vendor, quirks[i].maker,
- quirks[i].product))
- return (quirks[i].quirk);
+ for (i = 0; quirks[i].quirk != 0; ++i) {
+ if (smbios_match(quirks[i].bios_vendor, quirks[i].maker,
+ quirks[i].product))
+ return (quirks[i].quirk);
+ }
- return (0);
+ return (0);
}
void
bios_getmem(void)
{
- uint64_t size;
+ uint64_t size;
- /* Parse system memory map */
- v86.ebx = 0;
- do {
- v86.ctl = V86_FLAGS;
- v86.addr = 0x15; /* int 0x15 function 0xe820*/
- v86.eax = 0xe820;
- v86.ecx = sizeof(struct bios_smap_xattr);
- v86.edx = SMAP_SIG;
- v86.es = VTOPSEG(&smap);
- v86.edi = VTOPOFF(&smap);
- v86int();
- if ((V86_CY(v86.efl)) || (v86.eax != SMAP_SIG))
- break;
- /* look for a low-memory segment that's large enough */
- if ((smap.type == SMAP_TYPE_MEMORY) && (smap.base == 0) &&
- (smap.length >= (512 * 1024))) {
- bios_basemem = smap.length;
- b_bios_probed |= B_BASEMEM_E820;
- }
+ /* Parse system memory map */
+ v86.ebx = 0;
+ do {
+ v86.ctl = V86_FLAGS;
+ v86.addr = 0x15; /* int 0x15 function 0xe820 */
+ v86.eax = 0xe820;
+ v86.ecx = sizeof (struct bios_smap_xattr);
+ v86.edx = SMAP_SIG;
+ v86.es = VTOPSEG(&smap);
+ v86.edi = VTOPOFF(&smap);
+ v86int();
+ if ((V86_CY(v86.efl)) || (v86.eax != SMAP_SIG))
+ break;
+ /* look for a low-memory segment that's large enough */
+ if ((smap.type == SMAP_TYPE_MEMORY) && (smap.base == 0) &&
+ (smap.length >= (512 * 1024))) {
+ bios_basemem = smap.length;
+ b_bios_probed |= B_BASEMEM_E820;
+ }
- /* look for the first segment in 'extended' memory */
- if ((smap.type == SMAP_TYPE_MEMORY) && (smap.base == 0x100000) &&
- !(bios_getquirks() & BQ_DISTRUST_E820_EXTMEM)) {
- bios_extmem = smap.length;
- b_bios_probed |= B_EXTMEM_E820;
- }
+ /* look for the first segment in 'extended' memory */
+ if ((smap.type == SMAP_TYPE_MEMORY) &&
+ (smap.base == 0x100000) &&
+ !(bios_getquirks() & BQ_DISTRUST_E820_EXTMEM)) {
+ bios_extmem = smap.length;
+ b_bios_probed |= B_EXTMEM_E820;
+ }
- /*
- * Look for the largest segment in 'extended' memory beyond
- * 1MB but below 4GB.
- */
- if ((smap.type == SMAP_TYPE_MEMORY) && (smap.base > 0x100000) &&
- (smap.base < 0x100000000ull)) {
- size = smap.length;
+ /*
+ * Look for the highest segment in 'extended' memory beyond
+ * 1MB but below 4GB.
+ */
+ if ((smap.type == SMAP_TYPE_MEMORY) &&
+ (smap.base > 0x100000) &&
+ (smap.base < 0x100000000ull)) {
+ size = smap.length;
- /*
- * If this segment crosses the 4GB boundary, truncate it.
- */
- if (smap.base + size > 0x100000000ull)
- size = 0x100000000ull - smap.base;
+ /*
+ * If this segment crosses the 4GB boundary,
+ * truncate it.
+ */
+ if (smap.base + size > 0x100000000ull)
+ size = 0x100000000ull - smap.base;
- if (size > high_heap_size) {
- high_heap_size = size;
- high_heap_base = smap.base;
- }
+ /*
+ * To make maximum space for the kernel and the modules,
+ * set heap to use highest HEAP_MIN bytes below 4GB.
+ */
+ if (high_heap_base < smap.base && size >= HEAP_MIN) {
+ high_heap_base = smap.base + size - HEAP_MIN;
+ high_heap_size = HEAP_MIN;
+ }
+ }
+ } while (v86.ebx != 0);
+
+ /* Fall back to the old compatibility function for base memory */
+ if (bios_basemem == 0) {
+ v86.ctl = 0;
+ v86.addr = 0x12; /* int 0x12 */
+ v86int();
+
+ bios_basemem = (v86.eax & 0xffff) * 1024;
+ b_bios_probed |= B_BASEMEM_12;
}
- } while (v86.ebx != 0);
- /* Fall back to the old compatibility function for base memory */
- if (bios_basemem == 0) {
- v86.ctl = 0;
- v86.addr = 0x12; /* int 0x12 */
- v86int();
-
- bios_basemem = (v86.eax & 0xffff) * 1024;
- b_bios_probed |= B_BASEMEM_12;
- }
+ /*
+ * Fall back through several compatibility functions for extended
+ * memory.
+ */
+ if (bios_extmem == 0) {
+ v86.ctl = V86_FLAGS;
+ v86.addr = 0x15; /* int 0x15 function 0xe801 */
+ v86.eax = 0xe801;
+ v86int();
+ if (!(V86_CY(v86.efl))) {
+ /*
+ * Clear high_heap; it may end up overlapping
+ * with the segment we're determining here.
+ * Let the default "steal stuff from top of
+ * bios_extmem" code below pick up on it.
+ */
+ high_heap_size = 0;
+ high_heap_base = 0;
- /* Fall back through several compatibility functions for extended memory */
- if (bios_extmem == 0) {
- v86.ctl = V86_FLAGS;
- v86.addr = 0x15; /* int 0x15 function 0xe801*/
- v86.eax = 0xe801;
- v86int();
- if (!(V86_CY(v86.efl))) {
- /*
- * Clear high_heap; it may end up overlapping
- * with the segment we're determining here.
- * Let the default "steal stuff from top of
- * bios_extmem" code below pick up on it.
- */
- high_heap_size = 0;
- high_heap_base = 0;
+ /*
+ * %cx is the number of 1KiB blocks between 1..16MiB.
+ * It can only be up to 0x3c00; if it's smaller then
+ * there's a PC AT memory hole so we can't treat
+ * it as contiguous.
+ */
+ bios_extmem = (v86.ecx & 0xffff) * 1024;
+ if (bios_extmem == (1024 * 0x3c00))
+ bios_extmem += (v86.edx & 0xffff) * 64 * 1024;
- /*
- * %cx is the number of 1KiB blocks between 1..16MiB.
- * It can only be up to 0x3c00; if it's smaller then
- * there's a PC AT memory hole so we can't treat
- * it as contiguous.
- */
- bios_extmem = (v86.ecx & 0xffff) * 1024;
- if (bios_extmem == (1024 * 0x3c00))
- bios_extmem += (v86.edx & 0xffff) * 64 * 1024;
+ /* truncate bios_extmem */
+ if (bios_extmem > 0x3ff00000)
+ bios_extmem = 0x3ff00000;
- /* truncate bios_extmem */
- if (bios_extmem > 0x3ff00000)
- bios_extmem = 0x3ff00000;
+ b_bios_probed |= B_EXTMEM_E801;
+ }
+ }
+ if (bios_extmem == 0) {
+ v86.ctl = 0;
+ v86.addr = 0x15; /* int 0x15 function 0x88 */
+ v86.eax = 0x8800;
+ v86int();
+ bios_extmem = (v86.eax & 0xffff) * 1024;
+ b_bios_probed |= B_EXTMEM_8800;
+ }
- b_bios_probed |= B_EXTMEM_E801;
+ /* Set memtop to actual top of memory */
+ if (high_heap_size != 0) {
+ memtop = memtop_copyin = high_heap_base;
+ } else {
+ memtop = memtop_copyin = 0x100000 + bios_extmem;
}
- }
- if (bios_extmem == 0) {
- v86.ctl = 0;
- v86.addr = 0x15; /* int 0x15 function 0x88*/
- v86.eax = 0x8800;
- v86int();
- bios_extmem = (v86.eax & 0xffff) * 1024;
- b_bios_probed |= B_EXTMEM_8800;
- }
- /* Set memtop to actual top of memory */
- memtop = memtop_copyin = 0x100000 + bios_extmem;
-
- /*
- * If we have extended memory and did not find a suitable heap
- * region in the SMAP, use the last HEAP_MIN of 'extended' memory as a
- * high heap candidate.
- */
- if (bios_extmem >= HEAP_MIN && high_heap_size < HEAP_MIN) {
- high_heap_size = HEAP_MIN;
- high_heap_base = memtop - HEAP_MIN;
- }
+ /*
+ * If we have extended memory and did not find a suitable heap
+ * region in the SMAP, use the last 64MB of 'extended' memory as a
+ * high heap candidate.
+ */
+ if (bios_extmem >= HEAP_MIN && high_heap_size < HEAP_MIN) {
+ high_heap_size = HEAP_MIN;
+ high_heap_base = memtop - HEAP_MIN;
+ memtop = memtop_copyin = high_heap_base;
+ }
}
static int
@@ -214,16 +230,16 @@
{
int bq = bios_getquirks();
- printf("bios_basemem: 0x%llx\n", (unsigned long long) bios_basemem);
- printf("bios_extmem: 0x%llx\n", (unsigned long long) bios_extmem);
- printf("memtop: 0x%llx\n", (unsigned long long) memtop);
- printf("high_heap_base: 0x%llx\n", (unsigned long long) high_heap_base);
- printf("high_heap_size: 0x%llx\n", (unsigned long long) high_heap_size);
+ printf("bios_basemem: 0x%llx\n", (unsigned long long)bios_basemem);
+ printf("bios_extmem: 0x%llx\n", (unsigned long long)bios_extmem);
+ printf("memtop: 0x%llx\n", (unsigned long long)memtop);
+ printf("high_heap_base: 0x%llx\n", (unsigned long long)high_heap_base);
+ printf("high_heap_size: 0x%llx\n", (unsigned long long)high_heap_size);
printf("bios_quirks: 0x%02x", bq);
if (bq & BQ_DISTRUST_E820_EXTMEM)
printf(" BQ_DISTRUST_E820_EXTMEM");
printf("\n");
- printf("b_bios_probed: 0x%02x", (int) b_bios_probed);
+ printf("b_bios_probed: 0x%02x", (int)b_bios_probed);
if (b_bios_probed & B_BASEMEM_E820)
printf(" B_BASEMEM_E820");
if (b_bios_probed & B_BASEMEM_12)
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Tue, Apr 7, 7:16 PM (10 h, 10 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
31046630
Default Alt Text
D12368.id33063.diff (9 KB)
Attached To
Mode
D12368: loader: biosmem allocate heap just below 4GB
Attached
Detach File
Event Timeline
Log In to Comment