#!/bin/ksh

# This file and its contents are supplied under the terms of the
# Common Development and Distribution License ("CDDL"), version 1.0.
# You may only use this file in accordance with the terms of version
# 1.0 of the CDDL.
#
# A full copy of the text of the CDDL should have accompanied this
# source. A copy of the CDDL is also available via the Internet at
# http://www.illumos.org/license/CDDL.

# Copyright 2019 OmniOS Community Edition (OmniOSce) Association.
# Copyright 2019 Joyent, Inc.

# A simple update script that extracts an Intel microcode download file
# into the intel/ directory, and updates the hardlinks in the
# system/kernel/platform manifest.

set -e
set -o pipefail

[[ -z "$1" ]] || [[ ! -f "$1" ]] && {
	echo "Syntax: $0 <path to microcode tar>" >&2
	exit 1
}

ucodetar="$1"

mf=../../pkg/manifests/system-microcode-intel.mf
[[ -f $mf ]] || {
	echo "Run from usr/src/data/ucode" 2>&1
	exit 1
}

fw=platform/i86pc/ucode/GenuineIntel

tmp=$(mktemp -d)
mkdir $tmp/out

gtar -C $tmp -xvf "$ucodetar"

find $tmp/Intel-Linux-Processor-Microcode-Data*/intel-ucode*/ -type f \
    | while read f; do
	echo "Converting $(basename $f)"
	cp $f $tmp/intel-fw
	ucodeadm -i -R $tmp/out $tmp/intel-fw
	rm -f $tmp/intel-fw
done

pkgfmt -u $mf
mv $mf $mf.tmp
egrep -v "(file|hardlink) path=$fw" $mf.tmp > $mf
rm -f $mf.tmp

rm -f intel/*

cp $tmp/Intel-Linux-Processor-Microcode-Data*/license intel/THIRDPARTYLICENSE
echo Intel Processor Microcode Data Files > intel/THIRDPARTYLICENSE.descrip

rm -f Makefile.links

typeset -A seen
typeset -A inodes
typeset -A links

for f in $tmp/out/*; do
	bf=$(basename $f)
	[[ -n "${seen[$bf]}" ]] && continue
	inode=$(stat -c %i $f)
	if [[ -n "${inodes[$inode]}" ]]; then
		links[$bf]=${inodes[$inode]}
	else
		inodes[$inode]=$bf
		cp $f intel/$bf
	fi
	seen[$bf]=1
done

for f in intel/*; do
	bf=$(basename $f)
	[[ $bf = THIRDPARTYLICENSE* ]] && continue
	echo "file path=$fw/$bf group=sys mode=0444 reboot-needed=true" >> $mf
done

(
	sed '/^$/q' < ../../prototypes/prototype.Makefile
	echo 'INTEL_LINKS = \'
	for i in "${!links[@]}"; do
		echo "\t$i \\"
	done | sed '$s/ .*//'
	echo
) > Makefile.links

for i in "${!links[@]}"; do
	echo "hardlink path=$fw/$i target=${links[$i]}" >> $mf
	cat << EOM >> Makefile.links
\$(ROOTINTELDIR)/$i: \$(ROOTINTELDIR)/${links[$i]}
	\$(RM) \$@; \$(LN) \$^ \$@

EOM
done

pkgfmt $mf

rm -rf $tmp