diff options
Diffstat (limited to 'src/cpu/x86')
-rw-r--r-- | src/cpu/x86/Makefile.inc | 14 | ||||
-rw-r--r-- | src/cpu/x86/mp_init.c | 8 | ||||
-rw-r--r-- | src/cpu/x86/smm/smm_module_loader.c | 2 | ||||
-rw-r--r-- | src/cpu/x86/smm/smm_stub.S | 3 | ||||
-rw-r--r-- | src/cpu/x86/smm_start32_offset.h.template | 9 |
5 files changed, 27 insertions, 9 deletions
diff --git a/src/cpu/x86/Makefile.inc b/src/cpu/x86/Makefile.inc index 3ef3a90313..2381b6fa20 100644 --- a/src/cpu/x86/Makefile.inc +++ b/src/cpu/x86/Makefile.inc @@ -8,6 +8,20 @@ subdirs-$(CONFIG_ARCH_BOOTBLOCK_X86_64) += 64bit subdirs-y += cache subdirs-$(CONFIG_PARALLEL_MP) += name + +ifeq ($(CONFIG_HAVE_SMI_HANDLER),y) +$(obj)/ramstage/cpu/x86/smm_start32_offset.h: $(dir)/smm_start32_offset.h.template $(obj)/smmstub/smmstub.elf + cp $< $@.temp + sed -i 's/##START32_OFFSET##/0x'$$($(NM_smmstub) -an $(obj)/smmstub/smmstub.elf | grep smm_trampolin | cut -d' ' -f1)'/' $@.temp + mv $@.temp $@ +else +$(obj)/ramstage/cpu/x86/smm_start32_offset.h: $(dir)/smm_start32_offset.h.template + cp $< $@.temp + sed -i 's/##START32_OFFSET##/0x0/' $@.temp + mv $@.temp $@ +endif + +$(call src-to-obj,ramstage,$(dir)/mp_init.c): $(obj)/ramstage/cpu/x86/smm_start32_offset.h ramstage-$(CONFIG_PARALLEL_MP) += mp_init.c ramstage-y += backup_default_smm.c diff --git a/src/cpu/x86/mp_init.c b/src/cpu/x86/mp_init.c index 2909022b34..01ca64e87e 100644 --- a/src/cpu/x86/mp_init.c +++ b/src/cpu/x86/mp_init.c @@ -24,6 +24,9 @@ #include <thread.h> #include <types.h> +/* Generated header */ +#include <ramstage/cpu/x86/smm_start32_offset.h> + #include <security/intel/stm/SmmStm.h> struct mp_callback { @@ -672,7 +675,6 @@ struct mp_state { uintptr_t perm_smbase; size_t perm_smsize; size_t smm_save_state_size; - uintptr_t reloc_start32_offset; bool do_smm; } mp_state; @@ -738,7 +740,7 @@ static asmlinkage void smm_do_relocation(void *arg) stm_setup(mseg, p->cpu, perm_smbase, mp_state.perm_smbase, - mp_state.reloc_start32_offset); + SMM_START32_OFFSET); } } @@ -770,8 +772,6 @@ static enum cb_err install_relocation_handler(int num_cpus, size_t save_state_si } adjust_smm_apic_id_map(&smm_params); - mp_state.reloc_start32_offset = smm_params.stub_params->start32_offset; - return CB_SUCCESS; } diff --git a/src/cpu/x86/smm/smm_module_loader.c b/src/cpu/x86/smm/smm_module_loader.c index 6452707f75..6cd9956dd6 100644 --- a/src/cpu/x86/smm/smm_module_loader.c +++ b/src/cpu/x86/smm/smm_module_loader.c @@ -277,8 +277,6 @@ static int smm_module_setup_stub(const uintptr_t smbase, const size_t smm_size, printk(BIOS_DEBUG, "%s: stack_top = 0x%x\n", __func__, stub_params->stack_top); printk(BIOS_DEBUG, "%s: per cpu stack_size = 0x%x\n", __func__, stub_params->stack_size); - printk(BIOS_DEBUG, "%s: runtime.start32_offset = 0x%x\n", __func__, - stub_params->start32_offset); printk(BIOS_DEBUG, "%s: runtime.smm_size = 0x%zx\n", __func__, smm_size); smm_stub_place_staggered_entry_points(params); diff --git a/src/cpu/x86/smm/smm_stub.S b/src/cpu/x86/smm/smm_stub.S index 02532a4d9f..19e9c501ab 100644 --- a/src/cpu/x86/smm/smm_stub.S +++ b/src/cpu/x86/smm/smm_stub.S @@ -31,9 +31,6 @@ fxsave_area_size: * into the table. */ apic_to_cpu_num: .fill CONFIG_MAX_CPUS,2,0xffff -/* allows the STM to bring up SMM in 32-bit mode */ -start32_offset: -.long smm_trampoline32 - _start .data /* Provide fallback stack to use when a valid CPU number cannot be found. */ diff --git a/src/cpu/x86/smm_start32_offset.h.template b/src/cpu/x86/smm_start32_offset.h.template new file mode 100644 index 0000000000..023bca78d7 --- /dev/null +++ b/src/cpu/x86/smm_start32_offset.h.template @@ -0,0 +1,9 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#ifndef _SMM_START32_OFFSET_H +#define _SMM_START32_OFFSET_H + +/* This gets filled in after building the SMM stub */ +#define SMM_START32_OFFSET ##START32_OFFSET## + +#endif |