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

Re: [Xen-devel] [PATCH] x86/emul: Split exception handling out of invoke_stub()



>>> On 24.01.18 at 19:16, <andrew.cooper3@xxxxxxxxxx> wrote:
> For a release build, bloat-o-meter reports:
> 
>   add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-5111 (-5111)
>   function                                     old     new   delta
>   x86_emulate                               126458  121347   -5111
> 
> or in other words, a 4% redunction in code size from this change alone.
> 
> While shuffling things around, drop the use of __LINE__,

While the rest of the change is fine, I continue to object to the
removal of __LINE__ here - afaict it is awkward to reconstruct the
line number when being presented just the address. At the very
least you'd have to run a tool like addr2line, which assumes you
have the correct binary to hand (which is not very likely based on
my experience). However much I can agree that line numbers get
in the way of live patching, there are cases where problem
analysis is quite a bit harder without them. And this is an example
thereof.

Jan

> and print the instruction stream hexdump at WARNING as well.
> 
> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
> ---
> CC: Jan Beulich <JBeulich@xxxxxxxx>
> 
> I stubled onto this while looking at the domain_crash() side of things.  It
> appears that your AVX series makes the problem more pronounced, due to more
> codepaths using invoke_stub().
> ---
>  xen/arch/x86/x86_emulate/x86_emulate.c | 33 +++++++++++++++++++--------------
>  1 file changed, 19 insertions(+), 14 deletions(-)
> 
> diff --git a/xen/arch/x86/x86_emulate/x86_emulate.c 
> b/xen/arch/x86/x86_emulate/x86_emulate.c
> index ff0a003..6dccf4e 100644
> --- a/xen/arch/x86/x86_emulate/x86_emulate.c
> +++ b/xen/arch/x86/x86_emulate/x86_emulate.c
> @@ -866,7 +866,7 @@ static inline int mkec(uint8_t e, int32_t ec, ...)
>  
>  #ifdef __XEN__
>  # define invoke_stub(pre, post, constraints...) do {                    \
> -    union stub_exception_token res_ = { .raw = ~0 };                    \
> +    stub_exn_info = (union stub_exception_token) { .raw = ~0 };         \
>      asm volatile ( pre "\n\tINDIRECT_CALL %[stub]\n\t" post "\n"        \
>                     ".Lret%=:\n\t"                                       \
>                     ".pushsection .fixup,\"ax\"\n"                       \
> @@ -875,21 +875,11 @@ static inline int mkec(uint8_t e, int32_t ec, ...)
>                     "jmp .Lret%=\n\t"                                    \
>                     ".popsection\n\t"                                    \
>                     _ASM_EXTABLE(.Lret%=, .Lfix%=)                       \
> -                   : [exn] "+g" (res_), constraints,                    \
> +                   : [exn] "+g" (stub_exn_info), constraints,           \
>                       [stub] "r" (stub.func),                            \
>                       "m" (*(uint8_t(*)[MAX_INST_LEN + 1])stub.ptr) );   \
> -    if ( unlikely(~res_.raw) )                                          \
> -    {                                                                   \
> -        gprintk(XENLOG_WARNING,                                         \
> -                "exception %u (ec=%04x) in emulation stub (line %u)\n", \
> -                res_.fields.trapnr, res_.fields.ec, __LINE__);          \
> -        gprintk(XENLOG_INFO, "stub: %"__stringify(MAX_INST_LEN)"ph\n",  \
> -                stub.func);                                             \
> -        generate_exception_if(res_.fields.trapnr == EXC_UD, EXC_UD);    \
> -        domain_crash(current->domain);                                  \
> -        rc = X86EMUL_UNHANDLEABLE;                                      \
> -        goto done;                                                      \
> -    }                                                                   \
> +    if ( unlikely(~stub_exn_info.raw) )                                 \
> +        goto emulation_stub_failure;                                    \
>  } while (0)
>  #else
>  # define invoke_stub(pre, post, constraints...)                         \
> @@ -3000,6 +2990,9 @@ x86_emulate(
>      struct fpu_insn_ctxt fic = { .type = X86EMUL_FPU_none, .exn_raised = -1 
> };
>      struct x86_emulate_stub stub = {};
>      DECLARE_ALIGNED(mmval_t, mmval);
> +#ifdef __XEN__
> +    union stub_exception_token stub_exn_info;
> +#endif
>  
>      ASSERT(ops->read);
>  
> @@ -8012,6 +8005,18 @@ x86_emulate(
>      put_stub(stub);
>      return rc;
>  #undef state
> +
> +#ifdef __XEN__
> + emulation_stub_failure:
> +    gprintk(XENLOG_WARNING, "exception %u (ec=%04x) in emulation stub\n",
> +            stub_exn_info.fields.trapnr, stub_exn_info.fields.ec);
> +    gprintk(XENLOG_WARNING, "  stub: %"__stringify(MAX_INST_LEN)"ph\n",
> +            stub.func);
> +    generate_exception_if(stub_exn_info.fields.trapnr == EXC_UD, EXC_UD);
> +    domain_crash(current->domain);
> +    rc = X86EMUL_UNHANDLEABLE;
> +    goto done;
> +#endif
>  }
>  
>  #undef op_bytes
> -- 
> 2.1.4



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

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