Merge branch 'efi-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull EFI updates from Ingo Molnar: - decode x86 CPER data (Yazen Ghannam) - ignore unrealistically large option ROMs (Hans de Goede) - initialize UEFI secure boot state during Xen dom0 boot (Daniel Kiper) - additional minor tweaks and fixes. * 'efi-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: efi/capsule-loader: Don't output reset log when reset flags are not set efi/x86: Ignore unrealistically large option ROMs efi/x86: Fold __setup_efi_pci32() and __setup_efi_pci64() into one function efi: Align efi_pci_io_protocol typedefs to type naming convention efi/libstub/tpm: Make function efi_retrieve_tpm2_eventlog_1_2() static efi: Decode IA32/X64 Context Info structure efi: Decode IA32/X64 MS Check structure efi: Decode additional IA32/X64 Bus Check fields efi: Decode IA32/X64 Cache, TLB, and Bus Check structures efi: Decode UEFI-defined IA32/X64 Error Structure GUIDs efi: Decode IA32/X64 Processor Error Info Structure efi: Decode IA32/X64 Processor Error Section efi: Fix IA32/X64 Processor Error Record definition efi/cper: Remove the INDENT_SP silliness x86/xen/efi: Initialize UEFI secure boot state during dom0 boot
This commit is contained in:
@@ -109,23 +109,34 @@ void efi_char16_printk(efi_system_table_t *table, efi_char16_t *str)
|
||||
}
|
||||
|
||||
static efi_status_t
|
||||
__setup_efi_pci32(efi_pci_io_protocol_32 *pci, struct pci_setup_rom **__rom)
|
||||
__setup_efi_pci(efi_pci_io_protocol_t *pci, struct pci_setup_rom **__rom)
|
||||
{
|
||||
struct pci_setup_rom *rom = NULL;
|
||||
efi_status_t status;
|
||||
unsigned long size;
|
||||
uint64_t attributes;
|
||||
uint64_t attributes, romsize;
|
||||
void *romimage;
|
||||
|
||||
status = efi_early->call(pci->attributes, pci,
|
||||
EfiPciIoAttributeOperationGet, 0, 0,
|
||||
&attributes);
|
||||
status = efi_call_proto(efi_pci_io_protocol, attributes, pci,
|
||||
EfiPciIoAttributeOperationGet, 0, 0,
|
||||
&attributes);
|
||||
if (status != EFI_SUCCESS)
|
||||
return status;
|
||||
|
||||
if (!pci->romimage || !pci->romsize)
|
||||
/*
|
||||
* Some firmware images contain EFI function pointers at the place where the
|
||||
* romimage and romsize fields are supposed to be. Typically the EFI
|
||||
* code is mapped at high addresses, translating to an unrealistically
|
||||
* large romsize. The UEFI spec limits the size of option ROMs to 16
|
||||
* MiB so we reject any ROMs over 16 MiB in size to catch this.
|
||||
*/
|
||||
romimage = (void *)(unsigned long)efi_table_attr(efi_pci_io_protocol,
|
||||
romimage, pci);
|
||||
romsize = efi_table_attr(efi_pci_io_protocol, romsize, pci);
|
||||
if (!romimage || !romsize || romsize > SZ_16M)
|
||||
return EFI_INVALID_PARAMETER;
|
||||
|
||||
size = pci->romsize + sizeof(*rom);
|
||||
size = romsize + sizeof(*rom);
|
||||
|
||||
status = efi_call_early(allocate_pool, EFI_LOADER_DATA, size, &rom);
|
||||
if (status != EFI_SUCCESS) {
|
||||
@@ -141,30 +152,32 @@ __setup_efi_pci32(efi_pci_io_protocol_32 *pci, struct pci_setup_rom **__rom)
|
||||
rom->pcilen = pci->romsize;
|
||||
*__rom = rom;
|
||||
|
||||
status = efi_early->call(pci->pci.read, pci, EfiPciIoWidthUint16,
|
||||
PCI_VENDOR_ID, 1, &(rom->vendor));
|
||||
status = efi_call_proto(efi_pci_io_protocol, pci.read, pci,
|
||||
EfiPciIoWidthUint16, PCI_VENDOR_ID, 1,
|
||||
&rom->vendor);
|
||||
|
||||
if (status != EFI_SUCCESS) {
|
||||
efi_printk(sys_table, "Failed to read rom->vendor\n");
|
||||
goto free_struct;
|
||||
}
|
||||
|
||||
status = efi_early->call(pci->pci.read, pci, EfiPciIoWidthUint16,
|
||||
PCI_DEVICE_ID, 1, &(rom->devid));
|
||||
status = efi_call_proto(efi_pci_io_protocol, pci.read, pci,
|
||||
EfiPciIoWidthUint16, PCI_DEVICE_ID, 1,
|
||||
&rom->devid);
|
||||
|
||||
if (status != EFI_SUCCESS) {
|
||||
efi_printk(sys_table, "Failed to read rom->devid\n");
|
||||
goto free_struct;
|
||||
}
|
||||
|
||||
status = efi_early->call(pci->get_location, pci, &(rom->segment),
|
||||
&(rom->bus), &(rom->device), &(rom->function));
|
||||
status = efi_call_proto(efi_pci_io_protocol, get_location, pci,
|
||||
&rom->segment, &rom->bus, &rom->device,
|
||||
&rom->function);
|
||||
|
||||
if (status != EFI_SUCCESS)
|
||||
goto free_struct;
|
||||
|
||||
memcpy(rom->romdata, (void *)(unsigned long)pci->romimage,
|
||||
pci->romsize);
|
||||
memcpy(rom->romdata, romimage, romsize);
|
||||
return status;
|
||||
|
||||
free_struct:
|
||||
@@ -176,7 +189,7 @@ static void
|
||||
setup_efi_pci32(struct boot_params *params, void **pci_handle,
|
||||
unsigned long size)
|
||||
{
|
||||
efi_pci_io_protocol_32 *pci = NULL;
|
||||
efi_pci_io_protocol_t *pci = NULL;
|
||||
efi_guid_t pci_proto = EFI_PCI_IO_PROTOCOL_GUID;
|
||||
u32 *handles = (u32 *)(unsigned long)pci_handle;
|
||||
efi_status_t status;
|
||||
@@ -203,7 +216,7 @@ setup_efi_pci32(struct boot_params *params, void **pci_handle,
|
||||
if (!pci)
|
||||
continue;
|
||||
|
||||
status = __setup_efi_pci32(pci, &rom);
|
||||
status = __setup_efi_pci(pci, &rom);
|
||||
if (status != EFI_SUCCESS)
|
||||
continue;
|
||||
|
||||
@@ -217,74 +230,11 @@ setup_efi_pci32(struct boot_params *params, void **pci_handle,
|
||||
}
|
||||
}
|
||||
|
||||
static efi_status_t
|
||||
__setup_efi_pci64(efi_pci_io_protocol_64 *pci, struct pci_setup_rom **__rom)
|
||||
{
|
||||
struct pci_setup_rom *rom;
|
||||
efi_status_t status;
|
||||
unsigned long size;
|
||||
uint64_t attributes;
|
||||
|
||||
status = efi_early->call(pci->attributes, pci,
|
||||
EfiPciIoAttributeOperationGet, 0,
|
||||
&attributes);
|
||||
if (status != EFI_SUCCESS)
|
||||
return status;
|
||||
|
||||
if (!pci->romimage || !pci->romsize)
|
||||
return EFI_INVALID_PARAMETER;
|
||||
|
||||
size = pci->romsize + sizeof(*rom);
|
||||
|
||||
status = efi_call_early(allocate_pool, EFI_LOADER_DATA, size, &rom);
|
||||
if (status != EFI_SUCCESS) {
|
||||
efi_printk(sys_table, "Failed to alloc mem for rom\n");
|
||||
return status;
|
||||
}
|
||||
|
||||
rom->data.type = SETUP_PCI;
|
||||
rom->data.len = size - sizeof(struct setup_data);
|
||||
rom->data.next = 0;
|
||||
rom->pcilen = pci->romsize;
|
||||
*__rom = rom;
|
||||
|
||||
status = efi_early->call(pci->pci.read, pci, EfiPciIoWidthUint16,
|
||||
PCI_VENDOR_ID, 1, &(rom->vendor));
|
||||
|
||||
if (status != EFI_SUCCESS) {
|
||||
efi_printk(sys_table, "Failed to read rom->vendor\n");
|
||||
goto free_struct;
|
||||
}
|
||||
|
||||
status = efi_early->call(pci->pci.read, pci, EfiPciIoWidthUint16,
|
||||
PCI_DEVICE_ID, 1, &(rom->devid));
|
||||
|
||||
if (status != EFI_SUCCESS) {
|
||||
efi_printk(sys_table, "Failed to read rom->devid\n");
|
||||
goto free_struct;
|
||||
}
|
||||
|
||||
status = efi_early->call(pci->get_location, pci, &(rom->segment),
|
||||
&(rom->bus), &(rom->device), &(rom->function));
|
||||
|
||||
if (status != EFI_SUCCESS)
|
||||
goto free_struct;
|
||||
|
||||
memcpy(rom->romdata, (void *)(unsigned long)pci->romimage,
|
||||
pci->romsize);
|
||||
return status;
|
||||
|
||||
free_struct:
|
||||
efi_call_early(free_pool, rom);
|
||||
return status;
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
setup_efi_pci64(struct boot_params *params, void **pci_handle,
|
||||
unsigned long size)
|
||||
{
|
||||
efi_pci_io_protocol_64 *pci = NULL;
|
||||
efi_pci_io_protocol_t *pci = NULL;
|
||||
efi_guid_t pci_proto = EFI_PCI_IO_PROTOCOL_GUID;
|
||||
u64 *handles = (u64 *)(unsigned long)pci_handle;
|
||||
efi_status_t status;
|
||||
@@ -311,7 +261,7 @@ setup_efi_pci64(struct boot_params *params, void **pci_handle,
|
||||
if (!pci)
|
||||
continue;
|
||||
|
||||
status = __setup_efi_pci64(pci, &rom);
|
||||
status = __setup_efi_pci(pci, &rom);
|
||||
if (status != EFI_SUCCESS)
|
||||
continue;
|
||||
|
||||
|
Reference in New Issue
Block a user