Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/x86_64/x86_64 Use BIOS memory info properly. Don't ...
details: https://anonhg.NetBSD.org/src/rev/1bd68d32606d
branches: trunk
changeset: 543315:1bd68d32606d
user: fvdl <fvdl%NetBSD.org@localhost>
date: Sun Feb 23 02:43:25 2003 +0000
description:
Use BIOS memory info properly. Don't try to allocate areas > 4G out of
the IO extent, since it only spans 32 bits.
diffstat:
sys/arch/x86_64/x86_64/machdep.c | 73 ++++++++++++++++++++-------------------
1 files changed, 37 insertions(+), 36 deletions(-)
diffs (148 lines):
diff -r 0f51528ec2ef -r 1bd68d32606d sys/arch/x86_64/x86_64/machdep.c
--- a/sys/arch/x86_64/x86_64/machdep.c Sun Feb 23 01:08:29 2003 +0000
+++ b/sys/arch/x86_64/x86_64/machdep.c Sun Feb 23 02:43:25 2003 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.27 2003/01/30 02:05:00 fvdl Exp $ */
+/* $NetBSD: machdep.c,v 1.28 2003/02/23 02:43:25 fvdl Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998, 2000 The NetBSD Foundation, Inc.
@@ -1197,8 +1197,8 @@
struct region_descriptor region;
struct mem_segment_descriptor *ldt_segp;
int x, first16q, ist;
- u_int64_t seg_start, seg_end;
- u_int64_t seg_start1, seg_end1;
+ u_int64_t seg_start, seg_end, addr, size;
+ u_int64_t seg_start1, seg_end1, io_end;
lwp0.l_addr = proc0paddr;
curpcb = &lwp0.l_addr->u_pcb;
@@ -1239,16 +1239,18 @@
* to us by the boot program.
*/
bim = lookup_bootinfo(BTINFO_MEMMAP);
- if (0 && bim != NULL && bim->num > 0) {
+ if (bim != NULL && bim->num > 0) {
#if DEBUG_MEMLOAD
printf("BIOS MEMORY MAP (%d ENTRIES):\n", bim->num);
#endif
for (x = 0; x < bim->num; x++) {
+ addr = ((u_int64_t)bim->entry[x].addrhi << 32) |
+ bim->entry[x].addrlo;
+ size = ((u_int64_t)bim->entry[x].sizehi << 32) |
+ bim->entry[x].sizelo;
#if DEBUG_MEMLOAD
- printf(" addr 0x%qx size 0x%qx type 0x%x\n",
- bim->entry[x].addr,
- bim->entry[x].size,
- bim->entry[x].type);
+ printf(" addr 0x%lx size 0x%lx type 0x%x\n",
+ addr, size, bim->entry[x].type);
#endif
/*
@@ -1263,44 +1265,39 @@
continue;
}
- seg_start = bim->entry[x].addr;
- seg_end = bim->entry[x].addr + bim->entry[x].size;
+ seg_start = addr;
+ seg_end = addr + size;
- if (seg_end > 0x10000000000ULL) {
+ if (seg_end > 0x100000000000ULL) {
printf("WARNING: skipping large "
"memory map entry: "
"0x%lx/0x%lx/0x%x\n",
- bim->entry[x].addr,
- bim->entry[x].size,
+ addr, size,
bim->entry[x].type);
continue;
}
/*
- * XXX Chop the last page off the size so that
- * XXX it can fit in avail_end.
- */
- if (seg_end == 0x100000000ULL) {
- seg_end -= PAGE_SIZE;
- if (seg_end <= seg_start)
- continue;
- }
-
- /*
* Allocate the physical addresses used by RAM
* from the iomem extent map. This is done before
* the addresses are page rounded just to make
* sure we get them all.
*/
- if (extent_alloc_region(iomem_ex, seg_start,
- seg_end - seg_start, EX_NOWAIT)) {
- /* XXX What should we do? */
- printf("WARNING: CAN'T ALLOCATE "
- "MEMORY SEGMENT %d "
- "(0x%lx/0x%lx/0l%x) FROM "
- "IOMEM EXTENT MAP!\n",
- x, seg_start, seg_end - seg_start,
- bim->entry[x].type);
+ if (seg_start < 0x100000000UL) {
+ if (seg_end > 0x100000000UL)
+ io_end = 0x100000000UL;
+ else
+ io_end = seg_end;
+ if (extent_alloc_region(iomem_ex, seg_start,
+ io_end - seg_start, EX_NOWAIT)) {
+ /* XXX What should we do? */
+ printf("WARNING: CAN'T ALLOCATE "
+ "MEMORY SEGMENT %d "
+ "(0x%lx/0x%lx/0l%x) FROM "
+ "IOMEM EXTENT MAP!\n",
+ x, seg_start, io_end - seg_start,
+ bim->entry[x].type);
+ }
}
/*
@@ -1450,7 +1447,8 @@
tmp = seg_end;
#if DEBUG_MEMLOAD
printf("loading 0x%qx-0x%qx (0x%lx-0x%lx)\n",
- seg_start, tmp,
+ (unsigned long long)seg_start,
+ (unsigned long long)tmp,
atop(seg_start), atop(tmp));
#endif
uvm_page_physload(atop(seg_start),
@@ -1462,7 +1460,8 @@
if (seg_start != seg_end) {
#if DEBUG_MEMLOAD
printf("loading 0x%qx-0x%qx (0x%lx-0x%lx)\n",
- seg_start, seg_end,
+ (unsigned long long)seg_start,
+ (unsigned long long)seg_end,
atop(seg_start), atop(seg_end));
#endif
uvm_page_physload(atop(seg_start),
@@ -1483,7 +1482,8 @@
tmp = seg_end1;
#if DEBUG_MEMLOAD
printf("loading 0x%qx-0x%qx (0x%lx-0x%lx)\n",
- seg_start1, tmp,
+ (unsigned long long)seg_start1,
+ (unsigned long long)tmp,
atop(seg_start1), atop(tmp));
#endif
uvm_page_physload(atop(seg_start1),
@@ -1495,7 +1495,8 @@
if (seg_start1 != seg_end1) {
#if DEBUG_MEMLOAD
printf("loading 0x%qx-0x%qx (0x%lx-0x%lx)\n",
- seg_start1, seg_end1,
+ (unsigned long long)seg_start1,
+ (unsigned long long)seg_end1,
atop(seg_start1), atop(seg_end1));
#endif
uvm_page_physload(atop(seg_start1),
Home |
Main Index |
Thread Index |
Old Index