x86/realmode: Setup AP jump table
[linux-2.6-microblaze.git] / arch / x86 / realmode / init.c
index 1ed1208..3fb9b60 100644 (file)
@@ -9,6 +9,7 @@
 #include <asm/realmode.h>
 #include <asm/tlbflush.h>
 #include <asm/crash.h>
+#include <asm/sev-es.h>
 
 struct real_mode_header *real_mode_header;
 u32 *trampoline_cr4_features;
@@ -38,6 +39,19 @@ void __init reserve_real_mode(void)
        crash_reserve_low_1M();
 }
 
+static void sme_sev_setup_real_mode(struct trampoline_header *th)
+{
+#ifdef CONFIG_AMD_MEM_ENCRYPT
+       if (sme_active())
+               th->flags |= TH_FLAGS_SME_ACTIVE;
+
+       if (sev_es_active()) {
+               if (sev_es_setup_ap_jump_table(real_mode_header))
+                       panic("Failed to get/update SEV-ES AP Jump Table");
+       }
+#endif
+}
+
 static void __init setup_real_mode(void)
 {
        u16 real_mode_seg;
@@ -104,13 +118,13 @@ static void __init setup_real_mode(void)
        *trampoline_cr4_features = mmu_cr4_features;
 
        trampoline_header->flags = 0;
-       if (sme_active())
-               trampoline_header->flags |= TH_FLAGS_SME_ACTIVE;
 
        trampoline_pgd = (u64 *) __va(real_mode_header->trampoline_pgd);
        trampoline_pgd[0] = trampoline_pgd_entry.pgd;
        trampoline_pgd[511] = init_top_pgt[511].pgd;
 #endif
+
+       sme_sev_setup_real_mode(trampoline_header);
 }
 
 /*