From 64d9e8568172402d8078c2c80ba994da16f4745b Mon Sep 17 00:00:00 2001 From: Arthur Heymans Date: Mon, 15 Feb 2021 18:55:40 +0100 Subject: 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 Reviewed-on: https://review.coreboot.org/c/coreboot/+/50769 Tested-by: build bot (Jenkins) Reviewed-by: Angel Pons --- src/cpu/x86/smm/smm_module_handler.c | 11 +++-------- src/cpu/x86/smm/smm_module_loader.c | 6 ++++++ src/cpu/x86/smm/smm_module_loaderv2.c | 5 +++++ 3 files changed, 14 insertions(+), 8 deletions(-) (limited to 'src/cpu') 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 #include #include #include @@ -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); } -- cgit v1.2.3