|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3] Fix the mistake of exception execution
>>> On 14.05.12 at 12:41, "Hao, Xudong" <xudong.hao@xxxxxxxxx> wrote:
> Fix the mistake for debug exception(#DB), overflow exception(#OF; generated
> by INTO) and int 3(#BP) instruction emulation.
>
> For INTn (CD ib), it should use type 4 (software interrupt).
>
> For INT3 (CC; NOT CD ib with ib=3) and INTO (CE; NOT CD ib with ib=4), it
> should use type 6 (software exception).
>
> For other exceptions (#DE, #DB, #BR, #UD, #NM, #TS, #NP, #SS, #GP, #PF, #MF,
> #AC, #MC, and #XM), it should use type 3 (hardware exception).
>
> In the unlikely event that you are emulating the undocumented opcode F1
> (informally called INT1 or ICEBP), it would use type 5 (privileged software
> exception).
>
> Signed-off-by: Eddie Dong<eddie.dong@xxxxxxxxx>
> Signed-off-by: Xudong Hao <xudong.hao@xxxxxxxxx>
>
> diff -r cd4dd23a831d xen/arch/x86/hvm/vmx/vmx.c
> --- a/xen/arch/x86/hvm/vmx/vmx.c Fri May 11 18:59:07 2012 +0100
> +++ b/xen/arch/x86/hvm/vmx/vmx.c Wed May 15 02:31:34 2013 +0800
> @@ -1350,6 +1350,19 @@ static void __vmx_inject_exception(int t
> curr->arch.hvm_vmx.vmx_emulate = 1;
> }
>
> +/*
> + * Generate the virtual event to guest.
> + * NOTE:
> + * This is for processor execution generated exceptions,
> + * and INT 3(CC), INTO (CE) instruction emulation. It is
> + * not intended for the delivery of event due to emulation
> + * of INT nn (CD nn) instruction, which should use
> + * X86_EVENTTYPE_SW_INTERRUPT as interrupt type; opcode
> + * 0xf1 generated #DB should use privileged software
> + * exception, which is not deliverd here either.
> + * The caller of this function should set correct instruction
> + * length.
> + */
> void vmx_inject_hw_exception(int trap, int error_code)
> {
> unsigned long intr_info;
> @@ -1365,7 +1378,6 @@ void vmx_inject_hw_exception(int trap, i
> switch ( trap )
> {
> case TRAP_debug:
> - type = X86_EVENTTYPE_SW_EXCEPTION;
> if ( guest_cpu_user_regs()->eflags & X86_EFLAGS_TF )
> {
> __restore_debug_registers(curr);
> @@ -1383,16 +1395,14 @@ void vmx_inject_hw_exception(int trap, i
> return;
> }
>
> - type = X86_EVENTTYPE_SW_EXCEPTION;
> - __vmwrite(VM_ENTRY_INSTRUCTION_LEN, 1); /* int3 */
> - break;
> -
> + type = X86_EVENTTYPE_SW_EXCEPTION; /* int3; CC */
> + break;
> +
> + case TRAP_overflow:
> + type = X86_EVENTTYPE_SW_EXCEPTION; /* into; CE */
> + break;
> +
> default:
> - if ( trap > TRAP_last_reserved )
> - {
> - type = X86_EVENTTYPE_SW_EXCEPTION;
> - __vmwrite(VM_ENTRY_INSTRUCTION_LEN, 2); /* int imm8 */
> - }
So this undoes Aravindh's earlier change, without replacement. I
don't think that's acceptable.
> break;
> }
>
> @@ -2447,6 +2457,11 @@ void vmx_vmexit_handler(struct cpu_user_
> if ( handled < 0 )
> {
> vmx_inject_exception(TRAP_int3,
> HVM_DELIVER_NO_ERROR_CODE, 0);
> + /*
> + * According to the vmx_inject_hw_exception()
> description,
> + * it must set correct instruction length by caller
> itself.
> + */
> + __vmwrite(VM_ENTRY_INSTRUCTION_LEN, 1); /* int3, CC */
Still using a hard-coded 1 here, the more that afaict you can't
distinguish CC and CD 03 here.
Furthermore - is this really the only place needing adjustment after
the removal of the corresponding writes above?
Jan
> break;
> }
> else if ( handled )
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |