diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2008-12-16 11:49:20 +0000 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2008-12-16 11:49:20 +0000 |
commit | 74d59a59e2db922adb45a427df3d77b8ff0f7aea (patch) | |
tree | a0d2e657a8ef20aaa680ea9df187b17511639d18 /tools | |
parent | 53e5cd08efbc58937be16027b35414a3353bfc51 (diff) | |
download | xen-74d59a59e2db922adb45a427df3d77b8ff0f7aea.tar.gz xen-74d59a59e2db922adb45a427df3d77b8ff0f7aea.tar.bz2 xen-74d59a59e2db922adb45a427df3d77b8ff0f7aea.zip |
x86: Enable MTF for HVM guest single step in gdb
Signed-off-by: Edwin Zhai <edwin.zhai@intel.com>
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/libxc/xc_domain.c | 14 | ||||
-rw-r--r-- | tools/libxc/xc_ptrace.c | 41 | ||||
-rw-r--r-- | tools/libxc/xenctrl.h | 6 |
3 files changed, 49 insertions, 12 deletions
diff --git a/tools/libxc/xc_domain.c b/tools/libxc/xc_domain.c index e1bf86ee6a..afffd68d1a 100644 --- a/tools/libxc/xc_domain.c +++ b/tools/libxc/xc_domain.c @@ -1061,6 +1061,20 @@ int xc_domain_suppress_spurious_page_faults(int xc, uint32_t domid) } +int xc_domain_debug_control(int xc, uint32_t domid, uint32_t sop, uint32_t vcpu) +{ + DECLARE_DOMCTL; + + memset(&domctl, 0, sizeof(domctl)); + domctl.domain = (domid_t)domid; + domctl.cmd = XEN_DOMCTL_debug_op; + domctl.u.debug_op.op = sop; + domctl.u.debug_op.vcpu = vcpu; + + return do_domctl(xc, &domctl); +} + + /* * Local variables: * mode: C diff --git a/tools/libxc/xc_ptrace.c b/tools/libxc/xc_ptrace.c index fa6c3a0ad1..094bf165df 100644 --- a/tools/libxc/xc_ptrace.c +++ b/tools/libxc/xc_ptrace.c @@ -524,10 +524,20 @@ xc_ptrace( /* XXX we can still have problems if the user switches threads * during single-stepping - but that just seems retarded */ - ctxt[cpu].c.user_regs.eflags |= PSL_T; - if ((retval = xc_vcpu_setcontext(xc_handle, current_domid, cpu, - &ctxt[cpu]))) - goto out_error_domctl; + /* Try to enalbe Monitor Trap Flag for HVM, and fall back to TF + * if no MTF support + */ + if ( !current_is_hvm || + xc_domain_debug_control(xc_handle, + current_domid, + XEN_DOMCTL_DEBUG_OP_SINGLE_STEP_ON, + cpu) ) + { + ctxt[cpu].c.user_regs.eflags |= PSL_T; + if ((retval = xc_vcpu_setcontext(xc_handle, current_domid, cpu, + &ctxt[cpu]))) + goto out_error_domctl; + } /* FALLTHROUGH */ case PTRACE_CONT: @@ -538,15 +548,22 @@ xc_ptrace( { FOREACH_CPU(cpumap, index) { cpu = index - 1; - if (fetch_regs(xc_handle, cpu, NULL)) - goto out_error; - /* Clear trace flag */ - if ( ctxt[cpu].c.user_regs.eflags & PSL_T ) + if ( !current_is_hvm || + xc_domain_debug_control(xc_handle, + current_domid, + XEN_DOMCTL_DEBUG_OP_SINGLE_STEP_OFF, + cpu) ) { - ctxt[cpu].c.user_regs.eflags &= ~PSL_T; - if ((retval = xc_vcpu_setcontext(xc_handle, current_domid, - cpu, &ctxt[cpu]))) - goto out_error_domctl; + if (fetch_regs(xc_handle, cpu, NULL)) + goto out_error; + /* Clear trace flag */ + if ( ctxt[cpu].c.user_regs.eflags & PSL_T ) + { + ctxt[cpu].c.user_regs.eflags &= ~PSL_T; + if ((retval = xc_vcpu_setcontext(xc_handle, current_domid, + cpu, &ctxt[cpu]))) + goto out_error_domctl; + } } } } diff --git a/tools/libxc/xenctrl.h b/tools/libxc/xenctrl.h index 18d2f5f4d1..b915ccaff2 100644 --- a/tools/libxc/xenctrl.h +++ b/tools/libxc/xenctrl.h @@ -1111,6 +1111,12 @@ int xc_domain_set_target(int xc_handle, uint32_t domid, uint32_t target); +/* Control the domain for debug */ +int xc_domain_debug_control(int xc_handle, + uint32_t domid, + uint32_t sop, + uint32_t vcpu); + #if defined(__i386__) || defined(__x86_64__) int xc_cpuid_check(int xc, const unsigned int *input, |