On Mon, 09 Sep, at 12:45:00PM, Clea F. Rees wrote:
> 2013/9/5 Matt Fleming <m...@console-pimps.org>:
> >
> > Sorry for the delay in replying to this.
> >
> > Does your machine hang during setup_efi_pci() or later on in boot?
> 
> I'm not certain. How would I tell this? I think the answer is probably
> during because the tests Matt had me do involved inserting reboot
> instructions into the code and testing where the hang occurred. But
> I'm not sure whether that showed absolutely that the hang occurs
> actually during setup_efi_pci().

Could you try the attached patch and let me know what you observe?

---

diff --git a/arch/x86/boot/compressed/eboot.c b/arch/x86/boot/compressed/eboot.c
index b7388a4..f4a966d 100644
--- a/arch/x86/boot/compressed/eboot.c
+++ b/arch/x86/boot/compressed/eboot.c
@@ -261,30 +261,37 @@ static efi_status_t setup_efi_pci(struct boot_params 
*params)
        int i;
        struct setup_data *data;
 
+       efi_printk("1\n");
        data = (struct setup_data *)(unsigned long)params->hdr.setup_data;
 
        while (data && data->next)
                data = (struct setup_data *)(unsigned long)data->next;
 
+       efi_printk("2\n");
        status = efi_call_phys5(sys_table->boottime->locate_handle,
                                EFI_LOCATE_BY_PROTOCOL, &pci_proto,
                                NULL, &size, pci_handle);
 
+       efi_printk("3\n");
        if (status == EFI_BUFFER_TOO_SMALL) {
                status = efi_call_phys3(sys_table->boottime->allocate_pool,
                                        EFI_LOADER_DATA, size, &pci_handle);
 
+               efi_printk("4\n");
                if (status != EFI_SUCCESS)
                        return status;
 
+               efi_printk("5\n");
                status = efi_call_phys5(sys_table->boottime->locate_handle,
                                        EFI_LOCATE_BY_PROTOCOL, &pci_proto,
                                        NULL, &size, pci_handle);
+               efi_printk("6\n");
        }
 
        if (status != EFI_SUCCESS)
                goto free_handle;
 
+       efi_printk("7\n");
        nr_pci = size / sizeof(void *);
        for (i = 0; i < nr_pci; i++) {
                void *h = pci_handle[i];
@@ -297,13 +304,16 @@ static efi_status_t setup_efi_pci(struct boot_params 
*params)
                if (status != EFI_SUCCESS)
                        continue;
 
+               efi_printk("8\n");
                if (!pci)
                        continue;
 
+               efi_printk("9\n");
 #ifdef CONFIG_X86_64
                status = efi_call_phys4(pci->attributes, pci,
                                        EfiPciIoAttributeOperationGet, 0,
                                        &attributes);
+               efi_printk("10\n");
 #else
                status = efi_call_phys5(pci->attributes, pci,
                                        EfiPciIoAttributeOperationGet, 0, 0,
@@ -312,43 +322,54 @@ static efi_status_t setup_efi_pci(struct boot_params 
*params)
                if (status != EFI_SUCCESS)
                        continue;
 
+               efi_printk("11\n");
                if (!pci->romimage || !pci->romsize)
                        continue;
 
+               efi_printk("12\n");
                size = pci->romsize + sizeof(*rom);
 
                status = efi_call_phys3(sys_table->boottime->allocate_pool,
                                EFI_LOADER_DATA, size, &rom);
 
+               efi_printk("13\n");
                if (status != EFI_SUCCESS)
                        continue;
 
+               efi_printk("14\n");
                rom->data.type = SETUP_PCI;
                rom->data.len = size - sizeof(struct setup_data);
                rom->data.next = 0;
                rom->pcilen = pci->romsize;
 
+               efi_printk("15\n");
                status = efi_call_phys5(pci->pci.read, pci,
                                        EfiPciIoWidthUint16, PCI_VENDOR_ID,
                                        1, &(rom->vendor));
+               efi_printk("16\n");
 
                if (status != EFI_SUCCESS)
                        goto free_struct;
 
+               efi_printk("17\n");
                status = efi_call_phys5(pci->pci.read, pci,
                                        EfiPciIoWidthUint16, PCI_DEVICE_ID,
                                        1, &(rom->devid));
 
+               efi_printk("18\n");
                if (status != EFI_SUCCESS)
                        goto free_struct;
 
+               efi_printk("19\n");
                status = efi_call_phys5(pci->get_location, pci,
                                        &(rom->segment), &(rom->bus),
                                        &(rom->device), &(rom->function));
 
+               efi_printk("20\n");
                if (status != EFI_SUCCESS)
                        goto free_struct;
 
+               efi_printk("21\n");
                memcpy(rom->romdata, pci->romimage, pci->romsize);
 
                if (data)
@@ -358,13 +379,18 @@ static efi_status_t setup_efi_pci(struct boot_params 
*params)
 
                data = (struct setup_data *)rom;
 
+               efi_printk("22\n");
                continue;
        free_struct:
+               efi_printk("23\n");
                efi_call_phys1(sys_table->boottime->free_pool, rom);
+               efi_printk("24\n");
        }
 
 free_handle:
+       efi_printk("25\n");
        efi_call_phys1(sys_table->boottime->free_pool, pci_handle);
+       efi_printk("26\n");
        return status;
 }
 
-- 
Matt Fleming, Intel Open Source Technology Center
--
To unsubscribe from this list: send the line "unsubscribe linux-efi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to