On Sat, 6 Sep 2014 23:02:51 +0200
Andre <[email protected]> wrote:
> With a Thinkpad T420 (pre-2.0 EFI), I do run into the failure condition for
> another reason:
>
> setup_efi_pci64 gets called,
> the loop therein is executed nr_pci=11 (!?) times.
> The second call run calls into __setup_efi_pci64 successfully, the memcpy
> takes place; the free_struct: path is not used. Back in setup_efi_pci64, the
> non-data path is walked.
>
> For all the other 10 runs of the loop, __setup_efi_pci64 fails at
> if (!pci->romimage || !pci->romsize)
> return EFI_INVALID_PARAMETER;
> so that is the status here for any run but the second.
Following up with code...
If it is OK to just leave the loop in setup_efi_pci64,
this can be done simply by
--- arch/x86/boot/compressed/eboot.c 2014-09-07 01:54:41.761008645 +0200
+++ arch/x86/boot/compressed/eboot_break.c 2014-09-07 01:52:06.321004951
+0200
@@ -504,6 +504,7 @@
params->hdr.setup_data = (unsigned long)rom;
data = (struct setup_data *)rom;
+ break;
}
But I've got severe doubts about this.
A solution limited to this particular failure mode
could look like the below. It has all the charm of
introducing a helper var. Hmpf.
--- arch/x86/boot/compressed/eboot.c 2014-09-07 01:54:41.761008645 +0200
+++ arch/x86/boot/compressed/eboot_preserve.c 2014-09-07 01:56:18.529010945
+0200
@@ -474,6 +474,7 @@
unsigned long nr_pci;
struct setup_data *data;
int i;
+ int setup_pci_worked_once = 0;
data = (struct setup_data *)(unsigned long)params->hdr.setup_data;
@@ -495,7 +496,13 @@
continue;
status = __setup_efi_pci64(pci, &rom);
- if (status != EFI_SUCCESS)
+ if (status == EFI_SUCCESS)
+ setup_pci_worked_once = 1;
+ else if (status == EFI_INVALID_PARAMETER &&
setup_pci_worked_once == 1 && i == nr_pci - 1) {
+ status = EFI_SUCCESS;
+ continue;
+ }
+ else if (status != EFI_SUCCESS)
continue;
if (data)
Regards,
Andre
--
To unsubscribe from this list: send the line "unsubscribe linux-efi" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html