diff options
Diffstat (limited to '0008-x86-Add-support-for-ZSTD-compressed-kernel.patch')
-rw-r--r-- | 0008-x86-Add-support-for-ZSTD-compressed-kernel.patch | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/0008-x86-Add-support-for-ZSTD-compressed-kernel.patch b/0008-x86-Add-support-for-ZSTD-compressed-kernel.patch new file mode 100644 index 000000000000..113e275dbd16 --- /dev/null +++ b/0008-x86-Add-support-for-ZSTD-compressed-kernel.patch @@ -0,0 +1,145 @@ +From 497ac308a65ab70fa14691d7f748d60cc4cd5d3e Mon Sep 17 00:00:00 2001 +From: Nick Terrell <terrelln@fb.com> +Date: Thu, 20 Jun 2019 15:18:36 -0700 +Subject: [PATCH 8/9] x86: Add support for ZSTD compressed kernel + +* Add support for zstd compressed kernel +* Define __DISABLE_EXPORTS in misc.c +* Bump the heap size for zstd. +* Update the documentation. + +Integrates the ZSTD decompression code to the x86 pre-boot code. + +Zstandard requires slightly more memory during the kernel decompression +on x86 (192 KB vs 64 KB), and the memory usage is independent of the +window size. + +__DISABLE_EXPORTS is defined in misc.c instead of the Makefile because +kaslr.c defines __DISABLE_EXPORTS, and defining it in the Makefile gives +duplicate definition warnings. + +This patch has been boot tested with both a zstd and gzip compressed +kernel on i386 and x86_64 using buildroot and QEMU. + +Additionally, this has been tested in production on x86_64 devices. +We saw a 2 second boot time reduction by switching kernel compression +from xz to zstd. + +Reviewed-by: Kees Cook <keescook@chromium.org> +Tested-by: Sedat Dilek <sedat.dilek@gmail.com> +Signed-off-by: Nick Terrell <terrelln@fb.com> +--- + Documentation/x86/boot.rst | 6 +++--- + arch/x86/Kconfig | 1 + + arch/x86/boot/compressed/Makefile | 5 ++++- + arch/x86/boot/compressed/misc.c | 9 +++++++++ + arch/x86/include/asm/boot.h | 6 ++++-- + 5 files changed, 21 insertions(+), 6 deletions(-) + +diff --git a/Documentation/x86/boot.rst b/Documentation/x86/boot.rst +index 5325c71ca877..7fafc7ac00d7 100644 +--- a/Documentation/x86/boot.rst ++++ b/Documentation/x86/boot.rst +@@ -782,9 +782,9 @@ Protocol: 2.08+ + uncompressed data should be determined using the standard magic + numbers. The currently supported compression formats are gzip + (magic numbers 1F 8B or 1F 9E), bzip2 (magic number 42 5A), LZMA +- (magic number 5D 00), XZ (magic number FD 37), and LZ4 (magic number +- 02 21). The uncompressed payload is currently always ELF (magic +- number 7F 45 4C 46). ++ (magic number 5D 00), XZ (magic number FD 37), LZ4 (magic number ++ 02 21) and ZSTD (magic number 28 B5). The uncompressed payload is ++ currently always ELF (magic number 7F 45 4C 46). + + ============ ============== + Field name: payload_length +diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig +index 2d3f963fd6f1..897b3253147b 100644 +--- a/arch/x86/Kconfig ++++ b/arch/x86/Kconfig +@@ -185,6 +185,7 @@ config X86 + select HAVE_KERNEL_LZMA + select HAVE_KERNEL_LZO + select HAVE_KERNEL_XZ ++ select HAVE_KERNEL_ZSTD + select HAVE_KPROBES + select HAVE_KPROBES_ON_FTRACE + select HAVE_FUNCTION_ERROR_INJECTION +diff --git a/arch/x86/boot/compressed/Makefile b/arch/x86/boot/compressed/Makefile +index 5f7c262bcc99..480cd5836825 100644 +--- a/arch/x86/boot/compressed/Makefile ++++ b/arch/x86/boot/compressed/Makefile +@@ -24,7 +24,7 @@ OBJECT_FILES_NON_STANDARD := y + KCOV_INSTRUMENT := n + + targets := vmlinux vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2 vmlinux.bin.lzma \ +- vmlinux.bin.xz vmlinux.bin.lzo vmlinux.bin.lz4 ++ vmlinux.bin.xz vmlinux.bin.lzo vmlinux.bin.lz4 vmlinux.bin.zst + + KBUILD_CFLAGS := -m$(BITS) -O2 + KBUILD_CFLAGS += -fno-strict-aliasing $(call cc-option, -fPIE, -fPIC) +@@ -143,6 +143,8 @@ $(obj)/vmlinux.bin.lzo: $(vmlinux.bin.all-y) FORCE + $(call if_changed,lzo) + $(obj)/vmlinux.bin.lz4: $(vmlinux.bin.all-y) FORCE + $(call if_changed,lz4) ++$(obj)/vmlinux.bin.zst: $(vmlinux.bin.all-y) FORCE ++ $(call if_changed,zstd22) + + suffix-$(CONFIG_KERNEL_GZIP) := gz + suffix-$(CONFIG_KERNEL_BZIP2) := bz2 +@@ -150,6 +152,7 @@ suffix-$(CONFIG_KERNEL_LZMA) := lzma + suffix-$(CONFIG_KERNEL_XZ) := xz + suffix-$(CONFIG_KERNEL_LZO) := lzo + suffix-$(CONFIG_KERNEL_LZ4) := lz4 ++suffix-$(CONFIG_KERNEL_ZSTD) := zst + + quiet_cmd_mkpiggy = MKPIGGY $@ + cmd_mkpiggy = $(obj)/mkpiggy $< > $@ +diff --git a/arch/x86/boot/compressed/misc.c b/arch/x86/boot/compressed/misc.c +index 9652d5c2afda..885dc20680c2 100644 +--- a/arch/x86/boot/compressed/misc.c ++++ b/arch/x86/boot/compressed/misc.c +@@ -12,6 +12,11 @@ + * High loaded stuff by Hans Lermen & Werner Almesberger, Feb. 1996 + */ + ++/* decompressors bring in EXPORT_SYMBOL which is meaningless and will ++ * cause compiler errors in some cases. ++ */ ++#define __DISABLE_EXPORTS ++ + #include "misc.h" + #include "error.h" + #include "pgtable.h" +@@ -77,6 +82,10 @@ static int lines, cols; + #ifdef CONFIG_KERNEL_LZ4 + #include "../../../../lib/decompress_unlz4.c" + #endif ++ ++#ifdef CONFIG_KERNEL_ZSTD ++#include "../../../../lib/decompress_unzstd.c" ++#endif + /* + * NOTE: When adding a new decompressor, please update the analysis in + * ../header.S. +diff --git a/arch/x86/include/asm/boot.h b/arch/x86/include/asm/boot.h +index 680c320363db..d6dd43d25d9f 100644 +--- a/arch/x86/include/asm/boot.h ++++ b/arch/x86/include/asm/boot.h +@@ -24,9 +24,11 @@ + # error "Invalid value for CONFIG_PHYSICAL_ALIGN" + #endif + +-#ifdef CONFIG_KERNEL_BZIP2 ++#if defined(CONFIG_KERNEL_BZIP2) + # define BOOT_HEAP_SIZE 0x400000 +-#else /* !CONFIG_KERNEL_BZIP2 */ ++#elif defined(CONFIG_KERNEL_ZSTD) ++# define BOOT_HEAP_SIZE 0x30000 ++#else + # define BOOT_HEAP_SIZE 0x10000 + #endif + +-- +2.28.0 + |