1#!/bin/ksh 2 3# This file and its contents are supplied under the terms of the 4# Common Development and Distribution License ("CDDL"), version 1.0. 5# You may only use this file in accordance with the terms of version 6# 1.0 of the CDDL. 7# 8# A full copy of the text of the CDDL should have accompanied this 9# source. A copy of the CDDL is also available via the Internet at 10# http://www.illumos.org/license/CDDL. 11 12# Copyright 2018 OmniOS Community Edition (OmniOSce) Association. 13# Copyright 2019 Joyent, Inc. 14 15# A simple update script that extracts an Intel microcode download file 16# into the intel/ directory, and updates the hardlinks in the 17# system/kernel/platform manifest. 18 19set -e 20set -o pipefail 21 22[[ -z "$1" ]] || [[ ! -f "$1" ]] && { 23 echo "Syntax: $0 <path to microcode tar>" >&2 24 exit 1 25} 26 27ucodetar="$1" 28 29mf=../../pkg/manifests/system-kernel-platform.mf 30[[ -f $mf ]] || { 31 echo "Run from usr/src/data/ucode" 2>&1 32 exit 1 33} 34 35fw=platform/i86pc/ucode/GenuineIntel 36 37tmp=$(mktemp -d) 38mkdir $tmp/out 39 40gtar -C $tmp -xvf "$ucodetar" 41 42find $tmp/Intel-Linux-Processor-Microcode-Data*/intel-ucode*/ -type f \ 43 | while read f; do 44 echo "Converting $(basename $f)" 45 cp $f $tmp/intel-fw 46 ucodeadm -i -R $tmp/out $tmp/intel-fw 47 rm -f $tmp/intel-fw 48done 49 50pkgfmt -u $mf 51mv $mf $mf.tmp 52egrep -v "(file|hardlink) path=$fw" $mf.tmp > $mf 53rm -f $mf.tmp 54 55rm -f intel/* 56rm -f Makefile.links 57 58typeset -A seen 59typeset -A inodes 60typeset -A links 61 62for f in $tmp/out/*; do 63 bf=$(basename $f) 64 [[ -n "${seen[$bf]}" ]] && continue 65 inode=$(stat -c %i $f) 66 if [[ -n "${inodes[$inode]}" ]]; then 67 links[$bf]=${inodes[$inode]} 68 else 69 inodes[$inode]=$bf 70 seen[$bf]=1 71 cp $f intel/$bf 72 fi 73 seen[$bf]=1 74done 75 76for f in intel/*; do 77 bf=$(basename $f) 78 echo "\$(i386_ONLY)file path=$fw/$bf group=sys mode=0444 reboot-needed=true" >> $mf 79done 80 81echo "INTEL_LINKS = ${!links[@]}" > Makefile.links 82echo >> Makefile.links 83 84for i in "${!links[@]}"; do 85 echo "\$(i386_ONLY)hardlink path=$fw/$i target=${links[$i]}" >> $mf 86 cat << EOM >> Makefile.links 87\$(ROOTINTELDIR)/$i: \$(ROOTINTELDIR)/${links[$i]} 88 \$(RM) \$@; \$(LN) \$^ \$@ 89 90EOM 91done 92 93pkgfmt $mf 94 95rm -rf $tmp 96