|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 3/3] x86/HVM: correct error code writing during task switch
On 22/11/16 13:56, Jan Beulich wrote:
> Whether to write 32 or just 16 bits depends on the D bit of the target
> CS. The width of the stack pointer to use depends on the B bit of the
> target SS.
>
> Also avoid using the no-fault copying routine.
>
> Finally avoid using yet another struct segment_register variable here.
>
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
>
> --- a/xen/arch/x86/hvm/hvm.c
> +++ b/xen/arch/x86/hvm/hvm.c
> @@ -3033,9 +3033,6 @@ void hvm_task_switch(
> goto out;
> }
>
> - if ( (tss.trace & 1) && !exn_raised )
> - hvm_inject_hw_exception(TRAP_debug, HVM_DELIVER_NO_ERROR_CODE);
> -
> tr.attr.fields.type = 0xb; /* busy 32-bit tss */
> hvm_set_segment_register(v, x86_seg_tr, &tr);
>
> @@ -3051,17 +3048,32 @@ void hvm_task_switch(
>
> if ( errcode >= 0 )
> {
> - struct segment_register reg;
> unsigned long linear_addr;
> - regs->esp -= 4;
> - hvm_get_segment_register(current, x86_seg_ss, ®);
> - /* Todo: do not ignore access faults here. */
> - if ( hvm_virtual_to_linear_addr(x86_seg_ss, ®, regs->esp,
> - 4, hvm_access_write, 32,
> + unsigned int opsz, sp;
> +
> + hvm_get_segment_register(current, x86_seg_cs, &segr);
You already have current latched in v at this point.
Otherwise, Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
> + opsz = segr.attr.fields.db ? 4 : 2;
> + hvm_get_segment_register(current, x86_seg_ss, &segr);
> + if ( segr.attr.fields.db )
> + sp = regs->_esp -= opsz;
> + else
> + sp = *(uint16_t *)®s->esp -= opsz;
> + if ( hvm_virtual_to_linear_addr(x86_seg_ss, &segr, sp, opsz,
> + hvm_access_write,
> + 16 << segr.attr.fields.db,
> &linear_addr) )
> - hvm_copy_to_guest_virt_nofault(linear_addr, &errcode, 4, 0);
> + {
> + rc = hvm_copy_to_guest_virt(linear_addr, &errcode, opsz, 0);
> + if ( rc == HVMCOPY_bad_gva_to_gfn )
> + exn_raised = 1;
> + else if ( rc != HVMCOPY_okay )
> + goto out;
> + }
> }
>
> + if ( (tss.trace & 1) && !exn_raised )
> + hvm_inject_hw_exception(TRAP_debug, HVM_DELIVER_NO_ERROR_CODE);
> +
> out:
> hvm_unmap_entry(optss_desc);
> hvm_unmap_entry(nptss_desc);
>
>
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |