[coreboot] New patch to review for coreboot: 78f56e2 PIANO: Various fixes

Stefan Reinauer (stefan.reinauer@coreboot.org) gerrit at coreboot.org
Mon Mar 4 23:20:40 CET 2013


Stefan Reinauer (stefan.reinauer at coreboot.org) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/2263

-gerrit

commit 78f56e239c7dc4a21a9f8ffa61c51f2123bfb2c6
Author: Stefan Reinauer <reinauer at chromium.org>
Date:   Fri Feb 1 13:24:53 2013 -0800

    PIANO: Various fixes
    
    - add FV2 HOB
    - make some functions static
    - fix flags of Resource Descriptor HOBs
    - fix memory allocation HOB
    - Determine actual CPU physical address bits for CPU HOB, if possible.
    
    Change-Id: I741a9478ced5abdb057f03ff7c54240424458d52
    Signed-off-by: Stefan Reinauer <reinauer at google.com>
---
 payloads/tianocoreboot/include/efi.h   |  1 +
 payloads/tianocoreboot/tianocoreboot.c | 50 ++++++++++++++++++++++++++++++----
 2 files changed, 45 insertions(+), 6 deletions(-)

diff --git a/payloads/tianocoreboot/include/efi.h b/payloads/tianocoreboot/include/efi.h
index 1c589a1..18b693b 100644
--- a/payloads/tianocoreboot/include/efi.h
+++ b/payloads/tianocoreboot/include/efi.h
@@ -25,6 +25,7 @@
 typedef long intn_t;
 typedef unsigned long uintn_t;
 
+#define PI_SPECIFICATION_VERSION 0x0001000A
 #include <EfiTypes.h>
 #include <EfiFirmwareVolumeHeader.h>
 #include <PiFirmwareFile.h>
diff --git a/payloads/tianocoreboot/tianocoreboot.c b/payloads/tianocoreboot/tianocoreboot.c
index 04d2f32..daf6828 100644
--- a/payloads/tianocoreboot/tianocoreboot.c
+++ b/payloads/tianocoreboot/tianocoreboot.c
@@ -30,6 +30,19 @@
 #undef VERBOSE
 #undef INVENTORY
 
+static unsigned int cpuid_eax(unsigned int op)
+{
+	unsigned int eax;
+
+	__asm__("mov %%ebx, %%edi;"
+		"cpuid;"
+		"mov %%edi, %%ebx;"
+		: "=a" (eax)
+		: "0" (op)
+		: "ecx", "edx", "edi");
+	return eax;
+}
+
 static void print_guid(EFI_GUID *guid)
 {
 	printf("%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
@@ -108,7 +121,7 @@ static void dump_uefi_ffs_file_header(EFI_FFS_FILE_HEADER *file)
 }
 #endif
 
-void *load_dxe_core(void *pe, void *target)
+static void *load_dxe_core(void *pe, void *target)
 {
 	dos_header_t *dos_hdr = (dos_header_t *)pe;
 
@@ -273,7 +286,7 @@ void *load_dxe_core(void *pe, void *target)
 	return (target + pe_hdr->AddressOfEntryPoint - offset);
 }
 
-void start_dxe_core(void *entry, void *stack, void *hoblist)
+static void start_dxe_core(void *entry, void *stack, void *hoblist)
 {
 	printf("\nJumping to DXE core at %p\n", entry);
 	asm volatile(
@@ -301,13 +314,24 @@ static const EFI_HOB_FIRMWARE_VOLUME FirmwareVolume = {
 	0 /* Length */
 };
 
+static const EFI_HOB_FIRMWARE_VOLUME2 FirmwareVolume2 = {
+	{ EFI_HOB_TYPE_FV2, sizeof(EFI_HOB_FIRMWARE_VOLUME2), 0 },
+	0 /* BaseAddress */,
+	0 /* Length */
+};
+
 /* 1..n */
 static const EFI_HOB_RESOURCE_DESCRIPTOR ResourceDescriptor = {
 	{ EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, sizeof(EFI_HOB_RESOURCE_DESCRIPTOR), 0 },
 	{ 0 }, // owner EFI_GUID
 	EFI_RESOURCE_SYSTEM_MEMORY,
-	EFI_RESOURCE_ATTRIBUTE_PRESENT | EFI_RESOURCE_ATTRIBUTE_INITIALIZED |
-		EFI_RESOURCE_ATTRIBUTE_TESTED,
+	(EFI_RESOURCE_ATTRIBUTE_PRESENT                 |
+	 EFI_RESOURCE_ATTRIBUTE_TESTED                  |
+	 EFI_RESOURCE_ATTRIBUTE_INITIALIZED             |
+	 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE             |
+	 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE       |
+	 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |
+	 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE),
 	0, /* PhysicalStart */
 	0 /* ResourceLength */
 };
@@ -346,6 +370,10 @@ static void prepare_handoff_blocks(void *hoblist, EFI_FIRMWARE_VOLUME_HEADER *fv
 	memcpy(ptr, &FirmwareVolume, sizeof(FirmwareVolume));
 	ptr += sizeof(FirmwareVolume);
 
+	EFI_HOB_FIRMWARE_VOLUME2 *fv2 = (EFI_HOB_FIRMWARE_VOLUME2 *)ptr;
+	memcpy(ptr, &FirmwareVolume2, sizeof(FirmwareVolume2));
+	ptr += sizeof(FirmwareVolume2);
+
 	for (i = 0; i < lib_sysinfo.n_memranges; i++) {
 		EFI_HOB_RESOURCE_DESCRIPTOR *resource;
 		if (lib_sysinfo.memrange[i].type != CB_MEM_RAM)
@@ -361,6 +389,7 @@ static void prepare_handoff_blocks(void *hoblist, EFI_FIRMWARE_VOLUME_HEADER *fv
 	memcpy(ptr, &MemoryAllocationModule, sizeof(MemoryAllocationModule));
 	ptr += sizeof(MemoryAllocationModule);
 
+	EFI_HOB_CPU *cpu = ptr;
 	memcpy(ptr, &Cpu, sizeof(Cpu));
 	ptr += sizeof(Cpu);
 
@@ -378,8 +407,17 @@ static void prepare_handoff_blocks(void *hoblist, EFI_FIRMWARE_VOLUME_HEADER *fv
 	fv->BaseAddress = (unsigned long)fvh;
 	fv->Length = fvh->FvLength;
 
-	allocation->MemoryAllocationHeader.MemoryBaseAddress = dxecore_base;
-	allocation->MemoryAllocationHeader.MemoryLength = DXE_CORE_SIZE;
+	fv2->BaseAddress = (unsigned long)fvh;
+	fv2->Length = fvh->FvLength;
+
+	allocation->MemoryAllocationHeader.MemoryBaseAddress = (unsigned long)fvh;
+	allocation->MemoryAllocationHeader.MemoryLength = fvh->FvLength;
+	allocation->EntryPoint = dxecore_base;
+
+	if (cpuid_eax(0x80000000) >= 0x80000008) {
+		int phys = cpuid_eax(0x80000008) & 0xff;
+		cpu->SizeOfMemorySpace = phys;
+	}
 }
 
 int main(void)



More information about the coreboot mailing list