Skip to content

Commit

Permalink
Skip SMAP regions above 4GB on i386 since they will not fit into a long.
Browse files Browse the repository at this point in the history
While here, update some comments to better explain the new code flow.

Tested by:	dhw
  • Loading branch information
bsdjhb committed Nov 2, 2010
1 parent 0773225 commit 3108c93
Showing 1 changed file with 19 additions and 12 deletions.
31 changes: 19 additions & 12 deletions sys/x86/x86/nexus.c
Original file line number Diff line number Diff line change
Expand Up @@ -694,35 +694,42 @@ ram_attach(device_t dev)
if (smap->type != SMAP_TYPE_MEMORY ||
smap->length == 0)
continue;
#ifdef __i386__
/*
* Resources use long's to track resources, so
* we can't include memory regions above 4GB.
*/
if (smap->base >= ~0ul)
break;
#endif
error = bus_set_resource(dev, SYS_RES_MEMORY, rid,
smap->base, smap->length);
if (error)
panic("ram_attach: resource %d failed set with %d",
panic(
"ram_attach: resource %d failed set with %d",
rid, error);
res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
0);
if (res == NULL)
panic("ram_attach: resource %d failed to attach",
panic("ram_attach: resource %d failed to attach",
rid);
rid++;
}
return (0);
}

/*
* We use the dump_avail[] array rather than phys_avail[] for
* the memory map as phys_avail[] contains holes for kernel
* memory, page 0, the message buffer, and the dcons buffer.
* We test the end address in the loop instead of the start
* since the start address for the first segment is 0.
*
* XXX: It would be preferable to use the SMAP if it exists
* instead since if the SMAP is very fragmented we may not
* include some memory regions in dump_avail[] and phys_avail[].
* If the system map is not available, fall back to using
* dump_avail[]. We use the dump_avail[] array rather than
* phys_avail[] for the memory map as phys_avail[] contains
* holes for kernel memory, page 0, the message buffer, and
* the dcons buffer. We test the end address in the loop
* instead of the start since the start address for the first
* segment is 0.
*/
for (i = 0, p = dump_avail; p[1] != 0; i++, p += 2) {
rid = i;
#ifdef PAE
#ifdef __i386__
/*
* Resources use long's to track resources, so we can't
* include memory regions above 4GB.
Expand Down

0 comments on commit 3108c93

Please sign in to comment.