All of lore.kernel.org
 help / color / mirror / Atom feed
* AMD support of hvm_vcpu.single_step
@ 2014-06-10 21:49 Mukesh Rathor
  2014-06-11 15:56 ` Boris Ostrovsky
  0 siblings, 1 reply; 7+ messages in thread
From: Mukesh Rathor @ 2014-06-10 21:49 UTC (permalink / raw)
  To: boris.ostrovsky, suravee.suthikulpanit, Aravind.Gopalakrishnan; +Cc: Xen-devel

Hi AMD folks,

I am unable to see support of single step on amd platform. On intel,
hvm_vcpu.single_step will cause MTF to be set in vmx_intr_assist:

    /* Block event injection when single step with MTF. */
    if ( unlikely(v->arch.hvm_vcpu.single_step) )
    {           
        v->arch.hvm_vmx.exec_control |= CPU_BASED_MONITOR_TRAP_FLAG;
        vmx_update_cpu_exec_control(v);
        return;
    }       

I don't see equivalent on amd? 

Furthermore, as a second issue, in __update_guest_eip(), imo the exception 
is injected into the guest prematurely :

    if ( regs->eflags & X86_EFLAGS_TF )
            hvm_inject_hw_exception(TRAP_debug,
    HVM_DELIVER_NO_ERROR_CODE);

Reason being, in the BP path, __update_guest_eip is called before
domain_pause_for_debugger(). As such, if the BP is handled, there is no
need to inject into the guest. right?

I've the following patch in my tree for the single step issue. LMK what
you think.

thanks
Mukesh


diff --git a/xen/arch/x86/hvm/svm/intr.c b/xen/arch/x86/hvm/svm/intr.c
index 023151a..28d2c6d 100644
--- a/xen/arch/x86/hvm/svm/intr.c
+++ b/xen/arch/x86/hvm/svm/intr.c
@@ -139,6 +139,12 @@ void svm_intr_assist(void)
     struct hvm_intack intack;
     enum hvm_intblk intblk;
 
+    if ( unlikely(v->arch.hvm_vcpu.single_step) )
+    {
+        guest_cpu_user_regs()->eflags |= X86_EFLAGS_TF;
+        return;
+    }
+
     /* Crank the handle on interrupt state. */
     pt_update_irq(v);
 
diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c
index d307dfb..b55825b 100644
--- a/xen/arch/x86/hvm/svm/svm.c
+++ b/xen/arch/x86/hvm/svm/svm.c
@@ -2340,12 +2368,14 @@ void svm_vmexit_handler(struct cpu_user_regs *regs)
         break;
 
     case VMEXIT_EXCEPTION_DB:
+        if ( !v->domain->debugger_attached )
+            goto exit_and_crash;
+        else
+            regs->eflags &= ~X86_EFLAGS_TF;
-        if ( !v->domain->debugger_attached )
-            goto exit_and_crash;
         domain_pause_for_debugger();
         break;

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: AMD support of hvm_vcpu.single_step
  2014-06-10 21:49 AMD support of hvm_vcpu.single_step Mukesh Rathor
@ 2014-06-11 15:56 ` Boris Ostrovsky
  2014-06-11 22:32   ` Mukesh Rathor
  0 siblings, 1 reply; 7+ messages in thread
From: Boris Ostrovsky @ 2014-06-11 15:56 UTC (permalink / raw)
  To: Mukesh Rathor; +Cc: Xen-devel, Aravind.Gopalakrishnan, suravee.suthikulpanit

On 06/10/2014 05:49 PM, Mukesh Rathor wrote:
> Hi AMD folks,
>
> I am unable to see support of single step on amd platform. On intel,
> hvm_vcpu.single_step will cause MTF to be set in vmx_intr_assist:
>
>      /* Block event injection when single step with MTF. */
>      if ( unlikely(v->arch.hvm_vcpu.single_step) )
>      {
>          v->arch.hvm_vmx.exec_control |= CPU_BASED_MONITOR_TRAP_FLAG;
>          vmx_update_cpu_exec_control(v);
>          return;
>      }
>
> I don't see equivalent on amd?

I think HW performs TF bit manipulations that your patch is suggesting 
(per 13.1.4 of APMv2)

>
> Furthermore, as a second issue, in __update_guest_eip(), imo the exception
> is injected into the guest prematurely :
>
>      if ( regs->eflags & X86_EFLAGS_TF )
>              hvm_inject_hw_exception(TRAP_debug,
>      HVM_DELIVER_NO_ERROR_CODE);
>
> Reason being, in the BP path, __update_guest_eip is called before
> domain_pause_for_debugger(). As such, if the BP is handled, there is no
> need to inject into the guest. right?

TF should be cleared when INT3 is executed according to the same section.

(Besides, it looks like VMX code does the same.)

-boris

>
> I've the following patch in my tree for the single step issue. LMK what
> you think.
>
> thanks
> Mukesh
>
>
> diff --git a/xen/arch/x86/hvm/svm/intr.c b/xen/arch/x86/hvm/svm/intr.c
> index 023151a..28d2c6d 100644
> --- a/xen/arch/x86/hvm/svm/intr.c
> +++ b/xen/arch/x86/hvm/svm/intr.c
> @@ -139,6 +139,12 @@ void svm_intr_assist(void)
>       struct hvm_intack intack;
>       enum hvm_intblk intblk;
>   
> +    if ( unlikely(v->arch.hvm_vcpu.single_step) )
> +    {
> +        guest_cpu_user_regs()->eflags |= X86_EFLAGS_TF;
> +        return;
> +    }
> +
>       /* Crank the handle on interrupt state. */
>       pt_update_irq(v);
>   
> diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c
> index d307dfb..b55825b 100644
> --- a/xen/arch/x86/hvm/svm/svm.c
> +++ b/xen/arch/x86/hvm/svm/svm.c
> @@ -2340,12 +2368,14 @@ void svm_vmexit_handler(struct cpu_user_regs *regs)
>           break;
>   
>       case VMEXIT_EXCEPTION_DB:
> +        if ( !v->domain->debugger_attached )
> +            goto exit_and_crash;
> +        else
> +            regs->eflags &= ~X86_EFLAGS_TF;
> -        if ( !v->domain->debugger_attached )
> -            goto exit_and_crash;
>           domain_pause_for_debugger();
>           break;
>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: AMD support of hvm_vcpu.single_step
  2014-06-11 15:56 ` Boris Ostrovsky
