Hi Andrew, On 4/14/22, 7:43 PM, "Andrew Fish" <af...@apple.com> wrote: > > >> On Apr 14, 2022, at 6:06 PM, Nate DeSimone <nathaniel.l.desim...@intel.com> >> wrote: >> >> Hi Marvin, >> >>> -----Original Message----- >>> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Marvin >>> Häuser >>> Sent: Thursday, April 14, 2022 12:56 AM >>> To: disc...@edk2.groups.io; Desimone, Nathaniel L >>> <nathaniel.l.desim...@intel.com> >>> Cc: Pedro Falcato <pedro.falc...@gmail.com>; edk2-devel-groups-io >>> <devel@edk2.groups.io>; adachristin...@gmail.com; Shi, Steven >>> <steven....@intel.com> >>> Subject: Re: [edk2-devel] [edk2-discuss] GSoC Proposal >>> >>> I feel like there are so many much easier solutions to this problem that >>> are at >>> most limited by the clear specification. The UEFI specification with >>> regards to >>> booting and all of that obviously is of utmost importance. >> >> If you have a better idea that retains compatibility with the existing UEFI >> PI then I would be happy to hear it. Ultimately anything we do needs to be a >> pure extension that retains compatibility with old code. Given that >> restriction having the ability to coalesce all the LibraryClasses into a >> single module and have cross-module linking seems like the best way to >> handle it to me. >> >>> The UEFI PI specification parts that deal about internal structure, as far >>> as I know, are >>> only in place to make it easy to integrate Intel IP. >> >> Its not just for Intel. The biggest reason for it to increase the >> standardization of the boot flow across the PC ecosystem. We have learned >> from experience that firmware is super critical to get a product out the >> door but it is also difficult to write. So we try to make it as reusable as >> humanly possible. >> >>> In fact, I don’t *know*, but I’m pretty sure the very strict separation >>> between PEI and DXE was >>> preserved mostly because MRC was 32-bit-only for a long time. Glad that >>> seems to have been resolved, AMD does memory init by PSP nowadays. >> >> Having less complex early stages chain load more complex later stages is a >> common design pattern in firmware, not just UEFI. For example, your typical >> ARM system loads kinda like this: >> >> PBL (SoC ROM) --> SBL (RAM Init) --> ARM Trust Zone --> Hypervisor --> EDK >> II or U-Boot or LittleKernel (which runs android fastboot) >> >> Comparing relative complexity I believe the Intel UEFI PI design is actually >> pretty simple when you consider how much it gets done: >> >> Ucode ROM --> SEC + PEI --> DXE + SMM + BDS >> >> My biggest criticism of the design is that the strict separation between PEI >> and DXE doesn't exist between DXE, SMM, and BDS 😊 >> >> There are a few reasons why PEI was 32-bit for quite some time. The biggest >> one is the code size increase, 64-bit x86 code is 20-30% larger than 32-bit >> x86 code. Since the only RAM Pre-Memory code has access to is the cache >> onboard the processor and for security reasons all that code has to fit >> within that RAM we generally do everything we can to make that image as >> small as possible. Second, 64-bit requires a page table and since we desired >> to keep PEI simple we tried to avoid that. Finally, the PI spec didn't allow >> a 64-bit PEI until recently. MRC is 32-bit code just because that is what >> PEI happens to be. Porting it to 64-bit is not terribly difficult. >> >> Ultimately the mix of 32/64-bit does cause some difficulties. Any data >> structures that get shared between PEI and DXE (HOBs, PCDs, etc.) need to >> resolve to the same size and packing. LibraryClasses need to be written to >> compile properly in both modes. In the case of FSP API mode you need to >> resort to thunking between 32 and 64-bit modes during DXE. More or less we >> decided that the costs are starting to outweigh the advantages. >> > >I’d also point out that x86 VMs use X64 (x86-64) PEI today and it works so the >32-bit/64-bit mix has nothing to do with UEFI/PI/edk2. > >In the PC ecosystem a single chipset family can power thousands of unique >designs. So the DRAM memory needs to be external, support lots of different >chipset packages(signal integrity...), support the lowest cost through the >highest cost DRAM and thousands of different board layouts. So programing DRAM >takes a masters degree in antenna design. I’ve seen MRC (Memory Reference >Code) with over a MiB of DEBUG prints in it, and it literally is printing >histograms of what it is tuning. So all this code has to run before the system >has any DRAM, thus it is running using the cache as RAM. I’ve not looked at >the x86 architecture specs form the vendors in a while, but back in the day >they did not support page tables in ROM or pinned cached. Now it might work, >but if it breaks your CPU vendor blames you so you don’t code PEI in X64…. > >We contributed the 1st edk2 ARM platform, Beagle Board, and It was a long time >ago but I seem to remember the mask ROM used a table in NOR FLASH to init >memory and then copied an image from NOR FLASH into DRAM and jumped to it. So >PEI is kind of not really needed and we implemented a PrePEI and jumped >directly to DXE. > >Given I was around back in the day when all this stuff was designed I can say >SEC was always a place holder for security code, as security code always has >to run 1st. PEI (Pre EFI) was designed to get DRAM programmed and then jump to >DXE. It kind of also fell in naturally to ACPI S3 flow since that was turning >memory back on. When we designed PEI we kind of though of it more like a boot >loader stage for the firmware that turned on memory and all the work would >happen in DXE. Then reality strikes and the existing BIOS assembly programmers >start learning C (lots of cranky people) and they start having to learn all >about PEI to turn on memory. They had to write a big chunk of code for the >memory init in PEI. These folks had never written any EFI code, so to them it >was easier to move a lot of the chipset init code into PEI as that is the >world they had to figure out to get memory turned on. I mean why learn EFI if >you don’t have to? So that is how we get so much code in IA32 (i386) on some >platforms. This start kind of biased future choices and how to enable non edk2 >code bases….
One of the big reasons a lot of code that should have been written in DXE ended up in PEI is unfortunately due to the FSP and its inability to support DXE code. > >Thanks, > >Andrew Fish > > >>> >>> For many good reasons, Linux does not provide a stable kernel API. This >>> allows to easily deploy breaking changes across the entire codebase. >>> Obviously, this is infeasible at a large scale when you need to integrate IP >>> blobs, but it would already help to break the expectation that UEFI PI is a >>> perfectly forwards- and backwards-compatible system. DXE has SetMem and >>> CopyMem as part of gBS. Maybe I don’t like it that much as part of the spec >>> itself, but it’s a good idea technically. I’d probably opt to have a quickly >>> accessible implementation detail of important function pointers appended to >>> PEI and DXE services, used by in-tree modules. This may break both >>> forwards- and backwards-compatibility, but as it only applies to in-tree >>> modules, that is fine so long as we let go of the compatibility notions. >>> PPIs >>> and protocols are an option too of course, but they have a lookup >>> performance penalty. Compared to dynamic linking, that should hopefully be >>> negligible however. >>> >>> Absolutely optional to read, I don’t intend to waste anyone’s time much, >>> some philosophical stuff about my rationale: >>> >>> If you started UEFI from scratch right now, would it have strictly separated >>> PEI and DXE? >> >> For sure a clean slate design started today would look a lot different than >> PEI/DXE... which was a clean slate design circa 1998 😊. In my opinion, if we >> were to suddenly go back to the drawing board we would build something that >> is much closer to a full OS now than we did back then. There have been cases >> where not being able to use interrupt handlers and not having thread >> scheduling has prevented implementation of desired features. The ARM guys >> built LittleKernel (https://github.com/littlekernel/lk) for a lot of these >> reasons. In the data center world some have decided to go to the extreme of >> putting an entire copy of Linux in SPI so they can do a network boot that >> downloads the OS image using BitTorrent! >> >>> The duplication between PEI and DXE core, and by extension >>> MM core, would be my most obvious place to start reducing size. I would >>> probably opt for a PEI/DXE hybrid where it starts in „minimal mode“ (maybe >>> think of PEI more like a microkernel here) and after memory is initialised, >>> the >>> rest of DXE is loaded. And MM core would get no loading at all, this >>> requirement has gladly been dropped ages ago. Just one prelinked snapshot >>> of the address space with a relocation table and a safe self-relocator on >>> entry >>> (this is needed at the very least for ARM). >>> >>> Ironically, with my idea for MM, dynamic loading would be free as everything >>> is prelinked anyway. The same is true for PEI XIP, it is prelinked by >>> nature. >> >> Actually Post-Memory PEI can have non-prelinked PEIMs. And that does get >> used for the PEI GOP driver. >> >>> What I do not like is the additional dynamic linking code at load-time for >>> non- >>> XIP modules. Though, the more I think about it, the more I wonder whether >>> not the entirety of UEFI could be composed of prelinked, relocatable >>> memory snapshots without traditional image loading entirely (for in-FW >>> stuff). macOS has a similar concept with its “Kernel Collections”. Well, way >>> too much off-topic now. :) >> >> If you make the assumption that 100% of the code is compiled all at once >> then yes that works. UEFI was designed so that assumption does not need to >> be true. There are good use cases for it: OpROMs, generic OS loaders, >> network boot, etc. >> >> Thanks, >> Nate >> >>> >>> Why am I explaining all this despite the fact everyone knows this will never >>> happen? Because I don’t like the notion of fixing issues of an already >>> overcomplicated system by adding even more complicated stuff. Especially >>> when the existing overcomplicated stuff is already uncomfortably broken. >>> >>> Best regards, >>> Marvin >>> >>>> For XIP PEI code… it will really help and would be very timely since the >>> transition of PEI from 32-bit to 64-bit is going to increase the size of >>> PEI by >>> ~20%. >>>> >>>> Thanks, >>>> Nate >>>> >>>> From: Pedro Falcato <pedro.falc...@gmail.com> >>>> Sent: Wednesday, April 13, 2022 11:43 AM >>>> To: edk2-devel-groups-io <devel@edk2.groups.io>; Marvin Häuser >>>> <mhaeu...@posteo.de> >>>> Cc: disc...@edk2.groups.io; adachristin...@gmail.com; Desimone, >>>> Nathaniel L <nathaniel.l.desim...@intel.com>; Shi, Steven >>>> <steven....@intel.com> >>>> Subject: Re: [edk2-devel] [edk2-discuss] GSoC Proposal >>>> >>>> Hi Marvin, Ada, >>>> >>>> Some comments: >>>> >>>> I don't think the purpose of the dynamic linker is to treat EFI as a >>>> complete operating system, but to try to eliminate the static linking >>>> that may be needlessly duplicating code that could instead be put in a >>> single dynamic library. For instance, MdePkg and MdeModulePkg are linked >>> into a *lot* of .efi, instead of being just a library. It'd be nice to see >>> some >>> numbers on this (something like Google's bloaty could be run on every .efi >>> file, in order to understand how much file space we would actually save). >>>> >>>> Other comments inline. >>>> >>>> On Wed, Apr 13, 2022 at 4:15 PM Marvin Häuser >>> <mhaeu...@posteo.de<mailto:mhaeu...@posteo.de>> wrote: >>>> >>>> On 13. Apr 2022, at 16:38, Ada Christine >>> <adachristin...@gmail.com<mailto:adachristin...@gmail.com>> wrote: >>>> i was replying via the groups.io<http://groups.io> web interface, I'm >>>> guessing that messed up the thread? i haven't used mailing lists >>>> before and don't know how they work. I'll use my mail client from here on. >>>> >>>> I'm on board with not treating EFI as an operating system. the more i >>>> think about it the more it looks like scope creep. >>>> >>>> Agreed. >>>> >>>> >>>> I'm not quite as enthusiastic >>>> about it as i was at first glance. >>>> >>>> I'm still keen on doing my gsoc proposal for edk, though, and even if >>>> this task and the acpica application are decided to be out of scope >>>> unit testing, >>>> >>>> How about fuzz-testing? This is also something edk2 needs quite badly. At >>> Acidanthera, we compile edk2 code in userspace outside the edk2 build >>> system and fuzz with dummy applications. >>>> >>>> Note: fuzzing is also part of the LLVM instrumentation suite (see >>> https://llvm.org/docs/LibFuzzer.html) and is something I could happily >>> mentor. >>>> clang integration >>>> >>>> Pedro and Vitaly are looking for someone to finish ASan: >>>> https://edk2.groups.io/g/devel/topic/90010978#87991 >>>> There are working UBSan concepts, but they also need to be mainlined. >>>> >>>> Is Vitaly going to be a mentor? I was assuming it was going to be me and >>> some other, more senior, mentor (possibly Steven Shi, which I included in >>> the task). >>>> Anyway, re: ASAN, if the project includes ASAN, UBSAN and possibly >>>> some other sanitizer it's quite possible that it could be considered a >>>> large >>> project (which means more hours but a larger stipend too). Fuzzing + >>> coverage could be very nice additions to this project idea. >>>> Also, is stress-testing a decent idea? >>>> >>>> >>>> and source-level debugging are all relevant to my interests. >>>> >>>> how about your ideas for security stuff? >>>> >>>> I want the entirety of MM to leverage SmmMemLib and to support SMAP. >>> SmmMemLib would then handle UEFI->MMRAM and BaseMemoryLib would >>> only work on MMRAM. Also evaluation of how to best avoid pointers in MM >>> communication buffers would be nice. >>>> >>>> There also is a bunch of other stuff, like working out moving a part of >>> CpuDxe into DxeCore to have memory protection live immediately, memory >>> protection in PEI, a replacement for the TE format (it’s buggy and most >>> platforms mostly abandoned it over various issues), and alternatives to >>> guarding critical code with SMM (like allowing NVRAM commits only as part >>> of a reboot). >>>> >>>> I personally find all of those projects very important, but I cannot >>>> promise many people agree. Especially those that impose global changes >>>> (most notably the TE replacement) may be very tedious to submit. >>>> Gladly, I believe you can submit multiple proposals (?) >>>> >>>> Best regards, >>>> Marvin >>>> >>>> >>>> I'm not very knowledgeable about >>>> trusted platform or secure boot but I'm willing to learn whatever is >>>> necessary to get something spun up for my proposal. >>>> >>>> On Wed, Apr 13, 2022, 12:05 Marvin Häuser >>> <mhaeu...@posteo.de<mailto:mhaeu...@posteo.de>> wrote: >>>> >>>> >>>> Do you use the “reply all” option in your mail client? Looks like my >>>> CCs have been dropped again. Comments inline. >>>> >>>> On 13. Apr 2022, at 12:54, Ada Christine >>>> <adachristin...@gmail.com<mailto:adachristin...@gmail.com>> >>>> wrote: >>>> Hi, Marvin >>>> >>>> Its similarity to my own latest experiment is the key to what grabbed >>>> my attention. I have no particular use case in mind for it, but I see >>>> its potential for anybody developing larger applications in that when >>>> a library is changed there's no need to distribute a new version of >>>> the whole binary, just the relevant library module. >>>> >>>> I really do not like the trend of treating UEFI as a full-fledged OS - >>>> it is not. The most used UEFI applications, OS loaders, are really not >>>> that huge and are distributed as part of the OS image anyway. Even for >>>> less used applications, you will always get a full snapshot anyhow. >>>> Gladly we don’t have auto-update and package management yet. :) >>>> >>>> >>>> I slept on it and it occurred to me that the whole thing could operate >>>> similarly to the shell protocol in that the linker/loader is itself an >>>> application that does a LoadImage() on the application needing dynamic >>>> linking facilities. >>>> >>>> That would mean the linker itself is shipped with every application >>>> that requires it? Otherwise it doesn’t make much sense for it to be an >>>> app and below’s problems apply. >>>> >>>> If however the whole plan is making the linker as a DXE and including >>>> it with the firmware, that I'm not quite as sure about. That would >>>> necessarily tie any applications using dynamic linking to TianoCore or >>>> any firmware distribution that derives from it. >>>> >>>> I think that was the idea referred to as “edk2 core” by Steven, but >>>> I’d like to hear his proposal to be sure. Virtually everyone uses >>>> edk2, so that itself is not the problem, but versioning is. Vendors >>>> are slow to update their snapshots or have just given up doing that >>>> entirely. Distributing it for external applications like OS loaders >>>> would mean this can be leveraged probably no earlier than 10 years >>>> from now. And for in-firmware things, I have a hard time thinking about a >>> use-case that outweighs the drawbacks. >>>> >>>> >>>> To shift the topic slightly back to GSoC, however, I'm willing to work >>>> on other items on the task list. Unit testing and an ACPICA >>>> application are the alternative projects I had thought about. I need >>>> to choose fairly soon as the proposal deadline is next Tuesday. I know >>>> a tiny bit about porting ACPICA as I also have plans to incorporate it >>>> into my >>> own project. >>>> >>>> I have a few more ideas for security stuff, but Nate did not confirm >>>> them as appropriate yet and I’m not here to drive you away from this >>>> specific task (or the others). However, I’m still curious and >>>> concerned. :) >>>> >>>> Best regards, >>>> Marvin >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> -- >>>> Pedro Falcato >>>> >>>> >>>> >>>> >>>> >>> >>> >>> >>> >>> >> >> >> >> >> >> > > -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#88926): https://edk2.groups.io/g/devel/message/88926 Mute This Topic: https://groups.io/mt/90435699/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-