Create memory map entries for VGA RAM & ROM space, fix memory parsing - Extend reserved memory range to include the VGA ROM space (0xc0000-0xdffff) - Create memory map entries for these ranges - Fix parsing of memory ranges that overlap VGA space (more dynamic) Signed-off-by: Alex Williamson --- diff -r 7988fb818c3b edk2-sparse/EdkXenPkg/Dxe/Bds/BdsPlatform.c --- a/edk2-sparse/EdkXenPkg/Dxe/Bds/BdsPlatform.c Wed Aug 29 04:11:05 2007 +0200 +++ b/edk2-sparse/EdkXenPkg/Dxe/Bds/BdsPlatform.c Tue Oct 09 14:54:55 2007 -0600 @@ -107,6 +107,20 @@ struct _PLATFORM_MEMORY_DESC { typedef struct _PLATFORM_MEMORY_DESC PLATFORM_MEMORY_DESC; STATIC PLATFORM_MEMORY_DESC PlatformMemory[] = { + { + 0xa0000, + 0x20000, + EfiGcdMemoryTypeMemoryMappedIo, + EfiMemoryMappedIO, + EFI_MEMORY_UC | EFI_MEMORY_WC | EFI_MEMORY_UCE | EFI_MEMORY_RUNTIME + }, + { + 0xc0000, + 0x20000, + EfiGcdMemoryTypeSystemMemory, + EfiReservedMemoryType, + EFI_MEMORY_UC + }, { 0xc0000000, 0x20000000, diff -r 7988fb818c3b edk2-sparse/EdkXenPkg/Pei/XenMemoryScan/XenMemoryScan.c --- a/edk2-sparse/EdkXenPkg/Pei/XenMemoryScan/XenMemoryScan.c Wed Aug 29 04:11:05 2007 +0200 +++ b/edk2-sparse/EdkXenPkg/Pei/XenMemoryScan/XenMemoryScan.c Wed Oct 10 11:08:34 2007 -0600 @@ -19,6 +19,10 @@ Revision History --*/ #include + +#define Min(a, b) ((a) < (b) ? (a) : (b)) +#define VGA_BASE 0xA0000 +#define VGA_END 0xE0000 STATIC VOID @@ -97,37 +101,41 @@ Returns: data = (UINT64 *)(hdr + 1); data_len = hdr->length - sizeof (struct XenHobHeader); if (hdr->type == HOB_TYPE_MEM && data_len == 16) { - Base = data[0]; - Len = data[1]; - if (Base == 0) - { - UINT64 mem_start = Base; - UINT64 mem_len = 0xa0000; + Base = data[0]; + Len = data[1]; - RegisterMemoryArea(PeiServices, mem_start, mem_len); - DEBUG((EFI_D_ERROR, "Build memory hob at 0x%lx, len is 0x%lx\n", mem_start, mem_len)); + // + // Don't register memory area for VGA hole: + // VGA RAM (0xA0000 ~ 0xBFFFF) + VGA ROM (0xC0000 ~ 0xDFFFF) + // + if (Base < VGA_END && (Base + Len) >= VGA_BASE) { + UINT64 mem_start; + UINT64 mem_len; - /* Don't register memory area for VGA hole(0xa0000 ~ 0xc0000)*/ - mem_start = 0xc0000; - mem_len = 0x100000 - 0xc0000; + if (Base < VGA_BASE) { + mem_start = Base; + mem_len = VGA_BASE - Base; - RegisterMemoryArea(PeiServices, mem_start, mem_len); - DEBUG((EFI_D_ERROR, "Build memory hob at 0x%lx, len is 0x%lx\n", mem_start, mem_len)); + RegisterMemoryArea(PeiServices, mem_start, mem_len); + DEBUG((EFI_D_ERROR, "Build memory hob at 0x%lx, len is 0x%lx\n", + mem_start, mem_len)); + } - mem_start = 0x100000; - mem_len = Len - 0x100000; + if (Base + Len > VGA_END) { + mem_start = VGA_END; + mem_len = (Base + Len) - VGA_END; - RegisterMemoryArea(PeiServices, mem_start, mem_len); - DEBUG((EFI_D_ERROR, "Build memory hob at 0x%lx, len is 0x%lx\n", mem_start, mem_len)); - - } - else - { - RegisterMemoryArea(PeiServices, Base, Len); - DEBUG((EFI_D_ERROR, "Build memory hob at 0x%lx, len is 0x%lx\n", Base, Len)); - } - } - hob += hdr->length; + RegisterMemoryArea(PeiServices, mem_start, mem_len); + DEBUG((EFI_D_ERROR, "Build memory hob at 0x%lx, len is 0x%lx\n", + mem_start, mem_len)); + } + } else { + RegisterMemoryArea(PeiServices, Base, Len); + DEBUG((EFI_D_ERROR, "Build memory hob at 0x%lx, len is 0x%lx\n", + Base, Len)); + } + } + hob += hdr->length; } while (hdr->type != HOB_TYPE_TERMINAL);