intel/stm: Place resource list right below MSEG

Suggested by Nico Huber in CB:38765.

This placement makes the address calculation simpler and
makes its location indepedent of the number of CPUs.

As part of the change in the BIOS resource list address
calculation, the `size` variable was factored out of the
conditional in line 361, thus eliminating the else.

Original-Change-Id: I9ee2747474df02b0306530048bdec75e95413b5d
Original-Signed-off-by: Eugene D Myers <cedarhouse@comcast.net>
Original-Reviewed-on: https://review.coreboot.org/c/coreboot/+/40437
Original-Reviewed-by: Nico Huber <nico.h@gmx.de>
Original-Reviewed-by: Angel Pons <th3fanbus@gmail.com>
Original-Tested-by: build bot (Jenkins) <no-reply@coreboot.org>

(cherry picked from commit 076605bc92)
Signed-off-by: Marc Jones <marcjones@sysproconsulting.com>

Change-Id: Ie62e2bdccd2d09084cc39a0f2fe32df236c08cd6
Reviewed-on: https://review.coreboot.org/c/coreboot/+/50312
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
Reviewed-by: Jay Talbott <JayTalbott@sysproconsulting.com>
Reviewed-by: Eugene Myers <cedarhouse1@comcast.net>
Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
This commit is contained in:
Eugene D Myers 2020-04-15 18:28:10 -04:00 committed by Patrick Georgi
parent b450c8d2cb
commit 6b395cb190
2 changed files with 8 additions and 18 deletions

View File

@ -318,13 +318,13 @@ int smm_setup_relocation_handler(struct smm_loader_params *params)
/* The SMM module is placed within the provided region in the following /* The SMM module is placed within the provided region in the following
* manner: * manner:
* +-----------------+ <- smram + size * +-----------------+ <- smram + size
* | stacks |
* +-----------------+ <- smram + size - total_stack_size
* | fxsave area |
* +-----------------+ <- smram + size - total_stack_size - fxsave_size
* | BIOS resource | * | BIOS resource |
* | list (STM) | * | list (STM) |
* +-----------------+ <- .. - CONFIG_BIOS_RESOURCE_LIST_SIZE * +-----------------+ <- smram + size - CONFIG_BIOS_RESOURCE_LIST_SIZE
* | stacks |
* +-----------------+ <- .. - total_stack_size
* | fxsave area |
* +-----------------+ <- .. - total_stack_size - fxsave_size
* | ... | * | ... |
* +-----------------+ <- smram + handler_size + SMM_DEFAULT_SIZE * +-----------------+ <- smram + handler_size + SMM_DEFAULT_SIZE
* | handler | * | handler |
@ -365,11 +365,10 @@ int smm_load_module(void *smram, size_t size, struct smm_loader_params *params)
/* Stacks start at the top of the region. */ /* Stacks start at the top of the region. */
base = smram; base = smram;
base += size;
if (CONFIG(STM)) if (CONFIG(STM))
base += size - CONFIG_MSEG_SIZE; // take out the mseg base -= CONFIG_MSEG_SIZE + CONFIG_BIOS_RESOURCE_LIST_SIZE;
else
base += size;
params->stack_top = base; params->stack_top = base;
@ -400,10 +399,6 @@ int smm_load_module(void *smram, size_t size, struct smm_loader_params *params)
total_size = total_stack_size + handler_size; total_size = total_stack_size + handler_size;
total_size += fxsave_size + SMM_DEFAULT_SIZE; total_size += fxsave_size + SMM_DEFAULT_SIZE;
// account for the bios resource list
if (CONFIG(STM))
total_size += CONFIG_BIOS_RESOURCE_LIST_SIZE;
if (total_size > size) if (total_size > size)
return -1; return -1;

View File

@ -177,12 +177,7 @@ void stm_setup(uintptr_t mseg, int cpu, int num_cpus, uintptr_t smbase,
// need to create the BIOS resource list once // need to create the BIOS resource list once
// first calculate the location in SMRAM // first calculate the location in SMRAM
addr_calc = (mseg - (CONFIG_SMM_MODULE_STACK_SIZE * num_cpus)); addr_calc = mseg - CONFIG_BIOS_RESOURCE_LIST_SIZE;
if (CONFIG(SSE))
addr_calc -= FXSAVE_SIZE * num_cpus;
addr_calc -= CONFIG_BIOS_RESOURCE_LIST_SIZE;
stm_resource_heap = (uint8_t *) addr_calc; 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);