Thursday, May 11, 2017

Re: OpenBSD 6.1: BOOTIA32 3.32 issue

On Thu, 11 May 2017 23:45:17 +0200
Michele Curti <michele.curti@gmail.com> wrote:
> On Wed, May 10, 2017 at 08:35:28PM +0200, Patrick Wildt wrote:
>>
>> I don't think this is the correct fix. It might solve your issue, but I
>> don't think it's completely right. So EFI has those so called device
>> paths. A path is basically a list of nodes. To compare two paths you
>> need to compare the whole path and not just a single node of it. If you
>> store dp instead of dp0 you will basically only save a part of the path,
>> not the full path.
>>
>> What you can do is print the full path of efi_bootdp like..
>>
>> for (dp = efi_bootdp; !IsDevicePathEnd(dp);
>> dp = NextDevicePathNode(dp)) {
>> printf("%x %x - ", DevicePathType(dp), DevicePathSubType(dp));
>> }
>> printf("\n");
>>
>> And do the same for the DPs that are being put into the
>> efi_device_path_cmp function. That will at least print the types, but
>> not the content of the nodes. That's a start into figuring out why it
>> does not correctly compare the paths.
>>
>> Maybe there's a bug in the compare code?
>
> Sorry, only now I understood what you said... Got
>
> 2 1 - 1 1 - 1 5 - 4 1 -
>
> (2 1) (2 1) da db cmp da db cmp diff bootdev 1
> (2 1) (2 1) da db cmp da db cmp diff bootdev 1
> (2 1) (2 1) da db cmp da db cmp diff bootdev 1
>
> with the following diff

All disks are identical in HARDWARE_DEVICE_PATH and ACPI_DEVICE_PATH
and they all don't have MESSAGING_DEVICE_PATH. So the boot loader
mistakenly treats all of them as the bootdisk..

I'd like to know whether there is a way to distigish those disks. Can
you try the diff following?

diff --git a/sys/arch/amd64/stand/efiboot/efiboot.c b/sys/arch/amd64/stand/efiboot/efiboot.c
index efa371f2ecd..891b6c75cc9 100644
--- a/sys/arch/amd64/stand/efiboot/efiboot.c
+++ b/sys/arch/amd64/stand/efiboot/efiboot.c
@@ -208,6 +208,14 @@ next:
TAILQ_INSERT_HEAD(&efi_disklist, di, list);
else
TAILQ_INSERT_TAIL(&efi_disklist, di, list);
+
+ printf("%d\n", i);
+ for (; !IsDevicePathEnd(dp); dp = NextDevicePathNode(dp)) {
+ int ii;
+ for (ii = 0; ii < DevicePathNodeLength(dp); ii++)
+ printf("%x ", *((u_char *)dp + ii));
+ printf("\n");
+ }
}

free(handles, sz);

No comments:

Post a Comment