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>
This commit is contained in:
Patrick Rudolph 2021-11-30 18:34:32 +01:00 committed by Patrick Georgi
parent c7f0bca9c2
commit 5b334b88a6
3 changed files with 16 additions and 5 deletions

View File

@ -68,7 +68,6 @@ __longmode_compatibility:
movl %eax, %es movl %eax, %es
movl %eax, %ss movl %eax, %ss
movl %eax, %fs movl %eax, %fs
movl %eax, %gs
/* Disable paging. */ /* Disable paging. */
movl %cr0, %eax movl %cr0, %eax

View File

@ -15,6 +15,10 @@ protected_mode_call_narg:
push %r14 push %r14
push %r15 push %r15
/* Backup gs to stack */
movl %gs, %eax
push %rax
/* Arguments to stack */ /* Arguments to stack */
push %rdi push %rdi
push %rsi push %rsi
@ -23,9 +27,9 @@ protected_mode_call_narg:
#include <cpu/x86/64bit/exit32.inc> #include <cpu/x86/64bit/exit32.inc>
movl -48(%ebp), %eax /* Argument count */ movl -56(%ebp), %eax /* Argument count */
movl -64(%ebp), %edx /* Argument 0 */ movl -72(%ebp), %edx /* Argument 0 */
movl -72(%ebp), %ecx /* Argument 1 */ movl -80(%ebp), %ecx /* Argument 1 */
/* Align the stack */ /* Align the stack */
andl $0xFFFFFFF0, %esp andl $0xFFFFFFF0, %esp
@ -46,7 +50,7 @@ protected_mode_call_narg:
pushl %edx /* Argument 0 */ pushl %edx /* Argument 0 */
1: 1:
movl -56(%ebp), %ebx /* Function to call */ movl -64(%ebp), %ebx /* Function to call */
call *%ebx call *%ebx
movl %eax, %ebx movl %eax, %ebx
@ -57,6 +61,8 @@ protected_mode_call_narg:
movl %ebx, %eax movl %ebx, %eax
/* Restore registers */ /* Restore registers */
mov -48(%rbp), %rbx
movl %ebx, %gs
mov -40(%rbp), %r15 mov -40(%rbp), %r15
mov -32(%rbp), %r14 mov -32(%rbp), %r14
mov -24(%rbp), %r13 mov -24(%rbp), %r13

View File

@ -227,6 +227,10 @@ cond_clear_var_mtrrs:
movd %esp, %xmm0 movd %esp, %xmm0
movd %ebp, %xmm1 movd %ebp, %xmm1
/* Backup %gs used by CPU_INFO_V2 */
movl %gs, %eax
movd %eax, %xmm2
/* /*
* Get function arguments. * Get function arguments.
* It's important to pass the exact ACM size as it's used by getsec to verify * It's important to pass the exact ACM size as it's used by getsec to verify
@ -261,6 +265,8 @@ cond_clear_var_mtrrs:
movl %eax, %es movl %eax, %es
movl %eax, %ss movl %eax, %ss
movl %eax, %fs movl %eax, %fs
/* Restore %gs used by CPU_INFO_V2 */
movd %xmm2, %eax
movl %eax, %gs movl %eax, %gs
/* Disable cache */ /* Disable cache */