diff options
author | Lasse Collin <lasse.collin@tukaani.org> | 2011-01-12 20:01:24 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-01-13 11:03:25 -0500 |
commit | 303148045aac34b70db722a54e5ad94a3a6625c6 (patch) | |
tree | 9be64b5d44cbef232daf11a89107772cb21647de /arch/x86/boot | |
parent | 3ebe12439ba7fc62e1d6ecb569b7287771716ca1 (diff) |
x86: support XZ-compressed kernel
This integrates the XZ decompression code to the x86 pre-boot code.
mkpiggy.c is updated to reserve about 32 KiB more buffer safety margin for
kernel decompression. It is done unconditionally for all decompressors to
keep the code simpler.
The XZ decompressor needs around 30 KiB of heap, so the heap size is
increased to 32 KiB on both x86-32 and x86-64.
Documentation/x86/boot.txt is updated to list the XZ magic number.
With the x86 BCJ filter in XZ, XZ-compressed x86 kernel tends to be a few
percent smaller than the equivalent LZMA-compressed kernel.
Signed-off-by: Lasse Collin <lasse.collin@tukaani.org>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Alain Knaff <alain@knaff.lu>
Cc: Albin Tonnerre <albin.tonnerre@free-electrons.com>
Cc: Phillip Lougher <phillip@lougher.demon.co.uk>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch/x86/boot')
-rw-r--r-- | arch/x86/boot/compressed/Makefile | 5 | ||||
-rw-r--r-- | arch/x86/boot/compressed/misc.c | 4 | ||||
-rw-r--r-- | arch/x86/boot/compressed/mkpiggy.c | 2 |
3 files changed, 9 insertions, 2 deletions
diff --git a/arch/x86/boot/compressed/Makefile b/arch/x86/boot/compressed/Makefile index 0c229551eead..09664efb9cee 100644 --- a/arch/x86/boot/compressed/Makefile +++ b/arch/x86/boot/compressed/Makefile | |||
@@ -4,7 +4,7 @@ | |||
4 | # create a compressed vmlinux image from the original vmlinux | 4 | # create a compressed vmlinux image from the original vmlinux |
5 | # | 5 | # |
6 | 6 | ||
7 | targets := vmlinux.lds vmlinux vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2 vmlinux.bin.lzma vmlinux.bin.lzo head_$(BITS).o misc.o string.o cmdline.o early_serial_console.o piggy.o | 7 | targets := vmlinux.lds vmlinux vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2 vmlinux.bin.lzma vmlinux.bin.xz vmlinux.bin.lzo head_$(BITS).o misc.o string.o cmdline.o early_serial_console.o piggy.o |
8 | 8 | ||
9 | KBUILD_CFLAGS := -m$(BITS) -D__KERNEL__ $(LINUX_INCLUDE) -O2 | 9 | KBUILD_CFLAGS := -m$(BITS) -D__KERNEL__ $(LINUX_INCLUDE) -O2 |
10 | KBUILD_CFLAGS += -fno-strict-aliasing -fPIC | 10 | KBUILD_CFLAGS += -fno-strict-aliasing -fPIC |
@@ -49,12 +49,15 @@ $(obj)/vmlinux.bin.bz2: $(vmlinux.bin.all-y) FORCE | |||
49 | $(call if_changed,bzip2) | 49 | $(call if_changed,bzip2) |
50 | $(obj)/vmlinux.bin.lzma: $(vmlinux.bin.all-y) FORCE | 50 | $(obj)/vmlinux.bin.lzma: $(vmlinux.bin.all-y) FORCE |
51 | $(call if_changed,lzma) | 51 | $(call if_changed,lzma) |
52 | $(obj)/vmlinux.bin.xz: $(vmlinux.bin.all-y) FORCE | ||
53 | $(call if_changed,xzkern) | ||
52 | $(obj)/vmlinux.bin.lzo: $(vmlinux.bin.all-y) FORCE | 54 | $(obj)/vmlinux.bin.lzo: $(vmlinux.bin.all-y) FORCE |
53 | $(call if_changed,lzo) | 55 | $(call if_changed,lzo) |
54 | 56 | ||
55 | suffix-$(CONFIG_KERNEL_GZIP) := gz | 57 | suffix-$(CONFIG_KERNEL_GZIP) := gz |
56 | suffix-$(CONFIG_KERNEL_BZIP2) := bz2 | 58 | suffix-$(CONFIG_KERNEL_BZIP2) := bz2 |
57 | suffix-$(CONFIG_KERNEL_LZMA) := lzma | 59 | suffix-$(CONFIG_KERNEL_LZMA) := lzma |
60 | suffix-$(CONFIG_KERNEL_XZ) := xz | ||
58 | suffix-$(CONFIG_KERNEL_LZO) := lzo | 61 | suffix-$(CONFIG_KERNEL_LZO) := lzo |
59 | 62 | ||
60 | quiet_cmd_mkpiggy = MKPIGGY $@ | 63 | quiet_cmd_mkpiggy = MKPIGGY $@ |
diff --git a/arch/x86/boot/compressed/misc.c b/arch/x86/boot/compressed/misc.c index 325c05294fc4..3a19d04cebeb 100644 --- a/arch/x86/boot/compressed/misc.c +++ b/arch/x86/boot/compressed/misc.c | |||
@@ -139,6 +139,10 @@ static int lines, cols; | |||
139 | #include "../../../../lib/decompress_unlzma.c" | 139 | #include "../../../../lib/decompress_unlzma.c" |
140 | #endif | 140 | #endif |
141 | 141 | ||
142 | #ifdef CONFIG_KERNEL_XZ | ||
143 | #include "../../../../lib/decompress_unxz.c" | ||
144 | #endif | ||
145 | |||
142 | #ifdef CONFIG_KERNEL_LZO | 146 | #ifdef CONFIG_KERNEL_LZO |
143 | #include "../../../../lib/decompress_unlzo.c" | 147 | #include "../../../../lib/decompress_unlzo.c" |
144 | #endif | 148 | #endif |
diff --git a/arch/x86/boot/compressed/mkpiggy.c b/arch/x86/boot/compressed/mkpiggy.c index 5c228129d175..646aa78ba5fd 100644 --- a/arch/x86/boot/compressed/mkpiggy.c +++ b/arch/x86/boot/compressed/mkpiggy.c | |||
@@ -74,7 +74,7 @@ int main(int argc, char *argv[]) | |||
74 | 74 | ||
75 | offs = (olen > ilen) ? olen - ilen : 0; | 75 | offs = (olen > ilen) ? olen - ilen : 0; |
76 | offs += olen >> 12; /* Add 8 bytes for each 32K block */ | 76 | offs += olen >> 12; /* Add 8 bytes for each 32K block */ |
77 | offs += 32*1024 + 18; /* Add 32K + 18 bytes slack */ | 77 | offs += 64*1024 + 128; /* Add 64K + 128 bytes slack */ |
78 | offs = (offs+4095) & ~4095; /* Round to a 4K boundary */ | 78 | offs = (offs+4095) & ~4095; /* Round to a 4K boundary */ |
79 | 79 | ||
80 | printf(".section \".rodata..compressed\",\"a\",@progbits\n"); | 80 | printf(".section \".rodata..compressed\",\"a\",@progbits\n"); |