|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] Can't see more than 3.5GB of RAM / UEFI / no e820 memory map detected
On 28/08/2012 22:41, Keir Fraser wrote: On 28/08/2012 22:13, "Jonathan Tripathy" <jonnyt@xxxxxxxxxxx> wrote:Keir Fraser wrote:On 28/08/2012 20:36, "Jonathan Tripathy" <jonnyt@xxxxxxxxxxx> wrote:Thanks for the clarification. So from a security/reliability standpoint, nothing will be affected by flipping the if block? Hi Keir,Thanks for doing that. However, the ordering of the if block in my code that I used was slightly different from your commit. Perhaps this doesn't make too much of a difference?
Thanks
if ( mbi->flags & MBI_MEMMAP )
{
memmap_type = "Multiboot-e820";
while ( (bytes < mbi->mmap_length) && (e820_raw_nr < E820MAX) )
{
memory_map_t *map = __va(mbi->mmap_addr + bytes);
/*
* This is a gross workaround for a BIOS bug. Some
bootloaders do
* not write e820 map entries into pre-zeroed memory. This is
* okay if the BIOS fills in all fields of the map entry, but
* some broken BIOSes do not bother to write the high word of
* the length field if the length is smaller than 4GB. We
* detect and fix this by flagging sections below 4GB that
* appear to be larger than 4GB in size.
*/
if ( (map->base_addr_high == 0) && (map->length_high != 0) )
{
if ( !e820_warn )
{
printk("WARNING: Buggy e820 map detected and fixed "
"(truncated length fields).\n");
e820_warn = 1;
}
map->length_high = 0;
}
e820_raw[e820_raw_nr].addr =
((u64)map->base_addr_high << 32) | (u64)map->base_addr_low;
e820_raw[e820_raw_nr].size =
((u64)map->length_high << 32) | (u64)map->length_low;
e820_raw[e820_raw_nr].type = map->type;
e820_raw_nr++;
bytes += map->size + 4;
}
}
else if ( mbi->flags & MBI_MEMLIMITS )
{
memmap_type = "Multiboot-e801";
e820_raw[0].addr = 0;
e820_raw[0].size = mbi->mem_lower << 10;
e820_raw[0].type = E820_RAM;
e820_raw[1].addr = 0x100000;
e820_raw[1].size = mbi->mem_upper << 10;
e820_raw[1].type = E820_RAM;
e820_raw_nr = 2;
}
if ( e820_raw_nr != 0 )
{
memmap_type = "Xen-e820";
}
else if ( bootsym(lowmem_kb) )
{
memmap_type = "Xen-e801";
e820_raw[0].addr = 0;
e820_raw[0].size = bootsym(lowmem_kb) << 10;
e820_raw[0].type = E820_RAM;
e820_raw[1].addr = 0x100000;
e820_raw[1].size = bootsym(highmem_kb) << 10;
e820_raw[1].type = E820_RAM;
e820_raw_nr = 2;
}
else
{
EARLY_FAIL("Bootloader provided no memory information.\n");
}
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |