powerpc/boot: Add support for XZ compression
This patch adds an option to use XZ compression for the kernel image. Currently this is only enabled for 64-bit Book3S targets, which is roughly equivalent to the platforms that use the kernel's zImage wrapper, and that have been tested. The bulk of the 32-bit platforms and 64-bit BookE use uboot images, which relies on uboot implementing XZ. In future we can enable XZ support for those targets once someone has tested it. Signed-off-by: Oliver O'Halloran <oohall@gmail.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
parent
f1e510bbb9
commit
c762c69e10
|
@ -20,6 +20,7 @@
|
|||
all: $(obj)/zImage
|
||||
|
||||
compress-$(CONFIG_KERNEL_GZIP) := CONFIG_KERNEL_GZIP
|
||||
compress-$(CONFIG_KERNEL_XZ) := CONFIG_KERNEL_XZ
|
||||
|
||||
BOOTCFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
|
||||
-fno-strict-aliasing -Os -msoft-float -pipe \
|
||||
|
@ -226,6 +227,7 @@ endif
|
|||
endif
|
||||
|
||||
compressor-$(CONFIG_KERNEL_GZIP) := gz
|
||||
compressor-$(CONFIG_KERNEL_XZ) := xz
|
||||
|
||||
# args (to if_changed): 1 = (this rule), 2 = platform, 3 = dts 4=dtb 5=initrd
|
||||
quiet_cmd_wrap = WRAP $@
|
||||
|
@ -433,6 +435,7 @@ clean-files += $(image-) $(initrd-) cuImage.* dtbImage.* treeImage.* \
|
|||
# clean up files cached by wrapper
|
||||
clean-kernel-base := vmlinux.strip vmlinux.bin
|
||||
clean-kernel := $(addsuffix .gz,$(clean-kernel-base))
|
||||
clean-kernel += $(addsuffix .xz,$(clean-kernel-base))
|
||||
# If not absolute clean-files are relative to $(obj).
|
||||
clean-files += $(addprefix $(objtree)/, $(clean-kernel))
|
||||
|
||||
|
|
|
@ -37,6 +37,11 @@
|
|||
# include "decompress_inflate.c"
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_KERNEL_XZ
|
||||
# include "xz_config.h"
|
||||
# include "../../../lib/decompress_unxz.c"
|
||||
#endif
|
||||
|
||||
/* globals for tracking the state of the decompression */
|
||||
static unsigned long decompressed_bytes;
|
||||
static unsigned long limit;
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
/*
|
||||
* Copyright (C) IBM Corporation 2016.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This file is only necessary because some of the pre-boot decompressors
|
||||
* expect stdbool.h to be available.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "types.h"
|
|
@ -0,0 +1,13 @@
|
|||
/*
|
||||
* Copyright (C) IBM Corporation 2016.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This file is only necessary because some of the pre-boot decompressors
|
||||
* expect stdint.h to be available.
|
||||
*/
|
||||
|
||||
#include "types.h"
|
|
@ -1,6 +1,8 @@
|
|||
#ifndef _TYPES_H_
|
||||
#define _TYPES_H_
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
|
||||
|
||||
typedef unsigned char u8;
|
||||
|
@ -34,4 +36,16 @@ typedef s64 int64_t;
|
|||
(void) (&_x == &_y); \
|
||||
_x > _y ? _x : _y; })
|
||||
|
||||
#define min_t(type, a, b) min(((type) a), ((type) b))
|
||||
#define max_t(type, a, b) max(((type) a), ((type) b))
|
||||
|
||||
typedef int bool;
|
||||
|
||||
#ifndef true
|
||||
#define true 1
|
||||
#endif
|
||||
|
||||
#ifndef false
|
||||
#define false 0
|
||||
#endif
|
||||
#endif /* _TYPES_H_ */
|
||||
|
|
|
@ -0,0 +1,39 @@
|
|||
#ifndef __XZ_CONFIG_H__
|
||||
#define __XZ_CONFIG_H__
|
||||
|
||||
/*
|
||||
* most of this is copied from lib/xz/xz_private.h, we can't use their defines
|
||||
* since the boot wrapper is not built in the same environment as the rest of
|
||||
* the kernel.
|
||||
*/
|
||||
|
||||
#include "types.h"
|
||||
#include "swab.h"
|
||||
|
||||
static inline uint32_t swab32p(void *p)
|
||||
{
|
||||
uint32_t *q = p;
|
||||
|
||||
return swab32(*q);
|
||||
}
|
||||
|
||||
#ifdef __LITTLE_ENDIAN__
|
||||
#define get_le32(p) (*((uint32_t *) (p)))
|
||||
#else
|
||||
#define get_le32(p) swab32p(p)
|
||||
#endif
|
||||
|
||||
#define memeq(a, b, size) (memcmp(a, b, size) == 0)
|
||||
#define memzero(buf, size) memset(buf, 0, size)
|
||||
|
||||
/* prevent the inclusion of the xz-preboot MM headers */
|
||||
#define DECOMPR_MM_H
|
||||
#define memmove memmove
|
||||
#define XZ_EXTERN static
|
||||
|
||||
/* xz.h needs to be included directly since we need enum xz_mode */
|
||||
#include "../../../include/linux/xz.h"
|
||||
|
||||
#undef XZ_EXTERN
|
||||
|
||||
#endif
|
|
@ -74,6 +74,7 @@ config PPC_BOOK3S_64
|
|||
select HAVE_ARCH_TRANSPARENT_HUGEPAGE
|
||||
select ARCH_SUPPORTS_NUMA_BALANCING
|
||||
select IRQ_WORK
|
||||
select HAVE_KERNEL_XZ
|
||||
|
||||
config PPC_BOOK3E_64
|
||||
bool "Embedded processors"
|
||||
|
|
Loading…
Reference in New Issue