@ 2014-06-11 22:32   ` Mukesh Rathor
  2014-06-11 22:55     ` Boris Ostrovsky
  0 siblings, 1 reply; 7+ messages in thread
From: Mukesh Rathor @ 2014-06-11 22:32 UTC (permalink / raw)
  To: Boris Ostrovsky; +Cc: Xen-devel, Aravind.Gopalakrishnan, suravee.suthikulpanit

On Wed, 11 Jun 2014 11:56:15 -0400
Boris Ostrovsky <boris.ostrovsky@oracle.com> wrote:

> On 06/10/2014 05:49 PM, Mukesh Rathor wrote:
> > Hi AMD folks,
> >
> > I am unable to see support of single step on amd platform. On intel,
> > hvm_vcpu.single_step will cause MTF to be set in vmx_intr_assist:
> >
> >      /* Block event injection when single step with MTF. */
> >      if ( unlikely(v->arch.hvm_vcpu.single_step) )
> >      {
> >          v->arch.hvm_vmx.exec_control |=
> > CPU_BASED_MONITOR_TRAP_FLAG; vmx_update_cpu_exec_control(v);
> >          return;
> >      }
> >
> > I don't see equivalent on amd?
> 
> I think HW performs TF bit manipulations that your patch is
> suggesting (per 13.1.4 of APMv2)

It only clears it, not set it. Patch on the way.

thanks
mukesh

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: AMD support of hvm_vcpu.single_step
  2014-06-11 22:32   ` Mukesh Rathor
@ 2014-06-11 22:55     ` Boris Ostrovsky
  2014-06-11 23:04       ` Mukesh Rathor
  0 siblings, 1 reply; 7+ messages in thread
From: Boris Ostrovsky @ 2014-06-11 22:55 UTC (permalink / raw)
  To: Mukesh Rathor; +Cc: Xen-devel, Aravind.Gopalakrishnan, suravee.suthikulpanit

On 06/11/2014 06:32 PM, Mukesh Rathor wrote:
> On Wed, 11 Jun 2014 11:56:15 -0400
> Boris Ostrovsky <boris.ostrovsky@oracle.com> wrote:
>
>> On 06/10/2014 05:49 PM, Mukesh Rathor wrote:
>>> Hi AMD folks,
>>>
>>> I am unable to see support of single step on amd platform. On intel,
>>> hvm_vcpu.single_step will cause MTF to be set in vmx_intr_assist:
>>>
>>>       /* Block event injection when single step with MTF. */
>>>       if ( unlikely(v->arch.hvm_vcpu.single_step) )
>>>       {
>>>           v->arch.hvm_vmx.exec_control |=
>>> CPU_BASED_MONITOR_TRAP_FLAG; vmx_update_cpu_exec_control(v);
>>>           return;
>>>       }
>>>
>>> I don't see equivalent on amd?
>> I think HW performs TF bit manipulations that your patch is
>> suggesting (per 13.1.4 of APMv2)
> It only clears it, not set it. Patch on the way.


Does it need to be set? My understanding is that it is supposed to be 
clear in the handler (in the guest) but set on the exception's stack so 
when the guest does the IRET it loads TF=1.

-boris

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: AMD support of hvm_vcpu.single_step
  2014-06-11 22:55     ` Boris Ostrovsky
