В Wed, 28 Jan 2015 00:56:30 +0000 Steve McIntyre <st...@einval.com> пишет:
> Hi folks, > > I've been working in Debian on adding support for amd64 platforms > which are shipped with 32-bit UEFI firmware, such as the Asus X205TA > and other Bay Trail machines. As part of that, I've had a patch > accepted by the Linux EFI maintainers [1] to expose the size of the > underlying firmware to userland via a new sysfs file. It should make > mainline Linux very soon. > > Using that patch as a basis, I've patched grub to use the new sysfs > interface to work out the correct default x86 platform to match the > firmware. Colin's happy with the patch and has just accepted it for > Debian's grub package for now; I promised to submit it upstream for > review, so here it is. :-) > > Feedback welcome please! > > [1] http://article.gmane.org/gmane.linux.kernel.efi/5229 > > ===================================================================== > Some platforms might be capable of running a 64-bit Linux kernel but > only use a 32-bit EFI. To support such systems, it is necessary to > work out the size of the firmware rather than just the size of the > kernel. To enable that, there is now an extra EFI sysfs file to > describe the underlying firmware. Read that if possible, otherwise > fall back to the kernel type as before. > > Signed-off-by: Steve McIntyre <st...@einval.com> > --- > grub-core/osdep/linux/platform.c | 38 > +++++++++++++++++++++++++++++++++++++- > 1 file changed, 37 insertions(+), 1 deletion(-) > > diff --git a/grub-core/osdep/linux/platform.c > b/grub-core/osdep/linux/platform.c > index 4b9f6ef..5668ae5 100644 > --- a/grub-core/osdep/linux/platform.c > +++ b/grub-core/osdep/linux/platform.c > @@ -60,6 +60,42 @@ is_64_kernel (void) > return strcmp (un.machine, "x86_64") == 0; > } > > +static int > +read_platform_size (void) > +{ > + FILE *fp; > + char *buf = NULL; > + size_t len = 0; > + int ret = 0; > + > + /* Newer kernels can tell us directly about the size of the > + * underlying firmware - let's see if that interface is there. */ > + fp = grub_util_fopen ("/sys/firmware/efi/fw_platform_size", "r"); > + if (fp != NULL) > + { > + if (getline (&buf, &len, fp) > 0) size >= 2 > + { > + if (strncmp (buf, "32", 2) == 0) > + ret = 32; > + else if (strncmp (buf, "64", 2) == 0) > + ret = 64; > + } > + free (buf); > + fclose (fp); > + } > + > + if (ret == 0) > + /* Unrecognised - fall back to matching the kernel size instead */ > + { I usually prefer comments inside braces and indented accordingly. Could you send it suitable for git am? Mentioning platforms in commit message would be useful for reference. BTW, re subject - this is about installing 32 bit EFI grub on 64 bit Linux, not running, right? It already should be able to run kernel if installed appropriately manually. > + if (is_64_kernel ()) > + ret = 64; > + else > + ret = 32; > + } > + > + return ret; > +} > + > const char * > grub_install_get_default_x86_platform (void) > { > @@ -77,7 +113,7 @@ grub_install_get_default_x86_platform (void) > if (is_not_empty_directory ("/sys/firmware/efi")) > { > grub_util_info ("...found"); > - if (is_64_kernel ()) > + if (read_platform_size() == 64) > return "x86_64-efi"; > else > return "i386-efi"; _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel