[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v2 11/19] x86/emul: Avoid raising faults behind the emulators back



> -----Original Message-----
> From: Andrew Cooper [mailto:andrew.cooper3@xxxxxxxxxx]
> Sent: 28 November 2016 11:13
> To: Xen-devel <xen-devel@xxxxxxxxxxxxx>
> Cc: Andrew Cooper <Andrew.Cooper3@xxxxxxxxxx>; Jan Beulich
> <JBeulich@xxxxxxxx>; Paul Durrant <Paul.Durrant@xxxxxxxxxx>
> 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@xxxxxxxxxx>
> ---
> CC: Jan Beulich <JBeulich@xxxxxxxx>
> CC: Paul Durrant <paul.durrant@xxxxxxxxxx>

Reviewed-by: Paul Durrant <paul.durrant@xxxxxxxxxx>

> 
> 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


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.