summaryrefslogtreecommitdiff
path: root/src/cpu/x86
diff options
context:
space:
mode:
authorArthur Heymans <arthur@aheymans.xyz>2021-02-15 18:55:40 +0100
committerPatrick Georgi <pgeorgi@google.com>2021-03-19 11:32:59 +0000
commit64d9e8568172402d8078c2c80ba994da16f4745b (patch)
treeceeec69b2dddf5a9b60dc9eeb35a70ebabe1a06e /src/cpu/x86
parentdfff5c2d193066adff8e0bee9ed4525b622eb7c8 (diff)
cpu/x86/smm_module_hander: Set up a save state map
With the smm_module_loaderv2 the save state map is not linear so copy a map from ramstage into the smihandler. TESTED on QEMU q35: Both SMMLOADER V1 and V2 handle save states properly. Change-Id: I31c57b59559ad4ee98500d83969424e5345881ee Signed-off-by: Arthur Heymans <arthur@aheymans.xyz> Reviewed-on: https://review.coreboot.org/c/coreboot/+/50769 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Angel Pons <th3fanbus@gmail.com>
Diffstat (limited to 'src/cpu/x86')
-rw-r--r--src/cpu/x86/smm/smm_module_handler.c11
-rw-r--r--src/cpu/x86/smm/smm_module_loader.c6
-rw-r--r--src/cpu/x86/smm/smm_module_loaderv2.c5
3 files changed, 14 insertions, 8 deletions
diff --git a/src/cpu/x86/smm/smm_module_handler.c b/src/cpu/x86/smm/smm_module_handler.c
index dec2d6b72f..f7cf928f73 100644
--- a/src/cpu/x86/smm/smm_module_handler.c
+++ b/src/cpu/x86/smm/smm_module_handler.c
@@ -94,15 +94,10 @@ struct global_nvs *gnvs;
void *smm_get_save_state(int cpu)
{
- char *base;
+ if (cpu > smm_runtime.num_cpus)
+ return NULL;
- /* This function assumes all save states start at top of default
- * SMRAM size space and are staggered down by save state size. */
- base = (void *)(uintptr_t)smm_runtime.smbase;
- base += SMM_DEFAULT_SIZE;
- base -= (cpu + 1) * smm_runtime.save_state_size;
-
- return base;
+ return (void *)(smm_runtime.save_state_top[cpu] - smm_runtime.save_state_size);
}
uint32_t smm_revision(void)
diff --git a/src/cpu/x86/smm/smm_module_loader.c b/src/cpu/x86/smm/smm_module_loader.c
index de2738ab36..021d739f94 100644
--- a/src/cpu/x86/smm/smm_module_loader.c
+++ b/src/cpu/x86/smm/smm_module_loader.c
@@ -1,5 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0-only */
+#include <stdint.h>
#include <string.h>
#include <acpi/acpi_gnvs.h>
#include <rmodule.h>
@@ -392,5 +393,10 @@ int smm_load_module(void *smram, size_t size, struct smm_loader_params *params)
handler_mod_params->num_cpus = params->num_concurrent_stacks;
handler_mod_params->gnvs_ptr = (uintptr_t)acpi_get_gnvs();
+ for (int i = 0; i < CONFIG_MAX_CPUS; i++) {
+ handler_mod_params->save_state_top[i] = (uintptr_t)smram + SMM_DEFAULT_SIZE
+ - params->per_cpu_save_state_size * i;
+ }
+
return smm_module_setup_stub(smram, size, params, fxsave_area);
}
diff --git a/src/cpu/x86/smm/smm_module_loaderv2.c b/src/cpu/x86/smm/smm_module_loaderv2.c
index e0877e7fc4..886041dbba 100644
--- a/src/cpu/x86/smm/smm_module_loaderv2.c
+++ b/src/cpu/x86/smm/smm_module_loaderv2.c
@@ -641,5 +641,10 @@ int smm_load_module(void *smram, size_t size, struct smm_loader_params *params)
return -1;
}
+ for (int i = 0; i < params->num_concurrent_stacks; i++) {
+ handler_mod_params->save_state_top[i] =
+ cpus[i].ss_start + params->per_cpu_save_state_size;
+ }
+
return smm_module_setup_stub(base, size, params, fxsave_area);
}