mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 04:18:39 +08:00
8085d56065
commit f5ae2ea634
upstream.
Intel Software Developer's Manual, volume 3, chapter 9.11.6 says:
"Note that the microcode update must be aligned on a 16-byte boundary
and the size of the microcode update must be 1-KByte granular"
When early-load Intel microcode is loaded from initramfs, userspace tool
'iucode_tool' has already 16-byte aligned those microcode bits in that
initramfs image. Image that was created something like this:
iucode_tool --write-earlyfw=FOO.cpio microcode-files...
However, when early-load Intel microcode is loaded from built-in
firmware BLOB using CONFIG_EXTRA_FIRMWARE= kernel config option, that
16-byte alignment is not guaranteed.
Fix this by forcing all built-in firmware BLOBs to 16-byte alignment.
[ If we end up having other firmware with much bigger alignment
requirements, we might need to introduce some method for the firmware
to specify it, this is the minimal "just increase the alignment a bit
to account for this one special case" patch - Linus ]
Signed-off-by: Jari Ruusu <jari.ruusu@gmail.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Fenghua Yu <fenghua.yu@intel.com>
Cc: Luis Chamberlain <mcgrof@kernel.org>
Cc: stable@kernel.org
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
65 lines
2.7 KiB
Makefile
65 lines
2.7 KiB
Makefile
# SPDX-License-Identifier: GPL-2.0
|
|
#
|
|
# kbuild file for firmware/
|
|
#
|
|
|
|
# Create $(fwabs) from $(CONFIG_EXTRA_FIRMWARE_DIR) -- if it doesn't have a
|
|
# leading /, it's relative to $(srctree).
|
|
fwdir := $(subst $(quote),,$(CONFIG_EXTRA_FIRMWARE_DIR))
|
|
fwabs := $(addprefix $(srctree)/,$(filter-out /%,$(fwdir)))$(filter /%,$(fwdir))
|
|
|
|
fw-external-y := $(subst $(quote),,$(CONFIG_EXTRA_FIRMWARE))
|
|
|
|
quiet_cmd_fwbin = MK_FW $@
|
|
cmd_fwbin = FWNAME="$(patsubst firmware/%.gen.S,%,$@)"; \
|
|
FWSTR="$(subst /,_,$(subst .,_,$(subst -,_,$(patsubst \
|
|
firmware/%.gen.S,%,$@))))"; \
|
|
ASM_WORD=$(if $(CONFIG_64BIT),.quad,.long); \
|
|
ASM_ALIGN=$(if $(CONFIG_64BIT),3,2); \
|
|
PROGBITS=$(if $(CONFIG_ARM),%,@)progbits; \
|
|
echo "/* Generated by firmware/Makefile */" > $@;\
|
|
echo " .section .rodata" >>$@;\
|
|
echo " .p2align 4" >>$@;\
|
|
echo "_fw_$${FWSTR}_bin:" >>$@;\
|
|
echo " .incbin \"$(2)\"" >>$@;\
|
|
echo "_fw_end:" >>$@;\
|
|
echo " .section .rodata.str,\"aMS\",$${PROGBITS},1" >>$@;\
|
|
echo " .p2align $${ASM_ALIGN}" >>$@;\
|
|
echo "_fw_$${FWSTR}_name:" >>$@;\
|
|
echo " .string \"$$FWNAME\"" >>$@;\
|
|
echo " .section .builtin_fw,\"a\",$${PROGBITS}" >>$@;\
|
|
echo " .p2align $${ASM_ALIGN}" >>$@;\
|
|
echo " $${ASM_WORD} _fw_$${FWSTR}_name" >>$@;\
|
|
echo " $${ASM_WORD} _fw_$${FWSTR}_bin" >>$@;\
|
|
echo " $${ASM_WORD} _fw_end - _fw_$${FWSTR}_bin" >>$@;
|
|
|
|
# One of these files will change, or come into existence, whenever
|
|
# the configuration changes between 32-bit and 64-bit. The .S files
|
|
# need to change when that happens.
|
|
wordsize_deps := $(wildcard include/config/64bit.h include/config/32bit.h \
|
|
include/config/ppc32.h include/config/ppc64.h \
|
|
include/config/superh32.h include/config/superh64.h \
|
|
include/config/x86_32.h include/config/x86_64.h \
|
|
firmware/Makefile)
|
|
|
|
$(patsubst %,$(obj)/%.gen.S, $(fw-external-y)): %: $(wordsize_deps) \
|
|
include/config/extra/firmware/dir.h
|
|
$(call cmd,fwbin,$(fwabs)/$(patsubst $(obj)/%.gen.S,%,$@))
|
|
|
|
# The .o files depend on the binaries directly; the .S files don't.
|
|
$(patsubst %,$(obj)/%.gen.o, $(fw-external-y)): $(obj)/%.gen.o: $(fwdir)/%
|
|
|
|
obj-y += $(patsubst %,%.gen.o, $(fw-external-y))
|
|
|
|
ifeq ($(KBUILD_SRC),)
|
|
# Makefile.build only creates subdirectories for O= builds, but external
|
|
# firmware might live outside the kernel source tree
|
|
_dummy := $(foreach d,$(addprefix $(obj)/,$(dir $(fw-external-y))), $(shell [ -d $(d) ] || mkdir -p $(d)))
|
|
endif
|
|
|
|
targets := $(patsubst $(obj)/%,%, \
|
|
$(shell find $(obj) -name \*.gen.S 2>/dev/null))
|
|
# Without this, built-in.o won't be created when it's empty, and the
|
|
# final vmlinux link will fail.
|
|
obj- := dummy
|