]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
x86/boot/compressed: Move startup32_load_idt() into .text section
authorArd Biesheuvel <ardb@kernel.org>
Tue, 22 Nov 2022 16:10:11 +0000 (17:10 +0100)
committerBorislav Petkov <bp@suse.de>
Thu, 24 Nov 2022 07:57:41 +0000 (08:57 +0100)
Convert startup32_load_idt() into an ordinary function and move it into
the .text section. This involves turning the rva() immediates into ones
derived from a local label, and preserving/restoring the %ebp and %ebx
as per the calling convention.

Also move the #ifdef to the only existing call site. This makes it clear
that the function call does nothing if support for memory encryption is
not compiled in.

Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Signed-off-by: Borislav Petkov <bp@suse.de>
Link: https://lore.kernel.org/r/20221122161017.2426828-12-ardb@kernel.org
arch/x86/boot/compressed/head_64.S

index f9926b3931c226b558f3fd1470154f5e3001a798..7aa147f30a0f37384acf1cf30d79daae06849a18 100644 (file)
@@ -118,7 +118,9 @@ SYM_FUNC_START(startup_32)
 1:
 
        /* Setup Exception handling for SEV-ES */
+#ifdef CONFIG_AMD_MEM_ENCRYPT
        call    startup32_load_idt
+#endif
 
        /* Make sure cpu supports long mode. */
        call    verify_cpu
@@ -716,10 +718,8 @@ SYM_DATA_START(boot32_idt)
        .quad 0
        .endr
 SYM_DATA_END_LABEL(boot32_idt, SYM_L_GLOBAL, boot32_idt_end)
-#endif
 
-#ifdef CONFIG_AMD_MEM_ENCRYPT
-       __HEAD
+       .text
        .code32
 /*
  * Write an IDT entry into boot32_idt
@@ -752,24 +752,32 @@ SYM_FUNC_START_LOCAL(startup32_set_idt_entry)
 
        RET
 SYM_FUNC_END(startup32_set_idt_entry)
-#endif
 
 SYM_FUNC_START(startup32_load_idt)
-#ifdef CONFIG_AMD_MEM_ENCRYPT
-       leal    rva(boot32_idt)(%ebp), %ecx
+       push    %ebp
+       push    %ebx
+
+       call    1f
+1:     pop     %ebp
+
+       leal    (boot32_idt - 1b)(%ebp), %ebx
 
        /* #VC handler */
-       leal    rva(startup32_vc_handler)(%ebp), %eax
+       leal    (startup32_vc_handler - 1b)(%ebp), %eax
        movl    $X86_TRAP_VC, %edx
+       movl    %ebx, %ecx
        call    startup32_set_idt_entry
 
        /* Load IDT */
-       leal    rva(boot32_idt)(%ebp), %eax
-       movl    %eax, rva(boot32_idt_desc+2)(%ebp)
-       lidt    rva(boot32_idt_desc)(%ebp)
-#endif
+       leal    (boot32_idt_desc - 1b)(%ebp), %ecx
+       movl    %ebx, 2(%ecx)
+       lidt    (%ecx)
+
+       pop     %ebx
+       pop     %ebp
        RET
 SYM_FUNC_END(startup32_load_idt)
+#endif
 
 /*
  * Check for the correct C-bit position when the startup_32 boot-path is used.
@@ -788,6 +796,7 @@ SYM_FUNC_END(startup32_load_idt)
  * succeed. An incorrect C-bit position will map all memory unencrypted, so that
  * the compare will use the encrypted random data and fail.
  */
+       __HEAD
 SYM_FUNC_START(startup32_check_sev_cbit)
 #ifdef CONFIG_AMD_MEM_ENCRYPT
        pushl   %eax