On Tue, Nov 16, 2021 at 02:42:05PM +1100, Daniel Axtens wrote: > Background > ---------- > > Figuring out how to lay out memory in powerpc OpenFirmware is a bit > of a complicate dance. > > Firstly, firmware needs to reserve a little bit of space for things > like interrupt vectors that live at a fixed address. This is usually > 0x4000 bytes. PFW calls this "stage 1" (of the firmware, not the > bootloader!) > > As discussed in the previous patch, the ELF image is loaded at > 'load-base' before it's unpacked. load-base is, by default, set at the > end of stage 1. From there, the ELF loader unpacks the binary to > wherever the program headers say and the program is executed. > > Next in memory, we need space for the rest of firmware. (PFW calls > this "stage 2" of firmware.) The starting address begins at > 'real-base'.* We need to not run past real-base when loading our ELF > binary. > > load-base and real-base have defaults from firmware, and may be > configurable in various ways. > > On PFW: > > - real-base defaults to 12MB (0xc00000) > > - real-base is configurable with the IEEE1275 ELF note. > > - a proprietary OS bootloader configures real-base to > 0x2000000 (32MB). > > On SLOF: > > - real-base is set dynamically towards the end of accessible memory. > > - real-base is not configurable. > > On 32-bit, I'm not sure quite what the story is. I don't have any > 32-bit Apple hardware to test with. However, with this change, grub > still loads and runs, including when I hack up the tests to install > the note by default. > > * I'm assuming here that the firmware doesn't do virtual mode. This is > true on Power for both PFW and SLOF; Apple OF implementations may do > things differently. > > Moving real-base > ---------------- > > To account for growing grub binary sizes, we want to try to expand the > amount of memory that we have to work with. We have the following > constraints and inputs: > > - A good practical limit for the size of the grub binary is 8MB, as > that's about the size of the PReP partition on a number of distro > setups. (See previous patch.) > > - We also want things to work if people forget to include the > note. Even if distros build it in to signed images, people > running grub-install will probably forget to set it and we don't > want to break their systems. (Helpfully, if you're running > grub-install manually there's a decent chance you're not building > in a bunch of modules so things are likely to be smaller anyway.) > > - We want to avoid doing anything too novel with enterprise software. > > So when the note is included, set real-base to 32MB. > > Results > ------- > > This means that: > > - The ELF file will be loaded at 0x4000 and have just short of 8MB to > fit into. (This is entirely the work of the previous patch - the > 8MB limitation is because we now load at 8MB instead of 2MB.) > > - Nothing changes on SLOF, because SLOF ignores the note. We have > oodles of space in SLOF. > > - On PFW when the note is not installed, we have about 4MB of space > for ELF loader to put the program into (the gap between 8MB and the > default real-base of 12MB). This is well more than any current grub > image uses. > > - On PFW when the note _is_ installed, we will have about 24MB of > space to put the program bits into. This is well more than we're > likely to use unless people start putting very large arrays in BSS, > but it means we're aligned with a proprietary bootloader and > therefore we can be assured that some testing has been done.
May I ask why 'proprietary' is used here to describe the usecase ? Does it possess any meaningful words like supportability to the firmware vendor that OS vendor have to think over before enabling the note for a 'general' feature like powerpc secure boot ? Thanks, Michael > > Signed-off-by: Daniel Axtens <d...@axtens.net> > --- > util/grub-mkimagexx.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/util/grub-mkimagexx.c b/util/grub-mkimagexx.c > index d78fa3e53308..2ac40b82a22d 100644 > --- a/util/grub-mkimagexx.c > +++ b/util/grub-mkimagexx.c > @@ -467,7 +467,7 @@ SUFFIX (grub_mkimage_generate_elf) (const struct > grub_install_image_target_desc > note_ptr->header.n_type = grub_host_to_target32 > (GRUB_IEEE1275_NOTE_TYPE); > strcpy (note_ptr->name, GRUB_IEEE1275_NOTE_NAME); > note_ptr->descriptor.real_mode = grub_host_to_target32 (0xffffffff); > - note_ptr->descriptor.real_base = grub_host_to_target32 (0x00c00000); > + note_ptr->descriptor.real_base = grub_host_to_target32 (0x02000000); > note_ptr->descriptor.real_size = grub_host_to_target32 (0xffffffff); > note_ptr->descriptor.virt_base = grub_host_to_target32 (0xffffffff); > note_ptr->descriptor.virt_size = grub_host_to_target32 (0xffffffff); > -- > 2.32.0 > > > _______________________________________________ > Grub-devel mailing list > Grub-devel@gnu.org > https://lists.gnu.org/mailman/listinfo/grub-devel _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel