All of lore.kernel.org
 help / color / mirror / Atom feed
From: Gleb Natapov <gleb@redhat.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: kvm@vger.kernel.org
Subject: Re: [PATCH kvm-unit-tests] Test fault during IRET from NMI.
Date: Sun, 15 Sep 2013 12:56:49 +0300	[thread overview]
Message-ID: <20130915095649.GY17294@redhat.com> (raw)
In-Reply-To: <523583C7.1050405@redhat.com>

On Sun, Sep 15, 2013 at 11:54:15AM +0200, Paolo Bonzini wrote:
> Il 15/09/2013 10:17, Gleb Natapov ha scritto:
> > This test checks that NMI window opens only after IRET from NMI is
> > executed without a fault.
> > 
> > Signed-off-by: Gleb Natapov <gleb@redhat.com>
> 
> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
> 
> ... with a couple English nits (see inline).
> 
Yeah, those are copy/paste from other places. The file is full of it :)

> > diff --git a/lib/x86/processor.h b/lib/x86/processor.h
> > index e46d8d0..de1dc47 100644
> > --- a/lib/x86/processor.h
> > +++ b/lib/x86/processor.h
> > @@ -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");
> > diff --git a/x86/eventinj.c b/x86/eventinj.c
> > index 7bed7c5..c171e30 100644
> > --- a/x86/eventinj.c
> > +++ b/x86/eventinj.c
> > @@ -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);
> > +
> > +	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/
> 
> > +	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");
> > @@ -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/
> 
> > +	apic_self_nmi();
> > +	/* this is needed on VMX without NMI window notificatoin.
> 
> s/notifiatoin/notification/
> 
> > +	   Interrupt windows is used instead, so let pending NMI
> > +	   to be injected */
> > +	irq_enable();
> > +	asm volatile ("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 majordomo@vger.kernel.org
> > More majordomo info at  http://vger.kernel.org/majordomo-info.html
> > 

--
			Gleb.

  reply	other threads:[~2013-09-15  9:56 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-09-15  8:17 [PATCH kvm-unit-tests] Test fault during IRET from NMI Gleb Natapov
2013-09-15  9:54 ` Paolo Bonzini
2013-09-15  9:56   ` Gleb Natapov [this message]
2013-09-16  9:30     ` Paolo Bonzini
2013-09-16 10:40       ` Gleb Natapov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20130915095649.GY17294@redhat.com \
    --to=gleb@redhat.com \
    --cc=kvm@vger.kernel.org \
    --cc=pbonzini@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.