[SeaBIOS] [PATCH v3] boot: Fix boot order for SCSI target, lun > 9

Markus Armbruster armbru at redhat.com
Fri Aug 15 09:39:22 CEST 2014


Laszlo Ersek <lersek at redhat.com> writes:

> On 08/15/14 08:58, Markus Armbruster wrote:
>> We identify devices by their Open Firmware device paths.  The path
>> component for the logical unit on a bus is incorrect:
>> bootprio_find_scsi_device() and bootprio_find_usb() format target
>> (a.k.a. SCSI ID) and lun in decimal, while QEMU uses hexadecimal.
>> Bootorder list entries with target, lun > 9 aren't found (lucky case),
>> or attributed to the wrong logical unit (unlucky case).
>> 
>> The relevant spec[*] agrees with QEMU (and OVMF, for that matter).
>> Change %d to %x.
>> 
>> No actual impact on USB, because QEMU only uses LUN 0 there.
>> 
>> RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=1096560
>> 
>> [*] Open Firmware Recommended Practice: SCSI-3 Parallel Interface,
>> Version 1, Section 3.1 Physical Address Formats and Representations
>> http://www.openfirmware.org/1275/practice/spi/spi1_0.ps
>> IEEE Standard for Boot (Initialization Configuration) Firmware: Core
>> Requirements and Practices, IEEE Std 1275-1994, Annex E SCSI host
>> adapter package class, section E.2.1 Physical address formats and
>> representations
>> 
>> Signed-off-by: Markus Armbruster <armbru at redhat.com>
>> ---
>> v3:
>> * Fix bootprio_find_usb() as well [Kevin]
>> * Also point to IEEE 1275 Annex E in commit message
>> v2:
>> * Fix the link to the spec (d'oh)
>> * While we're linking, link to RHBZ
>> 
>>  src/boot.c | 4 ++--
>>  1 file changed, 2 insertions(+), 2 deletions(-)
>> 
>> diff --git a/src/boot.c b/src/boot.c
>> index 5837ad0..34088c8 100644
>> --- a/src/boot.c
>> +++ b/src/boot.c
>> @@ -145,7 +145,7 @@ int bootprio_find_scsi_device(struct pci_device *pci, int target, int lun)
>>      // Find scsi drive - for example: /pci at i0cf8/scsi at 5/channel at 0/disk at 1,0
>>      char desc[256], *p;
>>      p = build_pci_path(desc, sizeof(desc), "*", pci);
>> -    snprintf(p, desc+sizeof(desc)-p, "/*@0/*@%d,%d", target, lun);
>> +    snprintf(p, desc+sizeof(desc)-p, "/*@0/*@%x,%x", target, lun);
>>      return find_prio(desc);
>>  }
>>  
>> @@ -224,7 +224,7 @@ int bootprio_find_usb(struct usbdevice_s *usbdev, int lun)
>>      char desc[256], *p;
>>      p = build_pci_path(desc, sizeof(desc), "usb", usbdev->hub->cntl->pci);
>>      p = build_usb_path(p, desc+sizeof(desc)-p, usbdev->hub);
>> -    snprintf(p, desc+sizeof(desc)-p, "/storage@%x/*@0/*@0,%d"
>> +    snprintf(p, desc+sizeof(desc)-p, "/storage@%x/*@0/*@0,%x"
>>               , usbdev->port+1, lun);
>>      int ret = find_prio(desc);
>>      if (ret >= 0)
>> 
>
> We had discussed bootprio_find_usb() too on IRC; I thought you were
> going to send a separate patch for that. But it's OK this way as well,
> obviously.

Stupid misunderstanding on my part.  I saw only the port number
mismatch, and that needs fixing in QEMU.  I missed the lun mismatch.

> Reviewed-by: Laszlo Ersek <lersek at redhat.com>

Thanks!



More information about the SeaBIOS mailing list