2011-01-13 01:01:22 +00:00
|
|
|
#!/bin/sh
|
2024-07-21 13:36:18 +00:00
|
|
|
# SPDX-License-Identifier: 0BSD
|
2011-01-13 01:01:22 +00:00
|
|
|
#
|
|
|
|
# This is a wrapper for xz to compress the kernel image using appropriate
|
|
|
|
# compression options depending on the architecture.
|
|
|
|
#
|
|
|
|
# Author: Lasse Collin <lasse.collin@tukaani.org>
|
|
|
|
|
2024-07-21 13:36:29 +00:00
|
|
|
# This has specialized settings for the following archs. However,
|
|
|
|
# XZ-compressed kernel isn't currently supported on every listed arch.
|
|
|
|
#
|
|
|
|
# Arch Align Notes
|
|
|
|
# arm 2/4 ARM and ARM-Thumb2
|
|
|
|
# arm64 4
|
|
|
|
# csky 2
|
|
|
|
# loongarch 4
|
|
|
|
# mips 2/4 MicroMIPS is 2-byte aligned
|
|
|
|
# parisc 4
|
|
|
|
# powerpc 4 Uses its own wrapper for compressors instead of this.
|
|
|
|
# riscv 2/4
|
|
|
|
# s390 2
|
|
|
|
# sh 2
|
|
|
|
# sparc 4
|
|
|
|
# x86 1
|
|
|
|
|
|
|
|
# A few archs use 2-byte or 4-byte aligned instructions depending on
|
|
|
|
# the kernel config. This function is used to check if the relevant
|
|
|
|
# config option is set to "y".
|
|
|
|
is_enabled()
|
|
|
|
{
|
|
|
|
grep -q "^$1=y$" include/config/auto.conf
|
|
|
|
}
|
|
|
|
|
|
|
|
# XZ_VERSION is needed to disable features that aren't available in
|
|
|
|
# old XZ Utils versions.
|
|
|
|
XZ_VERSION=$($XZ --robot --version) || exit
|
|
|
|
XZ_VERSION=$(printf '%s\n' "$XZ_VERSION" | sed -n 's/^XZ_VERSION=//p')
|
|
|
|
|
|
|
|
# Assume that no BCJ filter is available.
|
2011-01-13 01:01:22 +00:00
|
|
|
BCJ=
|
|
|
|
|
2024-07-21 13:36:29 +00:00
|
|
|
# Set the instruction alignment to 1, 2, or 4 bytes.
|
|
|
|
#
|
|
|
|
# Set the BCJ filter if one is available.
|
|
|
|
# It must match the #ifdef usage in lib/decompress_unxz.c.
|
2012-04-18 16:55:44 +00:00
|
|
|
case $SRCARCH in
|
2024-07-21 13:36:29 +00:00
|
|
|
arm)
|
|
|
|
if is_enabled CONFIG_THUMB2_KERNEL; then
|
|
|
|
ALIGN=2
|
|
|
|
BCJ=--armthumb
|
|
|
|
else
|
|
|
|
ALIGN=4
|
|
|
|
BCJ=--arm
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
|
|
|
|
arm64)
|
|
|
|
ALIGN=4
|
|
|
|
|
|
|
|
# ARM64 filter was added in XZ Utils 5.4.0.
|
|
|
|
if [ "$XZ_VERSION" -ge 50040002 ]; then
|
|
|
|
BCJ=--arm64
|
|
|
|
else
|
|
|
|
echo "$0: Upgrading to xz >= 5.4.0" \
|
|
|
|
"would enable the ARM64 filter" \
|
|
|
|
"for better compression" >&2
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
|
|
|
|
csky)
|
|
|
|
ALIGN=2
|
|
|
|
;;
|
|
|
|
|
|
|
|
loongarch)
|
|
|
|
ALIGN=4
|
|
|
|
;;
|
|
|
|
|
|
|
|
mips)
|
|
|
|
if is_enabled CONFIG_CPU_MICROMIPS; then
|
|
|
|
ALIGN=2
|
|
|
|
else
|
|
|
|
ALIGN=4
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
|
|
|
|
parisc)
|
|
|
|
ALIGN=4
|
|
|
|
;;
|
|
|
|
|
|
|
|
powerpc)
|
|
|
|
ALIGN=4
|
|
|
|
|
|
|
|
# The filter is only for big endian instruction encoding.
|
|
|
|
if is_enabled CONFIG_CPU_BIG_ENDIAN; then
|
|
|
|
BCJ=--powerpc
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
|
|
|
|
riscv)
|
|
|
|
if is_enabled CONFIG_RISCV_ISA_C; then
|
|
|
|
ALIGN=2
|
|
|
|
else
|
|
|
|
ALIGN=4
|
|
|
|
fi
|
|
|
|
|
|
|
|
# RISC-V filter was added in XZ Utils 5.6.0.
|
|
|
|
if [ "$XZ_VERSION" -ge 50060002 ]; then
|
|
|
|
BCJ=--riscv
|
|
|
|
else
|
|
|
|
echo "$0: Upgrading to xz >= 5.6.0" \
|
|
|
|
"would enable the RISC-V filter" \
|
|
|
|
"for better compression" >&2
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
|
|
|
|
s390)
|
|
|
|
ALIGN=2
|
|
|
|
;;
|
|
|
|
|
|
|
|
sh)
|
|
|
|
ALIGN=2
|
|
|
|
;;
|
|
|
|
|
|
|
|
sparc)
|
|
|
|
ALIGN=4
|
|
|
|
BCJ=--sparc
|
|
|
|
;;
|
|
|
|
|
|
|
|
x86)
|
|
|
|
ALIGN=1
|
|
|
|
BCJ=--x86
|
|
|
|
;;
|
|
|
|
|
|
|
|
*)
|
|
|
|
echo "$0: Arch-specific tuning is missing for '$SRCARCH'" >&2
|
|
|
|
|
|
|
|
# Guess 2-byte-aligned instructions. Guessing too low
|
|
|
|
# should hurt less than guessing too high.
|
|
|
|
ALIGN=2
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
# Select the LZMA2 options matching the instruction alignment.
|
|
|
|
case $ALIGN in
|
|
|
|
1) LZMA2OPTS= ;;
|
|
|
|
2) LZMA2OPTS=lp=1 ;;
|
|
|
|
4) LZMA2OPTS=lp=2,lc=2 ;;
|
|
|
|
*) echo "$0: ALIGN wrong or missing" >&2; exit 1 ;;
|
2011-01-13 01:01:22 +00:00
|
|
|
esac
|
|
|
|
|
2024-07-21 13:36:28 +00:00
|
|
|
# Use single-threaded mode because it compresses a little better
|
|
|
|
# (and uses less RAM) than multithreaded mode.
|
|
|
|
#
|
|
|
|
# For the best compression, the dictionary size shouldn't be
|
|
|
|
# smaller than the uncompressed kernel. 128 MiB dictionary
|
|
|
|
# needs less than 1400 MiB of RAM in single-threaded mode.
|
|
|
|
#
|
|
|
|
# On the archs that use this script to compress the kernel,
|
|
|
|
# decompression in the preboot code is done in single-call mode.
|
|
|
|
# Thus the dictionary size doesn't affect the memory requirements
|
|
|
|
# of the preboot decompressor at all.
|
|
|
|
exec $XZ --check=crc32 --threads=1 $BCJ --lzma2=$LZMA2OPTS,dict=128MiB
|