summaryrefslogtreecommitdiff
path: root/src/cpu/x86/64bit
diff options
context:
space:
mode:
authorPatrick Rudolph <patrick.rudolph@9elements.com>2021-11-30 18:34:32 +0100
committerPatrick Georgi <patrick@coreboot.org>2021-12-06 12:37:48 +0000
commit5b334b88a635e46d47ce3f3b703d2470d6e8514c (patch)
treee57abd4d22b9ccaa7c771de1ad18845991521b9f /src/cpu/x86/64bit
parentc7f0bca9c23ac8d96ffc5ec0fcaddf9190d7dbff (diff)
x86_64 assembly: Don't touch %gs
With CPU_INFO_V2 enabled %gs holds the pointer to the cpu_info struct, so don't clobber it. Backup and restore %gs where possible. Fixes a crash in MPinit seen after calling FSP-S. Change-Id: If9fc999b34530de5d8b6ad27b9af25fc552e9420 Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/59764 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Arthur Heymans <arthur@aheymans.xyz>
Diffstat (limited to 'src/cpu/x86/64bit')
-rw-r--r--src/cpu/x86/64bit/exit32.inc1
-rw-r--r--src/cpu/x86/64bit/mode_switch.S14
2 files changed, 10 insertions, 5 deletions
diff --git a/src/cpu/x86/64bit/exit32.inc b/src/cpu/x86/64bit/exit32.inc
index 4d1149ee6c..3ac86a9df1 100644
--- a/src/cpu/x86/64bit/exit32.inc
+++ b/src/cpu/x86/64bit/exit32.inc
@@ -68,7 +68,6 @@ __longmode_compatibility:
movl %eax, %es
movl %eax, %ss
movl %eax, %fs
- movl %eax, %gs
/* Disable paging. */
movl %cr0, %eax
diff --git a/src/cpu/x86/64bit/mode_switch.S b/src/cpu/x86/64bit/mode_switch.S
index eea104bcf3..c27f540ba3 100644
--- a/src/cpu/x86/64bit/mode_switch.S
+++ b/src/cpu/x86/64bit/mode_switch.S
@@ -15,6 +15,10 @@ protected_mode_call_narg:
push %r14
push %r15
+ /* Backup gs to stack */
+ movl %gs, %eax
+ push %rax
+
/* Arguments to stack */
push %rdi
push %rsi
@@ -23,9 +27,9 @@ protected_mode_call_narg:
#include <cpu/x86/64bit/exit32.inc>
- movl -48(%ebp), %eax /* Argument count */
- movl -64(%ebp), %edx /* Argument 0 */
- movl -72(%ebp), %ecx /* Argument 1 */
+ movl -56(%ebp), %eax /* Argument count */
+ movl -72(%ebp), %edx /* Argument 0 */
+ movl -80(%ebp), %ecx /* Argument 1 */
/* Align the stack */
andl $0xFFFFFFF0, %esp
@@ -46,7 +50,7 @@ protected_mode_call_narg:
pushl %edx /* Argument 0 */
1:
- movl -56(%ebp), %ebx /* Function to call */
+ movl -64(%ebp), %ebx /* Function to call */
call *%ebx
movl %eax, %ebx
@@ -57,6 +61,8 @@ protected_mode_call_narg:
movl %ebx, %eax
/* Restore registers */
+ mov -48(%rbp), %rbx
+ movl %ebx, %gs
mov -40(%rbp), %r15
mov -32(%rbp), %r14
mov -24(%rbp), %r13