MIPS: Add support for ZSTD-compressed kernels
authorPaul Cercueil <paul@crapouillou.net>
Tue, 1 Sep 2020 14:26:51 +0000 (16:26 +0200)
committerThomas Bogendoerfer <tsbogend@alpha.franken.de>
Thu, 3 Sep 2020 08:13:24 +0000 (10:13 +0200)
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.

Compressed kernels are now also compiled with -D__DISABLE_EXPORTS in
order to disable the EXPORT_SYMBOL() macros inside of
lib/zstd/decompress.c.

Signed-off-by: Paul Cercueil <paul@crapouillou.net>
Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
arch/mips/Kconfig
arch/mips/boot/compressed/Makefile
arch/mips/boot/compressed/decompress.c
arch/mips/boot/compressed/string.c

index 99220e7e465e9e69c5bc6f89055bef844a218a1a..a35dd02fc82c7a3ece1993b0d59d6afbdbd890f9 100644 (file)
@@ -1860,6 +1860,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
index 6e56caef69f063006c7ff1e7cc74007446e3d82f..9a9ba77b745ee6910ce477a55a737f89c0a42904 100644 (file)
@@ -22,7 +22,7 @@ KBUILD_CFLAGS := $(filter-out -pg, $(KBUILD_CFLAGS))
 
 KBUILD_CFLAGS := $(filter-out -fstack-protector, $(KBUILD_CFLAGS))
 
-KBUILD_CFLAGS := $(KBUILD_CFLAGS) -D__KERNEL__ \
+KBUILD_CFLAGS := $(KBUILD_CFLAGS) -D__KERNEL__ -D__DISABLE_EXPORTS \
        -DBOOT_HEAP_SIZE=$(BOOT_HEAP_SIZE) -D"VMLINUX_LOAD_ADDRESS_ULL=$(VMLINUX_LOAD_ADDRESS)ull"
 
 KBUILD_AFLAGS := $(KBUILD_AFLAGS) -D__ASSEMBLY__ \
@@ -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)    = zstd22
 
 targets += vmlinux.bin.z
 $(obj)/vmlinux.bin.z: $(obj)/vmlinux.bin FORCE
index 88f5d637b1c49af3c407341609f4717086aaf36e..c61c641674e6b4765495cf4cc9751af7b54d539d 100644 (file)
@@ -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)
index 43beecc3587cdd92b9cbe8ddbb293ba179b5cd01..0b593b70922865888fad09d307affc0232bcd50b 100644 (file)
@@ -5,6 +5,7 @@
  * Very small subset of simple string routines
  */
 
+#include <linux/compiler_attributes.h>
 #include <linux/types.h>
 
 void *memcpy(void *dest, const void *src, size_t n)
@@ -27,3 +28,19 @@ void *memset(void *s, int c, size_t n)
                ss[i] = c;
        return s;
 }
+
+void * __weak 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;
+}