x86/boot/compressed: Move startup32_load_idt() out of head_64.S
authorArd Biesheuvel <ardb@kernel.org>
Tue, 22 Nov 2022 16:10:12 +0000 (17:10 +0100)
committerBorislav Petkov <bp@suse.de>
Thu, 24 Nov 2022 07:57:41 +0000 (08:57 +0100)
Now that startup32_load_idt() has been refactored into an ordinary
callable function, move it into mem-encrypt.S where it belongs.

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

index 7aa147f..16cccc2 100644 (file)
@@ -707,78 +707,6 @@ SYM_DATA_START(boot_idt)
        .endr
 SYM_DATA_END_LABEL(boot_idt, SYM_L_GLOBAL, boot_idt_end)
 
-#ifdef CONFIG_AMD_MEM_ENCRYPT
-SYM_DATA_START(boot32_idt_desc)
-       .word   boot32_idt_end - boot32_idt - 1
-       .long   0
-SYM_DATA_END(boot32_idt_desc)
-       .balign 8
-SYM_DATA_START(boot32_idt)
-       .rept 32
-       .quad 0
-       .endr
-SYM_DATA_END_LABEL(boot32_idt, SYM_L_GLOBAL, boot32_idt_end)
-
-       .text
-       .code32
-/*
- * Write an IDT entry into boot32_idt
- *
- * Parameters:
- *
- * %eax:       Handler address
- * %edx:       Vector number
- * %ecx:       IDT address
- */
-SYM_FUNC_START_LOCAL(startup32_set_idt_entry)
-       /* IDT entry address to %ecx */
-       leal    (%ecx, %edx, 8), %ecx
-
-       /* Build IDT entry, lower 4 bytes */
-       movl    %eax, %edx
-       andl    $0x0000ffff, %edx               # Target code segment offset [15:0]
-       orl     $(__KERNEL32_CS << 16), %edx    # Target code segment selector
-
-       /* Store lower 4 bytes to IDT */
-       movl    %edx, (%ecx)
-
-       /* Build IDT entry, upper 4 bytes */
-       movl    %eax, %edx
-       andl    $0xffff0000, %edx       # Target code segment offset [31:16]
-       orl     $0x00008e00, %edx       # Present, Type 32-bit Interrupt Gate
-
-       /* Store upper 4 bytes to IDT */
-       movl    %edx, 4(%ecx)
-
-       RET
-SYM_FUNC_END(startup32_set_idt_entry)
-
-SYM_FUNC_START(startup32_load_idt)
-       push    %ebp
-       push    %ebx
-
-       call    1f
-1:     pop     %ebp
-
-       leal    (boot32_idt - 1b)(%ebp), %ebx
-
-       /* #VC handler */
-       leal    (startup32_vc_handler - 1b)(%ebp), %eax
-       movl    $X86_TRAP_VC, %edx
-       movl    %ebx, %ecx
-       call    startup32_set_idt_entry
-
-       /* Load IDT */
-       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.
  *
index a73e4d7..6747e5e 100644 (file)
@@ -12,6 +12,8 @@
 #include <asm/processor-flags.h>
 #include <asm/msr.h>
 #include <asm/asm-offsets.h>
+#include <asm/segment.h>
+#include <asm/trapnr.h>
 
        .text
        .code32
@@ -98,7 +100,7 @@ SYM_CODE_START_LOCAL(sev_es_req_cpuid)
        jmp     1b
 SYM_CODE_END(sev_es_req_cpuid)
 
-SYM_CODE_START(startup32_vc_handler)
+SYM_CODE_START_LOCAL(startup32_vc_handler)
        pushl   %eax
        pushl   %ebx
        pushl   %ecx
@@ -184,6 +186,63 @@ SYM_CODE_START(startup32_vc_handler)
        jmp .Lfail
 SYM_CODE_END(startup32_vc_handler)
 
+/*
+ * Write an IDT entry into boot32_idt
+ *
+ * Parameters:
+ *
+ * %eax:       Handler address
+ * %edx:       Vector number
+ * %ecx:       IDT address
+ */
+SYM_FUNC_START_LOCAL(startup32_set_idt_entry)
+       /* IDT entry address to %ecx */
+       leal    (%ecx, %edx, 8), %ecx
+
+       /* Build IDT entry, lower 4 bytes */
+       movl    %eax, %edx
+       andl    $0x0000ffff, %edx               # Target code segment offset [15:0]
+       orl     $(__KERNEL32_CS << 16), %edx    # Target code segment selector
+
+       /* Store lower 4 bytes to IDT */
+       movl    %edx, (%ecx)
+
+       /* Build IDT entry, upper 4 bytes */
+       movl    %eax, %edx
+       andl    $0xffff0000, %edx       # Target code segment offset [31:16]
+       orl     $0x00008e00, %edx       # Present, Type 32-bit Interrupt Gate
+
+       /* Store upper 4 bytes to IDT */
+       movl    %edx, 4(%ecx)
+
+       RET
+SYM_FUNC_END(startup32_set_idt_entry)
+
+SYM_FUNC_START(startup32_load_idt)
+       push    %ebp
+       push    %ebx
+
+       call    1f
+1:     pop     %ebp
+
+       leal    (boot32_idt - 1b)(%ebp), %ebx
+
+       /* #VC handler */
+       leal    (startup32_vc_handler - 1b)(%ebp), %eax
+       movl    $X86_TRAP_VC, %edx
+       movl    %ebx, %ecx
+       call    startup32_set_idt_entry
+
+       /* Load IDT */
+       leal    (boot32_idt_desc - 1b)(%ebp), %ecx
+       movl    %ebx, 2(%ecx)
+       lidt    (%ecx)
+
+       pop     %ebx
+       pop     %ebp
+       RET
+SYM_FUNC_END(startup32_load_idt)
+
        .code64
 
 #include "../../kernel/sev_verify_cbit.S"
@@ -195,4 +254,15 @@ SYM_CODE_END(startup32_vc_handler)
 SYM_DATA(sme_me_mask,          .quad 0)
 SYM_DATA(sev_status,           .quad 0)
 SYM_DATA(sev_check_data,       .quad 0)
+
+SYM_DATA_START_LOCAL(boot32_idt)
+       .rept   32
+       .quad   0
+       .endr
+SYM_DATA_END(boot32_idt)
+
+SYM_DATA_START_LOCAL(boot32_idt_desc)
+       .word   . - boot32_idt - 1
+       .long   0
+SYM_DATA_END(boot32_idt_desc)
 #endif