On Sun, May 14, 2017 at 07:31:09PM +0900, YASUOKA Masahiko wrote:
> On Fri, 12 May 2017 16:15:52 +0200
>
> It seems the problem which had been fixed previous is happening again.
> Does efidev.c have following $OpenBSD$?
>
> /* $OpenBSD: efidev.c,v 1.25 2017/05/11 01:37:24 yasuoka Exp $ */
>
You are right, I wasn't following HEAD, so cvs update did not
retrieved the latest version.. Sorry for the trouble.
>
> Also let me update the diff.
Works for me :)
Thank you,
Michele
>
> diff --git a/sys/arch/amd64/stand/efiboot/efiboot.c
> b/sys/arch/amd64/stand/efiboot/efiboot.c
> index efa371f2ecd..19df6b1dc64 100644
> --- a/sys/arch/amd64/stand/efiboot/efiboot.c
> +++ b/sys/arch/amd64/stand/efiboot/efiboot.c
> @@ -52,7 +52,9 @@ static EFI_GUID blkio_guid = BLOCK_IO_PROTOCOL;
> static EFI_GUID devp_guid = DEVICE_PATH_PROTOCOL;
> u_long efi_loadaddr;
>
> -static int efi_device_path_cmp(EFI_DEVICE_PATH *, EFI_DEVICE_PATH *, int);
> +static int efi_device_path_depth(EFI_DEVICE_PATH *dp, int);
> +static int efi_device_path_ncmp(EFI_DEVICE_PATH *, EFI_DEVICE_PATH *,
> + int);
> static void efi_heap_init(void);
> static void efi_memprobe_internal(void);
> static void efi_video_init(void);
> @@ -159,7 +161,7 @@ struct disklist_lh efi_disklist;
> void
> efi_diskprobe(void)
> {
> - int i, bootdev;
> + int i, bootdev = 0, depth = -1;
> UINTN sz;
> EFI_STATUS status;
> EFI_HANDLE *handles = NULL;
> @@ -180,8 +182,10 @@ efi_diskprobe(void)
> if (handles == NULL || EFI_ERROR(status))
> panic("BS->LocateHandle() returns %d", status);
>
> + if (efi_bootdp != NULL)
> + depth = efi_device_path_depth(efi_bootdp, MEDIA_DEVICE_PATH);
> +
> for (i = 0; i < sz / sizeof(EFI_HANDLE); i++) {
> - bootdev = 0;
> status = EFI_CALL(BS->HandleProtocol, handles[i], &blkio_guid,
> (void **)&blkio);
> if (EFI_ERROR(status))
> @@ -193,53 +197,57 @@ efi_diskprobe(void)
> di = alloc(sizeof(struct diskinfo));
> efid_init(di, blkio);
>
> - if (efi_bootdp == NULL)
> + if (efi_bootdp == NULL || depth == -1 || bootdev != 0)
> goto next;
> status = EFI_CALL(BS->HandleProtocol, handles[i], &devp_guid,
> (void **)&dp);
> if (EFI_ERROR(status))
> goto next;
> - if (!efi_device_path_cmp(efi_bootdp, dp, HARDWARE_DEVICE_PATH)&&
> - !efi_device_path_cmp(efi_bootdp, dp, ACPI_DEVICE_PATH) &&
> - !efi_device_path_cmp(efi_bootdp, dp, MESSAGING_DEVICE_PATH))
> + if (efi_device_path_ncmp(efi_bootdp, dp, depth) == 0) {
> + TAILQ_INSERT_HEAD(&efi_disklist, di, list);
> bootdev = 1;
> + continue;
> + }
> next:
> - if (bootdev)
> - TAILQ_INSERT_HEAD(&efi_disklist, di, list);
> - else
> - TAILQ_INSERT_TAIL(&efi_disklist, di, list);
> + TAILQ_INSERT_TAIL(&efi_disklist, di, list);
> }
>
> free(handles, sz);
> }
>
> static int
> -efi_device_path_cmp(EFI_DEVICE_PATH *dpa, EFI_DEVICE_PATH *dpb, int dptype)
> +efi_device_path_depth(EFI_DEVICE_PATH *dp, int dptype)
> {
> - int cmp;
> - EFI_DEVICE_PATH *dp, *dpt_a = NULL, *dpt_b = NULL;
> + int i;
>
> - for (dp = dpa; !IsDevicePathEnd(dp); dp = NextDevicePathNode(dp)) {
> - if (DevicePathType(dp) == dptype) {
> - dpt_a = dp;
> - break;
> - }
> - }
> - for (dp = dpb; !IsDevicePathEnd(dp); dp = NextDevicePathNode(dp)) {
> - if (DevicePathType(dp) == dptype) {
> - dpt_b = dp;
> - break;
> - }
> + for (i = 0; !IsDevicePathEnd(dp); dp = NextDevicePathNode(dp), i++) {
> + if (DevicePathType(dp) == dptype)
> + return (i);
> }
>
> - if (dpt_a && dpt_b) {
> - cmp = DevicePathNodeLength(dpt_a) - DevicePathNodeLength(dpt_b);
> + return (-1);
> +}
> +
> +static int
> +efi_device_path_ncmp(EFI_DEVICE_PATH *dpa, EFI_DEVICE_PATH *dpb, int deptn)
> +{
> + int i, cmp;
> +
> + for (i = 0; i < deptn; i++) {
> + if (IsDevicePathEnd(dpa) || IsDevicePathEnd(dpb))
> + return ((IsDevicePathEnd(dpa) && IsDevicePathEnd(dpb))
> + ? 0 : (IsDevicePathEnd(dpa))? -1 : 1);
> + cmp = DevicePathNodeLength(dpa) - DevicePathNodeLength(dpb);
> + if (cmp)
> + return (cmp);
> + cmp = memcmp(dpa, dpb, DevicePathNodeLength(dpa));
> if (cmp)
> return (cmp);
> - return (memcmp(dpt_a, dpt_b, DevicePathNodeLength(dpt_a)));
> + dpa = NextDevicePathNode(dpa);
> + dpb = NextDevicePathNode(dpb);
> }
>
> - return ((uintptr_t)dpt_a - (uintptr_t)dpt_b);
> + return (0);
> }
>
> /***********************************************************************
>
>
>
>