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

Re: [Xen-devel] [PATCH 9/9] x86/vvmx: Use hvm_copy_{to, from}_guest_virt() to read operands



>>> On 26.10.17 at 19:03, <euan.harris@xxxxxxxxxx> wrote:

In the title please use "read/write" or "access".

> @@ -380,17 +383,7 @@ static int operand_read(void *buf, struct vmx_inst_op 
> *op,
>          return X86EMUL_OKAY;
>      }
>      else
> -    {
> -        pagefault_info_t pfinfo;
> -        int rc = hvm_copy_from_guest_linear(buf, op->mem, bytes, 0, &pfinfo);
> -
> -        if ( rc == HVMTRANS_bad_linear_to_gfn )
> -            hvm_inject_page_fault(pfinfo.ec, pfinfo.linear);
> -        if ( rc != HVMTRANS_okay )
> -            return X86EMUL_EXCEPTION;
> -
> -        return X86EMUL_OKAY;
> -    }
> +        return hvm_copy_from_guest_virt(buf, op->seg, op->offset, bytes, 0);
>  }

Please also drop the now pointless "else".

> @@ -458,9 +451,8 @@ static int decode_vmx_inst(struct cpu_user_regs *regs,
>  {
>      struct vcpu *v = current;
>      union vmx_inst_info info;
> -    struct segment_register seg;
> -    unsigned long base, index, seg_base, disp, offset;
> -    int scale, size;
> +    unsigned long base, index, disp, offset;
> +    int scale;

unsigned int please, if you touch it anyway.

> @@ -496,19 +485,12 @@ static int decode_vmx_inst(struct cpu_user_regs *regs,
>  
>          __vmread(EXIT_QUALIFICATION, &disp);
>  
> -        size = 1 << (info.fields.addr_size + 1);
> -
> -        offset = base + index * scale + disp;
> -        base = !mode_64bit || info.fields.segment >= x86_seg_fs ?
> -               seg_base + offset : offset;
> -        if ( offset + size - 1 < offset ||
> -             (mode_64bit ?
> -              !is_canonical_address((long)base < 0 ? base :
> -                                    base + size - 1) :
> -              offset + size - 1 > seg.limit) )
> -            goto gp_fault;
> +        decode->op[0].type = VMX_INST_MEMREG_TYPE_MEMORY;
> +        decode->op[0].seg = info.fields.segment;
> +        decode->op[0].offset = base + index * scale + disp;
> +        if ( info.fields.addr_size < 2 )
> +            decode->op[0].offset = (uint32_t)decode->op[0].offset;

For 16-bit addressing you need to truncate to 16 bits.

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