On Wed, May 10, 2017 at 08:35:28PM +0200, Patrick Wildt wrote:
> On Wed, May 10, 2017 at 03:14:30PM +0200, Stefan Sperling wrote:
> > On Tue, May 09, 2017 at 09:47:14PM +0200, Michele Curti wrote:
> > >                           bios_bootdev = 0x80;
> > > -                         efi_bootdp = dp0;
> > > +                         efi_bootdp = dp;
> > >                           break;
> > >                   }
> > >           }
> > > 
> > 
> 
> 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");
> 

4e 6f - 5f 2d - 22 4e - 4e 55 - 3a 48 - 1e ce - and many others ........

I got the same values starting the for loop with dp = dp0 or dp = NULL

So dp0 was not intialized by the EFI_CALL() above?

        if (status == EFI_SUCCESS)
                status = EFI_CALL(BS->HandleProtocol, imgp->DeviceHandle,
                    &devp_guid, (void **)&dp0);
        if (status == EFI_SUCCESS) {


I'm going to study a bit about EFI.. :p

Thanks,
Michele

> 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?

Reply via email to