@ 2014-06-11 23:04       ` Mukesh Rathor
  2014-06-11 23:46         ` Boris Ostrovsky
  0 siblings, 1 reply; 7+ messages in thread
From: Mukesh Rathor @ 2014-06-11 23:04 UTC (permalink / raw)
  To: Boris Ostrovsky; +Cc: Xen-devel, Aravind.Gopalakrishnan, suravee.suthikulpanit

On Wed, 11 Jun 2014 18:55:53 -0400
Boris Ostrovsky <boris.ostrovsky@oracle.com> wrote:

> On 06/11/2014 06:32 PM, Mukesh Rathor wrote:
> > On Wed, 11 Jun 2014 11:56:15 -0400
> > Boris Ostrovsky <boris.ostrovsky@oracle.com> wrote:
> >
> >> On 06/10/2014 05:49 PM, Mukesh Rathor wrote:
> >>> Hi AMD folks,
> >>>
> >>> I am unable to see support of single step on amd platform. On
> >>> intel, hvm_vcpu.single_step will cause MTF to be set in
> >>> vmx_intr_assist:
> >>>
> >>>       /* Block event injection when single step with MTF. */
> >>>       if ( unlikely(v->arch.hvm_vcpu.single_step) )
> >>>       {
> >>>           v->arch.hvm_vmx.exec_control |=
> >>> CPU_BASED_MONITOR_TRAP_FLAG; vmx_update_cpu_exec_control(v);
> >>>           return;
> >>>       }
> >>>
> >>> I don't see equivalent on amd?
> >> I think HW performs TF bit manipulations that your patch is
> >> suggesting (per 13.1.4 of APMv2)
> > It only clears it, not set it. Patch on the way.
> 
> 
> Does it need to be set? My understanding is that it is supposed to be 
> clear in the handler (in the guest) but set on the exception's stack
> so when the guest does the IRET it loads TF=1.

If a debugger wants to single step, it needs to set the TF. So this
is for the debugger path. The hardware clears it upon execution of next
instruction, and generates #DB.

-Mukesh

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: AMD support of hvm_vcpu.single_step
  2014-06-11 23:04       ` Mukesh Rathor
@ 2014-06-11 23:46         ` Boris Ostrovsky
  2014-06-12  0:14           ` Mukesh Rathor
  0 siblings, 1 reply; 7+ messages in thread
From: Boris Ostrovsky @ 2014-06-11 23:46 UTC (permalink / raw)
  To: Mukesh Rathor; +Cc: Xen-devel, Aravind.Gopalakrishnan, suravee.suthikulpanit

On 06/11/2014 07:04 PM, Mukesh Rathor wrote:
> On Wed, 11 Jun 2014 18:55:53 -0400
> Boris Ostrovsky <boris.ostrovsky@oracle.com> wrote:
>
>> On 06/11/2014 06:32 PM, Mukesh Rathor wrote:
>>> On Wed, 11 Jun 2014 11:56:15 -0400
>>> Boris Ostrovsky <boris.ostrovsky@oracle.com> wrote:
>>>
>>>> On 06/10/2014 05:49 PM, Mukesh Rathor wrote:
>>>>> Hi AMD folks,
>>>>>
>>>>> I am unable to see support of single step on amd platform. On
>>>>> intel, hvm_vcpu.single_step will cause MTF to be set in
>>>>> vmx_intr_assist:
>>>>>
>>>>>        /* Block event injection when single step with MTF. */
>>>>>        if ( unlikely(v->arch.hvm_vcpu.single_step) )
>>>>>        {
>>>>>            v->arch.hvm_vmx.exec_control |=
>>>>> CPU_BASED_MONITOR_TRAP_FLAG; vmx_update_cpu_exec_control(v);
>>>>>            return;
>>>>>        }
>>>>>
>>>>> I don't see equivalent on amd?
>>>> I think HW performs TF bit manipulations that your patch is
>>>> suggesting (per 13.1.4 of APMv2)
>>> It only clears it, not set it. Patch on the way.
>>
>> Does it need to be set? My understanding is that it is supposed to be
>> clear in the handler (in the guest) but set on the exception's stack
>> so when the guest does the IRET it loads TF=1.
> If a debugger wants to single step, it needs to set the TF. So this
> is for the debugger path. The hardware clears it upon execution of next
> instruction, and generates #DB.

The patch seems to be setting TF when returning from #DB intercept, 
right? Won't this result in another #DB on the first instruction of 
guest's #DB handler?

-boris

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: AMD support of hvm_vcpu.single_step
  2014-06-11 23:46         ` Boris Ostrovsky
