Linux Audio

Check our new training course

Loading...
v6.9.4
 1#!/bin/sh
 
 2#
 3# This is a wrapper for xz to compress the kernel image using appropriate
 4# compression options depending on the architecture.
 5#
 6# Author: Lasse Collin <lasse.collin@tukaani.org>
 
 
 
 7#
 8# This file has been put into the public domain.
 9# You can do whatever you want with this file.
10#
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
 
12BCJ=
13LZMA2OPTS=
14
 
 
 
 
15case $SRCARCH in
16	x86)            BCJ=--x86 ;;
17	powerpc)        BCJ=--powerpc ;;
18	arm)            BCJ=--arm ;;
19	sparc)          BCJ=--sparc ;;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20esac
21
22exec $XZ --check=crc32 $BCJ --lzma2=$LZMA2OPTS,dict=32MiB
 
 
 
 
 
 
 
 
 
 
 
v6.13.7
  1#!/bin/sh
  2# SPDX-License-Identifier: 0BSD
  3#
  4# This is a wrapper for xz to compress the kernel image using appropriate
  5# compression options depending on the architecture.
  6#
  7# Author: Lasse Collin <lasse.collin@tukaani.org>
  8
  9# This has specialized settings for the following archs. However,
 10# XZ-compressed kernel isn't currently supported on every listed arch.
 11#
 12#   Arch        Align   Notes
 13#   arm          2/4    ARM and ARM-Thumb2
 14#   arm64         4
 15#   csky          2
 16#   loongarch     4
 17#   mips         2/4    MicroMIPS is 2-byte aligned
 18#   parisc        4
 19#   powerpc       4     Uses its own wrapper for compressors instead of this.
 20#   riscv        2/4
 21#   s390          2
 22#   sh            2
 23#   sparc         4
 24#   x86           1
 25
 26# A few archs use 2-byte or 4-byte aligned instructions depending on
 27# the kernel config. This function is used to check if the relevant
 28# config option is set to "y".
 29is_enabled()
 30{
 31	grep -q "^$1=y$" include/config/auto.conf
 32}
 33
 34# XZ_VERSION is needed to disable features that aren't available in
 35# old XZ Utils versions.
 36XZ_VERSION=$($XZ --robot --version) || exit
 37XZ_VERSION=$(printf '%s\n' "$XZ_VERSION" | sed -n 's/^XZ_VERSION=//p')
 38
 39# Assume that no BCJ filter is available.
 40BCJ=
 
 41
 42# Set the instruction alignment to 1, 2, or 4 bytes.
 43#
 44# Set the BCJ filter if one is available.
 45# It must match the #ifdef usage in lib/decompress_unxz.c.
 46case $SRCARCH in
 47	arm)
 48		if is_enabled CONFIG_THUMB2_KERNEL; then
 49			ALIGN=2
 50			BCJ=--armthumb
 51		else
 52			ALIGN=4
 53			BCJ=--arm
 54		fi
 55		;;
 56
 57	arm64)
 58		ALIGN=4
 59
 60		# ARM64 filter was added in XZ Utils 5.4.0.
 61		if [ "$XZ_VERSION" -ge 50040002 ]; then
 62			BCJ=--arm64
 63		else
 64			echo "$0: Upgrading to xz >= 5.4.0" \
 65				"would enable the ARM64 filter" \
 66				"for better compression" >&2
 67		fi
 68		;;
 69
 70	csky)
 71		ALIGN=2
 72		;;
 73
 74	loongarch)
 75		ALIGN=4
 76		;;
 77
 78	mips)
 79		if is_enabled CONFIG_CPU_MICROMIPS; then
 80			ALIGN=2
 81		else
 82			ALIGN=4
 83		fi
 84		;;
 85
 86	parisc)
 87		ALIGN=4
 88		;;
 89
 90	powerpc)
 91		ALIGN=4
 92
 93		# The filter is only for big endian instruction encoding.
 94		if is_enabled CONFIG_CPU_BIG_ENDIAN; then
 95			BCJ=--powerpc
 96		fi
 97		;;
 98
 99	riscv)
100		if is_enabled CONFIG_RISCV_ISA_C; then
101			ALIGN=2
102		else
103			ALIGN=4
104		fi
105
106		# RISC-V filter was added in XZ Utils 5.6.0.
107		if [ "$XZ_VERSION" -ge 50060002 ]; then
108			BCJ=--riscv
109		else
110			echo "$0: Upgrading to xz >= 5.6.0" \
111				"would enable the RISC-V filter" \
112				"for better compression" >&2
113		fi
114		;;
115
116	s390)
117		ALIGN=2
118		;;
119
120	sh)
121		ALIGN=2
122		;;
123
124	sparc)
125		ALIGN=4
126		BCJ=--sparc
127		;;
128
129	x86)
130		ALIGN=1
131		BCJ=--x86
132		;;
133
134	*)
135		echo "$0: Arch-specific tuning is missing for '$SRCARCH'" >&2
136
137		# Guess 2-byte-aligned instructions. Guessing too low
138		# should hurt less than guessing too high.
139		ALIGN=2
140		;;
141esac
142
143# Select the LZMA2 options matching the instruction alignment.
144case $ALIGN in
145	1)  LZMA2OPTS= ;;
146	2)  LZMA2OPTS=lp=1 ;;
147	4)  LZMA2OPTS=lp=2,lc=2 ;;
148	*)  echo "$0: ALIGN wrong or missing" >&2; exit 1 ;;
149esac
150
151# Use single-threaded mode because it compresses a little better
152# (and uses less RAM) than multithreaded mode.
153#
154# For the best compression, the dictionary size shouldn't be
155# smaller than the uncompressed kernel. 128 MiB dictionary
156# needs less than 1400 MiB of RAM in single-threaded mode.
157#
158# On the archs that use this script to compress the kernel,
159# decompression in the preboot code is done in single-call mode.
160# Thus the dictionary size doesn't affect the memory requirements
161# of the preboot decompressor at all.
162exec $XZ --check=crc32 --threads=1 $BCJ --lzma2=$LZMA2OPTS,dict=128MiB