ltr(TSS_ENTRY << 3);
lldt(0);
- set_ist(&idt_tables[cpu][TRAP_double_fault], IST_DF);
- set_ist(&idt_tables[cpu][TRAP_nmi], IST_NMI);
- set_ist(&idt_tables[cpu][TRAP_machine_check], IST_MCE);
+ enable_each_ist(idt_tables[cpu]);
/*
* Bottom-of-stack must be 16-byte aligned!
svm_vmload_pa(per_cpu(host_vmcb, cpu));
/* Resume use of ISTs now that the host TR is reinstated. */
- set_ist(&idt_tables[cpu][TRAP_double_fault], IST_DF);
- set_ist(&idt_tables[cpu][TRAP_nmi], IST_NMI);
- set_ist(&idt_tables[cpu][TRAP_machine_check], IST_MCE);
+ enable_each_ist(idt_tables[cpu]);
}
static void svm_ctxt_switch_to(struct vcpu *v)
* Cannot use ISTs for NMI/#MC/#DF while we are running with the guest TR.
* But this doesn't matter: the IST is only req'd to handle SYSCALL/SYSRET.
*/
- set_ist(&idt_tables[cpu][TRAP_double_fault], IST_NONE);
- set_ist(&idt_tables[cpu][TRAP_nmi], IST_NONE);
- set_ist(&idt_tables[cpu][TRAP_machine_check], IST_NONE);
+ disable_each_ist(idt_tables[cpu]);
svm_restore_dr(v);
if ( idt_tables[cpu] == NULL )
goto out;
memcpy(idt_tables[cpu], idt_table, IDT_ENTRIES * sizeof(idt_entry_t));
- set_ist(&idt_tables[cpu][TRAP_double_fault], IST_NONE);
- set_ist(&idt_tables[cpu][TRAP_nmi], IST_NONE);
- set_ist(&idt_tables[cpu][TRAP_machine_check], IST_NONE);
+ disable_each_ist(idt_tables[cpu]);
rc = setup_cpu_root_pgt(cpu);
if ( rc )
set_intr_gate(TRAP_simd_error,&simd_coprocessor_error);
/* Specify dedicated interrupt stacks for NMI, #DF, and #MC. */
- set_ist(&idt_table[TRAP_double_fault], IST_DF);
- set_ist(&idt_table[TRAP_nmi], IST_NMI);
- set_ist(&idt_table[TRAP_machine_check], IST_MCE);
+ enable_each_ist(idt_table);
/* CPU0 uses the master IDT. */
idt_tables[0] = idt_table;
_write_gate_lower(idt, &new);
}
+static inline void enable_each_ist(idt_entry_t *idt)
+{
+ set_ist(&idt[TRAP_double_fault], IST_DF);
+ set_ist(&idt[TRAP_nmi], IST_NMI);
+ set_ist(&idt[TRAP_machine_check], IST_MCE);
+}
+
+static inline void disable_each_ist(idt_entry_t *idt)
+{
+ set_ist(&idt[TRAP_double_fault], IST_NONE);
+ set_ist(&idt[TRAP_nmi], IST_NONE);
+ set_ist(&idt[TRAP_machine_check], IST_NONE);
+}
+
#define IDT_ENTRIES 256
extern idt_entry_t idt_table[];
extern idt_entry_t *idt_tables[];