cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

gen_initramfs.sh (5850B)


      1#!/bin/sh
      2# Copyright (C) Martin Schlemmer <azarah@nosferatu.za.org>
      3# Copyright (C) 2006 Sam Ravnborg <sam@ravnborg.org>
      4#
      5# Released under the terms of the GNU GPL
      6#
      7# Generate a cpio packed initramfs. It uses gen_init_cpio to generate
      8# the cpio archive.
      9# This script assumes that gen_init_cpio is located in usr/ directory
     10
     11# error out on errors
     12set -e
     13
     14usage() {
     15cat << EOF
     16Usage:
     17$0 [-o <file>] [-l <dep_list>] [-u <uid>] [-g <gid>] {-d | <cpio_source>} ...
     18	-o <file>      Create initramfs file named <file> by using gen_init_cpio
     19	-l <dep_list>  Create dependency list named <dep_list>
     20	-u <uid>       User ID to map to user ID 0 (root).
     21		       <uid> is only meaningful if <cpio_source> is a
     22		       directory.  "squash" forces all files to uid 0.
     23	-g <gid>       Group ID to map to group ID 0 (root).
     24		       <gid> is only meaningful if <cpio_source> is a
     25		       directory.  "squash" forces all files to gid 0.
     26	<cpio_source>  File list or directory for cpio archive.
     27		       If <cpio_source> is a .cpio file it will be used
     28		       as direct input to initramfs.
     29
     30All options except -o and -l may be repeated and are interpreted
     31sequentially and immediately.  -u and -g states are preserved across
     32<cpio_source> options so an explicit "-u 0 -g 0" is required
     33to reset the root/group mapping.
     34EOF
     35}
     36
     37# awk style field access
     38# $1 - field number; rest is argument string
     39field() {
     40	shift $1 ; echo $1
     41}
     42
     43filetype() {
     44	local argv1="$1"
     45
     46	# symlink test must come before file test
     47	if [ -L "${argv1}" ]; then
     48		echo "slink"
     49	elif [ -f "${argv1}" ]; then
     50		echo "file"
     51	elif [ -d "${argv1}" ]; then
     52		echo "dir"
     53	elif [ -b "${argv1}" -o -c "${argv1}" ]; then
     54		echo "nod"
     55	elif [ -p "${argv1}" ]; then
     56		echo "pipe"
     57	elif [ -S "${argv1}" ]; then
     58		echo "sock"
     59	else
     60		echo "invalid"
     61	fi
     62	return 0
     63}
     64
     65print_mtime() {
     66	local my_mtime="0"
     67
     68	if [ -e "$1" ]; then
     69		my_mtime=$(find "$1" -printf "%T@\n" | sort -r | head -n 1)
     70	fi
     71
     72	echo "# Last modified: ${my_mtime}" >> $cpio_list
     73	echo "" >> $cpio_list
     74}
     75
     76list_parse() {
     77	if [ -z "$dep_list" -o -L "$1" ]; then
     78		return
     79	fi
     80	echo "$1" | sed 's/:/\\:/g; s/$/ \\/' >> $dep_list
     81}
     82
     83# for each file print a line in following format
     84# <filetype> <name> <path to file> <octal mode> <uid> <gid>
     85# for links, devices etc the format differs. See gen_init_cpio for details
     86parse() {
     87	local location="$1"
     88	local name="/${location#${srcdir}}"
     89	# change '//' into '/'
     90	name=$(echo "$name" | sed -e 's://*:/:g')
     91	local mode="$2"
     92	local uid="$3"
     93	local gid="$4"
     94	local ftype=$(filetype "${location}")
     95	# remap uid/gid to 0 if necessary
     96	[ "$root_uid" = "squash" ] && uid=0 || [ "$uid" -eq "$root_uid" ] && uid=0
     97	[ "$root_gid" = "squash" ] && gid=0 || [ "$gid" -eq "$root_gid" ] && gid=0
     98	local str="${mode} ${uid} ${gid}"
     99
    100	[ "${ftype}" = "invalid" ] && return 0
    101	[ "${location}" = "${srcdir}" ] && return 0
    102
    103	case "${ftype}" in
    104		"file")
    105			str="${ftype} ${name} ${location} ${str}"
    106			;;
    107		"nod")
    108			local dev="`LC_ALL=C ls -l "${location}"`"
    109			local maj=`field 5 ${dev}`
    110			local min=`field 6 ${dev}`
    111			maj=${maj%,}
    112
    113			[ -b "${location}" ] && dev="b" || dev="c"
    114
    115			str="${ftype} ${name} ${str} ${dev} ${maj} ${min}"
    116			;;
    117		"slink")
    118			local target=`readlink "${location}"`
    119			str="${ftype} ${name} ${target} ${str}"
    120			;;
    121		*)
    122			str="${ftype} ${name} ${str}"
    123			;;
    124	esac
    125
    126	echo "${str}" >> $cpio_list
    127
    128	return 0
    129}
    130
    131unknown_option() {
    132	printf "ERROR: unknown option \"$arg\"\n" >&2
    133	printf "If the filename validly begins with '-', " >&2
    134	printf "then it must be prefixed\n" >&2
    135	printf "by './' so that it won't be interpreted as an option." >&2
    136	printf "\n" >&2
    137	usage >&2
    138	exit 1
    139}
    140
    141header() {
    142	printf "\n#####################\n# $1\n" >> $cpio_list
    143}
    144
    145# process one directory (incl sub-directories)
    146dir_filelist() {
    147	header "$1"
    148
    149	srcdir=$(echo "$1" | sed -e 's://*:/:g')
    150	dirlist=$(find "${srcdir}" -printf "%p %m %U %G\n" | LC_ALL=C sort)
    151
    152	# If $dirlist is only one line, then the directory is empty
    153	if [  "$(echo "${dirlist}" | wc -l)" -gt 1 ]; then
    154		print_mtime "$1"
    155
    156		echo "${dirlist}" | \
    157		while read x; do
    158			list_parse $x
    159			parse $x
    160		done
    161	fi
    162}
    163
    164input_file() {
    165	source="$1"
    166	if [ -f "$1" ]; then
    167		# If a regular file is specified, assume it is in
    168		# gen_init_cpio format
    169		header "$1"
    170		print_mtime "$1" >> $cpio_list
    171		cat "$1"         >> $cpio_list
    172		if [ -n "$dep_list" ]; then
    173		        echo "$1 \\"  >> $dep_list
    174			cat "$1" | while read type dir file perm ; do
    175				if [ "$type" = "file" ]; then
    176					echo "$file \\" >> $dep_list
    177				fi
    178			done
    179		fi
    180	elif [ -d "$1" ]; then
    181		# If a directory is specified then add all files in it to fs
    182		dir_filelist "$1"
    183	else
    184		echo "  ${prog}: Cannot open '$1'" >&2
    185		exit 1
    186	fi
    187}
    188
    189prog=$0
    190root_uid=0
    191root_gid=0
    192dep_list=
    193cpio_list=$(mktemp ${TMPDIR:-/tmp}/cpiolist.XXXXXX)
    194output="/dev/stdout"
    195
    196trap "rm -f $cpio_list" EXIT
    197
    198while [ $# -gt 0 ]; do
    199	arg="$1"
    200	shift
    201	case "$arg" in
    202		"-l")	# files included in initramfs - used by kbuild
    203			dep_list="$1"
    204			echo "deps_initramfs := \\" > $dep_list
    205			shift
    206			;;
    207		"-o")	# generate cpio image named $1
    208			output="$1"
    209			shift
    210			;;
    211		"-u")	# map $1 to uid=0 (root)
    212			root_uid="$1"
    213			[ "$root_uid" = "-1" ] && root_uid=$(id -u || echo 0)
    214			shift
    215			;;
    216		"-g")	# map $1 to gid=0 (root)
    217			root_gid="$1"
    218			[ "$root_gid" = "-1" ] && root_gid=$(id -g || echo 0)
    219			shift
    220			;;
    221		"-h")
    222			usage
    223			exit 0
    224			;;
    225		*)
    226			case "$arg" in
    227				"-"*)
    228					unknown_option
    229					;;
    230				*)	# input file/dir - process it
    231					input_file "$arg"
    232					;;
    233			esac
    234			;;
    235	esac
    236done
    237
    238# If output_file is set we will generate cpio archive
    239# we are careful to delete tmp files
    240timestamp=
    241if test -n "$KBUILD_BUILD_TIMESTAMP"; then
    242	timestamp="$(date -d"$KBUILD_BUILD_TIMESTAMP" +%s || :)"
    243	if test -n "$timestamp"; then
    244		timestamp="-t $timestamp"
    245	fi
    246fi
    247usr/gen_init_cpio $timestamp $cpio_list > $output