[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] x86/IST: Create set_ist() helper function
# HG changeset patch # User Andrew Cooper <andrew.cooper3@xxxxxxxxxx> # Date 1355244559 -3600 # Node ID ef8c1b607b1046b69036bd16d27e08413d47ed11 # Parent a1599b7ce6b2ab54607f8d34bd11b6c3ca6f0005 x86/IST: Create set_ist() helper function ... to save using open-coded bitwise operations, and update all IST manipulation sites to use the function. Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Committed-by: Jan Beulich <jbeulich@xxxxxxxx> --- diff -r a1599b7ce6b2 -r ef8c1b607b10 xen/arch/x86/hvm/svm/svm.c --- a/xen/arch/x86/hvm/svm/svm.c Tue Dec 11 17:46:57 2012 +0100 +++ b/xen/arch/x86/hvm/svm/svm.c Tue Dec 11 17:49:19 2012 +0100 @@ -869,9 +869,9 @@ static void svm_ctxt_switch_from(struct svm_vmload(per_cpu(root_vmcb, cpu)); /* Resume use of ISTs now that the host TR is reinstated. */ - idt_tables[cpu][TRAP_double_fault].a |= IST_DF << 32; - idt_tables[cpu][TRAP_nmi].a |= IST_NMI << 32; - idt_tables[cpu][TRAP_machine_check].a |= IST_MCE << 32; + 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); } static void svm_ctxt_switch_to(struct vcpu *v) @@ -893,9 +893,9 @@ static void svm_ctxt_switch_to(struct vc * 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. */ - idt_tables[cpu][TRAP_double_fault].a &= ~(7UL << 32); - idt_tables[cpu][TRAP_nmi].a &= ~(7UL << 32); - idt_tables[cpu][TRAP_machine_check].a &= ~(7UL << 32); + 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); svm_restore_dr(v); diff -r a1599b7ce6b2 -r ef8c1b607b10 xen/arch/x86/x86_64/traps.c --- a/xen/arch/x86/x86_64/traps.c Tue Dec 11 17:46:57 2012 +0100 +++ b/xen/arch/x86/x86_64/traps.c Tue Dec 11 17:49:19 2012 +0100 @@ -370,9 +370,9 @@ void __devinit subarch_percpu_traps_init { /* Specify dedicated interrupt stacks for NMI, #DF, and #MC. */ set_intr_gate(TRAP_double_fault, &double_fault); - idt_table[TRAP_double_fault].a |= IST_DF << 32; - idt_table[TRAP_nmi].a |= IST_NMI << 32; - idt_table[TRAP_machine_check].a |= IST_MCE << 32; + 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); /* * The 32-on-64 hypercall entry vector is only accessible from ring 1. diff -r a1599b7ce6b2 -r ef8c1b607b10 xen/include/asm-x86/processor.h --- a/xen/include/asm-x86/processor.h Tue Dec 11 17:46:57 2012 +0100 +++ b/xen/include/asm-x86/processor.h Tue Dec 11 17:49:19 2012 +0100 @@ -425,10 +425,20 @@ struct tss_struct { u8 __cacheline_filler[24]; } __cacheline_aligned __attribute__((packed)); -#define IST_DF 1UL -#define IST_NMI 2UL -#define IST_MCE 3UL -#define IST_MAX 3UL +#define IST_NONE 0UL +#define IST_DF 1UL +#define IST_NMI 2UL +#define IST_MCE 3UL +#define IST_MAX 3UL + +/* Set the interrupt stack table used by a particular interrupt + * descriptor table entry. */ +static always_inline void set_ist(idt_entry_t *idt, unsigned long ist) +{ + /* IST is a 3 bit field, 32 bits into the IDT entry. */ + ASSERT(ist <= IST_MAX); + idt->a = (idt->a & ~(7UL << 32)) | (ist << 32); +} #define IDT_ENTRIES 256 extern idt_entry_t idt_table[]; _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |