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

Re: [Xen-devel] [PATCH 1/2] x86/svm: Improve diagnostics when __get_instruction_length_from_list() fails



>>> On 30.11.18 at 18:07, <andrew.cooper3@xxxxxxxxxx> wrote:
> Also, I'm not entirely convinced that making modrm an annonymous union is
> going to work with older CentOS compilers,

It certainly won't.

> and therefore am not sure whether
> that part of the change is worth it.  The instruction in question can be
> obtained from the printed INSN_ constant alone.
> ---
>  xen/arch/x86/hvm/svm/emulate.c | 26 +++++++++++++++++++-------
>  1 file changed, 19 insertions(+), 7 deletions(-)
> 
> diff --git a/xen/arch/x86/hvm/svm/emulate.c b/xen/arch/x86/hvm/svm/emulate.c
> index 3d04af0..71a1b6e 100644
> --- a/xen/arch/x86/hvm/svm/emulate.c
> +++ b/xen/arch/x86/hvm/svm/emulate.c
> @@ -56,11 +56,14 @@ static unsigned long svm_nextrip_insn_length(struct vcpu 
> *v)
>  
>  static const struct {
>      unsigned int opcode;
> -    struct {
> -        unsigned int rm:3;
> -        unsigned int reg:3;
> -        unsigned int mod:2;
> -#define MODRM(mod, reg, rm) { rm, reg, mod }
> +    union {
> +        struct {
> +            unsigned int rm:3;
> +            unsigned int reg:3;
> +            unsigned int mod:2;
> +        };
> +        unsigned int raw;

Why unsigned int instead of uint8_t?

> @@ -152,8 +155,17 @@ int __get_instruction_length_from_list(struct vcpu *v,
>      }
>  
>      gdprintk(XENLOG_WARNING,
> -             "%s: Mismatch between expected and actual instruction: "
> -             "eip = %lx\n",  __func__, (unsigned long)vmcb->rip);
> +             "%s: Mismatch between expected and actual instruction:\n",
> +             __func__);
> +    gdprintk(XENLOG_WARNING,
> +             "  list[0] val %d, { opc %#x, modrm %#x }, list entries: %u\n",
> +             list[0], opc_tab[list[0]].opcode, opc_tab[list[0]].modrm.raw,
> +             list_count);
> +    gdprintk(XENLOG_WARNING, "  rip 0x%lx, nextrip 0x%lx, len %lu\n",
> +             vmcb->rip, vmcb->nextrip, vmcb->nextrip - vmcb->rip);
> +    hvm_dump_emulation_state(XENLOG_G_WARNING, "Insn_len",
> +                             &ctxt, X86EMUL_UNHANDLEABLE);
> +
>      hvm_inject_hw_exception(TRAP_gp_fault, 0);
>      return 0;
>  }

The gdprintk()s all expanding to nothing in release builds I'm
not fully convinced the added verbosity is worth it. In debug
builds adding some debugging code like this shouldn't be a
big hurdle.

In any event %#lx instead of 0x%lx please.

Jan



_______________________________________________
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®.