* [PATCH] grub-install: Include all decompressor modules in pvxen core image. @ 2014-11-28 8:33 Ian Campbell 2014-11-28 17:09 ` Andrei Borzenkov 0 siblings, 1 reply; 11+ messages in thread From: Ian Campbell @ 2014-11-28 8:33 UTC (permalink / raw) To: grub-devel; +Cc: 755256, Ian Campbell From: Ian Campbell <ijc@debian.org> This avoids needing to update all the native update-grub stanzas to also probe for and arrange to load the relevant decompressor, which would be wasteful on native boots. Signed-off-by: Ian Campbell <ijc@debian.org> --- util/grub-install.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/util/grub-install.c b/util/grub-install.c index 7a7734e..6ad5afb 100644 --- a/util/grub-install.c +++ b/util/grub-install.c @@ -422,6 +422,14 @@ push_cryptodisk_module (const char *mod, void *data __attribute__ ((unused))) } static void +push_all_decompressor_modules(void) +{ + grub_install_push_module ("gzio"); + grub_install_push_module ("xzio"); + grub_install_push_module ("lzopio"); +} + +static void probe_mods (grub_disk_t disk) { grub_partition_t part; @@ -1228,6 +1236,23 @@ main (int argc, char *argv[]) } } + + switch (platform) + { + case GRUB_INSTALL_PLATFORM_I386_XEN: + case GRUB_INSTALL_PLATFORM_X86_64_XEN: + /* When booting a Xen PV kernel grub may need to decompress the + * kernel which may use a variety of algorithmns. Since we try + * to reuse the native grub.cfg files rather than trying to + * insmod the relevant decompressors on the fly we build them + * into the core image. This means we avoid needlessly loading + * modules on native. */ + push_all_decompressor_modules(); + break; + default: + break; + } + grub_install_copy_files (grub_install_source_directory, grubdir, platform); -- 2.1.3 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH] grub-install: Include all decompressor modules in pvxen core image. 2014-11-28 8:33 [PATCH] grub-install: Include all decompressor modules in pvxen core image Ian Campbell @ 2014-11-28 17:09 ` Andrei Borzenkov 2014-11-28 17:25 ` Ian Campbell 0 siblings, 1 reply; 11+ messages in thread From: Andrei Borzenkov @ 2014-11-28 17:09 UTC (permalink / raw) To: Ian Campbell; +Cc: 755256, grub-devel, Ian Campbell В Fri, 28 Nov 2014 08:33:34 +0000 Ian Campbell <ijc@hellion.org.uk> пишет: > From: Ian Campbell <ijc@debian.org> > > This avoids needing to update all the native update-grub stanzas to also probe > for and arrange to load the relevant decompressor, which would be wasteful on > native boots. > Could you give some more details why you need it? > Signed-off-by: Ian Campbell <ijc@debian.org> > --- > util/grub-install.c | 25 +++++++++++++++++++++++++ > 1 file changed, 25 insertions(+) > > diff --git a/util/grub-install.c b/util/grub-install.c > index 7a7734e..6ad5afb 100644 > --- a/util/grub-install.c > +++ b/util/grub-install.c > @@ -422,6 +422,14 @@ push_cryptodisk_module (const char *mod, void *data __attribute__ ((unused))) > } > > static void > +push_all_decompressor_modules(void) > +{ > + grub_install_push_module ("gzio"); > + grub_install_push_module ("xzio"); > + grub_install_push_module ("lzopio"); > +} > + It is not enough. Some of them need another modules that are autoloaded by normal. > +static void > probe_mods (grub_disk_t disk) > { > grub_partition_t part; > @@ -1228,6 +1236,23 @@ main (int argc, char *argv[]) > } > } > > + > + switch (platform) > + { > + case GRUB_INSTALL_PLATFORM_I386_XEN: > + case GRUB_INSTALL_PLATFORM_X86_64_XEN: > + /* When booting a Xen PV kernel grub may need to decompress the > + * kernel which may use a variety of algorithmns. Since we try > + * to reuse the native grub.cfg files rather than trying to > + * insmod the relevant decompressors on the fly we build them > + * into the core image. This means we avoid needlessly loading > + * modules on native. */ > + push_all_decompressor_modules(); > + break; > + default: > + break; > + } > + > grub_install_copy_files (grub_install_source_directory, > grubdir, platform); > ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] grub-install: Include all decompressor modules in pvxen core image. 2014-11-28 17:09 ` Andrei Borzenkov @ 2014-11-28 17:25 ` Ian Campbell 2014-11-30 11:31 ` Andrei Borzenkov 0 siblings, 1 reply; 11+ messages in thread From: Ian Campbell @ 2014-11-28 17:25 UTC (permalink / raw) To: Andrei Borzenkov; +Cc: 755256, grub-devel On Fri, 2014-11-28 at 20:09 +0300, Andrei Borzenkov wrote: > В Fri, 28 Nov 2014 08:33:34 +0000 > Ian Campbell <ijc@hellion.org.uk> пишет: > > > From: Ian Campbell <ijc@debian.org> > > > > This avoids needing to update all the native update-grub stanzas to also probe > > for and arrange to load the relevant decompressor, which would be wasteful on > > native boots. > > > > Could you give some more details why you need it? In order to boot a Linux kernel under Xen grub needs to extract the ELF file from the bzImage payload, which is compressed. The compression algo is a kernel compile time option, gz and xz are the most probably ones today. > > +push_all_decompressor_modules(void) > > +{ > > + grub_install_push_module ("gzio"); > > + grub_install_push_module ("xzio"); > > + grub_install_push_module ("lzopio"); > > +} > > + > > It is not enough. Some of them need another modules that are autoloaded > by normal. autoloading should work, I think. But if not -- how can one determine which modules are required and/or arrange for them to be added automatically? > > > +static void > > probe_mods (grub_disk_t disk) > > { > > grub_partition_t part; > > @@ -1228,6 +1236,23 @@ main (int argc, char *argv[]) > > } > > } > > > > + > > + switch (platform) > > + { > > + case GRUB_INSTALL_PLATFORM_I386_XEN: > > + case GRUB_INSTALL_PLATFORM_X86_64_XEN: > > + /* When booting a Xen PV kernel grub may need to decompress the > > + * kernel which may use a variety of algorithmns. Since we try > > + * to reuse the native grub.cfg files rather than trying to > > + * insmod the relevant decompressors on the fly we build them > > + * into the core image. This means we avoid needlessly loading > > + * modules on native. */ > > + push_all_decompressor_modules(); > > + break; > > + default: > > + break; > > + } > > + > > grub_install_copy_files (grub_install_source_directory, > > grubdir, platform); > > > > ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] grub-install: Include all decompressor modules in pvxen core image. 2014-11-28 17:25 ` Ian Campbell @ 2014-11-30 11:31 ` Andrei Borzenkov 2014-11-30 11:51 ` Ian Campbell 0 siblings, 1 reply; 11+ messages in thread From: Andrei Borzenkov @ 2014-11-30 11:31 UTC (permalink / raw) To: Ian Campbell; +Cc: 755256, grub-devel В Fri, 28 Nov 2014 17:25:55 +0000 Ian Campbell <ijc@hellion.org.uk> пишет: > On Fri, 2014-11-28 at 20:09 +0300, Andrei Borzenkov wrote: > > В Fri, 28 Nov 2014 08:33:34 +0000 > > Ian Campbell <ijc@hellion.org.uk> пишет: > > > > > From: Ian Campbell <ijc@debian.org> > > > > > > This avoids needing to update all the native update-grub stanzas to also probe > > > for and arrange to load the relevant decompressor, which would be wasteful on > > > native boots. > > > > > > > Could you give some more details why you need it? > > In order to boot a Linux kernel under Xen grub needs to extract the ELF > file from the bzImage payload, which is compressed. > > The compression algo is a kernel compile time option, gz and xz are the > most probably ones today. > Not directly related but I this comment in Makefile draw my attention: # Note that the bytes added by size_append will make the xz tool think that # the file is corrupt. This is expected. We probably never read vmlinuz to the end anyway, but I wonder if it could be an issue. > > > +push_all_decompressor_modules(void) > > > +{ > > > + grub_install_push_module ("gzio"); > > > + grub_install_push_module ("xzio"); > > > + grub_install_push_module ("lzopio"); > > > +} > > > + > > > > It is not enough. Some of them need another modules that are autoloaded > > by normal. > > autoloading should work, I think. > OK, so you need it post-normal. core.img is really about getting access to /boot/grub; anything else can be done from within grub.cfg. If you do not want to load other filters unconditionally, just use if [ x$grub_platform = xxen ]; then insmod xzio fi But as far as I understand, CONFIG_KERNEL_XZ is not really dependent on Xen; so we may want to either load them for real hardware as well or - better - extend grub-file to check for compression method. > But if not -- how can one determine which modules are required and/or > arrange for them to be added automatically? > > > > > > +static void > > > probe_mods (grub_disk_t disk) > > > { > > > grub_partition_t part; > > > @@ -1228,6 +1236,23 @@ main (int argc, char *argv[]) > > > } > > > } > > > > > > + > > > + switch (platform) > > > + { > > > + case GRUB_INSTALL_PLATFORM_I386_XEN: > > > + case GRUB_INSTALL_PLATFORM_X86_64_XEN: > > > + /* When booting a Xen PV kernel grub may need to decompress the > > > + * kernel which may use a variety of algorithmns. Since we try > > > + * to reuse the native grub.cfg files rather than trying to > > > + * insmod the relevant decompressors on the fly we build them > > > + * into the core image. This means we avoid needlessly loading > > > + * modules on native. */ > > > + push_all_decompressor_modules(); > > > + break; > > > + default: > > > + break; > > > + } > > > + > > > grub_install_copy_files (grub_install_source_directory, > > > grubdir, platform); > > > > > > > > > ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] grub-install: Include all decompressor modules in pvxen core image. 2014-11-30 11:31 ` Andrei Borzenkov @ 2014-11-30 11:51 ` Ian Campbell 2014-11-30 11:52 ` Ian Campbell 2014-11-30 13:34 ` Ian Campbell 0 siblings, 2 replies; 11+ messages in thread From: Ian Campbell @ 2014-11-30 11:51 UTC (permalink / raw) To: Andrei Borzenkov; +Cc: 755256, grub-devel On Sun, 2014-11-30 at 14:31 +0300, Andrei Borzenkov wrote: > В Fri, 28 Nov 2014 17:25:55 +0000 > Ian Campbell <ijc@hellion.org.uk> пишет: > > > On Fri, 2014-11-28 at 20:09 +0300, Andrei Borzenkov wrote: > > > В Fri, 28 Nov 2014 08:33:34 +0000 > > > Ian Campbell <ijc@hellion.org.uk> пишет: > > > > > > > From: Ian Campbell <ijc@debian.org> > > > > > > > > This avoids needing to update all the native update-grub stanzas to also probe > > > > for and arrange to load the relevant decompressor, which would be wasteful on > > > > native boots. > > > > > > > > > > Could you give some more details why you need it? > > > > In order to boot a Linux kernel under Xen grub needs to extract the ELF > > file from the bzImage payload, which is compressed. > > > > The compression algo is a kernel compile time option, gz and xz are the > > most probably ones today. > > > > Not directly related but I this comment in Makefile draw my attention: > > # Note that the bytes added by size_append will make the xz tool think that > # the file is corrupt. This is expected. > > We probably never read vmlinuz to the end anyway, but I wonder if it > could be an issue. I've no idea. I don't see that comment anywhere in either Linux nor Grub codebase though. I do know that insmod xzio makes grub capable of booting the Debian kernel. > > > > +push_all_decompressor_modules(void) > > > > +{ > > > > + grub_install_push_module ("gzio"); > > > > + grub_install_push_module ("xzio"); > > > > + grub_install_push_module ("lzopio"); > > > > +} > > > > + > > > > > > It is not enough. Some of them need another modules that are autoloaded > > > by normal. > > > > autoloading should work, I think. > > > > OK, so you need it post-normal. core.img is really about getting access > to /boot/grub; anything else can be done from within grub.cfg. If you > do not want to load other filters unconditionally, just use > > if [ x$grub_platform = xxen ]; then > insmod xzio > fi I think that could work. Is adding Xen specific stuff to grub.cfg the preferred way to do this sort of thing then? > But as far as I understand, CONFIG_KERNEL_XZ is not really dependent on > Xen; so we may want to either load them for real hardware as well or - > better - extend grub-file to check for compression method. On native the bootloader has no reason to decompress the Linux bzImage payload, the kernel itself can do so. AFAIK decompression is only need for Xen (and for certain userspace tools like crash and other debuggers, but they aren't relevant here). > > But if not -- how can one determine which modules are required and/or > > arrange for them to be added automatically? You'd have to peer into the kernel image, use the bzImage header fields to locate the payload and then do magic number probing to figure out which compression algorithm is used. Ian. ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] grub-install: Include all decompressor modules in pvxen core image. 2014-11-30 11:51 ` Ian Campbell @ 2014-11-30 11:52 ` Ian Campbell 2014-11-30 13:34 ` Ian Campbell 1 sibling, 0 replies; 11+ messages in thread From: Ian Campbell @ 2014-11-30 11:52 UTC (permalink / raw) To: Andrei Borzenkov; +Cc: 755256, grub-devel On Sun, 2014-11-30 at 11:51 +0000, Ian Campbell wrote: > On Sun, 2014-11-30 at 14:31 +0300, Andrei Borzenkov wrote: [...] > > We probably never read vmlinuz to the end anyway, but I wonder if it > > could be an issue. > > I've no idea. I don't see that comment anywhere in either Linux nor Grub > codebase though. NM, I found it in scripts/Makefile.lib... Doesn't seem to matter in practice though. Ian. ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] grub-install: Include all decompressor modules in pvxen core image. 2014-11-30 11:51 ` Ian Campbell 2014-11-30 11:52 ` Ian Campbell @ 2014-11-30 13:34 ` Ian Campbell 2014-12-07 17:18 ` Vladimir 'φ-coder/phcoder' Serbinenko 1 sibling, 1 reply; 11+ messages in thread From: Ian Campbell @ 2014-11-30 13:34 UTC (permalink / raw) To: Andrei Borzenkov; +Cc: 755256, grub-devel On Sun, 2014-11-30 at 11:51 +0000, Ian Campbell wrote: > On Sun, 2014-11-30 at 14:31 +0300, Andrei Borzenkov wrote: > > if [ x$grub_platform = xxen ]; then > > insmod xzio > > fi > > I think that could work. Indeed it does, so how about this instead of the patch at the start of the thread? From f4199776eca80dfad4e9378a01ddb5866face3d7 Mon Sep 17 00:00:00 2001 From: Ian Campbell <ijc@debian.org> Date: Sun, 30 Nov 2014 12:12:52 +0000 Subject: [PATCH] Arrange to insmod xzio when booting a kernel as a Xen guest This is needed in case the Linux kernel is compiled with CONFIG_KERNEL_XZ rather than CONFIG_KERNEL_GZ (gzio is already loaded by grub.cfg). Signed-off-by: Ian Campbell <ijc@debian.org> Patch-Name: insmod-xzio-on-xen.patch --- util/grub.d/10_linux.in | 1 + 1 file changed, 1 insertion(+) diff --git a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in index 79fa03a..86e35f2 100644 --- a/util/grub.d/10_linux.in +++ b/util/grub.d/10_linux.in @@ -150,6 +150,7 @@ linux_entry () fi echo " insmod gzio" | sed "s/^/$submenu_indentation/" + echo " if [ x\$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi" | sed "s/^/$submenu_indentation/" if [ x$dirname = x/ ]; then if [ -z "${prepare_root_cache}" ]; then -- 2.1.3 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH] grub-install: Include all decompressor modules in pvxen core image. 2014-11-30 13:34 ` Ian Campbell @ 2014-12-07 17:18 ` Vladimir 'φ-coder/phcoder' Serbinenko 2014-12-07 17:26 ` Andrei Borzenkov 0 siblings, 1 reply; 11+ messages in thread From: Vladimir 'φ-coder/phcoder' Serbinenko @ 2014-12-07 17:18 UTC (permalink / raw) To: The development of GNU GRUB [-- Attachment #1: Type: text/plain, Size: 1530 bytes --] On 30.11.2014 14:34, Ian Campbell wrote: > On Sun, 2014-11-30 at 11:51 +0000, Ian Campbell wrote: >> On Sun, 2014-11-30 at 14:31 +0300, Andrei Borzenkov wrote: >>> if [ x$grub_platform = xxen ]; then >>> insmod xzio >>> fi >> >> I think that could work. > > Indeed it does, so how about this instead of the patch at the start of > the thread? > This should probably have been autoloaded. Can you send me privately a kernel you use, so I can reproduce your tests? >>From f4199776eca80dfad4e9378a01ddb5866face3d7 Mon Sep 17 00:00:00 2001 > From: Ian Campbell <ijc@debian.org> > Date: Sun, 30 Nov 2014 12:12:52 +0000 > Subject: [PATCH] Arrange to insmod xzio when booting a kernel as a Xen guest > > This is needed in case the Linux kernel is compiled with CONFIG_KERNEL_XZ > rather than CONFIG_KERNEL_GZ (gzio is already loaded by grub.cfg). > > Signed-off-by: Ian Campbell <ijc@debian.org> > > Patch-Name: insmod-xzio-on-xen.patch > --- > util/grub.d/10_linux.in | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in > index 79fa03a..86e35f2 100644 > --- a/util/grub.d/10_linux.in > +++ b/util/grub.d/10_linux.in > @@ -150,6 +150,7 @@ linux_entry () > fi > > echo " insmod gzio" | sed "s/^/$submenu_indentation/" > + echo " if [ x\$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi" | sed "s/^/$submenu_indentation/" > > if [ x$dirname = x/ ]; then > if [ -z "${prepare_root_cache}" ]; then > [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 213 bytes --] ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] grub-install: Include all decompressor modules in pvxen core image. 2014-12-07 17:18 ` Vladimir 'φ-coder/phcoder' Serbinenko @ 2014-12-07 17:26 ` Andrei Borzenkov 2014-12-07 21:53 ` Vladimir 'φ-coder/phcoder' Serbinenko 2016-02-12 16:28 ` Vladimir 'φ-coder/phcoder' Serbinenko 0 siblings, 2 replies; 11+ messages in thread From: Andrei Borzenkov @ 2014-12-07 17:26 UTC (permalink / raw) To: grub-devel [-- Attachment #1: Type: text/plain, Size: 2073 bytes --] В Sun, 07 Dec 2014 18:18:47 +0100 Vladimir 'φ-coder/phcoder' Serbinenko <phcoder@gmail.com> пишет: > On 30.11.2014 14:34, Ian Campbell wrote: > > On Sun, 2014-11-30 at 11:51 +0000, Ian Campbell wrote: > >> On Sun, 2014-11-30 at 14:31 +0300, Andrei Borzenkov wrote: > >>> if [ x$grub_platform = xxen ]; then > >>> insmod xzio > >>> fi > >> > >> I think that could work. > > > > Indeed it does, so how about this instead of the patch at the start of > > the thread? > > > This should probably have been autoloaded. File filters are not autoloaded and I do not see how it can really be done. OTOH unconditionally loading them may have unwanted side effect where we assumed files were not decompressed. In this specific case extending grub-file to detect compression type used by kernel is probably OK. > Can you send me privately a > kernel you use, so I can reproduce your tests? > >>From f4199776eca80dfad4e9378a01ddb5866face3d7 Mon Sep 17 00:00:00 2001 > > From: Ian Campbell <ijc@debian.org> > > Date: Sun, 30 Nov 2014 12:12:52 +0000 > > Subject: [PATCH] Arrange to insmod xzio when booting a kernel as a Xen guest > > > > This is needed in case the Linux kernel is compiled with CONFIG_KERNEL_XZ > > rather than CONFIG_KERNEL_GZ (gzio is already loaded by grub.cfg). > > > > Signed-off-by: Ian Campbell <ijc@debian.org> > > > > Patch-Name: insmod-xzio-on-xen.patch > > --- > > util/grub.d/10_linux.in | 1 + > > 1 file changed, 1 insertion(+) > > > > diff --git a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in > > index 79fa03a..86e35f2 100644 > > --- a/util/grub.d/10_linux.in > > +++ b/util/grub.d/10_linux.in > > @@ -150,6 +150,7 @@ linux_entry () > > fi > > > > echo " insmod gzio" | sed "s/^/$submenu_indentation/" > > + echo " if [ x\$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi" | sed "s/^/$submenu_indentation/" > > > > if [ x$dirname = x/ ]; then > > if [ -z "${prepare_root_cache}" ]; then > > > > [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 181 bytes --] ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] grub-install: Include all decompressor modules in pvxen core image. 2014-12-07 17:26 ` Andrei Borzenkov @ 2014-12-07 21:53 ` Vladimir 'φ-coder/phcoder' Serbinenko 2016-02-12 16:28 ` Vladimir 'φ-coder/phcoder' Serbinenko 1 sibling, 0 replies; 11+ messages in thread From: Vladimir 'φ-coder/phcoder' Serbinenko @ 2014-12-07 21:53 UTC (permalink / raw) To: The development of GNU GRUB [-- Attachment #1: Type: text/plain, Size: 2522 bytes --] On 07.12.2014 18:26, Andrei Borzenkov wrote: > В Sun, 07 Dec 2014 18:18:47 +0100 > Vladimir 'φ-coder/phcoder' Serbinenko <phcoder@gmail.com> пишет: > >> On 30.11.2014 14:34, Ian Campbell wrote: >>> On Sun, 2014-11-30 at 11:51 +0000, Ian Campbell wrote: >>>> On Sun, 2014-11-30 at 14:31 +0300, Andrei Borzenkov wrote: >>>>> if [ x$grub_platform = xxen ]; then >>>>> insmod xzio >>>>> fi >>>> >>>> I think that could work. >>> >>> Indeed it does, so how about this instead of the patch at the start of >>> the thread? >>> >> This should probably have been autoloaded. > > File filters are not autoloaded and I do not see how it can really be > done. OTOH unconditionally loading them may have unwanted side effect > where we assumed files were not decompressed. > In this particular case we could autoload based on signature to module map. Probably it's a fair game since compressor can be uniquely determined from magic. Autoload could be restricted to xen linux loader. > In this specific case extending grub-file to detect compression type > used by kernel is probably OK. > >> Can you send me privately a >> kernel you use, so I can reproduce your tests? >>> >From f4199776eca80dfad4e9378a01ddb5866face3d7 Mon Sep 17 00:00:00 2001 >>> From: Ian Campbell <ijc@debian.org> >>> Date: Sun, 30 Nov 2014 12:12:52 +0000 >>> Subject: [PATCH] Arrange to insmod xzio when booting a kernel as a Xen guest >>> >>> This is needed in case the Linux kernel is compiled with CONFIG_KERNEL_XZ >>> rather than CONFIG_KERNEL_GZ (gzio is already loaded by grub.cfg). >>> >>> Signed-off-by: Ian Campbell <ijc@debian.org> >>> >>> Patch-Name: insmod-xzio-on-xen.patch >>> --- >>> util/grub.d/10_linux.in | 1 + >>> 1 file changed, 1 insertion(+) >>> >>> diff --git a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in >>> index 79fa03a..86e35f2 100644 >>> --- a/util/grub.d/10_linux.in >>> +++ b/util/grub.d/10_linux.in >>> @@ -150,6 +150,7 @@ linux_entry () >>> fi >>> >>> echo " insmod gzio" | sed "s/^/$submenu_indentation/" >>> + echo " if [ x\$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi" | sed "s/^/$submenu_indentation/" >>> >>> if [ x$dirname = x/ ]; then >>> if [ -z "${prepare_root_cache}" ]; then >>> >> >> > > > > _______________________________________________ > Grub-devel mailing list > Grub-devel@gnu.org > https://lists.gnu.org/mailman/listinfo/grub-devel > [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 213 bytes --] ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] grub-install: Include all decompressor modules in pvxen core image. 2014-12-07 17:26 ` Andrei Borzenkov 2014-12-07 21:53 ` Vladimir 'φ-coder/phcoder' Serbinenko @ 2016-02-12 16:28 ` Vladimir 'φ-coder/phcoder' Serbinenko 1 sibling, 0 replies; 11+ messages in thread From: Vladimir 'φ-coder/phcoder' Serbinenko @ 2016-02-12 16:28 UTC (permalink / raw) To: The development of GNU GRUB [-- Attachment #1.1: Type: text/plain, Size: 2336 bytes --] On 07.12.2014 18:26, Andrei Borzenkov wrote: > В Sun, 07 Dec 2014 18:18:47 +0100 > Vladimir 'φ-coder/phcoder' Serbinenko <phcoder@gmail.com> пишет: > >> On 30.11.2014 14:34, Ian Campbell wrote: >>> On Sun, 2014-11-30 at 11:51 +0000, Ian Campbell wrote: >>>> On Sun, 2014-11-30 at 14:31 +0300, Andrei Borzenkov wrote: >>>>> if [ x$grub_platform = xxen ]; then >>>>> insmod xzio >>>>> fi >>>> >>>> I think that could work. >>> >>> Indeed it does, so how about this instead of the patch at the start of >>> the thread? >>> >> This should probably have been autoloaded. > > File filters are not autoloaded and I do not see how it can really be > done. OTOH unconditionally loading them may have unwanted side effect > where we assumed files were not decompressed. > > In this specific case extending grub-file to detect compression type > used by kernel is probably OK. Please test attached file. > >> Can you send me privately a >> kernel you use, so I can reproduce your tests? >>> >From f4199776eca80dfad4e9378a01ddb5866face3d7 Mon Sep 17 00:00:00 2001 >>> From: Ian Campbell <ijc@debian.org> >>> Date: Sun, 30 Nov 2014 12:12:52 +0000 >>> Subject: [PATCH] Arrange to insmod xzio when booting a kernel as a Xen guest >>> >>> This is needed in case the Linux kernel is compiled with CONFIG_KERNEL_XZ >>> rather than CONFIG_KERNEL_GZ (gzio is already loaded by grub.cfg). >>> >>> Signed-off-by: Ian Campbell <ijc@debian.org> >>> >>> Patch-Name: insmod-xzio-on-xen.patch >>> --- >>> util/grub.d/10_linux.in | 1 + >>> 1 file changed, 1 insertion(+) >>> >>> diff --git a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in >>> index 79fa03a..86e35f2 100644 >>> --- a/util/grub.d/10_linux.in >>> +++ b/util/grub.d/10_linux.in >>> @@ -150,6 +150,7 @@ linux_entry () >>> fi >>> >>> echo " insmod gzio" | sed "s/^/$submenu_indentation/" >>> + echo " if [ x\$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi" | sed "s/^/$submenu_indentation/" >>> >>> if [ x$dirname = x/ ]; then >>> if [ -z "${prepare_root_cache}" ]; then >>> >> >> > > > > _______________________________________________ > Grub-devel mailing list > Grub-devel@gnu.org > https://lists.gnu.org/mailman/listinfo/grub-devel > [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #1.2: autoload.diff --] [-- Type: text/x-diff; name="autoload.diff", Size: 3324 bytes --] diff --git a/grub-core/loader/i386/xen_file.c b/grub-core/loader/i386/xen_file.c index 5836218..90e0a6e 100644 --- a/grub-core/loader/i386/xen_file.c +++ b/grub-core/loader/i386/xen_file.c @@ -20,12 +20,99 @@ #include <grub/i386/linux.h> #include <grub/misc.h> +#define LZOP_MAGIC "\x89\x4c\x5a\x4f\x00\x0d\x0a\x1a\x0a" +#define LZOP_MAGIC_SIZE 9 +#define XZ_MAGIC "\3757zXZ\0" +#define XZ_MAGIC_SIZE 6 +#define ELF_MAGIC "\177ELF" +#define ELF_MAGIC_SIZE 4 +#define GZ_MAGIC "\x1F\x8B" +#define GZ_MAGIC_SIZE 2 +#define GZ_OLD_MAGIC "\x1F\x9E" +#define GZ_OLD_MAGIC_SIZE 2 + +#ifndef GRUB_UTIL + +#include <grub/dl.h> + +static grub_uint8_t +mod_31 (grub_uint16_t v) +{ + /* At most 2 iterations for any number that + we can get here. + In any case faster than real division. */ + while (v > 0x1f) + v = (v & 0x1f) + (v >> 5); + if (v == 0x1f) + return 0; + return v; +} + +static int +is_zlib (grub_uint8_t *head) +{ + grub_uint8_t cmf, flg; + + cmf = head[0]; + flg = head[1]; + + if ((cmf & 0xf) != 8) + return 0; + + if (mod_31 (cmf + flg * 4) != 0) + return 0; + + if (flg & 0x20) + return 0; + + return 1; +} + +static void +autoload_filters (grub_file_t file, grub_uint32_t payload_offset) +{ + grub_uint8_t payload_header[LZOP_MAGIC_SIZE]; + + grub_file_seek (file, payload_offset); + + if (grub_file_read (file, &payload_header, sizeof (payload_header)) != sizeof (payload_header)) + { + grub_print_error (); + return; + } + + if (grub_memcmp (payload_header, ELF_MAGIC, ELF_MAGIC_SIZE) == 0) + { + /* Uncompressed. */ + } + else if (grub_memcmp (payload_header, XZ_MAGIC, XZ_MAGIC_SIZE) == 0) + { + grub_dl_load("xzio"); + grub_print_error (); + } + else if (grub_memcmp (payload_header, LZOP_MAGIC, LZOP_MAGIC_SIZE) == 0) + { + grub_dl_load("lzopio"); + grub_print_error (); + } + else if (grub_memcmp (payload_header, GZ_MAGIC, GZ_MAGIC_SIZE) == 0 + || grub_memcmp (payload_header, GZ_OLD_MAGIC, GZ_OLD_MAGIC_SIZE) == 0 + || is_zlib (payload_header)) + { + grub_dl_load("gzio"); + grub_print_error (); + } +} + +#endif + grub_elf_t grub_xen_file (grub_file_t file) { grub_elf_t elf; struct linux_kernel_header lh; grub_file_t off_file; + grub_uint32_t payload_offset; elf = grub_elf_file (file, file->name); if (elf) @@ -46,19 +133,24 @@ grub_xen_file (grub_file_t file) return NULL; } - if (lh.payload_length < 4) + if (lh.payload_length < LZOP_MAGIC_SIZE) { grub_error (GRUB_ERR_BAD_OS, "payload too short"); return NULL; } + payload_offset = (lh.setup_sects + 1) * 512 + lh.payload_offset; + +#ifndef GRUB_UTIL + autoload_filters (file, payload_offset); +#endif + grub_dprintf ("xen", "found bzimage payload 0x%llx-0x%llx\n", (unsigned long long) (lh.setup_sects + 1) * 512 + lh.payload_offset, (unsigned long long) lh.payload_length - 4); - off_file = grub_file_offset_open (file, (lh.setup_sects + 1) * 512 - + lh.payload_offset, + off_file = grub_file_offset_open (file, payload_offset, lh.payload_length - 4); if (!off_file) goto fail; [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 213 bytes --] ^ permalink raw reply related [flat|nested] 11+ messages in thread
end of thread, other threads:[~2016-02-12 16:28 UTC | newest] Thread overview: 11+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2014-11-28 8:33 [PATCH] grub-install: Include all decompressor modules in pvxen core image Ian Campbell 2014-11-28 17:09 ` Andrei Borzenkov 2014-11-28 17:25 ` Ian Campbell 2014-11-30 11:31 ` Andrei Borzenkov 2014-11-30 11:51 ` Ian Campbell 2014-11-30 11:52 ` Ian Campbell 2014-11-30 13:34 ` Ian Campbell 2014-12-07 17:18 ` Vladimir 'φ-coder/phcoder' Serbinenko 2014-12-07 17:26 ` Andrei Borzenkov 2014-12-07 21:53 ` Vladimir 'φ-coder/phcoder' Serbinenko 2016-02-12 16:28 ` Vladimir 'φ-coder/phcoder' Serbinenko
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).