security/intel/stm: Make STM setup MP safe

Some processor families allow for SMM setup to be done in parallel.

On processors that have this feature, the BIOS resource list becomes
unusable for some processors during STM startup.

This patch covers two cases: (1) The BIOS resource list becomes twice
as long because the smm_relocation function is called twice - this is
resolved by recreating the list on each invocation. (2) Not all
processors receive the correct resource list pointer - this is resolved
by having every processor execute the pointer calculation code, which is
a lot faster then forcing all processors to spin lock waiting for this
value to be calculated.

This patch has been tested on a Purism L1UM-1X8C and Purism 15v4.

Signed-off-by: Eugene Myers <cedarhouse@comcast.net>
Change-Id: I7619038edc78f306bd7eb95844bd1598766f8b37
Reviewed-on: https://review.coreboot.org/c/coreboot/+/61689
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Eugene Myers <cedarhouse1@comcast.net>
Reviewed-by: Philipp Deppenwiese <zaolin.daisuki@gmail.com>
This commit is contained in:
Eugene Myers 2022-02-07 16:45:22 -05:00 committed by Felix Held
parent a514192ffe
commit b2c681fc4a
2 changed files with 11 additions and 3 deletions

View File

@ -167,9 +167,14 @@ static void add_msr_resources(void)
/* /*
* Add resources to BIOS resource database. * Add resources to BIOS resource database.
*/ */
extern uint8_t *m_stm_resources_ptr;
void add_resources_cmd(void) void add_resources_cmd(void)
{ {
m_stm_resources_ptr = NULL;
add_simple_resources(); add_simple_resources();
add_msr_resources(); add_msr_resources();

View File

@ -155,12 +155,15 @@ void stm_setup(uintptr_t mseg, int cpu, uintptr_t smbase,
return; return;
} }
// This code moved here because paralled SMM set can cause
// some processor to receive a bad value
// calculate the location in SMRAM
addr_calc = mseg - CONFIG_BIOS_RESOURCE_LIST_SIZE;
stm_resource_heap = (uint8_t *) addr_calc;
if (cpu == 0) { if (cpu == 0) {
// need to create the BIOS resource list once // need to create the BIOS resource list once
// first calculate the location in SMRAM
addr_calc = mseg - CONFIG_BIOS_RESOURCE_LIST_SIZE;
stm_resource_heap = (uint8_t *) addr_calc;
printk(BIOS_DEBUG, "STM: stm_resource_heap located at %p\n", printk(BIOS_DEBUG, "STM: stm_resource_heap located at %p\n",
stm_resource_heap); stm_resource_heap);
//setup the list //setup the list