> On Aug 21, 2020, at 9:29 AM, Paul Cercueil <paul@xxxxxxxxxxxxxxx> wrote: > > Add support for self-extracting kernels with a ZSTD compression. > > Tested on a kernel for the GCW-Zero, it allows to reduce the size of the > kernel file from 4.1 MiB with gzip to 3.5 MiB with ZSTD, and boots just > as fast. > > Signed-off-by: Paul Cercueil <paul@xxxxxxxxxxxxxxx> > --- > arch/mips/Kconfig | 1 + > arch/mips/boot/compressed/Makefile | 1 + > arch/mips/boot/compressed/decompress.c | 4 ++++ > arch/mips/boot/compressed/string.c | 16 ++++++++++++++++ > 4 files changed, 22 insertions(+) > > diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig > index c95fa3a2484c..b9d7c4249dc9 100644 > --- a/arch/mips/Kconfig > +++ b/arch/mips/Kconfig > @@ -1890,6 +1890,7 @@ config SYS_SUPPORTS_ZBOOT > select HAVE_KERNEL_LZMA > select HAVE_KERNEL_LZO > select HAVE_KERNEL_XZ > + select HAVE_KERNEL_ZSTD > > config SYS_SUPPORTS_ZBOOT_UART16550 > bool > diff --git a/arch/mips/boot/compressed/Makefile b/arch/mips/boot/compressed/Makefile > index 6e56caef69f0..86ddc6fc16f4 100644 > --- a/arch/mips/boot/compressed/Makefile > +++ b/arch/mips/boot/compressed/Makefile > @@ -70,6 +70,7 @@ tool_$(CONFIG_KERNEL_LZ4) = lz4 > tool_$(CONFIG_KERNEL_LZMA) = lzma > tool_$(CONFIG_KERNEL_LZO) = lzo > tool_$(CONFIG_KERNEL_XZ) = xzkern > +tool_$(CONFIG_KERNEL_ZSTD) = zstd You can use zstd22 here. It will give you slightly better compression without any additional memory usage. Also, you should add -D__DISABLE_EXPORTS to the KBUILD_CFLAGS like x86 does [1]. [1] https://github.com/torvalds/linux/blob/master/arch/x86/boot/compressed/Makefile -Nick > targets += vmlinux.bin.z > $(obj)/vmlinux.bin.z: $(obj)/vmlinux.bin FORCE > diff --git a/arch/mips/boot/compressed/decompress.c b/arch/mips/boot/compressed/decompress.c > index 88f5d637b1c4..c61c641674e6 100644 > --- a/arch/mips/boot/compressed/decompress.c > +++ b/arch/mips/boot/compressed/decompress.c > @@ -72,6 +72,10 @@ void error(char *x) > #include "../../../../lib/decompress_unxz.c" > #endif > > +#ifdef CONFIG_KERNEL_ZSTD > +#include "../../../../lib/decompress_unzstd.c" > +#endif > + > const unsigned long __stack_chk_guard = 0x000a0dff; > > void __stack_chk_fail(void) > diff --git a/arch/mips/boot/compressed/string.c b/arch/mips/boot/compressed/string.c > index 43beecc3587c..ab95722ec0c9 100644 > --- a/arch/mips/boot/compressed/string.c > +++ b/arch/mips/boot/compressed/string.c > @@ -27,3 +27,19 @@ void *memset(void *s, int c, size_t n) > ss[i] = c; > return s; > } > + > +void *memmove(void *dest, const void *src, size_t n) > +{ > + unsigned int i; > + const char *s = src; > + char *d = dest; > + > + if ((uintptr_t)dest < (uintptr_t)src) { > + for (i = 0; i < n; i++) > + d[i] = s[i]; > + } else { > + for (i = n; i > 0; i--) > + d[i - 1] = s[i - 1]; > + } > + return dest; > +} > -- > 2.28.0 >