summaryrefslogtreecommitdiff
path: root/src/cpu
diff options
context:
space:
mode:
Diffstat (limited to 'src/cpu')
-rw-r--r--src/cpu/x86/mp_init.c4
-rw-r--r--src/cpu/x86/sipi_vector.S4
-rw-r--r--src/cpu/x86/smm/smm_stub.S4
3 files changed, 10 insertions, 2 deletions
diff --git a/src/cpu/x86/mp_init.c b/src/cpu/x86/mp_init.c
index d3af6ecc8f..b336e9f2d1 100644
--- a/src/cpu/x86/mp_init.c
+++ b/src/cpu/x86/mp_init.c
@@ -98,6 +98,7 @@ struct sipi_params {
uint32_t msr_table_ptr;
uint32_t msr_count;
uint32_t c_handler;
+ uint32_t cr3;
atomic_t ap_count;
} __packed;
@@ -361,6 +362,7 @@ static atomic_t *load_sipi_vector(struct mp_params *mp_params)
else
sp->microcode_lock = 0;
sp->c_handler = (uintptr_t)&ap_init;
+ sp->cr3 = read_cr3();
ap_count = &sp->ap_count;
atomic_set(ap_count, 0);
@@ -763,6 +765,7 @@ static enum cb_err install_relocation_handler(int num_cpus, size_t save_state_si
.cpu_save_state_size = save_state_size,
.num_concurrent_save_states = 1,
.handler = smm_do_relocation,
+ .cr3 = read_cr3(),
};
if (smm_setup_relocation_handler(&smm_params)) {
@@ -787,6 +790,7 @@ static enum cb_err install_permanent_handler(int num_cpus, uintptr_t smbase,
.num_cpus = num_cpus,
.cpu_save_state_size = save_state_size,
.num_concurrent_save_states = num_cpus,
+ .cr3 = read_cr3(),
};
printk(BIOS_DEBUG, "Installing permanent SMM handler to 0x%08lx\n", smbase);
diff --git a/src/cpu/x86/sipi_vector.S b/src/cpu/x86/sipi_vector.S
index 923e3987d0..b7d700fb39 100644
--- a/src/cpu/x86/sipi_vector.S
+++ b/src/cpu/x86/sipi_vector.S
@@ -38,6 +38,8 @@ msr_count:
.long 0
c_handler:
.long 0
+cr3:
+.long 0
ap_count:
.long 0
@@ -224,7 +226,7 @@ load_msr:
#if ENV_X86_64
/* entry64.inc preserves ebx, esi, edi, ebp */
- setup_longmode $(CONFIG_ARCH_X86_64_PGTBL_LOC)
+ setup_longmode cr3
movabs c_handler, %eax
call *%rax
diff --git a/src/cpu/x86/smm/smm_stub.S b/src/cpu/x86/smm/smm_stub.S
index 9f1f21d974..9b4b966f7c 100644
--- a/src/cpu/x86/smm/smm_stub.S
+++ b/src/cpu/x86/smm/smm_stub.S
@@ -23,6 +23,8 @@ stack_top:
.long 0
c_handler:
.long 0
+cr3:
+.long 0
/* apic_to_cpu_num is a table mapping the default APIC id to CPU num. If the
* APIC id is found at the given index, the contiguous CPU number is index
* into the table. */
@@ -196,7 +198,7 @@ align_stack:
#if ENV_X86_64
mov %ecx, %edi
/* entry64.inc preserves ebx, esi, edi, ebp */
- setup_longmode $(CONFIG_ARCH_X86_64_PGTBL_LOC)
+ setup_longmode cr3
mov %edi, %ecx