summaryrefslogtreecommitdiffstats
path: root/Makefile
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--Makefile165
1 files changed, 165 insertions, 0 deletions
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..1d5f5a0
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,165 @@
+PATH := $(PATH):/sbin:/usr/sbin
+IUCODE_TOOL ?= iucode_tool
+IUC_FLAGS := -v
+IUC_FINAL_FLAGS := -vv
+
+# CUTDATE RANGE:
+#
+# This filter selects what we consider to be old microcode which
+# should still be shipped even if Intel dropped them. Note that
+# it is useless to ship microcodes for anything the distro doesn't
+# really support anymore
+#
+# Watch out: check in the changelog, if this filter will add
+# microcodes that look like they've been recalled, use
+# IUC_OLDIES_EXCLUDE to avoid shipping the probably recalled
+# microcode. Refer to IUC_EXCLUDE for IUC_OLDIES_EXCLUDE syntax.
+#
+# Last manual check: up to 2008-01-01
+IUC_OLDIES_SELECT := "--date-before=2008-01-01"
+IUC_OLDIES_EXCLUDE :=
+
+# EXCLUDING MICROCODES:
+#
+# Always document reason. See iucode_tool(8) for -s !<sig> syntax
+# Recalls might require use of .fw overrides to retain old version,
+# instead of exclusions. Exclusions have the highest priority, and
+# will remove microcode added by any other means, including override
+# files (.fw files).
+IUC_EXCLUDE :=
+
+# 0x106c0: alpha hardware, seen in a very very old microcode data file
+IUC_EXCLUDE += -s !0x106c0
+
+# INCLUDING MICROCODES:
+#
+# This should be used to add a microcode from any of the regular
+# microcode bundles, without the need for an override file. See
+# iucode_tool(8) for -s <sig> syntax. Always document the reason,
+# as per IUC_EXCLUDE.
+IUC_INCLUDE :=
+
+# Keep sorting order predictable or things will break
+export LC_COLLATE=C
+
+MICROCODE_REG_DBIN := $(patsubst microcode-%.d/,microcode-%.dbin,$(wildcard microcode-*.d/))
+MICROCODE_REG_SOURCES := $(sort $(wildcard microcode-*.dat microcode-*.bin) $(MICROCODE_REG_DBIN))
+MICROCODE_SUP_SOURCES := $(wildcard supplementary-ucode-*.bin supplementary-ucode-*.d/)
+MICROCODE_OVERRIDES := $(wildcard *.fw)
+
+MICROCODE_FINAL_REG_SOURCES :=
+ifneq ($(IUC_OLDIES_SELECT),)
+ MICROCODE_FINAL_REG_SOURCES += microcode-oldies.pbin
+endif
+ifneq ($(IUC_INCLUDE),)
+ MICROCODE_FINAL_REG_SOURCES += microcode-includes.pbin
+endif
+MICROCODE_FINAL_REG_SOURCES += $(lastword $(MICROCODE_REG_SOURCES))
+
+ifneq ($(MICROCODE_SUP_SOURCES),)
+MICROCODE_FINAL_SOURCES := microcode-aux.pbin
+else
+MICROCODE_FINAL_SOURCES := $(MICROCODE_FINAL_REG_SOURCES)
+endif
+ifneq ($(MICROCODE_OVERRIDES),)
+ MICROCODE_FINAL_SOURCES += microcode-overrides.pbin
+endif
+
+all: intel-microcode.bin intel-microcode-64.bin
+
+# When processing a directory that contains a single upstream
+# microcode release (split over many binary microcode files), we need
+# to group it into a single (temporary) bundle for downgrade mode to
+# work as expected. Using iucode_tool (in the default --no-downgrade
+# mode) to generate the temporary bundle ensures reproducibility,
+# since it will sort out any conflicts in a predictable way.
+
+microcode-%.dbin: microcode-%.d/
+ @echo
+ @echo Preprocessing microcode directory $^ into $@...
+ @$(IUCODE_TOOL) $(IUC_FLAGS) --overwrite -w "$@" $^
+
+# When looking for "old" microcodes that we should ship even if they
+# are not in the latest regular microcode bundle anymore, we use a
+# date filter to select *signatures* of microcodes that should be
+# included (instead of directly selecting the microcode itself).
+#
+# Then, the "latest" microcode (in source file order, due to the use
+# of downgrade mode) for each such signatures will be selected,
+# regardless of the date on the microcode itself.
+
+microcode-oldies.pbin: $(MICROCODE_REG_SOURCES)
+ @echo
+ @echo Preprocessing older regular microcode...
+ @$(IUCODE_TOOL) $(IUC_FLAGS) \
+ $(IUC_OLDIES_SELECT) $(IUC_OLDIES_EXCLUDE) \
+ --loose-date-filtering --downgrade --overwrite -w "$@" $^
+
+microcode-includes.pbin: $(MICROCODE_REG_SOURCES)
+ @echo
+ @echo Preprocessing force-included regular microcode...
+ @$(IUCODE_TOOL) $(IUC_FLAGS) -s! $(IUC_INCLUDE) \
+ --downgrade --overwrite -w "$@" $^
+
+# When there are supplementary microcode bundles, they must be merged
+# with the regular microcode in a separate step, since all such
+# microcodes must have the same precedence. We use two intermediate
+# bundles for this.
+#
+# The oldies and force-included microcodes are bundled together with
+# the latest regular microcode bundle in microcode-regular.pbin. The
+# precedence order for downgrading is:
+#
+# oldies < includes < latest regular microcode bundle
+#
+# The precedence order won't matter for oldies and includes, as they
+# either have different microcode, or microcode with the same
+# revision.
+#
+# Then, microcode-regular.pbin is merged with all supplementary
+# microcode bundles, with the downgrade logic disabled in the
+# microcode-aux.pbin target. The result will be used by the final
+# target.
+#
+# When there are no supplementary microcode updates, we can do all the
+# merging with the downgrade logic active in a single go in the final
+# target.
+
+microcode-regular.pbin: $(MICROCODE_FINAL_REG_SOURCES)
+ @echo
+ @echo Building microcode bundle for regular microcode...
+ @$(IUCODE_TOOL) $(IUC_FINAL_FLAGS) --downgrade --overwrite -w "$@" $^
+
+microcode-aux.pbin: microcode-regular.pbin $(MICROCODE_SUP_SOURCES)
+ @echo
+ @echo Merging regular and supplementary microcode bundles...
+ @$(IUCODE_TOOL) $(IUC_FINAL_FLAGS) --overwrite -w "$@" $^
+
+# The microcode overrides are bundled together to sort out any
+# duplication and revision level issues.
+microcode-overrides.pbin: $(MICROCODE_OVERRIDES)
+ @echo
+ @echo Preprocessing microcode overrides...
+ @$(IUCODE_TOOL) $(IUC_FLAGS) --overwrite -w "$@" $^
+
+# Final target
+intel-microcode.bin: $(MICROCODE_FINAL_SOURCES)
+ @echo
+ @echo Building final microcode bundle...
+ @$(IUCODE_TOOL) $(IUC_FINAL_FLAGS) $(IUC_EXCLUDE) \
+ --downgrade --overwrite -w "$@" $^
+
+intel-microcode-64.bin: intel-microcode.bin
+ @echo
+ @echo Building stripped-down microcode bundle for x86-64 and x32...
+ @$(IUCODE_TOOL) $(IUC_FLAGS) \
+ $(shell sed -n -r -e '/^i.86/ { s/^[^ ]+ +/-s !/;s/ +\#.*//;p}' cpu-signatures.txt) $(IUC_EXCLUDE) \
+ --overwrite -w "$@" $^
+
+distclean: clean
+clean:
+ rm -f intel-microcode-64.bin intel-microcode.bin
+ rm -f microcode-overrides.pbin microcode-oldies.pbin microcode-includes.pbin microcode-regular.pbin microcode-aux.pbin
+ rm -f microcode-*.dbin
+
+.PHONY: clean