0001
0002 #include <asm/trap_pf.h>
0003 #include <asm/segment.h>
0004 #include <asm/trapnr.h>
0005 #include "misc.h"
0006
0007 static void set_idt_entry(int vector, void (*handler)(void))
0008 {
0009 unsigned long address = (unsigned long)handler;
0010 gate_desc entry;
0011
0012 memset(&entry, 0, sizeof(entry));
0013
0014 entry.offset_low = (u16)(address & 0xffff);
0015 entry.segment = __KERNEL_CS;
0016 entry.bits.type = GATE_TRAP;
0017 entry.bits.p = 1;
0018 entry.offset_middle = (u16)((address >> 16) & 0xffff);
0019 entry.offset_high = (u32)(address >> 32);
0020
0021 memcpy(&boot_idt[vector], &entry, sizeof(entry));
0022 }
0023
0024
0025 static void load_boot_idt(const struct desc_ptr *dtr)
0026 {
0027 asm volatile("lidt %0"::"m" (*dtr));
0028 }
0029
0030
0031 void load_stage1_idt(void)
0032 {
0033 boot_idt_desc.address = (unsigned long)boot_idt;
0034
0035
0036 if (IS_ENABLED(CONFIG_AMD_MEM_ENCRYPT))
0037 set_idt_entry(X86_TRAP_VC, boot_stage1_vc);
0038
0039 load_boot_idt(&boot_idt_desc);
0040 }
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059 void load_stage2_idt(void)
0060 {
0061 boot_idt_desc.address = (unsigned long)boot_idt;
0062
0063 set_idt_entry(X86_TRAP_PF, boot_page_fault);
0064
0065 #ifdef CONFIG_AMD_MEM_ENCRYPT
0066 set_idt_entry(X86_TRAP_VC, boot_stage2_vc);
0067 #endif
0068
0069 load_boot_idt(&boot_idt_desc);
0070 }
0071
0072 void cleanup_exception_handling(void)
0073 {
0074
0075
0076
0077
0078 sev_es_shutdown_ghcb();
0079
0080
0081 boot_idt_desc.size = 0;
0082 boot_idt_desc.address = 0;
0083 load_boot_idt(&boot_idt_desc);
0084 }