diff options
author | Arthur Heymans <arthur@aheymans.xyz> | 2021-12-06 11:42:03 +0100 |
---|---|---|
committer | Subrata Banik <subrata.banik@intel.com> | 2021-12-06 11:39:08 +0000 |
commit | 7d925c5fb8ec44c3fdaf98535c0badc955fb3a4d (patch) | |
tree | 961f5f023c88a8a17fa05c32809592d64e722213 /src | |
parent | df808f36190a99013a9687ea5c4aa0c70da5dd40 (diff) |
cpu/x86/mp_init.c: Fix HAVE_SMI_HANDLER
Fixes commit 29c7622 ("cpu/x86/mp_init.c: Fix building with no
smihandler") broke SMM init because is_smm_enable() was called before
smm_enable.
Rework the code a little to make it clear what codepaths are used with
CONFIG_HAVE_SMI_HANDLER.
TESTED: now prodrive/hermes boots again.
Change-Id: If4ce0dca2f29754d131dacf2da63e946be9a7b6d
Signed-off-by: Arthur Heymans <arthur@aheymans.xyz>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/59912
Reviewed-by: Paul Menzel <paulepanter@mailbox.org>
Reviewed-by: Angel Pons <th3fanbus@gmail.com>
Reviewed-by: Subrata Banik <subrata.banik@intel.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/cpu/x86/mp_init.c | 38 |
1 files changed, 19 insertions, 19 deletions
diff --git a/src/cpu/x86/mp_init.c b/src/cpu/x86/mp_init.c index 709e7a2218..507b5fef8a 100644 --- a/src/cpu/x86/mp_init.c +++ b/src/cpu/x86/mp_init.c @@ -1061,27 +1061,13 @@ static size_t smm_stub_size(void) return rmodule_memory_size(&smm_stub); } -static void fill_mp_state(struct mp_state *state, const struct mp_ops *ops) +static void fill_mp_state_smm(struct mp_state *state, const struct mp_ops *ops) { - /* - * Make copy of the ops so that defaults can be set in the non-const - * structure if needed. - */ - memcpy(&state->ops, ops, sizeof(*ops)); - - if (ops->get_cpu_count != NULL) - state->cpu_count = ops->get_cpu_count(); - - if (!is_smm_enabled()) - return; - if (ops->get_smm_info != NULL) ops->get_smm_info(&state->perm_smbase, &state->perm_smsize, - &state->smm_real_save_state_size); + &state->smm_real_save_state_size); - if (CONFIG(HAVE_SMI_HANDLER)) - state->smm_save_state_size = MAX(state->smm_real_save_state_size, - smm_stub_size()); + state->smm_save_state_size = MAX(state->smm_real_save_state_size, smm_stub_size()); /* * Make sure there is enough room for the SMM descriptor @@ -1095,11 +1081,25 @@ static void fill_mp_state(struct mp_state *state, const struct mp_ops *ops) * Default to smm_initiate_relocation() if trigger callback isn't * provided. */ - if (CONFIG(HAVE_SMI_HANDLER) && - ops->per_cpu_smm_trigger == NULL) + if (ops->per_cpu_smm_trigger == NULL) mp_state.ops.per_cpu_smm_trigger = smm_initiate_relocation; } +static void fill_mp_state(struct mp_state *state, const struct mp_ops *ops) +{ + /* + * Make copy of the ops so that defaults can be set in the non-const + * structure if needed. + */ + memcpy(&state->ops, ops, sizeof(*ops)); + + if (ops->get_cpu_count != NULL) + state->cpu_count = ops->get_cpu_count(); + + if (CONFIG(HAVE_SMI_HANDLER)) + fill_mp_state_smm(state, ops); +} + static enum cb_err do_mp_init_with_smm(struct bus *cpu_bus, const struct mp_ops *mp_ops) { enum cb_err ret; |