aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm/x86.c
diff options
context:
space:
mode:
authorFeng (Eric) Liu <eric.e.liu@intel.com>2008-04-10 15:31:10 -0400
committerAvi Kivity <avi@qumranet.com>2008-04-27 05:01:19 -0400
commit2714d1d3d6be882b97cd0125140fccf9976a460a (patch)
tree57b654cafff076ae95b62b7763113b1ef8511eb5 /arch/x86/kvm/x86.c
parent53371b5098543ab09dcb0c7ce31da887dbe58c62 (diff)
KVM: Add trace markers
Trace markers allow userspace to trace execution of a virtual machine in order to monitor its performance. Signed-off-by: Feng (Eric) Liu <eric.e.liu@intel.com> Signed-off-by: Avi Kivity <avi@qumranet.com>
Diffstat (limited to 'arch/x86/kvm/x86.c')
-rw-r--r--arch/x86/kvm/x86.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index c7ad2352227a..f070f0a9adee 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -303,6 +303,9 @@ EXPORT_SYMBOL_GPL(kvm_set_cr0);
303void kvm_lmsw(struct kvm_vcpu *vcpu, unsigned long msw) 303void kvm_lmsw(struct kvm_vcpu *vcpu, unsigned long msw)
304{ 304{
305 kvm_set_cr0(vcpu, (vcpu->arch.cr0 & ~0x0ful) | (msw & 0x0f)); 305 kvm_set_cr0(vcpu, (vcpu->arch.cr0 & ~0x0ful) | (msw & 0x0f));
306 KVMTRACE_1D(LMSW, vcpu,
307 (u32)((vcpu->arch.cr0 & ~0x0ful) | (msw & 0x0f)),
308 handler);
306} 309}
307EXPORT_SYMBOL_GPL(kvm_lmsw); 310EXPORT_SYMBOL_GPL(kvm_lmsw);
308 311
@@ -2269,6 +2272,13 @@ int kvm_emulate_pio(struct kvm_vcpu *vcpu, struct kvm_run *run, int in,
2269 vcpu->arch.pio.guest_page_offset = 0; 2272 vcpu->arch.pio.guest_page_offset = 0;
2270 vcpu->arch.pio.rep = 0; 2273 vcpu->arch.pio.rep = 0;
2271 2274
2275 if (vcpu->run->io.direction == KVM_EXIT_IO_IN)
2276 KVMTRACE_2D(IO_READ, vcpu, vcpu->run->io.port, (u32)size,
2277 handler);
2278 else
2279 KVMTRACE_2D(IO_WRITE, vcpu, vcpu->run->io.port, (u32)size,
2280 handler);
2281
2272 kvm_x86_ops->cache_regs(vcpu); 2282 kvm_x86_ops->cache_regs(vcpu);
2273 memcpy(vcpu->arch.pio_data, &vcpu->arch.regs[VCPU_REGS_RAX], 4); 2283 memcpy(vcpu->arch.pio_data, &vcpu->arch.regs[VCPU_REGS_RAX], 4);
2274 kvm_x86_ops->decache_regs(vcpu); 2284 kvm_x86_ops->decache_regs(vcpu);
@@ -2307,6 +2317,13 @@ int kvm_emulate_pio_string(struct kvm_vcpu *vcpu, struct kvm_run *run, int in,
2307 vcpu->arch.pio.guest_page_offset = offset_in_page(address); 2317 vcpu->arch.pio.guest_page_offset = offset_in_page(address);
2308 vcpu->arch.pio.rep = rep; 2318 vcpu->arch.pio.rep = rep;
2309 2319
2320 if (vcpu->run->io.direction == KVM_EXIT_IO_IN)
2321 KVMTRACE_2D(IO_READ, vcpu, vcpu->run->io.port, (u32)size,
2322 handler);
2323 else
2324 KVMTRACE_2D(IO_WRITE, vcpu, vcpu->run->io.port, (u32)size,
2325 handler);
2326
2310 if (!count) { 2327 if (!count) {
2311 kvm_x86_ops->skip_emulated_instruction(vcpu); 2328 kvm_x86_ops->skip_emulated_instruction(vcpu);
2312 return 1; 2329 return 1;
@@ -2414,6 +2431,7 @@ void kvm_arch_exit(void)
2414int kvm_emulate_halt(struct kvm_vcpu *vcpu) 2431int kvm_emulate_halt(struct kvm_vcpu *vcpu)
2415{ 2432{
2416 ++vcpu->stat.halt_exits; 2433 ++vcpu->stat.halt_exits;
2434 KVMTRACE_0D(HLT, vcpu, handler);
2417 if (irqchip_in_kernel(vcpu->kvm)) { 2435 if (irqchip_in_kernel(vcpu->kvm)) {
2418 vcpu->arch.mp_state = VCPU_MP_STATE_HALTED; 2436 vcpu->arch.mp_state = VCPU_MP_STATE_HALTED;
2419 up_read(&vcpu->kvm->slots_lock); 2437 up_read(&vcpu->kvm->slots_lock);
@@ -2451,6 +2469,8 @@ int kvm_emulate_hypercall(struct kvm_vcpu *vcpu)
2451 a2 = vcpu->arch.regs[VCPU_REGS_RDX]; 2469 a2 = vcpu->arch.regs[VCPU_REGS_RDX];
2452 a3 = vcpu->arch.regs[VCPU_REGS_RSI]; 2470 a3 = vcpu->arch.regs[VCPU_REGS_RSI];
2453 2471
2472 KVMTRACE_1D(VMMCALL, vcpu, (u32)nr, handler);
2473
2454 if (!is_long_mode(vcpu)) { 2474 if (!is_long_mode(vcpu)) {
2455 nr &= 0xFFFFFFFF; 2475 nr &= 0xFFFFFFFF;
2456 a0 &= 0xFFFFFFFF; 2476 a0 &= 0xFFFFFFFF;
@@ -2639,6 +2659,11 @@ void kvm_emulate_cpuid(struct kvm_vcpu *vcpu)
2639 } 2659 }
2640 kvm_x86_ops->decache_regs(vcpu); 2660 kvm_x86_ops->decache_regs(vcpu);
2641 kvm_x86_ops->skip_emulated_instruction(vcpu); 2661 kvm_x86_ops->skip_emulated_instruction(vcpu);
2662 KVMTRACE_5D(CPUID, vcpu, function,
2663 (u32)vcpu->arch.regs[VCPU_REGS_RAX],
2664 (u32)vcpu->arch.regs[VCPU_REGS_RBX],
2665 (u32)vcpu->arch.regs[VCPU_REGS_RCX],
2666 (u32)vcpu->arch.regs[VCPU_REGS_RDX], handler);
2642} 2667}
2643EXPORT_SYMBOL_GPL(kvm_emulate_cpuid); 2668EXPORT_SYMBOL_GPL(kvm_emulate_cpuid);
2644 2669
@@ -2794,6 +2819,7 @@ again:
2794 if (test_and_clear_bit(KVM_REQ_TLB_FLUSH, &vcpu->requests)) 2819 if (test_and_clear_bit(KVM_REQ_TLB_FLUSH, &vcpu->requests))
2795 kvm_x86_ops->tlb_flush(vcpu); 2820 kvm_x86_ops->tlb_flush(vcpu);
2796 2821
2822 KVMTRACE_0D(VMENTRY, vcpu, entryexit);
2797 kvm_x86_ops->run(vcpu, kvm_run); 2823 kvm_x86_ops->run(vcpu, kvm_run);
2798 2824
2799 vcpu->guest_mode = 0; 2825 vcpu->guest_mode = 0;