Package: initramfs-tools Version: 0.112+nmu1 Severity: wishlist Tags: patch
Enclosed you will find two patches to add early-initramfs support to initramfs-tools. It adds, and properly documents, a hook function that allows packages to _prepend_ data to the main initramfs archive. It will be used by intel-microcode and amd64-microcode to supply an early initramfs with microcode data for the kernel. This is extremely important to properly work around bugs that would otherwise force the kernel to disable important functionality (such as the ones in the Atom that requires disabling PME, which previously required a bios update or the use of Intel BITS to work around. We have several documented cases of Debian users that cannot use either method). Please review and comment. If it is OK, please apply. git tree for git merge available upon request. -- no debconf information -- "One disk to rule them all, One disk to find them. One disk to bring them all and in the darkness grind them. In the Land of Redmond where the shadows lie." -- The Silicon Valley Tarot Henrique Holschuh
>From 53852844059e8dac529618acfeffc285b32a3ee5 Mon Sep 17 00:00:00 2001 From: Henrique de Moraes Holschuh <[email protected]> Date: Fri, 31 May 2013 22:16:44 -0300 Subject: [PATCH 1/2] implement early initramfs support Add a new hook function, prepend_earlyinitramfs(), which prepends the content of the file passed as a parameter to the initramfs that will be generated. This will be used to pass system processor microcode and ACPI table overrides to the kernel (requires Linux kernel v3.9 or later). Signed-off-by: Henrique de Moraes Holschuh <[email protected]> --- hook-functions | 10 ++++++++++ initramfs-tools.8 | 14 ++++++++++++++ mkinitramfs | 19 ++++++++++++++++--- 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/hook-functions b/hook-functions index 817d06c..e751021 100644 --- a/hook-functions +++ b/hook-functions @@ -10,6 +10,16 @@ catenate_cpiogz() { cat "${1}" >>"${__TMPCPIOGZ}" } +prepend_earlyinitramfs() { + # Sanity check + if [ ! -e "${1}" ]; then + echo "W: prepend_earlyinitramfs: arg1='${1}' does not exist." >&2 + return + fi + + cat "${1}" >>"${__TMPEARLYCPIO}" +} + # force_load module [args...] force_load() { diff --git a/initramfs-tools.8 b/initramfs-tools.8 index 375e5c1..546bb01 100644 --- a/initramfs-tools.8 +++ b/initramfs-tools.8 @@ -240,6 +240,20 @@ and copy them to the initramfs. This means that most executables, unless compiled with klibc, will automatically include glibc in the image which will increase its size by several hundred kilobytes. +.SS Including a system firmware preimage (early initramfs) +If you need to prepend data to the initramfs image, you need to prepare it +in a file, and call the \fB\fIprepend_earlyinitramfs\fR function. The file +can be disposed of as soon as the function returns. + +.B Example: +.nf +TEMP_FILE=$(mktemp ...) + ... +prepend_earlyinitramfs ${TEMP_FILE} +rm -f ${TEMP_FILE} + +.RE + .SS Exported variables mkinitramfs sets several variables for the hook scripts environment. diff --git a/mkinitramfs b/mkinitramfs index d9a54e2..cdec420 100755 --- a/mkinitramfs +++ b/mkinitramfs @@ -175,6 +175,7 @@ if [ -n "$fs" ] && mount | grep -q "on $fs .*noexec" ; then fi __TMPCPIOGZ="$(mktemp ${TMPDIR:-/var/tmp}/mkinitramfs-OL_XXXXXX)" || exit 1 +__TMPEARLYCPIO="$(mktemp ${TMPDIR:-/var/tmp}/mkinitramfs-FW_XXXXXX)" || exit 1 DPKG_ARCH=`dpkg --print-architecture` @@ -193,6 +194,9 @@ export BUSYBOX # Private, used by 'catenate_cpiogz'. export __TMPCPIOGZ +# Private, used by 'prepend_earlyinitramfs'. +export __TMPEARLYCPIO + for d in bin conf/conf.d etc lib/modules run sbin scripts ${MODULESDIR}; do mkdir -p "${DESTDIR}/${d}" done @@ -331,9 +335,17 @@ if [ "$DPKG_ARCH" = armhf ]; then fi [ "${verbose}" = y ] && echo "Building cpio ${outfile} initramfs" + +if [ -s "${__TMPEARLYCPIO}" ]; then + cat "${__TMPEARLYCPIO}" >"${outfile}" || exit 1 +else + # truncate + > "${outfile}" +fi + ( # work around lack of "set -o pipefail" for the following pipe: -# cd "${DESTDIR}" && find . | cpio --quiet -R 0:0 -o -H newc | gzip >"${outfile}" || exit 1 +# cd "${DESTDIR}" && find . | cpio --quiet -R 0:0 -o -H newc | gzip >>"${outfile}" || exit 1 exec 3>&1 eval ` # http://cfaj.freeshell.org/shell/cus-faq-2.html @@ -343,7 +355,7 @@ eval ` find . 4>&-; echo "ec1=$?;" >&4 } | { cpio --quiet -R 0:0 -o -H newc 4>&-; echo "ec2=$?;" >&4 - } | ${compress} >"${outfile}" + } | ${compress} >>"${outfile}" echo "ec3=$?;" >&4 ` if [ "$ec1" -ne 0 ]; then @@ -365,10 +377,11 @@ if [ -s "${__TMPCPIOGZ}" ]; then fi if [ "${keep}" = "y" ]; then - echo "Working files in ${DESTDIR} and overlay in ${__TMPCPIOGZ}" + echo "Working files in ${DESTDIR}, early initramfs in ${__TMPEARLYCPIO} and overlay in ${__TMPCPIOGZ}" else rm -rf "${DESTDIR}" rm -rf "${__TMPCPIOGZ}" + rm -rf "${__TMPEARLYCPIO}" fi exit 0 -- 1.7.10.4
>From 810e64e2460978dc509930f64a4f2a3576a1a1b2 Mon Sep 17 00:00:00 2001 From: Henrique de Moraes Holschuh <[email protected]> Date: Sun, 2 Jun 2013 17:50:36 -0300 Subject: [PATCH 2/2] lsinitramfs(8): document failure to deal with early initramfs lsinitramfs cannot deal with a multi-segmented initramfs archive, such as one with an uncompressed early initramfs prepended to the main compressed initramfs. Document this in the manpage. The kernel will parse all cpio archives it can find in the initramfs in sequence, and it doesn't care if some of them are compressed and others are not. Signed-off-by: Henrique de Moraes Holschuh <[email protected]> --- lsinitramfs.8 | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lsinitramfs.8 b/lsinitramfs.8 index b07ddeb..798aa8d 100644 --- a/lsinitramfs.8 +++ b/lsinitramfs.8 @@ -36,6 +36,13 @@ List content of two initramfs files in verbose mode: .PP .B lsinitramfs -l /boot/vmlinuz-2.6.31-grml64 /boot/vmlinuz-2.6.33-grml64 +.SH BUGS +.BR lsinitramfs +cannot deal with multiple-segmented initramfs images, such as those created +when an early (uncompressed) initramfs with system firmware is prepended to +the regular compressed initrams, or when overlay data is appended to the +initramfs. + .SH AUTHOR The initramfs-tools are written by Maximilian Attems <[email protected]> and numerous others. -- 1.7.10.4

