diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2009-02-05 12:17:24 +0000 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2009-02-05 12:17:24 +0000 |
commit | c8ff96bd9f266646e10eac1787a3f516ed24731b (patch) | |
tree | 3169d66cd148f5983aafa205592a26801178e2c7 /tools/xentrace/xenctx.c | |
parent | 2c3072a583d7d57ba0372f3b89f4f20a59693c83 (diff) | |
download | xen-c8ff96bd9f266646e10eac1787a3f516ed24731b.tar.gz xen-c8ff96bd9f266646e10eac1787a3f516ed24731b.tar.bz2 xen-c8ff96bd9f266646e10eac1787a3f516ed24731b.zip |
xenctx support for 64-bit HVM guests
Now that we can easily find EFER.LMA, xenctx can detect 64-bit HVM
VCPUs
Signed-off-by: Tim Deegan <Tim.Deegan@citrix.com>
Diffstat (limited to 'tools/xentrace/xenctx.c')
-rw-r--r-- | tools/xentrace/xenctx.c | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/tools/xentrace/xenctx.c b/tools/xentrace/xenctx.c index ec01427413..00410ef61c 100644 --- a/tools/xentrace/xenctx.c +++ b/tools/xentrace/xenctx.c @@ -26,6 +26,7 @@ #include "xenctrl.h" #include <xen/foreign/x86_32.h> #include <xen/foreign/x86_64.h> +#include <xen/hvm/save.h> int xc_handle = 0; int domid = 0; @@ -788,23 +789,29 @@ static void dump_ctx(int vcpu) #if defined(__i386__) || defined(__x86_64__) { - struct xen_domctl domctl; - memset(&domctl, 0, sizeof domctl); - domctl.domain = domid; - domctl.cmd = XEN_DOMCTL_get_address_size; - if (xc_domctl(xc_handle, &domctl) == 0) - ctxt_word_size = guest_word_size = domctl.u.address_size.size / 8; if (dominfo.hvm) { + struct hvm_hw_cpu cpuctx; xen_capabilities_info_t xen_caps = ""; + if (xc_domain_hvm_getcontext_partial( + xc_handle, domid, HVM_SAVE_CODE(CPU), + vcpu, &cpuctx, sizeof cpuctx) != 0) { + perror("xc_domain_hvm_getcontext_partial"); + exit(-1); + } + guest_word_size = (cpuctx.msr_efer & 0x400) ? 8 : 4; + /* HVM guest context records are always host-sized */ if (xc_version(xc_handle, XENVER_capabilities, &xen_caps) != 0) { perror("xc_version"); exit(-1); } - /* HVM guest context records are always host-sized */ ctxt_word_size = (strstr(xen_caps, "xen-3.0-x86_64")) ? 8 : 4; - /* XXX For now we can't tell whether a HVM guest is in long - * XXX mode; eventually fix this here and in xc_pagetab.c */ - guest_word_size = 4; + } else { + struct xen_domctl domctl; + memset(&domctl, 0, sizeof domctl); + domctl.domain = domid; + domctl.cmd = XEN_DOMCTL_get_address_size; + if (xc_domctl(xc_handle, &domctl) == 0) + ctxt_word_size = guest_word_size = domctl.u.address_size.size / 8; } } #endif |