[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 0/2] xen/efi: Make boot more flexible, especially with GRUB2



On Thu, Jun 26, 2025 at 4:03 PM Marek Marczykowski-Górecki
<marmarek@xxxxxxxxxxxxxxxxxxxxxx> wrote:
>
> On Thu, Jun 26, 2025 at 09:12:53AM +0100, Frediano Ziglio wrote:
> > On Wed, Jun 25, 2025 at 9:26 PM Marek Marczykowski-Górecki
> > <marmarek@xxxxxxxxxxxxxxxxxxxxxx> wrote:
> > >
> > > On Tue, Jun 24, 2025 at 09:38:42AM +0100, Frediano Ziglio wrote:
> > > > On Tue, Jun 24, 2025 at 9:32 AM Frediano Ziglio
> > > > <frediano.ziglio@xxxxxxxxx> wrote:
> > > > >
> > > > > The combination of GRUB2, EFI and UKI allows potentially more 
> > > > > flexibility.
> > > > > For instance is possible to load xen.efi from a no ESP partition 
> > > > > leaving
> > > > > a boot loader like GRUB2 taking care of the file loading.
> > > > > This however requires some changes in Xen to be less restrictive.
> > > > > Specifically for GRUB2 these changes allows the usage of "chainloader"
> > > > > command with UKI and reading xen.efi from no ESP (so no DeviceHandle
> > > > > set) and usage of "linux" and "initrd" commands to load separately
> > > > > the kernel (embedding using UKI) and initrd (using LoadFile2 
> > > > > protocol).
> > > >
> > > > I was forgetting. If somebody wants to test "linux" and "initrd"
> > > > command with these changes be aware that GRUB currently has a problem
> > > > passing arguments, I posted a patch, see
> > > > https://lists.gnu.org/archive/html/grub-devel/2025-06/msg00156.html.
> > > > I also have a workaround for this issue in xen but it would be better
> > > > to have a fix in GRUB.
> > >
> > > Can you tell more how to test this, especially the second variant? When
> > > trying to use GRUB linux or linuxefi commands on xen.efi, I get "invalid
> > > magic number" error.
> > >
> >
> > That's weird.
> >
> > Be the way. As usual I have a super complicated script that does everything.
> >
> > But to simplify:
> > - I compile xen (plain upstream plus my patches) with "make -C
> > ~/work/xen/xen -j O=normal MAP"
>
> Is there any that would be related to the "invalid magic" error? IIUC
> without your patches options will be mangled, but I don't think I get
> this far.
>

I tried to do some changes and check the CI with your branch. Not hard
to reproduce and the test looks correct.
Looking at GRUB code I can see various "linux" command implementations
and it looks like yours is picking up i386-pc target and not
x86_64-efi one which is really odd to me.

> > - output xen.efi in "~/work/xen/xen/normal/xen.efi"
> > - add configuration and kernel with "./add_sections xen.efi
> > xen.unified.efi .config xen.cfg .kernel vmlinuz-xen"
> > - boot using patched Grub (or patched Xen, to handle command line, if
> > you don't care about command line you can use a stock one), the menu
> > entry is
> >
> > menuentry 'XenServer (Serial)' {
> >         search --label --set root EFI-BOOT
> >         linux /boot/xen.unified.efi -- com1=115200,8n1
> > console=com1,vga dom0_mem=1232M,max:1232M watchdog dom0_max_vcpus=1-4
> > crashkernel=256M,below=4G -- root=LABEL=root-qjhppe ro nolvm
> > hpet=disable console=tty0 console=hvc0
> >         initrd /boot/initrd.img
> > }
>
> All looks quite similar. FWIW my setup is:
> https://gitlab.com/xen-project/people/marmarek/xen/-/blob/test-uki/automation/scripts/qemu-smoke-x86-64-efi-uki.sh?ref_type=heads
>
> Booting such UKI from OVMF directly works, as well as with
> "chainloader" grub command:
>
> https://gitlab.com/xen-project/people/marmarek/xen/-/pipelines/1891308263
>
> CI uses Grub 2.06 from Debian, but I get the same result with 2.12 from
> Fedora too.
>
> >
> > xen.cfg file:
> > ----------
> > [global]
> > default=xen
> >
> > [xen]
> > ----------
> >
> > add_sections file:
> > ----------
> > #!/usr/bin/env perl
> > use strict;
> >
> > die if $#ARGV < 1;
> > my $in = shift @ARGV;
> > my $out = shift @ARGV;
> >
> > my $max = 0;
> > open(IN, "objdump -h $in |") or die;
> > while (<IN>) {
> >         next if !/^\s*\d+\s+\S+\s+([0-9a-f]+)\s+([0-9a-f]+)\s+/;
> >         my $val = hex($1) + hex($2);
> >         $max = $val if $val > $max;
> > }
> > close(IN);
> >
> > sub up($) {
> >         my $n = shift;
> >         return ($n + 4095) & -4096;
> > }
> >
> > my @args = ('objcopy');
> >
> > my $start = up($max);
> > while ($#ARGV >= 1) {
> >         my $name = shift;
> >         my $fn = shift;
> >         push @args, '--add-section', "$name=$fn";
> >         push @args, '--change-section-vma', sprintf("%s=%#x", $name, 
> > $start);
> >         $start += -s $fn;
> >         $start = up($start);
> > }
> > push @args, $in, $out;
> > print "Executing @args\n";
> > system(@args) == 0 || die "Error!";
> > ----------
> >
> > My script creates the initrd, builds a full disk for Qemu and launches
> > Qemu too with specific options.
> >
> > Frediano
>
> --
> Best Regards,
> Marek Marczykowski-Górecki
> Invisible Things Lab



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.