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 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 
  19 set -e
  20 set -o pipefail
  21 
  22 [[ -z "$1" ]] || [[ ! -f "$1" ]] && {
  23         echo "Syntax: $0 <path to microcode tar>" >&2
  24         exit 1
  25 }
  26 
  27 ucodetar="$1"
  28 
  29 mf=../../pkg/manifests/system-microcode-intel.mf
  30 [[ -f $mf ]] || {
  31         echo "Run from usr/src/data/ucode" 2>&1
  32         exit 1
  33 }
  34 
  35 fw=platform/i86pc/ucode/GenuineIntel
  36 
  37 tmp=$(mktemp -d)
  38 mkdir $tmp/out
  39 
  40 gtar -C $tmp -xvf "$ucodetar"
  41 
  42 find $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
  48 done
  49 
  50 pkgfmt -u $mf
  51 mv $mf $mf.tmp
  52 egrep -v "(file|hardlink) path=$fw" $mf.tmp > $mf
  53 rm -f $mf.tmp
  54 
  55 rm -f intel/*
  56 
  57 cp $tmp/Intel-Linux-Processor-Microcode-Data*/license intel/THIRDPARTYLICENSE
  58 echo Intel Processor Microcode Data Files > intel/THIRDPARTYLICENSE.descrip
  59 
  60 rm -f Makefile.links
  61 
  62 typeset -A seen
  63 typeset -A inodes
  64 typeset -A links
  65 
  66 for f in $tmp/out/*; do
  67         bf=$(basename $f)
  68         [[ -n "${seen[$bf]}" ]] && continue
  69         inode=$(stat -c %i $f)
  70         if [[ -n "${inodes[$inode]}" ]]; then
  71                 links[$bf]=${inodes[$inode]}
  72         else
  73                 inodes[$inode]=$bf
  74                 cp $f intel/$bf
  75         fi
  76         seen[$bf]=1
  77 done
  78 
  79 for f in intel/*; do
  80         bf=$(basename $f)
  81         [[ $bf = THIRDPARTYLICENSE* ]] && continue
  82         echo "file path=$fw/$bf group=sys mode=0444 reboot-needed=true" >> $mf
  83 done
  84 
  85 (
  86         sed '/^$/q' < ../../prototypes/prototype.Makefile
  87         echo 'INTEL_LINKS = \'
  88         for i in "${!links[@]}"; do
  89                 echo "\t$i \\"
  90         done | sed '$s/ .*//'
  91         echo
  92 ) > Makefile.links
  93 
  94 for i in "${!links[@]}"; do
  95         echo "hardlink path=$fw/$i target=${links[$i]}" >> $mf
  96         cat << EOM >> Makefile.links
  97 \$(ROOTINTELDIR)/$i: \$(ROOTINTELDIR)/${links[$i]}
  98         \$(RM) \$@; \$(LN) \$^ \$@
  99 
 100 EOM
 101 done
 102 
 103 pkgfmt $mf
 104 
 105 rm -rf $tmp