From: Christoph Egger <Christoph.Egger@amd.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Subject: nested virtualization: tracing capabilities
Date: Thu, 7 Apr 2011 16:26:02 +0200 [thread overview]
Message-ID: <4D9DC97A.10209@amd.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 404 bytes --]
Hi,
Attached patch allows xentrace to track what happens with l1 and l2 guests.
Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
--
---to satisfy European Law for business letters:
Advanced Micro Devices GmbH
Einsteinring 24, 85689 Dornach b. Muenchen
Geschaeftsfuehrer: Alberto Bozzo, Andrew Bowd
Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen
Registergericht Muenchen, HRB Nr. 43632
[-- Attachment #2: xen_nh_tracing.diff --]
[-- Type: text/plain, Size: 9936 bytes --]
# HG changeset patch
# User cegger
# Date 1302180533 -7200
Tracing facility for nested virtualization
Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
diff -r ee39668a7840 -r aef9e2deb9a7 tools/xentrace/formats
--- a/tools/xentrace/formats
+++ b/tools/xentrace/formats
@@ -5,6 +5,7 @@ 0x0001f002 CPU%(cpu)d %(tsc)d (+%(relt
0x0001f003 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) cpu_change 0x%(1)08x
0x0001f004 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) trace_irq [ vector = %(1)d, count = %(2)d, tot_cycles = 0x%(3)08x, max_cycles = 0x%(4)08x ]
+0x00021002 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) continue_running [ dom:vcpu = 0x%(1)08x ]
0x00021011 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) running_to_runnable [ dom:vcpu = 0x%(1)08x ]
0x00021021 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) running_to_blocked [ dom:vcpu = 0x%(1)08x ]
0x00021031 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) running_to_offline [ dom:vcpu = 0x%(1)08x ]
@@ -34,7 +35,10 @@ 0x0002800d CPU%(cpu)d %(tsc)d (+%(relt
0x0002800e CPU%(cpu)d %(tsc)d (+%(reltsc)8d) switch_infprev [ old_domid = 0x%(1)08x, runtime = %(2)d ]
0x0002800f CPU%(cpu)d %(tsc)d (+%(reltsc)8d) switch_infnext [ new_domid = 0x%(1)08x, time = %(2)d, r_time = %(3)d ]
-0x00081001 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) VMENTRY
+0x00081401 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) nVMENTRY [ rIP = 0x%(1)08x ]
+0x00081402 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) nVMEXIT [ exitcode = 0x%(1)08x, rIP = 0x%(2)08x, intercepted = 0x%(5)01x ]
+0x00081502 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) nVMEXIT [ exitcode = 0x%(1)08x, rIP = 0x%(3)08x%(2)08x, intercepted = 0x%(6)01x ]
+0x00081001 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) VMENTRY [ rIP = 0x%(1)08x ]
0x00081002 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) VMEXIT [ exitcode = 0x%(1)08x, rIP = 0x%(2)08x ]
0x00081102 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) VMEXIT [ exitcode = 0x%(1)08x, rIP = 0x%(3)08x%(2)08x ]
0x00082001 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) PF_XEN [ errorcode = 0x%(2)02x, virt = 0x%(1)08x ]
@@ -63,15 +67,19 @@ 0x00082013 CPU%(cpu)d %(tsc)d (+%(relt
0x00082014 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) INVLPG [ is invlpga? = %(1)d, virt = 0x%(2)08x ]
0x00082114 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) INVLPG [ is invlpga? = %(1)d, virt = 0x%(3)08x%(2)08x ]
0x00082015 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) MCE
-0x00082016 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) IOPORT_READ [ data = 0x%(1)04x ]
-0x00082216 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) IOPORT_WRITE [ data = 0x%(1)04x ]
-0x00082017 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) MMIO_READ [ data = 0x%(1)04x ]
-0x00082217 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) MMIO_WRITE [ data = 0x%(1)04x ]
+0x00082016 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) IOPORT_READ [ data = 0x%(1)04x, value = 0x%(2)08x ]
+0x00082216 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) IOPORT_WRITE [ data = 0x%(1)04x, value = 0x%(2)08x ]
+0x00082017 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) MMIO_READ [ data = 0x%(1)04x, ip = 0x%(3)08x ]
+0x00082217 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) MMIO_WRITE [ data = 0x%(1)04x, ip = 0x%(3)08x, value = 0x%(2)08x ]
0x00082018 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) CLTS
0x00082019 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) LMSW [ value = 0x%(1)08x ]
0x00082119 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) LMSW [ value = 0x%(2)08x%(1)08x ]
+0x0008201a CPU%(cpu)d %(tsc)d (+%(reltsc)8d) RDTSC [ value = 0x%(2)08x%(1)08x ]
0x00082020 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) INTR_WINDOW [ value = 0x%(1)08x ]
0x00082021 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) NPF [ gpa = 0x%(2)08x%(1)08x mfn = 0x%(4)08x%(3)08x qual = 0x%(5)04x p2mt = 0x%(6)04x ]
+0x00082022 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) VINTR
+0x00082023 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) INVD
+0x00082024 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) WBINVD
0x0010f001 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) page_grant_map [ domid = %(1)d ]
0x0010f002 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) page_grant_unmap [ domid = %(1)d ]
diff -r ee39668a7840 -r aef9e2deb9a7 xen/arch/x86/hvm/emulate.c
--- a/xen/arch/x86/hvm/emulate.c
+++ b/xen/arch/x86/hvm/emulate.c
@@ -45,6 +45,9 @@ static void hvmtrace_io_assist(int is_mm
size += 4;
}
+ *(uint32_t *)&buffer[size] = guest_cpu_user_regs()->eip;
+ size += 4;
+
trace_var(event, 0/*!cycles*/, size, buffer);
}
@@ -153,8 +156,6 @@ static int hvmemul_do_io(
p->df = df;
p->data = value;
- hvmtrace_io_assist(is_mmio, p);
-
if ( is_mmio )
{
rc = hvm_mmio_intercept(p);
@@ -166,6 +167,8 @@ static int hvmemul_do_io(
rc = hvm_portio_intercept(p);
}
+ hvmtrace_io_assist(is_mmio, p);
+
switch ( rc )
{
case X86EMUL_OKAY:
diff -r ee39668a7840 -r aef9e2deb9a7 xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -1108,20 +1108,24 @@ void hvm_hlt(unsigned long rflags)
{
struct vcpu *curr = current;
- if ( hvm_event_pending(curr) )
+ if ( hvm_event_pending(curr) ) {
+ HVMTRACE_2D(HLT, /* pending */ 1, /* shutdown */ 0);
return;
+ }
/*
* If we halt with interrupts disabled, that's a pretty sure sign that we
* want to shut down. In a real processor, NMIs are the only way to break
* out of this.
*/
- if ( unlikely(!(rflags & X86_EFLAGS_IF)) )
+ if ( unlikely(!(rflags & X86_EFLAGS_IF)) ) {
+ HVMTRACE_2D(HLT, /* pending */ 0, /* shutdown */ 1);
return hvm_vcpu_down(curr);
+ }
do_sched_op_compat(SCHEDOP_block, 0);
- HVMTRACE_1D(HLT, /* pending = */ vcpu_runnable(curr));
+ HVMTRACE_2D(HLT, /* pending = */ vcpu_runnable(curr), /* shutdown */ 0);
}
void hvm_triple_fault(void)
diff -r ee39668a7840 -r aef9e2deb9a7 xen/arch/x86/hvm/svm/svm.c
--- a/xen/arch/x86/hvm/svm/svm.c
+++ b/xen/arch/x86/hvm/svm/svm.c
@@ -1679,6 +1679,25 @@ asmlinkage void svm_vmexit_handler(struc
exit_reason = vmcb->exitcode;
+ if ( tb_init_done ) {
+ bool_t intercepted = 0;
+ if (vcpu_guestmode)
+ intercepted = nsvm_vmcb_guest_intercepts_exitcode(v, regs,
+ exit_reason);
+
+ if ( hvm_long_mode_enabled(v) ) {
+ HVMTRACE_ND(VMEXIT64 | (TRC_HVM_NESTEDFLAG * vcpu_guestmode),
+ 1/*cycles*/, 6, exit_reason,
+ (uint32_t)regs->eip, (uint32_t)((uint64_t)regs->eip >> 32),
+ intercepted, 0, 0);
+ } else {
+ HVMTRACE_ND(VMEXIT | (TRC_HVM_NESTEDFLAG * vcpu_guestmode),
+ 1/*cycles*/, 5, exit_reason,
+ (uint32_t)regs->eip,
+ intercepted, 0, 0, 0);
+ }
+ }
+
if ( vcpu_guestmode ) {
enum nestedhvm_vmexits nsret;
struct nestedvcpu *nv = &vcpu_nestedhvm(v);
@@ -1739,15 +1758,6 @@ asmlinkage void svm_vmexit_handler(struc
}
}
- if ( hvm_long_mode_enabled(v) )
- HVMTRACE_ND(VMEXIT64, 1/*cycles*/, 3, exit_reason,
- (uint32_t)regs->eip, (uint32_t)((uint64_t)regs->eip >> 32),
- 0, 0, 0);
- else
- HVMTRACE_ND(VMEXIT, 1/*cycles*/, 2, exit_reason,
- (uint32_t)regs->eip,
- 0, 0, 0, 0);
-
if ( unlikely(exit_reason == VMEXIT_INVALID) )
{
svm_vmcb_dump(__func__, vmcb);
@@ -1841,7 +1851,10 @@ asmlinkage void svm_vmexit_handler(struc
break;
case VMEXIT_VINTR: {
- u32 general1_intercepts = vmcb_get_general1_intercepts(vmcb);
+ uint32_t general1_intercepts;
+
+ HVMTRACE_0D(VINTR);
+ general1_intercepts = vmcb_get_general1_intercepts(vmcb);
intr = vmcb_get_vintr(vmcb);
intr.fields.irq = 0;
@@ -1853,7 +1866,12 @@ asmlinkage void svm_vmexit_handler(struc
}
case VMEXIT_INVD:
+ HVMTRACE_0D(INVD);
+ svm_vmexit_do_invalidate_cache(regs);
+ break;
+
case VMEXIT_WBINVD:
+ HVMTRACE_0D(WBINVD);
svm_vmexit_do_invalidate_cache(regs);
break;
@@ -2027,7 +2045,10 @@ asmlinkage void svm_vmexit_handler(struc
asmlinkage void svm_trace_vmentry(void)
{
- HVMTRACE_ND (VMENTRY, 1/*cycles*/, 0, 0, 0, 0, 0, 0, 0);
+ struct vcpu *v = current;
+ HVMTRACE_ND(VMENTRY | (TRC_HVM_NESTEDFLAG * !!(nestedhvm_vcpu_in_guestmode(v))),
+ 1/*cycles*/, 1, v->arch.hvm_svm.vmcb->rip,
+ 0, 0, 0, 0, 0);
}
/*
diff -r ee39668a7840 -r aef9e2deb9a7 xen/include/asm-x86/hvm/trace.h
--- a/xen/include/asm-x86/hvm/trace.h
+++ b/xen/include/asm-x86/hvm/trace.h
@@ -50,7 +50,9 @@
#define DO_TRC_HVM_CLTS DEFAULT_HVM_MISC
#define DO_TRC_HVM_LMSW DEFAULT_HVM_MISC
#define DO_TRC_HVM_LMSW64 DEFAULT_HVM_MISC
-
+#define DO_TRC_HVM_VINTR DEFAULT_HVM_MISC
+#define DO_TRC_HVM_INVD DEFAULT_HVM_MISC
+#define DO_TRC_HVM_WBINVD DEFAULT_HVM_MISC
#ifdef __x86_64__
#define TRC_PAR_LONG(par) ((par)&0xFFFFFFFF),((par)>>32)
diff -r ee39668a7840 -r aef9e2deb9a7 xen/include/public/trace.h
--- a/xen/include/public/trace.h
+++ b/xen/include/public/trace.h
@@ -123,6 +123,7 @@
#define TRC_SHADOW_RESYNC_ONLY (TRC_SHADOW + 15)
/* trace events per subclass */
+#define TRC_HVM_NESTEDFLAG (0x400)
#define TRC_HVM_VMENTRY (TRC_HVM_ENTRYEXIT + 0x01)
#define TRC_HVM_VMEXIT (TRC_HVM_ENTRYEXIT + 0x02)
#define TRC_HVM_VMEXIT64 (TRC_HVM_ENTRYEXIT + TRC_64_FLAG + 0x02)
@@ -160,6 +161,9 @@
#define TRC_HVM_RDTSC (TRC_HVM_HANDLER + 0x1a)
#define TRC_HVM_INTR_WINDOW (TRC_HVM_HANDLER + 0x20)
#define TRC_HVM_NPF (TRC_HVM_HANDLER + 0x21)
+#define TRC_HVM_VINTR (TRC_HVM_HANDLER + 0x22)
+#define TRC_HVM_INVD (TRC_HVM_HANDLER + 0x23)
+#define TRC_HVM_WBINVD (TRC_HVM_HANDLER + 0x24)
#define TRC_HVM_IOPORT_WRITE (TRC_HVM_HANDLER + 0x216)
#define TRC_HVM_IOMEM_WRITE (TRC_HVM_HANDLER + 0x217)
[-- Attachment #3: Type: text/plain, Size: 138 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
next reply other threads:[~2011-04-07 14:26 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-04-07 14:26 Christoph Egger [this message]
2011-04-07 14:49 ` nested virtualization: tracing capabilities Tim Deegan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4D9DC97A.10209@amd.com \
--to=christoph.egger@amd.com \
--cc=xen-devel@lists.xensource.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.