From owner-freebsd-hackers@freebsd.org Mon May 16 08:51:33 2016 Return-Path: Delivered-To: freebsd-hackers@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 94680B3D6C5 for ; Mon, 16 May 2016 08:51:33 +0000 (UTC) (envelope-from nao@enuenu.org) Received: from mail.tee-n.com (32.161.192.61.east.global.crust-r.net [61.192.161.32]) by mx1.freebsd.org (Postfix) with ESMTP id 5791E1E0F for ; Mon, 16 May 2016 08:51:32 +0000 (UTC) (envelope-from nao@enuenu.org) Received: from melon.enuenu.site (melon.enuenu.site [192.168.30.10]) by mail.tee-n.com (Postfix) with ESMTP id 8C5AAB1F3E; Mon, 16 May 2016 17:51:24 +0900 (JST) Received: from [192.168.30.136] (dhcp30136.enuenu.site [192.168.30.136]) by melon.enuenu.site (Postfix) with ESMTP id 85E0C5712D; Mon, 16 May 2016 17:51:24 +0900 (JST) Subject: Re: Update on EFI work: refactoring ready for testing, GELI coming very soon To: Eric McCorkle , Oliver Pinter References: <1C7554E1-DF5F-4D86-B4D3-757CF55FCB9E@metricspace.net> Cc: "freebsd-hackers@freebsd.org" From: Naomichi Nonaka Message-ID: <58159dcd-4187-473f-4a20-1d2f7a20c955@enuenu.org> Date: Mon, 16 May 2016 17:51:23 +0900 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.0 MIME-Version: 1.0 In-Reply-To: <1C7554E1-DF5F-4D86-B4D3-757CF55FCB9E@metricspace.net> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit X-Mailman-Approved-At: Mon, 16 May 2016 11:28:44 +0000 X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 16 May 2016 08:51:33 -0000 Hi Eric. On 2016/05/16 5:37, Eric McCorkle wrote: > How close is that patch to going in? > > Something like this would be pretty straightforward following the > refactoring; however, its worth considering all the options here: > > * GRUB works fine pulling loader off the disk, with either ZFS or UFS, > with no boot1 at all. This was my setup for developing the ZFS support, > actually. Is Grub + loader really work in EFI mode ? My test results are 1) Grub's kfreebsd command does not support loader.efi 2) Chainload loader.efi in Grub couldn't show display. maybe it work in keadless but I didn't tested headless mode. 3) Chaiload boot1.efi in Grub works. That is why I wrote PR#207940. Maybe I miss something. So, If anyone successed to boot in Grub + loader.efi combination, please let me know. > * In theory it should be possible to install loader itself on the ESP > and install a /boot/config that points it to the real kernel and rootfs > > The takeaway is that boot1 is kind of an odd citizen in the EFI world. Year, I agree that. But I myself need boot menu, and expand boot1 seems better than to install Grub in Freebsd installer. > When you get into things like GELI support and secure boot (my next > planned thing after this), its role is much clearer, but at that point > it also becomes a key attack vector in a system that's presumably trying > to resist some level of tampering. > > What I'm getting at is that there is a future-oriented case for keeping > boot1 simple, and if it's a boot menu you want, grub is already an > option (also, the loader-only method). > > To be clear: I'm not opposed to adding this feature; I just want to make > sure these issues are given due consideration. I agree that too. Naomichi Nonaka > On May 15, 2016 12:00:58 PM EDT, Oliver Pinter > wrote: > > Hi Eric! > > Could you please take a look at this PR: > https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=207940 > This feature would be nice too. > > On 5/15/16, Eric McCorkle wrote: > > Hello everyone, > > I've been working on a rather significant refactoring of the EFI > boot/loader > code. While this was originally in support of adding GELI > support, it has > grown to such a scope that it could be considered a patch in its > own right. > > The branch containing my work can be found here: > https://github.com/emc2/freebsd/tree/efize > > The following is a summary of the changes: > * Both boot1 and loader have been redesigned to look for > instances of > EFI_SIMPLE_FILESYSTEM_PROTOCOL and load using that interface. In > loader, > this is accomplished through a new synthetic filesystem driver > (called > efifs) that is just a wrapper around > EFI_SIMPLE_FILESYSTEM_PROTOCOL. In > boot, this is achieved by calling the interface directly. > * The efipart and filesystem back ends (including ZFS) have been > moved into > a drivers directory, where they have been wrapped up into a > filesystem > backend driver that does the same probing that loader does > today, and then > installs an EFI_SIMPLE_FILESYSTEM_INTERFACE on all device > handles that host > supported filesystems. This interface is a wrapper around the > filesystem > interface currently used by loader. > * boot now uses the same filesystem backend code as loader. This > increased > its size, necessitating recreation of the FAT templates. The old > boot > filesystem code and boot modules have been discarded. > * loader can use any protocol interface installed by boot just > fine. These > remain valid until ExitBootServices is called. Moreover, the probing > process is idempotent, and is run by both boot and loader, with > the first > one to run actually installing the interfaces. > * I had originally hoped to move the entire code base to use the > EFI driver > model, which would support hotplugging devices. However, the new > bcache > stuff currently requires that all devices be statically detected > before the > caches are used, which is fundamentally incompatible with this > way of doing > things. This was the sole blocker of such a transition (the > handles.c code > requires some minor modification as well, but nothing problematic) > * I had also considered altering the device name code to use textual > representations of EFI device paths, but I don't see any real > reason for > doing so. > * I have not touched efinet or nfs in this changeset. > > The rationale for these changes is as follows: > * The model of looking for EFI_SIMPLE_FILESYSTEM_PROTOCOL > instances and > using them to load things increases interoperability with other > systems. > For example, the new boot and loader would work just fine with > interfaces > installed by GRUB or another boot loader, or perhaps custom > filesystem > modules added into an open-source firmware implementation like > coreboot. > * This model works really well for functionality like GELI or custom > partition schemes that potentially create new devices. All you > do is create > one or more new device nodes, attach device paths and block io > interfaces, > and call ConnectController on them (for now, it's necessary to > make sure the > fs_driver runs AFTER) all new nodes have been created. This also > vastly > simplifies passing information between stages about filesystems > and devices > (this is important for GELI). > * This approach can leverage drivers that are mandated by the > EFI spec, like > the GPT partition driver. This avoids reimplementing such a > driver to > support partition schemes nested inside GELI volumes, for example. > * This model provides most of the groundwork for supporting hot > plugging of > devices at boot time. All that is required at this point is a > refactoring > of bcache to support adding new devices dynamically (I had to > draw the line > somewhere, and this had already gotten big enough, and I want to > focus on > GELI support) > * Getting rid of the duplicated and minimized filesystem code in > boot1 > improves maintainability. Indeed, the actual boot1 code is quite > small > now. > > Some notes and future work: > * In general, the FreeBSD loader framework and the EFI framework > do many > similar things. For the most part, there is a fairly direct > mapping, though > EFI interfaces tend to be more tedious. The one thing EFI does > decidedly > better is support dynamic detection of devices (hotplugging). > * There are some interesting possibilities for hotplugging > beyond just the > obvious. For example, loading GELI or other keys off of > hotplugged USB > sticks. > * I didn't touch efinet or nfs on this patch. It is certainly > possible to > efize them as well, but I don't have a test setup for doing so > (or frankly, > the motivation to do so). > * It might make more sense to use the EFI_LOAD_FILE_PROTOCOL to > do the > actual loading, as some applications support this without > supporting a full > filesystem interface (some embedded devices do this, as do some > network boot > protocols). However, this would involve changing the non-EFI > boot code and > interfaces, which is something I specifically wanted to avoid in > this work. > > This changeset can be tested as is, and should just work. > Disclaimer: I > rebased it to head yesterday, and haven't had time to build and > test it yet, > but I will. I know it works with ZFS, but I have no UFS systems > on which to > test that functionality. > > If you intend to test this, I STRONGLY recommend installing an > EFI shell on > your ESP, and then installing the modified boot block under > something like > boot.tst. This will allow you to run the modified boot block, > but fall back > to a working boot if it fails. Also, I had modified the loader > path to > /boot/loader.tst for similar reasons, and it may still be set to > that in the > code. > > I am currently adding GELI support as a proper EFI driver, and > should be > coming in the very near future (the code is already written, in > fact). If > anyone wants to test the refactoring by itself, any results or > comments are > certainly appreciated. > ------------------------------------------------------------------------ > > freebsd-hackers@freebsd.org mailing list > https://lists.freebsd.org/mailman/listinfo/freebsd-hackers > To unsubscribe, send any mail to > "freebsd-hackers-unsubscribe@freebsd.org" > > > > -- > Sent from my Android device with K-9 Mail. Please excuse my brevity.