diff options
author | Feng (Eric) Liu <eric.e.liu@intel.com> | 2008-04-10 15:31:10 -0400 |
---|---|---|
committer | Avi Kivity <avi@qumranet.com> | 2008-04-27 05:01:19 -0400 |
commit | 2714d1d3d6be882b97cd0125140fccf9976a460a (patch) | |
tree | 57b654cafff076ae95b62b7763113b1ef8511eb5 /arch/x86/kvm/x86.c | |
parent | 53371b5098543ab09dcb0c7ce31da887dbe58c62 (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.c | 26 |
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); | |||
303 | void kvm_lmsw(struct kvm_vcpu *vcpu, unsigned long msw) | 303 | void 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 | } |
307 | EXPORT_SYMBOL_GPL(kvm_lmsw); | 310 | EXPORT_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) | |||
2414 | int kvm_emulate_halt(struct kvm_vcpu *vcpu) | 2431 | int 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 | } |
2643 | EXPORT_SYMBOL_GPL(kvm_emulate_cpuid); | 2668 | EXPORT_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; |