Message ID | 1480331616-6165-12-git-send-email-andrew.cooper3@citrix.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
> -----Original Message----- > From: Andrew Cooper [mailto:andrew.cooper3@citrix.com] > Sent: 28 November 2016 11:13 > To: Xen-devel <xen-devel@lists.xen.org> > Cc: Andrew Cooper <Andrew.Cooper3@citrix.com>; Jan Beulich > <JBeulich@suse.com>; Paul Durrant <Paul.Durrant@citrix.com> > Subject: [PATCH v2 11/19] x86/emul: Avoid raising faults behind the > emulators back > > Introduce a new x86_emul_pagefault() similar to x86_emul_hw_exception(), > and > use this instead of hvm_inject_page_fault() from emulation codepaths. > > Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> > --- > CC: Jan Beulich <JBeulich@suse.com> > CC: Paul Durrant <paul.durrant@citrix.com> Reviewed-by: Paul Durrant <paul.durrant@citrix.com> > > v2: > * Change x86_emul_pagefault()'s error_code parameter to being signed > * Split out shadow changes > --- > xen/arch/x86/hvm/emulate.c | 4 ++-- > xen/arch/x86/x86_emulate/x86_emulate.h | 13 +++++++++++++ > 2 files changed, 15 insertions(+), 2 deletions(-) > > diff --git a/xen/arch/x86/hvm/emulate.c b/xen/arch/x86/hvm/emulate.c > index 7745c5b..35d1d1c 100644 > --- a/xen/arch/x86/hvm/emulate.c > +++ b/xen/arch/x86/hvm/emulate.c > @@ -459,7 +459,7 @@ static int hvmemul_linear_to_phys( > { > if ( pfec & (PFEC_page_paged | PFEC_page_shared) ) > return X86EMUL_RETRY; > - hvm_inject_page_fault(pfec, addr); > + x86_emul_pagefault(pfec, addr, &hvmemul_ctxt->ctxt); > return X86EMUL_EXCEPTION; > } > > @@ -483,7 +483,7 @@ static int hvmemul_linear_to_phys( > ASSERT(!reverse); > if ( npfn != gfn_x(INVALID_GFN) ) > return X86EMUL_UNHANDLEABLE; > - hvm_inject_page_fault(pfec, addr & PAGE_MASK); > + x86_emul_pagefault(pfec, addr & PAGE_MASK, &hvmemul_ctxt- > >ctxt); > return X86EMUL_EXCEPTION; > } > *reps = done; > diff --git a/xen/arch/x86/x86_emulate/x86_emulate.h > b/xen/arch/x86/x86_emulate/x86_emulate.h > index 8019ee1..4679711 100644 > --- a/xen/arch/x86/x86_emulate/x86_emulate.h > +++ b/xen/arch/x86/x86_emulate/x86_emulate.h > @@ -624,6 +624,19 @@ static inline void x86_emul_hw_exception( > ctxt->event_pending = true; > } > > +static inline void x86_emul_pagefault( > + int error_code, unsigned long cr2, struct x86_emulate_ctxt *ctxt) > +{ > + ASSERT(!ctxt->event_pending); > + > + ctxt->event.vector = 14; /* TRAP_page_fault */ > + ctxt->event.type = X86_EVENTTYPE_HW_EXCEPTION; > + ctxt->event.error_code = error_code; > + ctxt->event.cr2 = cr2; > + > + ctxt->event_pending = true; > +} > + > static inline void x86_emul_software_event( > enum x86_swint_type type, uint8_t vector, uint8_t insn_len, > struct x86_emulate_ctxt *ctxt) > -- > 2.1.4
>>> On 28.11.16 at 12:13, <andrew.cooper3@citrix.com> wrote: > Introduce a new x86_emul_pagefault() similar to x86_emul_hw_exception(), and > use this instead of hvm_inject_page_fault() from emulation codepaths. > > Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> Reviewed-by: Jan Beulich <jbeulich@suse.com>
diff --git a/xen/arch/x86/hvm/emulate.c b/xen/arch/x86/hvm/emulate.c index 7745c5b..35d1d1c 100644 --- a/xen/arch/x86/hvm/emulate.c +++ b/xen/arch/x86/hvm/emulate.c @@ -459,7 +459,7 @@ static int hvmemul_linear_to_phys( { if ( pfec & (PFEC_page_paged | PFEC_page_shared) ) return X86EMUL_RETRY; - hvm_inject_page_fault(pfec, addr); + x86_emul_pagefault(pfec, addr, &hvmemul_ctxt->ctxt); return X86EMUL_EXCEPTION; } @@ -483,7 +483,7 @@ static int hvmemul_linear_to_phys( ASSERT(!reverse); if ( npfn != gfn_x(INVALID_GFN) ) return X86EMUL_UNHANDLEABLE; - hvm_inject_page_fault(pfec, addr & PAGE_MASK); + x86_emul_pagefault(pfec, addr & PAGE_MASK, &hvmemul_ctxt->ctxt); return X86EMUL_EXCEPTION; } *reps = done; diff --git a/xen/arch/x86/x86_emulate/x86_emulate.h b/xen/arch/x86/x86_emulate/x86_emulate.h index 8019ee1..4679711 100644 --- a/xen/arch/x86/x86_emulate/x86_emulate.h +++ b/xen/arch/x86/x86_emulate/x86_emulate.h @@ -624,6 +624,19 @@ static inline void x86_emul_hw_exception( ctxt->event_pending = true; } +static inline void x86_emul_pagefault( + int error_code, unsigned long cr2, struct x86_emulate_ctxt *ctxt) +{ + ASSERT(!ctxt->event_pending); + + ctxt->event.vector = 14; /* TRAP_page_fault */ + ctxt->event.type = X86_EVENTTYPE_HW_EXCEPTION; + ctxt->event.error_code = error_code; + ctxt->event.cr2 = cr2; + + ctxt->event_pending = true; +} + static inline void x86_emul_software_event( enum x86_swint_type type, uint8_t vector, uint8_t insn_len, struct x86_emulate_ctxt *ctxt)
Introduce a new x86_emul_pagefault() similar to x86_emul_hw_exception(), and use this instead of hvm_inject_page_fault() from emulation codepaths. Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> --- CC: Jan Beulich <JBeulich@suse.com> CC: Paul Durrant <paul.durrant@citrix.com> v2: * Change x86_emul_pagefault()'s error_code parameter to being signed * Split out shadow changes --- xen/arch/x86/hvm/emulate.c | 4 ++-- xen/arch/x86/x86_emulate/x86_emulate.h | 13 +++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-)