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 2019 OmniOS Community Edition (OmniOSce) Association.
13 # Copyright 2020 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
19 set -e
20 set -o pipefail
21
22 # Remove this once we start using pkgfmt without it in the rest of -gate.
23 export PKGFMT_OUTPUT=v1
24
25 # Change me if the world evolves, but for now, this is the source of
26 # truth for Intel microcode.
27 REPOSOURCE="https://github.com/intel/Intel-Linux-Processor-Microcode-Data-Files"
28
29 tmp=$(mktemp -d)
30 mkdir $tmp/out
31 mf=../../pkg/manifests/system-microcode-intel.mf
32 [[ -f $mf ]] || {
33 echo "Run from usr/src/data/ucode" 2>&1
34 exit 1
35 }
36
37 fw=platform/i86pc/ucode/GenuineIntel
38
39 if [[ -z "$1" ]]; then
40 goback=`pwd`
41 cd $tmp
42 # Hope git is available if we need it...
43 git clone $REPOSOURCE || {
44 echo "Git clone of $REPOSOURCE failed." 2>&1
45 exit 1
46 }
47 cd $goback
48 # Change with REPOSOURCE name
49 dir=$tmp/Intel-Linux-Processor-Microcode-Data-Files
50 elif [[ -d "$1" ]]; then
51 dir=$1
52 else
53 gtar -C $tmp -xvf "$1"
54 # This will expand properly if the tarball appends a release
55 # to the name.
56 dir=$tmp/Intel-Linux-Processor-Microcode-Data-Files*
57 fi
58
59 find $dir/intel-ucode*/ -type f \
60 | while read f; do
61 echo "Converting $(basename $f)"
62 cp $f $tmp/intel-fw
63 ucodeadm -i -R $tmp/out $tmp/intel-fw
64 rm -f $tmp/intel-fw
65 done
66
67 pkgfmt -u $mf
68 mv $mf $mf.tmp
69 egrep -v "(file|hardlink) path=$fw" $mf.tmp > $mf
70 rm -f $mf.tmp
71
72 rm -f intel/*
73
74 cp $dir/license intel/THIRDPARTYLICENSE
75 echo Intel Processor Microcode Data Files > intel/THIRDPARTYLICENSE.descrip
76
77 rm -f Makefile.links
78
79 typeset -A seen
80 typeset -A inodes
81 typeset -A links
82
83 for f in $tmp/out/*; do
84 bf=$(basename $f)
85 [[ -n "${seen[$bf]}" ]] && continue
86 inode=$(stat -c %i $f)
87 if [[ -n "${inodes[$inode]}" ]]; then
88 links[$bf]=${inodes[$inode]}
89 else
90 inodes[$inode]=$bf
91 cp $f intel/$bf
92 fi
93 seen[$bf]=1
94 done
95
96 for f in intel/*; do
97 bf=$(basename $f)
98 [[ $bf = THIRDPARTYLICENSE* ]] && continue
99 echo "file path=$fw/$bf group=sys mode=0444 reboot-needed=true" >> $mf
100 done
101
102 (
103 sed '/^$/q' < ../../prototypes/prototype.Makefile
104 echo 'INTEL_LINKS = \'
105 for i in "${!links[@]}"; do
106 echo "\t$i \\"
107 done | sed '$s/ .*//'
108 echo
109 ) > Makefile.links
110
111 for i in "${!links[@]}"; do
112 echo "hardlink path=$fw/$i target=${links[$i]}" >> $mf
113 cat << EOM >> Makefile.links
114 \$(ROOTINTELDIR)/$i: \$(ROOTINTELDIR)/${links[$i]}
115 \$(RM) \$@; \$(LN) \$^ \$@
116
117 EOM
118 done
119
120 pkgfmt $mf
121
122 rm -rf $tmp