aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlain Knaff <alain@knaff.lu>2009-01-07 03:10:27 -0500
committerH. Peter Anvin <hpa@zytor.com>2009-01-07 03:10:27 -0500
commita26ee60f90daffe1de6be0d093af86e7279b3dfd (patch)
tree01239fb6b173ff46711480b9601c69b92e1715a5
parentfb9a4ca9820fd4d7c4906bd393004662451e273e (diff)
bzip2/lzma: fix built-in initramfs vs CONFIG_RD_GZIP
Impact: Resolves build failures in some configurations Makes it possible to disable CONFIG_RD_GZIP . In that case, the built-in initramfs will be compressed by whatever compressor is available (bzip2 or lzma) or left uncompressed if none is available. It also removes a couple of warnings which occur when no ramdisk compression at all is chosen. It also restores the select ZLIB_INFLATE in drivers/block/Kconfig which somehow came missing. This is needed to activate compilation of the stuff in zlib_deflate. Signed-off-by: Alain Knaff <alain@knaff.lu> Signed-off-by: H. Peter Anvin <hpa@zytor.com>
-rw-r--r--init/initramfs.c7
-rw-r--r--scripts/gen_initramfs_list.sh17
-rw-r--r--usr/Makefile42
-rw-r--r--usr/initramfs_data.S2
-rw-r--r--usr/initramfs_data.bz2.S29
-rw-r--r--usr/initramfs_data.gz.S29
-rw-r--r--usr/initramfs_data.lzma.S29
7 files changed, 135 insertions, 20 deletions
diff --git a/init/initramfs.c b/init/initramfs.c
index 40bd4fb95788..a3ba91cdab89 100644
--- a/init/initramfs.c
+++ b/init/initramfs.c
@@ -389,7 +389,7 @@ static int __init write_buffer(char *buf, unsigned len)
389 return len - count; 389 return len - count;
390} 390}
391 391
392 392#if defined CONFIG_RD_GZIP || defined CONFIG_RD_BZIP2 || defined CONFIG_RD_LZMA
393static int __init flush_buffer(void *bufv, unsigned len) 393static int __init flush_buffer(void *bufv, unsigned len)
394{ 394{
395 char *buf = (char *) bufv; 395 char *buf = (char *) bufv;
@@ -412,6 +412,7 @@ static int __init flush_buffer(void *bufv, unsigned len)
412 } 412 }
413 return origLen; 413 return origLen;
414} 414}
415#endif
415 416
416static unsigned my_inptr; /* index of next byte to be processed in inbuf */ 417static unsigned my_inptr; /* index of next byte to be processed in inbuf */
417 418
@@ -449,10 +450,12 @@ static char * __init unpack_to_rootfs(char *buf, unsigned len, int check_only)
449 continue; 450 continue;
450 } 451 }
451 this_header = 0; 452 this_header = 0;
453#ifdef CONFIG_RD_GZIP
452 if (!gunzip(buf, len, NULL, flush_buffer, NULL, 454 if (!gunzip(buf, len, NULL, flush_buffer, NULL,
453 &my_inptr, error) && 455 &my_inptr, error) &&
454 message == NULL) 456 message == NULL)
455 goto ok; 457 goto ok;
458#endif
456 459
457#ifdef CONFIG_RD_BZIP2 460#ifdef CONFIG_RD_BZIP2
458 message = NULL; /* Zero out message, or else cpio will 461 message = NULL; /* Zero out message, or else cpio will
@@ -473,7 +476,9 @@ static char * __init unpack_to_rootfs(char *buf, unsigned len, int check_only)
473 goto ok; 476 goto ok;
474 } 477 }
475#endif 478#endif
479#if defined CONFIG_RD_GZIP || defined CONFIG_RD_BZIP2 || defined CONFIG_RD_LZMA
476ok: 480ok:
481#endif
477 if (state != Reset) 482 if (state != Reset)
478 error("junk in compressed archive"); 483 error("junk in compressed archive");
479 this_header = saved_offset + my_inptr; 484 this_header = saved_offset + my_inptr;
diff --git a/scripts/gen_initramfs_list.sh b/scripts/gen_initramfs_list.sh
index 5f3415f28736..41041e4923f7 100644
--- a/scripts/gen_initramfs_list.sh
+++ b/scripts/gen_initramfs_list.sh
@@ -5,7 +5,7 @@
5# Released under the terms of the GNU GPL 5# Released under the terms of the GNU GPL
6# 6#
7# Generate a cpio packed initramfs. It uses gen_init_cpio to generate 7# Generate a cpio packed initramfs. It uses gen_init_cpio to generate
8# the cpio archive, and gzip to pack it. 8# the cpio archive, and then compresses it.
9# The script may also be used to generate the inputfile used for gen_init_cpio 9# The script may also be used to generate the inputfile used for gen_init_cpio
10# This script assumes that gen_init_cpio is located in usr/ directory 10# This script assumes that gen_init_cpio is located in usr/ directory
11 11
@@ -16,8 +16,8 @@ usage() {
16cat << EOF 16cat << EOF
17Usage: 17Usage:
18$0 [-o <file>] [-u <uid>] [-g <gid>] {-d | <cpio_source>} ... 18$0 [-o <file>] [-u <uid>] [-g <gid>] {-d | <cpio_source>} ...
19 -o <file> Create gzipped initramfs file named <file> using 19 -o <file> Create compressed initramfs file named <file> using
20 gen_init_cpio and gzip 20 gen_init_cpio and compressor depending on the extension
21 -u <uid> User ID to map to user ID 0 (root). 21 -u <uid> User ID to map to user ID 0 (root).
22 <uid> is only meaningful if <cpio_source> is a 22 <uid> is only meaningful if <cpio_source> is a
23 directory. "squash" forces all files to uid 0. 23 directory. "squash" forces all files to uid 0.
@@ -225,6 +225,7 @@ cpio_list=
225output="/dev/stdout" 225output="/dev/stdout"
226output_file="" 226output_file=""
227is_cpio_compressed= 227is_cpio_compressed=
228compr="gzip -9 -f"
228 229
229arg="$1" 230arg="$1"
230case "$arg" in 231case "$arg" in
@@ -233,11 +234,15 @@ case "$arg" in
233 echo "deps_initramfs := \\" 234 echo "deps_initramfs := \\"
234 shift 235 shift
235 ;; 236 ;;
236 "-o") # generate gzipped cpio image named $1 237 "-o") # generate compressed cpio image named $1
237 shift 238 shift
238 output_file="$1" 239 output_file="$1"
239 cpio_list="$(mktemp ${TMPDIR:-/tmp}/cpiolist.XXXXXX)" 240 cpio_list="$(mktemp ${TMPDIR:-/tmp}/cpiolist.XXXXXX)"
240 output=${cpio_list} 241 output=${cpio_list}
242 echo "$output_file" | grep -q "\.gz$" && compr="gzip -9 -f"
243 echo "$output_file" | grep -q "\.bz2$" && compr="bzip2 -9 -f"
244 echo "$output_file" | grep -q "\.lzma$" && compr="lzma -9 -f"
245 echo "$output_file" | grep -q "\.cpio$" && compr="cat"
241 shift 246 shift
242 ;; 247 ;;
243esac 248esac
@@ -274,7 +279,7 @@ while [ $# -gt 0 ]; do
274 esac 279 esac
275done 280done
276 281
277# If output_file is set we will generate cpio archive and gzip it 282# If output_file is set we will generate cpio archive and compress it
278# we are carefull to delete tmp files 283# we are carefull to delete tmp files
279if [ ! -z ${output_file} ]; then 284if [ ! -z ${output_file} ]; then
280 if [ -z ${cpio_file} ]; then 285 if [ -z ${cpio_file} ]; then
@@ -287,7 +292,7 @@ if [ ! -z ${output_file} ]; then
287 if [ "${is_cpio_compressed}" = "compressed" ]; then 292 if [ "${is_cpio_compressed}" = "compressed" ]; then
288 cat ${cpio_tfile} > ${output_file} 293 cat ${cpio_tfile} > ${output_file}
289 else 294 else
290 cat ${cpio_tfile} | gzip -f -9 - > ${output_file} 295 cat ${cpio_tfile} | ${compr} - > ${output_file}
291 fi 296 fi
292 [ -z ${cpio_file} ] && rm ${cpio_tfile} 297 [ -z ${cpio_file} ] && rm ${cpio_tfile}
293fi 298fi
diff --git a/usr/Makefile b/usr/Makefile
index 201f27f8cbaf..451cdff7dff9 100644
--- a/usr/Makefile
+++ b/usr/Makefile
@@ -5,14 +5,32 @@
5klibcdirs:; 5klibcdirs:;
6PHONY += klibcdirs 6PHONY += klibcdirs
7 7
8# Find out "preferred" ramdisk compressor. Order of preference is
9# 1. bzip2 efficient, and likely to be present
10# 2. gzip former default
11# 3. lzma
12# 4. none
13
14# None of the above
15suffix_y =
16
17# Lzma, but no gzip nor bzip2
18suffix_$(CONFIG_RD_LZMA) = .lzma
19
20# Gzip, but no bzip2
21suffix_$(CONFIG_RD_GZIP) = .gz
22
23# Bzip2
24suffix_$(CONFIG_RD_BZIP2) = .bz2
25
8 26
9# Generate builtin.o based on initramfs_data.o 27# Generate builtin.o based on initramfs_data.o
10obj-$(CONFIG_BLK_DEV_INITRD) := initramfs_data.o 28obj-$(CONFIG_BLK_DEV_INITRD) := initramfs_data$(suffix_y).o
11 29
12# initramfs_data.o contains the initramfs_data.cpio.gz image. 30# initramfs_data.o contains the compressed initramfs_data.cpio image.
13# The image is included using .incbin, a dependency which is not 31# The image is included using .incbin, a dependency which is not
14# tracked automatically. 32# tracked automatically.
15$(obj)/initramfs_data.o: $(obj)/initramfs_data.cpio.gz FORCE 33$(obj)/initramfs_data$(suffix_y).o: $(obj)/initramfs_data.cpio$(suffix_y) FORCE
16 34
17##### 35#####
18# Generate the initramfs cpio archive 36# Generate the initramfs cpio archive
@@ -25,28 +43,28 @@ ramfs-args := \
25 $(if $(CONFIG_INITRAMFS_ROOT_UID), -u $(CONFIG_INITRAMFS_ROOT_UID)) \ 43 $(if $(CONFIG_INITRAMFS_ROOT_UID), -u $(CONFIG_INITRAMFS_ROOT_UID)) \
26 $(if $(CONFIG_INITRAMFS_ROOT_GID), -g $(CONFIG_INITRAMFS_ROOT_GID)) 44 $(if $(CONFIG_INITRAMFS_ROOT_GID), -g $(CONFIG_INITRAMFS_ROOT_GID))
27 45
28# .initramfs_data.cpio.gz.d is used to identify all files included 46# .initramfs_data.cpio.d is used to identify all files included
29# in initramfs and to detect if any files are added/removed. 47# in initramfs and to detect if any files are added/removed.
30# Removed files are identified by directory timestamp being updated 48# Removed files are identified by directory timestamp being updated
31# The dependency list is generated by gen_initramfs.sh -l 49# The dependency list is generated by gen_initramfs.sh -l
32ifneq ($(wildcard $(obj)/.initramfs_data.cpio.gz.d),) 50ifneq ($(wildcard $(obj)/.initramfs_data.cpio.d),)
33 include $(obj)/.initramfs_data.cpio.gz.d 51 include $(obj)/.initramfs_data.cpio.d
34endif 52endif
35 53
36quiet_cmd_initfs = GEN $@ 54quiet_cmd_initfs = GEN $@
37 cmd_initfs = $(initramfs) -o $@ $(ramfs-args) $(ramfs-input) 55 cmd_initfs = $(initramfs) -o $@ $(ramfs-args) $(ramfs-input)
38 56
39targets := initramfs_data.cpio.gz 57targets := initramfs_data.cpio.gz initramfs_data.cpio.bz2 initramfs_data.cpio.lzma initramfs_data.cpio
40# do not try to update files included in initramfs 58# do not try to update files included in initramfs
41$(deps_initramfs): ; 59$(deps_initramfs): ;
42 60
43$(deps_initramfs): klibcdirs 61$(deps_initramfs): klibcdirs
44# We rebuild initramfs_data.cpio.gz if: 62# We rebuild initramfs_data.cpio if:
45# 1) Any included file is newer then initramfs_data.cpio.gz 63# 1) Any included file is newer then initramfs_data.cpio
46# 2) There are changes in which files are included (added or deleted) 64# 2) There are changes in which files are included (added or deleted)
47# 3) If gen_init_cpio are newer than initramfs_data.cpio.gz 65# 3) If gen_init_cpio are newer than initramfs_data.cpio
48# 4) arguments to gen_initramfs.sh changes 66# 4) arguments to gen_initramfs.sh changes
49$(obj)/initramfs_data.cpio.gz: $(obj)/gen_init_cpio $(deps_initramfs) klibcdirs 67$(obj)/initramfs_data.cpio$(suffix_y): $(obj)/gen_init_cpio $(deps_initramfs) klibcdirs
50 $(Q)$(initramfs) -l $(ramfs-input) > $(obj)/.initramfs_data.cpio.gz.d 68 $(Q)$(initramfs) -l $(ramfs-input) > $(obj)/.initramfs_data.cpio.d
51 $(call if_changed,initfs) 69 $(call if_changed,initfs)
52 70
diff --git a/usr/initramfs_data.S b/usr/initramfs_data.S
index c2e1ad424f4a..7c6973d8d829 100644
--- a/usr/initramfs_data.S
+++ b/usr/initramfs_data.S
@@ -26,5 +26,5 @@ SECTIONS
26*/ 26*/
27 27
28.section .init.ramfs,"a" 28.section .init.ramfs,"a"
29.incbin "usr/initramfs_data.cpio.gz" 29.incbin "usr/initramfs_data.cpio"
30 30
diff --git a/usr/initramfs_data.bz2.S b/usr/initramfs_data.bz2.S
new file mode 100644
index 000000000000..bc54d090365c
--- /dev/null
+++ b/usr/initramfs_data.bz2.S
@@ -0,0 +1,29 @@
1/*
2 initramfs_data includes the compressed binary that is the
3 filesystem used for early user space.
4 Note: Older versions of "as" (prior to binutils 2.11.90.0.23
5 released on 2001-07-14) dit not support .incbin.
6 If you are forced to use older binutils than that then the
7 following trick can be applied to create the resulting binary:
8
9
10 ld -m elf_i386 --format binary --oformat elf32-i386 -r \
11 -T initramfs_data.scr initramfs_data.cpio.gz -o initramfs_data.o
12 ld -m elf_i386 -r -o built-in.o initramfs_data.o
13
14 initramfs_data.scr looks like this:
15SECTIONS
16{
17 .init.ramfs : { *(.data) }
18}
19
20 The above example is for i386 - the parameters vary from architectures.
21 Eventually look up LDFLAGS_BLOB in an older version of the
22 arch/$(ARCH)/Makefile to see the flags used before .incbin was introduced.
23
24 Using .incbin has the advantage over ld that the correct flags are set
25 in the ELF header, as required by certain architectures.
26*/
27
28.section .init.ramfs,"a"
29.incbin "usr/initramfs_data.cpio.bz2"
diff --git a/usr/initramfs_data.gz.S b/usr/initramfs_data.gz.S
new file mode 100644
index 000000000000..890c8dd1d6bd
--- /dev/null
+++ b/usr/initramfs_data.gz.S
@@ -0,0 +1,29 @@
1/*
2 initramfs_data includes the compressed binary that is the
3 filesystem used for early user space.
4 Note: Older versions of "as" (prior to binutils 2.11.90.0.23
5 released on 2001-07-14) dit not support .incbin.
6 If you are forced to use older binutils than that then the
7 following trick can be applied to create the resulting binary:
8
9
10 ld -m elf_i386 --format binary --oformat elf32-i386 -r \
11 -T initramfs_data.scr initramfs_data.cpio.gz -o initramfs_data.o
12 ld -m elf_i386 -r -o built-in.o initramfs_data.o
13
14 initramfs_data.scr looks like this:
15SECTIONS
16{
17 .init.ramfs : { *(.data) }
18}
19
20 The above example is for i386 - the parameters vary from architectures.
21 Eventually look up LDFLAGS_BLOB in an older version of the
22 arch/$(ARCH)/Makefile to see the flags used before .incbin was introduced.
23
24 Using .incbin has the advantage over ld that the correct flags are set
25 in the ELF header, as required by certain architectures.
26*/
27
28.section .init.ramfs,"a"
29.incbin "usr/initramfs_data.cpio.gz"
diff --git a/usr/initramfs_data.lzma.S b/usr/initramfs_data.lzma.S
new file mode 100644
index 000000000000..e11469e48562
--- /dev/null
+++ b/usr/initramfs_data.lzma.S
@@ -0,0 +1,29 @@
1/*
2 initramfs_data includes the compressed binary that is the
3 filesystem used for early user space.
4 Note: Older versions of "as" (prior to binutils 2.11.90.0.23
5 released on 2001-07-14) dit not support .incbin.
6 If you are forced to use older binutils than that then the
7 following trick can be applied to create the resulting binary:
8
9
10 ld -m elf_i386 --format binary --oformat elf32-i386 -r \
11 -T initramfs_data.scr initramfs_data.cpio.gz -o initramfs_data.o
12 ld -m elf_i386 -r -o built-in.o initramfs_data.o
13
14 initramfs_data.scr looks like this:
15SECTIONS
16{
17 .init.ramfs : { *(.data) }
18}
19
20 The above example is for i386 - the parameters vary from architectures.
21 Eventually look up LDFLAGS_BLOB in an older version of the
22 arch/$(ARCH)/Makefile to see the flags used before .incbin was introduced.
23
24 Using .incbin has the advantage over ld that the correct flags are set
25 in the ELF header, as required by certain architectures.
26*/
27
28.section .init.ramfs,"a"
29.incbin "usr/initramfs_data.cpio.lzma"