Test fault during IRET from NMI.
PATCH 1/1 Test fault during IRET from NMI.
This test checks that NMI window opens only after IRET from NMI is executed without a fault.
lib/x86/processor.h +7 -0
@@ -62,6 +62,13 @@ static inline u16 read_gs(void)return val; } +static inline unsigned long read_rflags (void ) +{ +unsigned long f; + asm ("pushf; pop %0\n\t" :"=rm" (f)); +return f; +} +static inline void write_ds (unsigned val) { asm ("mov %0, %%ds" : :"rm" (val) :"memory" );
x86/eventinj.c +50 -0
62 lines not on this page · raw message
--
Gleb.
Il 15/09/2013 10:17, Gleb Natapov ha scritto:
Quoted 4 lines
This test checks that NMI window opens only after IRET from NMI is executed without a fault.
Signed-off-by Gleb Natapov <[email protected]>
... with a couple English nits (see inline).
Quoted 32 lines
lib/x86/processor.h +7
-0@@ -62,6 +62,13 @@ static inline u16 read_gs(void)return val; } +static inline unsigned long read_rflags (void ) +{ +unsigned long f; + asm ("pushf; pop %0\n\t" :"=rm" (f)); +return f; +} +static inline void write_ds (unsigned val) { asm ("mov %0, %%ds" : :"rm" (val) :"memory" );x86/eventinj.c +6
-0@@ -125,6 +125,42 @@ static void nmi_isr(struct ex_regs *r)printf ("After nested NMI to itself\n" ); } +unsigned long after_iret_addr; + +static void nested_nmi_iret_isr (struct ex_regs *r) +{ +printf ("Nested NMI isr running rip=%x\n" , r->rip); +
x86/eventinj.c static void nmi_isr(struct ex_regs *r) · line 143
Quoted 10 lines
x86/eventinj.c +10
-0+if (r->rip == after_iret_addr) + test_count++; +} +static void nmi_iret_isr (struct ex_regs *r) +{ +unsigned long *s =alloc_page (); + test_count++; +printf ("NMI isr running %p stack %p\n" , &&after_iret, s); +handle_exception (2 , nested_nmi_iret_isr); +printf ("Try send nested NMI to itself\n" );
s/Try send/Sending/
Quoted 24 lines
x86/eventinj.c +20
-0+apic_self_nmi (); +printf ("After nested NMI to itself\n" ); + s[4 ] =read_ss (); + s[3 ] =0 ;/* rsp */ + s[2 ] =read_rflags (); + s[1 ] =read_cs (); + s[0 ] = after_iret_addr = (unsigned long )&&after_iret; + asm ("mov %%rsp, %0\n\t" + "mov %1, %%rsp\n\t" + "outl %2, $0xe4\n\t" /* flush stack page */ +#ifdef __x86_64__ + "iretq\n\t" +#else +"iretl\n\t" +#endif + :"=m" (s[3 ]) :"rm" (&s[0 ]),"a" ((unsigned int )virt_to_phys (s)) :"memory" ); +after_iret: +printf ("After iret\n" ); +} +static void tirq0 (isr_regs_t *r) {printf ("irq0 running\n" );
x86/eventinj.c int main() · line 343
Quoted 8 lines
x86/eventinj.c +5
-0@@ -300,6 +336,20 @@ int main()irq_disable ();report ("NMI" , test_count ==2 ); +/* generate NMI that will fault on IRET */ +printf ("Before NMI IRET test\n" ); + test_count =0 ; +handle_exception (2 , nmi_iret_isr); +printf ("Try send NMI to itself\n" );
s/Try send/Sending/
x86/eventinj.c int main() · line 345
Quoted 2 lines
x86/eventinj.c +2
-0+apic_self_nmi (); +/* this is needed on VMX without NMI window notificatoin.
s/notifiatoin/notification/
Quoted 17 lines
x86/eventinj.c +7
-1+Interrupt windows is used instead, so let pending NMI +to be injected */ +irq_enable (); + asmvolatile ("nop" ); +irq_disable (); +printf ("After NMI to itself\n" ); +report ("NMI" , test_count ==2 );#ifndef __x86_64__ stack_phys = (ulong )virt_to_phys (alloc_page ()); stack_va =alloc_vpage (); --Gleb.
--
To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Quoted 10 lines · Paolo Bonzini
Il 15/09/2013 10:17, Gleb Natapov ha scritto:
Quoted 4 lines
This test checks that NMI window opens only after IRET from NMI is executed without a fault.
Signed-off-by Gleb Natapov <[email protected]>Reviewed-by Paolo Bonzini <[email protected]>... with a couple English nits (see inline).
Yeah, those are copy/paste from other places. The file is full of it :)
Quoted 94 lines
Quoted 32 lines
lib/x86/processor.h +7
-0@@ -62,6 +62,13 @@ static inline u16 read_gs(void)return val; } +static inline unsigned long read_rflags (void ) +{ +unsigned long f; + asm ("pushf; pop %0\n\t" :"=rm" (f)); +return f; +} +static inline void write_ds (unsigned val) { asm ("mov %0, %%ds" : :"rm" (val) :"memory" );x86/eventinj.c +6
-0@@ -125,6 +125,42 @@ static void nmi_isr(struct ex_regs *r)printf ("After nested NMI to itself\n" ); } +unsigned long after_iret_addr; + +static void nested_nmi_iret_isr (struct ex_regs *r) +{ +printf ("Nested NMI isr running rip=%x\n" , r->rip); +x86/eventinj.c static void nmi_isr(struct ex_regs *r) · line 143
Quoted 10 lines
x86/eventinj.c +10
-0+if (r->rip == after_iret_addr) + test_count++; +} +static void nmi_iret_isr (struct ex_regs *r) +{ +unsigned long *s =alloc_page (); + test_count++; +printf ("NMI isr running %p stack %p\n" , &&after_iret, s); +handle_exception (2 , nested_nmi_iret_isr); +printf ("Try send nested NMI to itself\n" );s/Try send/Sending/
Quoted 24 lines
x86/eventinj.c +20
-0+apic_self_nmi (); +printf ("After nested NMI to itself\n" ); + s[4 ] =read_ss (); + s[3 ] =0 ;/* rsp */ + s[2 ] =read_rflags (); + s[1 ] =read_cs (); + s[0 ] = after_iret_addr = (unsigned long )&&after_iret; + asm ("mov %%rsp, %0\n\t" + "mov %1, %%rsp\n\t" + "outl %2, $0xe4\n\t" /* flush stack page */ +#ifdef __x86_64__ + "iretq\n\t" +#else +"iretl\n\t" +#endif + :"=m" (s[3 ]) :"rm" (&s[0 ]),"a" ((unsigned int )virt_to_phys (s)) :"memory" ); +after_iret: +printf ("After iret\n" ); +} +static void tirq0 (isr_regs_t *r) {printf ("irq0 running\n" );x86/eventinj.c int main() · line 343
Quoted 8 lines
x86/eventinj.c +5
-0@@ -300,6 +336,20 @@ int main()irq_disable ();report ("NMI" , test_count ==2 ); +/* generate NMI that will fault on IRET */ +printf ("Before NMI IRET test\n" ); + test_count =0 ; +handle_exception (2 , nmi_iret_isr); +printf ("Try send NMI to itself\n" );s/Try send/Sending/
x86/eventinj.c int main() · line 345
Quoted 2 lines
x86/eventinj.c +2
-0+apic_self_nmi (); +/* this is needed on VMX without NMI window notificatoin. s/notifiatoin/notification/
Quoted 9 lines
x86/eventinj.c +7
-0+Interrupt windows is used instead, so let pending NMI +to be injected */ +irq_enable (); + asmvolatile ("nop" ); +irq_disable (); +printf ("After NMI to itself\n" ); +report ("NMI" , test_count ==2 );#ifndef __x86_64__ stack_phys = (ulong )virt_to_phys (alloc_page ());
Quoted 8 lines
Quoted 8 lines
x86/eventinj.c +0
-1stack_va =alloc_vpage (); --Gleb.
--
To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
--
Gleb.
Paolo Bonzini
maintainerIl 15/09/2013 11:56, Gleb Natapov ha scritto:
Quoted 5 lines · Paolo Bonzini
Quoted 4 lines
Il 15/09/2013 10:17, Gleb Natapov ha scritto:
Quoted 3 lines
This test checks that NMI window opens only after IRET from NMI is executed without a fault.
Quoted 7 lines
Quoted 6 lines
Quoted 1 line
Signed-off-by Gleb Natapov <[email protected]>Reviewed-by Paolo Bonzini <[email protected]>... with a couple English nits (see inline).
Yeah, those are copy/paste from other places. The file is full of it :)
Can you fix all of them? :)
Paolo
Quoted 8 lines · Paolo Bonzini
Il 15/09/2013 11:56, Gleb Natapov ha scritto:
Quoted 7 lines · Paolo Bonzini
Quoted 6 lines
Il 15/09/2013 10:17, Gleb Natapov ha scritto:
Quoted 4 lines
This test checks that NMI window opens only after IRET from NMI is executed without a fault.
Signed-off-by Gleb Natapov <[email protected]>
Quoted 8 lines
Quoted 5 lines
Quoted 4 lines
Reviewed-by Paolo Bonzini <[email protected]>... with a couple English nits (see inline).
Yeah, those are copy/paste from other places. The file is full of it :)
Can you fix all of them? :)
Sure, I will commit this one as is then and fix all places with a patch on top.
--
Gleb.