Blame SPECS/dracut_99microcode_ctl-fw_dir_override_module_init.sh

Packit e3b5e1
#!/bin/bash
Packit e3b5e1
Packit e3b5e1
# Hack in additional firmware directories for supported caveats.
Packit e3b5e1
#
Packit e3b5e1
# SPDX-License-Identifier: CC0-1.0
Packit e3b5e1
Packit e3b5e1
check() {
Packit e3b5e1
	return 0
Packit e3b5e1
}
Packit e3b5e1
Packit e3b5e1
install() {
Packit e3b5e1
	local FW_DIR=/lib/firmware
Packit e3b5e1
	local DATA_DIR=/usr/share/microcode_ctl/ucode_with_caveats
Packit e3b5e1
	local CFG_DIR="/etc/microcode_ctl/ucode_with_caveats"
Packit e3b5e1
	local check_caveats=/usr/libexec/microcode_ctl/check_caveats
Packit e3b5e1
Packit e3b5e1
	local verbose_opt
Packit e3b5e1
	local cc_out
Packit e3b5e1
	local path
Packit e3b5e1
	local ignored
Packit e3b5e1
	local do_skip_host_only
Packit e3b5e1
	local p
Packit e3b5e1
Packit e3b5e1
	verbose_opt=
Packit e3b5e1
	[ 4 -gt "$stdloglvl" ] || verbose_opt="-v"
Packit e3b5e1
Packit e3b5e1
	# HACK: we override external fw_dir variable in order to get
Packit e3b5e1
	#       an additional ucode based on the kernel version.
Packit e3b5e1
	dinfo "  microcode_ctl module: mangling fw_dir"
Packit e3b5e1
Packit e3b5e1
	[ -z "$fw_dir_l" ] || {
Packit e3b5e1
		dinfo "    microcode_ctl: avoid touching fw_dir as" \
Packit e3b5e1
		      "it has been changed (fw_dir_l is '$fw_dir_l')"
Packit e3b5e1
Packit e3b5e1
		return 0
Packit e3b5e1
	}
Packit e3b5e1
Packit e3b5e1
	# Reset fw_dir to avoid inclusion of kernel-version-specific directories
Packit e3b5e1
	# populated with microcode for the late load
Packit e3b5e1
	[ "x$fw_dir" != \
Packit e3b5e1
	  "x/lib/firmware/updates /lib/firmware /lib/firmware/$kernel" ] || {
Packit e3b5e1
		fw_dir="/lib/firmware/updates /lib/firmware"
Packit e3b5e1
		dinfo "    microcode_ctl: reset fw_dir to \"${fw_dir}\""
Packit e3b5e1
	}
Packit e3b5e1
Packit e3b5e1
	fw_dir_add=""
Packit e3b5e1
	while read -d $'\n' -r i; do
Packit e3b5e1
		dinfo "    microcode_ctl: processing data directory " \
Packit e3b5e1
		      "\"$DATA_DIR/$i\"..."
Packit e3b5e1
Packit e3b5e1
		if [ "x" != "x$hostonly" ]; then
Packit e3b5e1
			do_skip_host_only=0
Packit e3b5e1
Packit e3b5e1
			local sho_overrides="
Packit e3b5e1
				$CFG_DIR/skip-host-only-check
Packit e3b5e1
				$CFG_DIR/skip-host-only-check-$i
Packit e3b5e1
				$FW_DIR/$kernel/skip-host-only-check
Packit e3b5e1
				$FW_DIR/$kernel/skip-host-only-check-$i"
Packit e3b5e1
Packit e3b5e1
			for p in $(echo "$sho_overrides"); do
Packit e3b5e1
				[ -e "$p" ] || continue
Packit e3b5e1
Packit e3b5e1
				do_skip_host_only=1
Packit e3b5e1
				dinfo "    microcode_ctl: $i; skipping" \
Packit e3b5e1
				      "Host-Only check, since \"$p\" exists."
Packit e3b5e1
				break
Packit e3b5e1
			done
Packit e3b5e1
		else
Packit e3b5e1
			do_skip_host_only=1
Packit e3b5e1
		fi
Packit e3b5e1
Packit e3b5e1
		match_model_opt=""
Packit e3b5e1
		[ 1 = "$do_skip_host_only" ] || match_model_opt="-m"
Packit e3b5e1
Packit e3b5e1
		if ! cc_out=$($check_caveats -e -k "$kernel" -c "$i" \
Packit e3b5e1
				$verbose_opt $match_model_opt)
Packit e3b5e1
		then
Packit e3b5e1
			dinfo "    microcode_ctl: kernel version \"$kernel\"" \
Packit e3b5e1
			      "failed early load check for \"$i\", skipping"
Packit e3b5e1
			continue
Packit e3b5e1
		fi
Packit e3b5e1
Packit e3b5e1
		path=$(printf "%s" "$cc_out" | sed -n 's/^paths //p')
Packit e3b5e1
		[ -n "$path" ] || {
Packit e3b5e1
			ignored=$(printf "%s" "$cc_out" | \
Packit e3b5e1
					sed -n 's/^skip_cfgs //p')
Packit e3b5e1
Packit e3b5e1
			if [ -n "$ignored" ]; then
Packit e3b5e1
				dinfo "    microcode_ctl: configuration" \
Packit e3b5e1
				      "\"$i\" is ignored"
Packit e3b5e1
			else
Packit e3b5e1
				dinfo "    microcode_ctl: no microcode paths" \
Packit e3b5e1
				      "are associated with \"$i\", skipping"
Packit e3b5e1
			fi
Packit e3b5e1
Packit e3b5e1
			continue
Packit e3b5e1
		}
Packit e3b5e1
Packit e3b5e1
		dinfo "      microcode_ctl: $i: caveats check for kernel" \
Packit e3b5e1
		      "version \"$kernel\" passed, adding" \
Packit e3b5e1
		      "\"$DATA_DIR/$i\" to fw_dir variable"
Packit e3b5e1
Packit e3b5e1
		if [ 0 -eq "$do_skip_host_only" ]; then
Packit e3b5e1
			fw_dir_add="$DATA_DIR/$i "
Packit e3b5e1
		else
Packit e3b5e1
			fw_dir_add="$DATA_DIR/$i $fw_dir_add"
Packit e3b5e1
		fi
Packit e3b5e1
	# The list of directories is reverse-sorted in order to preserve the
Packit e3b5e1
	# "last wins" policy in case of presence of multiple microcode
Packit e3b5e1
	# revisions.
Packit e3b5e1
	#
Packit e3b5e1
	# In case of hostonly == 0, all microcode revisions will be included,
Packit e3b5e1
	# but since the microcode search is done with the "first wins" policy
Packit e3b5e1
	# by the (early) microcode loading code, the correct microcode revision
Packit e3b5e1
	# still has to be picked.
Packit e3b5e1
	#
Packit e3b5e1
	# Note that dracut without patch [1] puts only the last directory
Packit e3b5e1
	# in the early cpio; we try to address this by putting only the last
Packit e3b5e1
	# matching caveat in the search path, but that workaround works only
Packit e3b5e1
	# for host-only mode; non-host-only mode early cpio generation is still
Packit e3b5e1
	# broken without that patch.
Packit e3b5e1
	#
Packit e3b5e1
	# [1] https://github.com/dracutdevs/dracut/commit/c44d2252bb4b
Packit e3b5e1
	done <<-EOF
Packit e3b5e1
	$(find "$DATA_DIR" -maxdepth 1 -mindepth 1 -type d -printf "%f\n" \
Packit e3b5e1
		| LC_ALL=C sort)
Packit e3b5e1
	EOF
Packit e3b5e1
Packit e3b5e1
	fw_dir="${fw_dir_add}${fw_dir}"
Packit e3b5e1
	dinfo "    microcode_ctl: final fw_dir: \"${fw_dir}\""
Packit e3b5e1
}
Packit e3b5e1