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>
This commit is contained in:
parent
df808f3619
commit
7d925c5fb8
|
@ -1061,27 +1061,13 @@ static size_t smm_stub_size(void)
|
||||||
return rmodule_memory_size(&smm_stub);
|
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)
|
if (ops->get_smm_info != NULL)
|
||||||
ops->get_smm_info(&state->perm_smbase, &state->perm_smsize,
|
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
|
* 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
|
* Default to smm_initiate_relocation() if trigger callback isn't
|
||||||
* provided.
|
* provided.
|
||||||
*/
|
*/
|
||||||
if (CONFIG(HAVE_SMI_HANDLER) &&
|
if (ops->per_cpu_smm_trigger == NULL)
|
||||||
ops->per_cpu_smm_trigger == NULL)
|
|
||||||
mp_state.ops.per_cpu_smm_trigger = smm_initiate_relocation;
|
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)
|
static enum cb_err do_mp_init_with_smm(struct bus *cpu_bus, const struct mp_ops *mp_ops)
|
||||||
{
|
{
|
||||||
enum cb_err ret;
|
enum cb_err ret;
|
||||||
|
|
Loading…
Reference in New Issue