summaryrefslogtreecommitdiff
path: root/src/cpu/x86
diff options
context:
space:
mode:
Diffstat (limited to 'src/cpu/x86')
-rw-r--r--src/cpu/x86/Makefile.inc14
-rw-r--r--src/cpu/x86/mp_init.c8
-rw-r--r--src/cpu/x86/smm/smm_module_loader.c2
-rw-r--r--src/cpu/x86/smm/smm_stub.S3
-rw-r--r--src/cpu/x86/smm_start32_offset.h.template9
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