Date: Sat, 2 Sep 2017 11:26:50 -0600 From: Warner Losh <imp@bsdimp.com> To: Tomoaki AOKI <junchoon@dec.sakura.ne.jp> Cc: "svn-src-head@freebsd.org" <svn-src-head@freebsd.org>, Warner Losh <imp@freebsd.org>, Steven Hartland <smh@freebsd.org> Subject: Re: svn commit: r322941 - head/sys/boot/efi/boot1 Message-ID: <CANCZdfoK=2%2BFa=jEjGOUeipxdFZTnQ8hxxThQDsQAY2KJWEOtA@mail.gmail.com> In-Reply-To: <CANCZdfoDk6fyNL=jJAxn%2BL=WZ84HwkpJDtM1PDhPPJ6HWmeYPw@mail.gmail.com> References: <20170902164311.eb7e5d2fa0e40f3b4e5e6142@dec.sakura.ne.jp> <CANCZdfoDk6fyNL=jJAxn%2BL=WZ84HwkpJDtM1PDhPPJ6HWmeYPw@mail.gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Sat, Sep 2, 2017 at 11:25 AM, Warner Losh <imp@bsdimp.com> wrote: > > > On Sat, Sep 2, 2017 at 1:43 AM, Tomoaki AOKI <junchoon@dec.sakura.ne.jp> > wrote: > >> Hi. >> >> This broke boot drive selection functionality by smh@ at r295320 on >> Feb.5, 2016. [1] >> Now, even if I forcibly select 2nd HDD via UEFI firmware, boot1.efi >> (as bootx64.efi) selects /boot/loader.efi on 1st HDD. Each boot >> partition are ZFS pools. Confirmed previous rev was OK. >> >> Attached is the boot log (with EFI_DEBUG). Pool zsysS02 should be >> selected there instead of zsysS01. As I have no serial console, there >> can be some typos. (Took video and hand-typed.) >> >> The boot order should be as below (what smh@ implemented). >> >> 1. ZFS pool on which drive boot1.efi is read from. >> 2. UFS partition on which drive boot1.efi is read from. >> 3. If both 1 and 2 are missed, try from UEFI 1st drive and later. >> >> P.S. Another possibility (not tested yet): >> Not forcibly prefer 1st drive, but reversed selection. >> (If boot1.efi is on 1st drive, loader.efi on 2nd drive is read.) >> >> [1] >> https://lists.freebsd.org/pipermail/svn-src-head/2016-Februa >> ry/082215.html > > > Looks like the matching function that I replaced this stuff with wasn't > quite the same. Will fix. I hadn't thought I'd broken it, honestly, since > the setup I have still worked. The intent was to keep things as they were, > which clearly didn't happen in at least your case. I'll take a look at the > logs to see if I can spot the differences between the two setups. The > intent was to keep functionality, for now, the same. > > In the long term, though, this guessing and matching is going to end up > first as deprecated and then as removed. To be replaced by a boot1.efi that > follows the EFI Boot Manager protocol where exactly what to load is > contained in EFI env variables. That's what all my changes to boot1 have > been working towards. > > Warner > P.S. This is the doc I put together for discussion. I'm keeping it updated as each stage is implemented. https://docs.google.com/document/d/1aK9IqF-60JPEbUeSAUAkYjF2W_8EnmczFs6RqCT90Jg/edit Lemme know if you have any comments. Warner > > Author: imp >> > Date: Sun Aug 27 03:10:16 2017 >> > New Revision: 322941 >> > URL: https://svnweb.freebsd.org/changeset/base/322941 >> > >> > Log: >> > Eliminate redunant device path matching. >> > >> > Use efi_devpath_match instead of device_paths_match. They are >> > functionally the same. Remove device_paths_match from boot1.c and call >> > efi_devpath_match instead. >> > >> > Sponsored by: Netflix >> > >> > Modified: >> > head/sys/boot/efi/boot1/boot1.c >> > >> > Modified: head/sys/boot/efi/boot1/boot1.c >> > ============================================================ >> ================== >> > --- head/sys/boot/efi/boot1/boot1.c Sat Aug 26 23:13:18 2017 >> (r322940) >> > +++ head/sys/boot/efi/boot1/boot1.c Sun Aug 27 03:10:16 2017 >> (r322941) >> > @@ -76,53 +76,6 @@ Free(void *buf, const char *file __unused, int line >> __ } >> > >> > /* >> > - * nodes_match returns TRUE if the imgpath isn't NULL and the nodes >> match, >> > - * FALSE otherwise. >> > - */ >> > -static BOOLEAN >> > -nodes_match(EFI_DEVICE_PATH *imgpath, EFI_DEVICE_PATH *devpath) >> > -{ >> > - size_t len; >> > - >> > - if (imgpath == NULL || imgpath->Type != devpath->Type || >> > - imgpath->SubType != devpath->SubType) >> > - return (FALSE); >> > - >> > - len = DevicePathNodeLength(imgpath); >> > - if (len != DevicePathNodeLength(devpath)) >> > - return (FALSE); >> > - >> > - return (memcmp(imgpath, devpath, (size_t)len) == 0); >> > -} >> > - >> > -/* >> > - * device_paths_match returns TRUE if the imgpath isn't NULL and all >> nodes >> > - * in imgpath and devpath match up to their respective occurrences of a >> > - * media node, FALSE otherwise. >> > - */ >> > -static BOOLEAN >> > -device_paths_match(EFI_DEVICE_PATH *imgpath, EFI_DEVICE_PATH *devpath) >> > -{ >> > - >> > - if (imgpath == NULL) >> > - return (FALSE); >> > - >> > - while (!IsDevicePathEnd(imgpath) && !IsDevicePathEnd(devpath)) >> { >> > - if (IsDevicePathType(imgpath, MEDIA_DEVICE_PATH) && >> > - IsDevicePathType(devpath, MEDIA_DEVICE_PATH)) >> > - return (TRUE); >> > - >> > - if (!nodes_match(imgpath, devpath)) >> > - return (FALSE); >> > - >> > - imgpath = NextDevicePathNode(imgpath); >> > - devpath = NextDevicePathNode(devpath); >> > - } >> > - >> > - return (FALSE); >> > -} >> > - >> > -/* >> > * devpath_last returns the last non-path end node in devpath. >> > */ >> > static EFI_DEVICE_PATH * >> > @@ -318,7 +271,7 @@ probe_handle(EFI_HANDLE h, EFI_DEVICE_PATH >> *imgpath, B >> > if (!blkio->Media->LogicalPartition) >> > return (EFI_UNSUPPORTED); >> > >> > - *preferred = device_paths_match(imgpath, devpath); >> > + *preferred = efi_devpath_match(imgpath, devpath); >> > >> > /* Run through each module, see if it can load this partition >> */ >> > for (i = 0; i < NUM_BOOT_MODULES; i++) { >> >> -- >> Tomoaki AOKI <junchoon@dec.sakura.ne.jp> >> > >
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CANCZdfoK=2%2BFa=jEjGOUeipxdFZTnQ8hxxThQDsQAY2KJWEOtA>