coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
smm_relocate.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <amdblocks/smm.h>
4 #include <console/console.h>
6 #include <cpu/amd/msr.h>
7 #include <cpu/cpu.h>
8 #include <cpu/x86/msr.h>
9 #include <cpu/x86/smm.h>
10 #include <types.h>
11 
13 
15 {
17  size_t tseg_size;
18 
19  smm_region(&tseg_base, &tseg_size);
20 
21  params->tseg_base.lo = ALIGN_DOWN(tseg_base, 128 * KiB);
22  params->tseg_base.hi = 0;
23  params->tseg_mask.lo = ALIGN_DOWN(~(tseg_size - 1), 128 * KiB);
24  params->tseg_mask.hi = ((1 << (cpu_phys_address_size() - 32)) - 1);
25 
26  params->tseg_mask.lo |= SMM_TSEG_WB;
27 }
28 
29 void get_smm_info(uintptr_t *perm_smbase, size_t *perm_smsize, size_t *smm_save_state_size)
30 {
31  printk(BIOS_DEBUG, "Setting up SMI for CPU\n");
32 
34 
35  smm_subregion(SMM_SUBREGION_HANDLER, perm_smbase, perm_smsize);
36  *smm_save_state_size = sizeof(amd64_smm_state_save_area_t);
37 }
38 
39 void smm_relocation_handler(int cpu, uintptr_t curr_smbase, uintptr_t staggered_smbase)
40 {
41  struct smm_relocation_params *relo_params = &smm_reloc_params;
42  amd64_smm_state_save_area_t *smm_state;
43 
44  wrmsr(SMM_ADDR_MSR, relo_params->tseg_base);
45  wrmsr(SMM_MASK_MSR, relo_params->tseg_mask);
46 
47  smm_state = (void *)(SMM_AMD64_SAVE_STATE_OFFSET + curr_smbase);
48  smm_state->smbase = staggered_smbase;
49 }
#define SMM_AMD64_SAVE_STATE_OFFSET
static struct sdram_info params
Definition: sdram_configs.c:83
#define ALIGN_DOWN(x, a)
Definition: helpers.h:18
#define KiB
Definition: helpers.h:75
#define printk(level,...)
Definition: stdlib.h:16
int cpu_phys_address_size(void)
Definition: cpu_common.c:46
#define SMM_TSEG_WB
Definition: msr.h:63
#define SMM_ADDR_MSR
Definition: msr.h:60
#define SMM_MASK_MSR
Definition: msr.h:61
static __always_inline void wrmsr(unsigned int index, msr_t msr)
Definition: msr.h:157
@ SMM_SUBREGION_HANDLER
Definition: smm.h:171
void smm_region(uintptr_t *start, size_t *size)
Definition: memmap.c:50
#define BIOS_DEBUG
BIOS_DEBUG - Verbose output.
Definition: loglevel.h:128
void smm_relocation_handler(int cpu, uintptr_t curr_smbase, uintptr_t staggered_smbase)
Definition: smm_relocate.c:39
static struct smm_relocation_params smm_reloc_params
Definition: smm_relocate.c:12
void get_smm_info(uintptr_t *perm_smbase, size_t *perm_smsize, size_t *smm_save_state_size)
Definition: smm_relocate.c:29
static void fill_in_relocation_params(struct smm_relocation_params *params)
Definition: smm_relocate.c:14
unsigned long uintptr_t
Definition: stdint.h:21
msr_t tseg_base
Definition: smm.h:7
msr_t tseg_mask
Definition: smm.h:8
int smm_subregion(int sub, uintptr_t *start, size_t *size)
Definition: tseg_region.c:22