summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/cpu/x86/mp_init.c19
-rw-r--r--src/cpu/x86/smm/smm_module_loader.c2
-rw-r--r--src/cpu/x86/smm/smm_module_loaderv2.c22
-rw-r--r--src/include/cpu/x86/smm.h2
4 files changed, 19 insertions, 26 deletions
diff --git a/src/cpu/x86/mp_init.c b/src/cpu/x86/mp_init.c
index 76f2650330..bac74f9243 100644
--- a/src/cpu/x86/mp_init.c
+++ b/src/cpu/x86/mp_init.c
@@ -796,19 +796,11 @@ static void adjust_smm_apic_id_map(struct smm_loader_params *smm_params)
}
static int install_relocation_handler(int num_cpus, size_t real_save_state_size,
- size_t save_state_size)
+ size_t save_state_size, uintptr_t perm_smbase)
{
- int cpus = num_cpus;
-#if CONFIG(X86_SMM_LOADER_VERSION2)
- /* Default SMRAM size is not big enough to concurrently
- * handle relocation for more than ~32 CPU threads
- * therefore, relocate 1 by 1. */
- cpus = 1;
-#endif
-
struct smm_loader_params smm_params = {
.per_cpu_stack_size = CONFIG_SMM_STUB_STACK_SIZE,
- .num_concurrent_stacks = cpus,
+ .num_concurrent_stacks = num_cpus,
.real_cpu_save_state_size = real_save_state_size,
.per_cpu_save_state_size = save_state_size,
.num_concurrent_save_states = 1,
@@ -819,7 +811,7 @@ static int install_relocation_handler(int num_cpus, size_t real_save_state_size,
if (mp_state.ops.adjust_smm_params != NULL)
mp_state.ops.adjust_smm_params(&smm_params, 0);
- if (smm_setup_relocation_handler(&smm_params)) {
+ if (smm_setup_relocation_handler((void *)perm_smbase, &smm_params)) {
printk(BIOS_ERR, "%s: smm setup failed\n", __func__);
return -1;
}
@@ -874,9 +866,8 @@ static void load_smm_handlers(void)
return;
/* Install handlers. */
- if (install_relocation_handler(mp_state.cpu_count,
- real_save_state_size,
- smm_save_state_size) < 0) {
+ if (install_relocation_handler(mp_state.cpu_count, real_save_state_size,
+ smm_save_state_size, mp_state.perm_smbase) < 0) {
printk(BIOS_ERR, "Unable to install SMM relocation handler.\n");
smm_disable();
}
diff --git a/src/cpu/x86/smm/smm_module_loader.c b/src/cpu/x86/smm/smm_module_loader.c
index 39cd9101a5..fae8742d11 100644
--- a/src/cpu/x86/smm/smm_module_loader.c
+++ b/src/cpu/x86/smm/smm_module_loader.c
@@ -266,7 +266,7 @@ static int smm_module_setup_stub(void *smbase, size_t smm_size,
* assumption is that the stub will be entered from the default SMRAM
* location: 0x30000 -> 0x40000.
*/
-int smm_setup_relocation_handler(struct smm_loader_params *params)
+int smm_setup_relocation_handler(void *const perm_smram, struct smm_loader_params *params)
{
void *smram = (void *)SMM_DEFAULT_BASE;
diff --git a/src/cpu/x86/smm/smm_module_loaderv2.c b/src/cpu/x86/smm/smm_module_loaderv2.c
index 26be00734d..1ac623e90c 100644
--- a/src/cpu/x86/smm/smm_module_loaderv2.c
+++ b/src/cpu/x86/smm/smm_module_loaderv2.c
@@ -295,20 +295,22 @@ static int smm_stub_place_staggered_entry_points(char *base,
* 0x30000), but no assumption should be made for the permanent SMI handler.
* The placement of CPU entry points for permanent handler are determined
* by the number of CPUs in the system and the amount of SMRAM.
- * There are potentially 3 regions to place
+ * There are potentially 2 regions to place
* within the default SMRAM size:
* 1. Save state areas
* 2. Stub code
- * 3. Stack areas
*
- * The save state and smm stack are treated as contiguous for the number of
- * concurrent areas requested. The save state always lives at the top of the
- * CPUS smbase (and the entry point is at offset 0x8000). This allows only a certain
- * number of CPUs with staggered entry points until the save state area comes
- * down far enough to overwrite/corrupt the entry code (stub code). Therefore,
- * an SMM map is created to avoid this corruption, see smm_create_map() above.
+ * The save state always lives at the top of the CPUS smbase (and the entry
+ * point is at offset 0x8000). This allows only a certain number of CPUs with
+ * staggered entry points until the save state area comes down far enough to
+ * overwrite/corrupt the entry code (stub code). Therefore, an SMM map is
+ * created to avoid this corruption, see smm_create_map() above.
* This module setup code works for the default (0x30000) SMM handler setup and the
* permanent SMM handler.
+ * The CPU stack is decided at runtime in the stub and is treaded as a continuous
+ * region. As this might not fit the default SMRAM region, the same region used
+ * by the permanent handler can be used during relocation. This is done via the
+ * smram_start argument.
*/
static int smm_module_setup_stub(void *const smbase, const size_t smm_size,
struct smm_loader_params *params,
@@ -438,7 +440,7 @@ static int smm_module_setup_stub(void *const smbase, const size_t smm_size,
* assumption is that the stub will be entered from the default SMRAM
* location: 0x30000 -> 0x40000.
*/
-int smm_setup_relocation_handler(struct smm_loader_params *params)
+int smm_setup_relocation_handler(void * const perm_smram, struct smm_loader_params *params)
{
void *smram = (void *)(SMM_DEFAULT_BASE);
printk(BIOS_SPEW, "%s: enter\n", __func__);
@@ -457,7 +459,7 @@ int smm_setup_relocation_handler(struct smm_loader_params *params)
params->num_concurrent_stacks = CONFIG_MAX_CPUS;
return smm_module_setup_stub(smram, SMM_DEFAULT_SIZE,
- params, fxsave_area_relocation, smram);
+ params, fxsave_area_relocation, perm_smram);
printk(BIOS_SPEW, "%s: exit\n", __func__);
}
diff --git a/src/include/cpu/x86/smm.h b/src/include/cpu/x86/smm.h
index c42eb8cf7f..1b4de2571a 100644
--- a/src/include/cpu/x86/smm.h
+++ b/src/include/cpu/x86/smm.h
@@ -148,7 +148,7 @@ struct smm_loader_params {
};
/* Both of these return 0 on success, < 0 on failure. */
-int smm_setup_relocation_handler(struct smm_loader_params *params);
+int smm_setup_relocation_handler(void * const perm_smram, struct smm_loader_params *params);
int smm_load_module(void *smram, size_t size, struct smm_loader_params *params);
u32 smm_get_cpu_smbase(unsigned int cpu_num);