@ 2014-06-12  0:14           ` Mukesh Rathor
  0 siblings, 0 replies; 7+ messages in thread
From: Mukesh Rathor @ 2014-06-12  0:14 UTC (permalink / raw)
  To: Boris Ostrovsky; +Cc: Xen-devel, Aravind.Gopalakrishnan, suravee.suthikulpanit

On Wed, 11 Jun 2014 19:46:12 -0400
Boris Ostrovsky <boris.ostrovsky@oracle.com> wrote:

> On 06/11/2014 07:04 PM, Mukesh Rathor wrote:
> > On Wed, 11 Jun 2014 18:55:53 -0400
> > Boris Ostrovsky <boris.ostrovsky@oracle.com> wrote:
> >
> >> On 06/11/2014 06:32 PM, Mukesh Rathor wrote:
> >>> On Wed, 11 Jun 2014 11:56:15 -0400
> >>> Boris Ostrovsky <boris.ostrovsky@oracle.com> wrote:
> >>>
> >>>> On 06/10/2014 05:49 PM, Mukesh Rathor wrote:
> >>>>> Hi AMD folks,
> >>>>>
> >>>>> I am unable to see support of single step on amd platform. On
> >>>>> intel, hvm_vcpu.single_step will cause MTF to be set in
> >>>>> vmx_intr_assist:
> >>>>>
> >>>>>        /* Block event injection when single step with MTF. */
> >>>>>        if ( unlikely(v->arch.hvm_vcpu.single_step) )
> >>>>>        {
> >>>>>            v->arch.hvm_vmx.exec_control |=
> >>>>> CPU_BASED_MONITOR_TRAP_FLAG; vmx_update_cpu_exec_control(v);
> >>>>>            return;
> >>>>>        }
> >>>>>
> >>>>> I don't see equivalent on amd?
> >>>> I think HW performs TF bit manipulations that your patch is
> >>>> suggesting (per 13.1.4 of APMv2)
> >>> It only clears it, not set it. Patch on the way.
> >>
> >> Does it need to be set? My understanding is that it is supposed to
> >> be clear in the handler (in the guest) but set on the exception's
> >> stack so when the guest does the IRET it loads TF=1.
> > If a debugger wants to single step, it needs to set the TF. So this
> > is for the debugger path. The hardware clears it upon execution of
> > next instruction, and generates #DB.
> 
> The patch seems to be setting TF when returning from #DB intercept, 
> right? Won't this result in another #DB on the first instruction of 
> guest's #DB handler?

Nop, we are setting the TF in the resume path, returning from whatever
intercept it was. It could have been anything. If an external debugger set the
single_step flag during this time, then just like vmx, svm must honor that 
and do what it takes, in this case setting the TF (vmx sets MTF) when
it's resuming the guest. 

thanks,
Mukesh

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2014-06-12  0:14 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-06-10 21:49 AMD support of hvm_vcpu.single_step Mukesh Rathor
2014-06-11 15:56 ` Boris Ostrovsky
2014-06-11 22:32   ` Mukesh Rathor
2014-06-11 22:55     ` Boris Ostrovsky
2014-06-11 23:04       ` Mukesh Rathor
2014-06-11 23:46         ` Boris Ostrovsky
2014-06-12  0:14           ` Mukesh Rathor

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.