diff options
author | Suresh E. Warrier <warrier@linux.vnet.ibm.com> | 2014-12-03 19:48:10 -0500 |
---|---|---|
committer | Alexander Graf <agraf@suse.de> | 2014-12-17 07:29:27 -0500 |
commit | 3c78f78af95615b017be751e763e623b6252d166 (patch) | |
tree | 271ab7ed516ce2dd81408379c35f0160dc0645e2 | |
parent | 2711e248a352d7ecc8767b1dfa1f0c2356cb7f4b (diff) |
KVM: PPC: Book3S HV: Tracepoints for KVM HV guest interactions
This patch adds trace points in the guest entry and exit code and also
for exceptions handled by the host in kernel mode - hypercalls and page
faults. The new events are added to /sys/kernel/debug/tracing/events
under a new subsystem called kvm_hv.
Acked-by: Paul Mackerras <paulus@samba.org>
Signed-off-by: Suresh Warrier <warrier@linux.vnet.ibm.com>
Signed-off-by: Alexander Graf <agraf@suse.de>
-rw-r--r-- | arch/powerpc/kvm/book3s_64_mmu_hv.c | 13 | ||||
-rw-r--r-- | arch/powerpc/kvm/book3s_hv.c | 19 | ||||
-rw-r--r-- | arch/powerpc/kvm/trace_book3s.h | 32 | ||||
-rw-r--r-- | arch/powerpc/kvm/trace_hv.h | 477 | ||||
-rw-r--r-- | arch/powerpc/kvm/trace_pr.h | 25 |
5 files changed, 539 insertions, 27 deletions
diff --git a/arch/powerpc/kvm/book3s_64_mmu_hv.c b/arch/powerpc/kvm/book3s_64_mmu_hv.c index 59425f143c6d..311e4a38dd8b 100644 --- a/arch/powerpc/kvm/book3s_64_mmu_hv.c +++ b/arch/powerpc/kvm/book3s_64_mmu_hv.c | |||
@@ -37,6 +37,8 @@ | |||
37 | #include <asm/ppc-opcode.h> | 37 | #include <asm/ppc-opcode.h> |
38 | #include <asm/cputable.h> | 38 | #include <asm/cputable.h> |
39 | 39 | ||
40 | #include "trace_hv.h" | ||
41 | |||
40 | /* POWER7 has 10-bit LPIDs, PPC970 has 6-bit LPIDs */ | 42 | /* POWER7 has 10-bit LPIDs, PPC970 has 6-bit LPIDs */ |
41 | #define MAX_LPID_970 63 | 43 | #define MAX_LPID_970 63 |
42 | 44 | ||
@@ -622,6 +624,8 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu, | |||
622 | gfn = gpa >> PAGE_SHIFT; | 624 | gfn = gpa >> PAGE_SHIFT; |
623 | memslot = gfn_to_memslot(kvm, gfn); | 625 | memslot = gfn_to_memslot(kvm, gfn); |
624 | 626 | ||
627 | trace_kvm_page_fault_enter(vcpu, hpte, memslot, ea, dsisr); | ||
628 | |||
625 | /* No memslot means it's an emulated MMIO region */ | 629 | /* No memslot means it's an emulated MMIO region */ |
626 | if (!memslot || (memslot->flags & KVM_MEMSLOT_INVALID)) | 630 | if (!memslot || (memslot->flags & KVM_MEMSLOT_INVALID)) |
627 | return kvmppc_hv_emulate_mmio(run, vcpu, gpa, ea, | 631 | return kvmppc_hv_emulate_mmio(run, vcpu, gpa, ea, |
@@ -641,6 +645,7 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu, | |||
641 | mmu_seq = kvm->mmu_notifier_seq; | 645 | mmu_seq = kvm->mmu_notifier_seq; |
642 | smp_rmb(); | 646 | smp_rmb(); |
643 | 647 | ||
648 | ret = -EFAULT; | ||
644 | is_io = 0; | 649 | is_io = 0; |
645 | pfn = 0; | 650 | pfn = 0; |
646 | page = NULL; | 651 | page = NULL; |
@@ -664,7 +669,7 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu, | |||
664 | } | 669 | } |
665 | up_read(¤t->mm->mmap_sem); | 670 | up_read(¤t->mm->mmap_sem); |
666 | if (!pfn) | 671 | if (!pfn) |
667 | return -EFAULT; | 672 | goto out_put; |
668 | } else { | 673 | } else { |
669 | page = pages[0]; | 674 | page = pages[0]; |
670 | pfn = page_to_pfn(page); | 675 | pfn = page_to_pfn(page); |
@@ -694,14 +699,14 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu, | |||
694 | } | 699 | } |
695 | } | 700 | } |
696 | 701 | ||
697 | ret = -EFAULT; | ||
698 | if (psize > pte_size) | 702 | if (psize > pte_size) |
699 | goto out_put; | 703 | goto out_put; |
700 | 704 | ||
701 | /* Check WIMG vs. the actual page we're accessing */ | 705 | /* Check WIMG vs. the actual page we're accessing */ |
702 | if (!hpte_cache_flags_ok(r, is_io)) { | 706 | if (!hpte_cache_flags_ok(r, is_io)) { |
703 | if (is_io) | 707 | if (is_io) |
704 | return -EFAULT; | 708 | goto out_put; |
709 | |||
705 | /* | 710 | /* |
706 | * Allow guest to map emulated device memory as | 711 | * Allow guest to map emulated device memory as |
707 | * uncacheable, but actually make it cacheable. | 712 | * uncacheable, but actually make it cacheable. |
@@ -765,6 +770,8 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu, | |||
765 | SetPageDirty(page); | 770 | SetPageDirty(page); |
766 | 771 | ||
767 | out_put: | 772 | out_put: |
773 | trace_kvm_page_fault_exit(vcpu, hpte, ret); | ||
774 | |||
768 | if (page) { | 775 | if (page) { |
769 | /* | 776 | /* |
770 | * We drop pages[0] here, not page because page might | 777 | * We drop pages[0] here, not page because page might |
diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c index 74afa2d06fbc..325ed9443e43 100644 --- a/arch/powerpc/kvm/book3s_hv.c +++ b/arch/powerpc/kvm/book3s_hv.c | |||
@@ -58,6 +58,9 @@ | |||
58 | 58 | ||
59 | #include "book3s.h" | 59 | #include "book3s.h" |
60 | 60 | ||
61 | #define CREATE_TRACE_POINTS | ||
62 | #include "trace_hv.h" | ||
63 | |||
61 | /* #define EXIT_DEBUG */ | 64 | /* #define EXIT_DEBUG */ |
62 | /* #define EXIT_DEBUG_SIMPLE */ | 65 | /* #define EXIT_DEBUG_SIMPLE */ |
63 | /* #define EXIT_DEBUG_INT */ | 66 | /* #define EXIT_DEBUG_INT */ |
@@ -1730,6 +1733,7 @@ static void kvmppc_run_core(struct kvmppc_vcore *vc) | |||
1730 | list_for_each_entry(vcpu, &vc->runnable_threads, arch.run_list) { | 1733 | list_for_each_entry(vcpu, &vc->runnable_threads, arch.run_list) { |
1731 | kvmppc_start_thread(vcpu); | 1734 | kvmppc_start_thread(vcpu); |
1732 | kvmppc_create_dtl_entry(vcpu, vc); | 1735 | kvmppc_create_dtl_entry(vcpu, vc); |
1736 | trace_kvm_guest_enter(vcpu); | ||
1733 | } | 1737 | } |
1734 | 1738 | ||
1735 | /* Set this explicitly in case thread 0 doesn't have a vcpu */ | 1739 | /* Set this explicitly in case thread 0 doesn't have a vcpu */ |
@@ -1738,6 +1742,9 @@ static void kvmppc_run_core(struct kvmppc_vcore *vc) | |||
1738 | 1742 | ||
1739 | vc->vcore_state = VCORE_RUNNING; | 1743 | vc->vcore_state = VCORE_RUNNING; |
1740 | preempt_disable(); | 1744 | preempt_disable(); |
1745 | |||
1746 | trace_kvmppc_run_core(vc, 0); | ||
1747 | |||
1741 | spin_unlock(&vc->lock); | 1748 | spin_unlock(&vc->lock); |
1742 | 1749 | ||
1743 | kvm_guest_enter(); | 1750 | kvm_guest_enter(); |
@@ -1783,6 +1790,8 @@ static void kvmppc_run_core(struct kvmppc_vcore *vc) | |||
1783 | kvmppc_core_pending_dec(vcpu)) | 1790 | kvmppc_core_pending_dec(vcpu)) |
1784 | kvmppc_core_dequeue_dec(vcpu); | 1791 | kvmppc_core_dequeue_dec(vcpu); |
1785 | 1792 | ||
1793 | trace_kvm_guest_exit(vcpu); | ||
1794 | |||
1786 | ret = RESUME_GUEST; | 1795 | ret = RESUME_GUEST; |
1787 | if (vcpu->arch.trap) | 1796 | if (vcpu->arch.trap) |
1788 | ret = kvmppc_handle_exit_hv(vcpu->arch.kvm_run, vcpu, | 1797 | ret = kvmppc_handle_exit_hv(vcpu->arch.kvm_run, vcpu, |
@@ -1808,6 +1817,8 @@ static void kvmppc_run_core(struct kvmppc_vcore *vc) | |||
1808 | wake_up(&vcpu->arch.cpu_run); | 1817 | wake_up(&vcpu->arch.cpu_run); |
1809 | } | 1818 | } |
1810 | } | 1819 | } |
1820 | |||
1821 | trace_kvmppc_run_core(vc, 1); | ||
1811 | } | 1822 | } |
1812 | 1823 | ||
1813 | /* | 1824 | /* |
@@ -1854,11 +1865,13 @@ static void kvmppc_vcore_blocked(struct kvmppc_vcore *vc) | |||
1854 | } | 1865 | } |
1855 | 1866 | ||
1856 | vc->vcore_state = VCORE_SLEEPING; | 1867 | vc->vcore_state = VCORE_SLEEPING; |
1868 | trace_kvmppc_vcore_blocked(vc, 0); | ||
1857 | spin_unlock(&vc->lock); | 1869 | spin_unlock(&vc->lock); |
1858 | schedule(); | 1870 | schedule(); |
1859 | finish_wait(&vc->wq, &wait); | 1871 | finish_wait(&vc->wq, &wait); |
1860 | spin_lock(&vc->lock); | 1872 | spin_lock(&vc->lock); |
1861 | vc->vcore_state = VCORE_INACTIVE; | 1873 | vc->vcore_state = VCORE_INACTIVE; |
1874 | trace_kvmppc_vcore_blocked(vc, 1); | ||
1862 | } | 1875 | } |
1863 | 1876 | ||
1864 | static int kvmppc_run_vcpu(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu) | 1877 | static int kvmppc_run_vcpu(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu) |
@@ -1867,6 +1880,8 @@ static int kvmppc_run_vcpu(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu) | |||
1867 | struct kvmppc_vcore *vc; | 1880 | struct kvmppc_vcore *vc; |
1868 | struct kvm_vcpu *v, *vn; | 1881 | struct kvm_vcpu *v, *vn; |
1869 | 1882 | ||
1883 | trace_kvmppc_run_vcpu_enter(vcpu); | ||
1884 | |||
1870 | kvm_run->exit_reason = 0; | 1885 | kvm_run->exit_reason = 0; |
1871 | vcpu->arch.ret = RESUME_GUEST; | 1886 | vcpu->arch.ret = RESUME_GUEST; |
1872 | vcpu->arch.trap = 0; | 1887 | vcpu->arch.trap = 0; |
@@ -1896,6 +1911,7 @@ static int kvmppc_run_vcpu(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu) | |||
1896 | VCORE_EXIT_COUNT(vc) == 0) { | 1911 | VCORE_EXIT_COUNT(vc) == 0) { |
1897 | kvmppc_create_dtl_entry(vcpu, vc); | 1912 | kvmppc_create_dtl_entry(vcpu, vc); |
1898 | kvmppc_start_thread(vcpu); | 1913 | kvmppc_start_thread(vcpu); |
1914 | trace_kvm_guest_enter(vcpu); | ||
1899 | } else if (vc->vcore_state == VCORE_SLEEPING) { | 1915 | } else if (vc->vcore_state == VCORE_SLEEPING) { |
1900 | wake_up(&vc->wq); | 1916 | wake_up(&vc->wq); |
1901 | } | 1917 | } |
@@ -1960,6 +1976,7 @@ static int kvmppc_run_vcpu(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu) | |||
1960 | wake_up(&v->arch.cpu_run); | 1976 | wake_up(&v->arch.cpu_run); |
1961 | } | 1977 | } |
1962 | 1978 | ||
1979 | trace_kvmppc_run_vcpu_exit(vcpu, kvm_run); | ||
1963 | spin_unlock(&vc->lock); | 1980 | spin_unlock(&vc->lock); |
1964 | return vcpu->arch.ret; | 1981 | return vcpu->arch.ret; |
1965 | } | 1982 | } |
@@ -2005,7 +2022,9 @@ static int kvmppc_vcpu_run_hv(struct kvm_run *run, struct kvm_vcpu *vcpu) | |||
2005 | 2022 | ||
2006 | if (run->exit_reason == KVM_EXIT_PAPR_HCALL && | 2023 | if (run->exit_reason == KVM_EXIT_PAPR_HCALL && |
2007 | !(vcpu->arch.shregs.msr & MSR_PR)) { | 2024 | !(vcpu->arch.shregs.msr & MSR_PR)) { |
2025 | trace_kvm_hcall_enter(vcpu); | ||
2008 | r = kvmppc_pseries_do_hcall(vcpu); | 2026 | r = kvmppc_pseries_do_hcall(vcpu); |
2027 | trace_kvm_hcall_exit(vcpu, r); | ||
2009 | kvmppc_core_prepare_to_enter(vcpu); | 2028 | kvmppc_core_prepare_to_enter(vcpu); |
2010 | } else if (r == RESUME_PAGE_FAULT) { | 2029 | } else if (r == RESUME_PAGE_FAULT) { |
2011 | srcu_idx = srcu_read_lock(&vcpu->kvm->srcu); | 2030 | srcu_idx = srcu_read_lock(&vcpu->kvm->srcu); |
diff --git a/arch/powerpc/kvm/trace_book3s.h b/arch/powerpc/kvm/trace_book3s.h new file mode 100644 index 000000000000..f647ce0f428b --- /dev/null +++ b/arch/powerpc/kvm/trace_book3s.h | |||
@@ -0,0 +1,32 @@ | |||
1 | #if !defined(_TRACE_KVM_BOOK3S_H) | ||
2 | #define _TRACE_KVM_BOOK3S_H | ||
3 | |||
4 | /* | ||
5 | * Common defines used by the trace macros in trace_pr.h and trace_hv.h | ||
6 | */ | ||
7 | |||
8 | #define kvm_trace_symbol_exit \ | ||
9 | {0x100, "SYSTEM_RESET"}, \ | ||
10 | {0x200, "MACHINE_CHECK"}, \ | ||
11 | {0x300, "DATA_STORAGE"}, \ | ||
12 | {0x380, "DATA_SEGMENT"}, \ | ||
13 | {0x400, "INST_STORAGE"}, \ | ||
14 | {0x480, "INST_SEGMENT"}, \ | ||
15 | {0x500, "EXTERNAL"}, \ | ||
16 | {0x501, "EXTERNAL_LEVEL"}, \ | ||
17 | {0x502, "EXTERNAL_HV"}, \ | ||
18 | {0x600, "ALIGNMENT"}, \ | ||
19 | {0x700, "PROGRAM"}, \ | ||
20 | {0x800, "FP_UNAVAIL"}, \ | ||
21 | {0x900, "DECREMENTER"}, \ | ||
22 | {0x980, "HV_DECREMENTER"}, \ | ||
23 | {0xc00, "SYSCALL"}, \ | ||
24 | {0xd00, "TRACE"}, \ | ||
25 | {0xe00, "H_DATA_STORAGE"}, \ | ||
26 | {0xe20, "H_INST_STORAGE"}, \ | ||
27 | {0xe40, "H_EMUL_ASSIST"}, \ | ||
28 | {0xf00, "PERFMON"}, \ | ||
29 | {0xf20, "ALTIVEC"}, \ | ||
30 | {0xf40, "VSX"} | ||
31 | |||
32 | #endif | ||
diff --git a/arch/powerpc/kvm/trace_hv.h b/arch/powerpc/kvm/trace_hv.h new file mode 100644 index 000000000000..33d9daff5783 --- /dev/null +++ b/arch/powerpc/kvm/trace_hv.h | |||
@@ -0,0 +1,477 @@ | |||
1 | #if !defined(_TRACE_KVM_HV_H) || defined(TRACE_HEADER_MULTI_READ) | ||
2 | #define _TRACE_KVM_HV_H | ||
3 | |||
4 | #include <linux/tracepoint.h> | ||
5 | #include "trace_book3s.h" | ||
6 | #include <asm/hvcall.h> | ||
7 | #include <asm/kvm_asm.h> | ||
8 | |||
9 | #undef TRACE_SYSTEM | ||
10 | #define TRACE_SYSTEM kvm_hv | ||
11 | #define TRACE_INCLUDE_PATH . | ||
12 | #define TRACE_INCLUDE_FILE trace_hv | ||
13 | |||
14 | #define kvm_trace_symbol_hcall \ | ||
15 | {H_REMOVE, "H_REMOVE"}, \ | ||
16 | {H_ENTER, "H_ENTER"}, \ | ||
17 | {H_READ, "H_READ"}, \ | ||
18 | {H_CLEAR_MOD, "H_CLEAR_MOD"}, \ | ||
19 | {H_CLEAR_REF, "H_CLEAR_REF"}, \ | ||
20 | {H_PROTECT, "H_PROTECT"}, \ | ||
21 | {H_GET_TCE, "H_GET_TCE"}, \ | ||
22 | {H_PUT_TCE, "H_PUT_TCE"}, \ | ||
23 | {H_SET_SPRG0, "H_SET_SPRG0"}, \ | ||
24 | {H_SET_DABR, "H_SET_DABR"}, \ | ||
25 | {H_PAGE_INIT, "H_PAGE_INIT"}, \ | ||
26 | {H_SET_ASR, "H_SET_ASR"}, \ | ||
27 | {H_ASR_ON, "H_ASR_ON"}, \ | ||
28 | {H_ASR_OFF, "H_ASR_OFF"}, \ | ||
29 | {H_LOGICAL_CI_LOAD, "H_LOGICAL_CI_LOAD"}, \ | ||
30 | {H_LOGICAL_CI_STORE, "H_LOGICAL_CI_STORE"}, \ | ||
31 | {H_LOGICAL_CACHE_LOAD, "H_LOGICAL_CACHE_LOAD"}, \ | ||
32 | {H_LOGICAL_CACHE_STORE, "H_LOGICAL_CACHE_STORE"}, \ | ||
33 | {H_LOGICAL_ICBI, "H_LOGICAL_ICBI"}, \ | ||
34 | {H_LOGICAL_DCBF, "H_LOGICAL_DCBF"}, \ | ||
35 | {H_GET_TERM_CHAR, "H_GET_TERM_CHAR"}, \ | ||
36 | {H_PUT_TERM_CHAR, "H_PUT_TERM_CHAR"}, \ | ||
37 | {H_REAL_TO_LOGICAL, "H_REAL_TO_LOGICAL"}, \ | ||
38 | {H_HYPERVISOR_DATA, "H_HYPERVISOR_DATA"}, \ | ||
39 | {H_EOI, "H_EOI"}, \ | ||
40 | {H_CPPR, "H_CPPR"}, \ | ||
41 | {H_IPI, "H_IPI"}, \ | ||
42 | {H_IPOLL, "H_IPOLL"}, \ | ||
43 | {H_XIRR, "H_XIRR"}, \ | ||
44 | {H_PERFMON, "H_PERFMON"}, \ | ||
45 | {H_MIGRATE_DMA, "H_MIGRATE_DMA"}, \ | ||
46 | {H_REGISTER_VPA, "H_REGISTER_VPA"}, \ | ||
47 | {H_CEDE, "H_CEDE"}, \ | ||
48 | {H_CONFER, "H_CONFER"}, \ | ||
49 | {H_PROD, "H_PROD"}, \ | ||
50 | {H_GET_PPP, "H_GET_PPP"}, \ | ||
51 | {H_SET_PPP, "H_SET_PPP"}, \ | ||
52 | {H_PURR, "H_PURR"}, \ | ||
53 | {H_PIC, "H_PIC"}, \ | ||
54 | {H_REG_CRQ, "H_REG_CRQ"}, \ | ||
55 | {H_FREE_CRQ, "H_FREE_CRQ"}, \ | ||
56 | {H_VIO_SIGNAL, "H_VIO_SIGNAL"}, \ | ||
57 | {H_SEND_CRQ, "H_SEND_CRQ"}, \ | ||
58 | {H_COPY_RDMA, "H_COPY_RDMA"}, \ | ||
59 | {H_REGISTER_LOGICAL_LAN, "H_REGISTER_LOGICAL_LAN"}, \ | ||
60 | {H_FREE_LOGICAL_LAN, "H_FREE_LOGICAL_LAN"}, \ | ||
61 | {H_ADD_LOGICAL_LAN_BUFFER, "H_ADD_LOGICAL_LAN_BUFFER"}, \ | ||
62 | {H_SEND_LOGICAL_LAN, "H_SEND_LOGICAL_LAN"}, \ | ||
63 | {H_BULK_REMOVE, "H_BULK_REMOVE"}, \ | ||
64 | {H_MULTICAST_CTRL, "H_MULTICAST_CTRL"}, \ | ||
65 | {H_SET_XDABR, "H_SET_XDABR"}, \ | ||
66 | {H_STUFF_TCE, "H_STUFF_TCE"}, \ | ||
67 | {H_PUT_TCE_INDIRECT, "H_PUT_TCE_INDIRECT"}, \ | ||
68 | {H_CHANGE_LOGICAL_LAN_MAC, "H_CHANGE_LOGICAL_LAN_MAC"}, \ | ||
69 | {H_VTERM_PARTNER_INFO, "H_VTERM_PARTNER_INFO"}, \ | ||
70 | {H_REGISTER_VTERM, "H_REGISTER_VTERM"}, \ | ||
71 | {H_FREE_VTERM, "H_FREE_VTERM"}, \ | ||
72 | {H_RESET_EVENTS, "H_RESET_EVENTS"}, \ | ||
73 | {H_ALLOC_RESOURCE, "H_ALLOC_RESOURCE"}, \ | ||
74 | {H_FREE_RESOURCE, "H_FREE_RESOURCE"}, \ | ||
75 | {H_MODIFY_QP, "H_MODIFY_QP"}, \ | ||
76 | {H_QUERY_QP, "H_QUERY_QP"}, \ | ||
77 | {H_REREGISTER_PMR, "H_REREGISTER_PMR"}, \ | ||
78 | {H_REGISTER_SMR, "H_REGISTER_SMR"}, \ | ||
79 | {H_QUERY_MR, "H_QUERY_MR"}, \ | ||
80 | {H_QUERY_MW, "H_QUERY_MW"}, \ | ||
81 | {H_QUERY_HCA, "H_QUERY_HCA"}, \ | ||
82 | {H_QUERY_PORT, "H_QUERY_PORT"}, \ | ||
83 | {H_MODIFY_PORT, "H_MODIFY_PORT"}, \ | ||
84 | {H_DEFINE_AQP1, "H_DEFINE_AQP1"}, \ | ||
85 | {H_GET_TRACE_BUFFER, "H_GET_TRACE_BUFFER"}, \ | ||
86 | {H_DEFINE_AQP0, "H_DEFINE_AQP0"}, \ | ||
87 | {H_RESIZE_MR, "H_RESIZE_MR"}, \ | ||
88 | {H_ATTACH_MCQP, "H_ATTACH_MCQP"}, \ | ||
89 | {H_DETACH_MCQP, "H_DETACH_MCQP"}, \ | ||
90 | {H_CREATE_RPT, "H_CREATE_RPT"}, \ | ||
91 | {H_REMOVE_RPT, "H_REMOVE_RPT"}, \ | ||
92 | {H_REGISTER_RPAGES, "H_REGISTER_RPAGES"}, \ | ||
93 | {H_DISABLE_AND_GETC, "H_DISABLE_AND_GETC"}, \ | ||
94 | {H_ERROR_DATA, "H_ERROR_DATA"}, \ | ||
95 | {H_GET_HCA_INFO, "H_GET_HCA_INFO"}, \ | ||
96 | {H_GET_PERF_COUNT, "H_GET_PERF_COUNT"}, \ | ||
97 | {H_MANAGE_TRACE, "H_MANAGE_TRACE"}, \ | ||
98 | {H_FREE_LOGICAL_LAN_BUFFER, "H_FREE_LOGICAL_LAN_BUFFER"}, \ | ||
99 | {H_QUERY_INT_STATE, "H_QUERY_INT_STATE"}, \ | ||
100 | {H_POLL_PENDING, "H_POLL_PENDING"}, \ | ||
101 | {H_ILLAN_ATTRIBUTES, "H_ILLAN_ATTRIBUTES"}, \ | ||
102 | {H_MODIFY_HEA_QP, "H_MODIFY_HEA_QP"}, \ | ||
103 | {H_QUERY_HEA_QP, "H_QUERY_HEA_QP"}, \ | ||
104 | {H_QUERY_HEA, "H_QUERY_HEA"}, \ | ||
105 | {H_QUERY_HEA_PORT, "H_QUERY_HEA_PORT"}, \ | ||
106 | {H_MODIFY_HEA_PORT, "H_MODIFY_HEA_PORT"}, \ | ||
107 | {H_REG_BCMC, "H_REG_BCMC"}, \ | ||
108 | {H_DEREG_BCMC, "H_DEREG_BCMC"}, \ | ||
109 | {H_REGISTER_HEA_RPAGES, "H_REGISTER_HEA_RPAGES"}, \ | ||
110 | {H_DISABLE_AND_GET_HEA, "H_DISABLE_AND_GET_HEA"}, \ | ||
111 | {H_GET_HEA_INFO, "H_GET_HEA_INFO"}, \ | ||
112 | {H_ALLOC_HEA_RESOURCE, "H_ALLOC_HEA_RESOURCE"}, \ | ||
113 | {H_ADD_CONN, "H_ADD_CONN"}, \ | ||
114 | {H_DEL_CONN, "H_DEL_CONN"}, \ | ||
115 | {H_JOIN, "H_JOIN"}, \ | ||
116 | {H_VASI_STATE, "H_VASI_STATE"}, \ | ||
117 | {H_ENABLE_CRQ, "H_ENABLE_CRQ"}, \ | ||
118 | {H_GET_EM_PARMS, "H_GET_EM_PARMS"}, \ | ||
119 | {H_SET_MPP, "H_SET_MPP"}, \ | ||
120 | {H_GET_MPP, "H_GET_MPP"}, \ | ||
121 | {H_HOME_NODE_ASSOCIATIVITY, "H_HOME_NODE_ASSOCIATIVITY"}, \ | ||
122 | {H_BEST_ENERGY, "H_BEST_ENERGY"}, \ | ||
123 | {H_XIRR_X, "H_XIRR_X"}, \ | ||
124 | {H_RANDOM, "H_RANDOM"}, \ | ||
125 | {H_COP, "H_COP"}, \ | ||
126 | {H_GET_MPP_X, "H_GET_MPP_X"}, \ | ||
127 | {H_SET_MODE, "H_SET_MODE"}, \ | ||
128 | {H_RTAS, "H_RTAS"} | ||
129 | |||
130 | #define kvm_trace_symbol_kvmret \ | ||
131 | {RESUME_GUEST, "RESUME_GUEST"}, \ | ||
132 | {RESUME_GUEST_NV, "RESUME_GUEST_NV"}, \ | ||
133 | {RESUME_HOST, "RESUME_HOST"}, \ | ||
134 | {RESUME_HOST_NV, "RESUME_HOST_NV"} | ||
135 | |||
136 | #define kvm_trace_symbol_hcall_rc \ | ||
137 | {H_SUCCESS, "H_SUCCESS"}, \ | ||
138 | {H_BUSY, "H_BUSY"}, \ | ||
139 | {H_CLOSED, "H_CLOSED"}, \ | ||
140 | {H_NOT_AVAILABLE, "H_NOT_AVAILABLE"}, \ | ||
141 | {H_CONSTRAINED, "H_CONSTRAINED"}, \ | ||
142 | {H_PARTIAL, "H_PARTIAL"}, \ | ||
143 | {H_IN_PROGRESS, "H_IN_PROGRESS"}, \ | ||
144 | {H_PAGE_REGISTERED, "H_PAGE_REGISTERED"}, \ | ||
145 | {H_PARTIAL_STORE, "H_PARTIAL_STORE"}, \ | ||
146 | {H_PENDING, "H_PENDING"}, \ | ||
147 | {H_CONTINUE, "H_CONTINUE"}, \ | ||
148 | {H_LONG_BUSY_START_RANGE, "H_LONG_BUSY_START_RANGE"}, \ | ||
149 | {H_LONG_BUSY_ORDER_1_MSEC, "H_LONG_BUSY_ORDER_1_MSEC"}, \ | ||
150 | {H_LONG_BUSY_ORDER_10_MSEC, "H_LONG_BUSY_ORDER_10_MSEC"}, \ | ||
151 | {H_LONG_BUSY_ORDER_100_MSEC, "H_LONG_BUSY_ORDER_100_MSEC"}, \ | ||
152 | {H_LONG_BUSY_ORDER_1_SEC, "H_LONG_BUSY_ORDER_1_SEC"}, \ | ||
153 | {H_LONG_BUSY_ORDER_10_SEC, "H_LONG_BUSY_ORDER_10_SEC"}, \ | ||
154 | {H_LONG_BUSY_ORDER_100_SEC, "H_LONG_BUSY_ORDER_100_SEC"}, \ | ||
155 | {H_LONG_BUSY_END_RANGE, "H_LONG_BUSY_END_RANGE"}, \ | ||
156 | {H_TOO_HARD, "H_TOO_HARD"}, \ | ||
157 | {H_HARDWARE, "H_HARDWARE"}, \ | ||
158 | {H_FUNCTION, "H_FUNCTION"}, \ | ||
159 | {H_PRIVILEGE, "H_PRIVILEGE"}, \ | ||
160 | {H_PARAMETER, "H_PARAMETER"}, \ | ||
161 | {H_BAD_MODE, "H_BAD_MODE"}, \ | ||
162 | {H_PTEG_FULL, "H_PTEG_FULL"}, \ | ||
163 | {H_NOT_FOUND, "H_NOT_FOUND"}, \ | ||
164 | {H_RESERVED_DABR, "H_RESERVED_DABR"}, \ | ||
165 | {H_NO_MEM, "H_NO_MEM"}, \ | ||
166 | {H_AUTHORITY, "H_AUTHORITY"}, \ | ||
167 | {H_PERMISSION, "H_PERMISSION"}, \ | ||
168 | {H_DROPPED, "H_DROPPED"}, \ | ||
169 | {H_SOURCE_PARM, "H_SOURCE_PARM"}, \ | ||
170 | {H_DEST_PARM, "H_DEST_PARM"}, \ | ||
171 | {H_REMOTE_PARM, "H_REMOTE_PARM"}, \ | ||
172 | {H_RESOURCE, "H_RESOURCE"}, \ | ||
173 | {H_ADAPTER_PARM, "H_ADAPTER_PARM"}, \ | ||
174 | {H_RH_PARM, "H_RH_PARM"}, \ | ||
175 | {H_RCQ_PARM, "H_RCQ_PARM"}, \ | ||
176 | {H_SCQ_PARM, "H_SCQ_PARM"}, \ | ||
177 | {H_EQ_PARM, "H_EQ_PARM"}, \ | ||
178 | {H_RT_PARM, "H_RT_PARM"}, \ | ||
179 | {H_ST_PARM, "H_ST_PARM"}, \ | ||
180 | {H_SIGT_PARM, "H_SIGT_PARM"}, \ | ||
181 | {H_TOKEN_PARM, "H_TOKEN_PARM"}, \ | ||
182 | {H_MLENGTH_PARM, "H_MLENGTH_PARM"}, \ | ||
183 | {H_MEM_PARM, "H_MEM_PARM"}, \ | ||
184 | {H_MEM_ACCESS_PARM, "H_MEM_ACCESS_PARM"}, \ | ||
185 | {H_ATTR_PARM, "H_ATTR_PARM"}, \ | ||
186 | {H_PORT_PARM, "H_PORT_PARM"}, \ | ||
187 | {H_MCG_PARM, "H_MCG_PARM"}, \ | ||
188 | {H_VL_PARM, "H_VL_PARM"}, \ | ||
189 | {H_TSIZE_PARM, "H_TSIZE_PARM"}, \ | ||
190 | {H_TRACE_PARM, "H_TRACE_PARM"}, \ | ||
191 | {H_MASK_PARM, "H_MASK_PARM"}, \ | ||
192 | {H_MCG_FULL, "H_MCG_FULL"}, \ | ||
193 | {H_ALIAS_EXIST, "H_ALIAS_EXIST"}, \ | ||
194 | {H_P_COUNTER, "H_P_COUNTER"}, \ | ||
195 | {H_TABLE_FULL, "H_TABLE_FULL"}, \ | ||
196 | {H_ALT_TABLE, "H_ALT_TABLE"}, \ | ||
197 | {H_MR_CONDITION, "H_MR_CONDITION"}, \ | ||
198 | {H_NOT_ENOUGH_RESOURCES, "H_NOT_ENOUGH_RESOURCES"}, \ | ||
199 | {H_R_STATE, "H_R_STATE"}, \ | ||
200 | {H_RESCINDED, "H_RESCINDED"}, \ | ||
201 | {H_P2, "H_P2"}, \ | ||
202 | {H_P3, "H_P3"}, \ | ||
203 | {H_P4, "H_P4"}, \ | ||
204 | {H_P5, "H_P5"}, \ | ||
205 | {H_P6, "H_P6"}, \ | ||
206 | {H_P7, "H_P7"}, \ | ||
207 | {H_P8, "H_P8"}, \ | ||
208 | {H_P9, "H_P9"}, \ | ||
209 | {H_TOO_BIG, "H_TOO_BIG"}, \ | ||
210 | {H_OVERLAP, "H_OVERLAP"}, \ | ||
211 | {H_INTERRUPT, "H_INTERRUPT"}, \ | ||
212 | {H_BAD_DATA, "H_BAD_DATA"}, \ | ||
213 | {H_NOT_ACTIVE, "H_NOT_ACTIVE"}, \ | ||
214 | {H_SG_LIST, "H_SG_LIST"}, \ | ||
215 | {H_OP_MODE, "H_OP_MODE"}, \ | ||
216 | {H_COP_HW, "H_COP_HW"}, \ | ||
217 | {H_UNSUPPORTED_FLAG_START, "H_UNSUPPORTED_FLAG_START"}, \ | ||
218 | {H_UNSUPPORTED_FLAG_END, "H_UNSUPPORTED_FLAG_END"}, \ | ||
219 | {H_MULTI_THREADS_ACTIVE, "H_MULTI_THREADS_ACTIVE"}, \ | ||
220 | {H_OUTSTANDING_COP_OPS, "H_OUTSTANDING_COP_OPS"} | ||
221 | |||
222 | TRACE_EVENT(kvm_guest_enter, | ||
223 | TP_PROTO(struct kvm_vcpu *vcpu), | ||
224 | TP_ARGS(vcpu), | ||
225 | |||
226 | TP_STRUCT__entry( | ||
227 | __field(int, vcpu_id) | ||
228 | __field(unsigned long, pc) | ||
229 | __field(unsigned long, pending_exceptions) | ||
230 | __field(u8, ceded) | ||
231 | ), | ||
232 | |||
233 | TP_fast_assign( | ||
234 | __entry->vcpu_id = vcpu->vcpu_id; | ||
235 | __entry->pc = kvmppc_get_pc(vcpu); | ||
236 | __entry->ceded = vcpu->arch.ceded; | ||
237 | __entry->pending_exceptions = vcpu->arch.pending_exceptions; | ||
238 | ), | ||
239 | |||
240 | TP_printk("VCPU %d: pc=0x%lx pexcp=0x%lx ceded=%d", | ||
241 | __entry->vcpu_id, | ||
242 | __entry->pc, | ||
243 | __entry->pending_exceptions, __entry->ceded) | ||
244 | ); | ||
245 | |||
246 | TRACE_EVENT(kvm_guest_exit, | ||
247 | TP_PROTO(struct kvm_vcpu *vcpu), | ||
248 | TP_ARGS(vcpu), | ||
249 | |||
250 | TP_STRUCT__entry( | ||
251 | __field(int, vcpu_id) | ||
252 | __field(int, trap) | ||
253 | __field(unsigned long, pc) | ||
254 | __field(unsigned long, msr) | ||
255 | __field(u8, ceded) | ||
256 | ), | ||
257 | |||
258 | TP_fast_assign( | ||
259 | __entry->vcpu_id = vcpu->vcpu_id; | ||
260 | __entry->trap = vcpu->arch.trap; | ||
261 | __entry->ceded = vcpu->arch.ceded; | ||
262 | __entry->pc = kvmppc_get_pc(vcpu); | ||
263 | __entry->msr = vcpu->arch.shregs.msr; | ||
264 | ), | ||
265 | |||
266 | TP_printk("VCPU %d: trap=%s pc=0x%lx msr=0x%lx, ceded=%d", | ||
267 | __entry->vcpu_id, | ||
268 | __print_symbolic(__entry->trap, kvm_trace_symbol_exit), | ||
269 | __entry->pc, __entry->msr, __entry->ceded | ||
270 | ) | ||
271 | ); | ||
272 | |||
273 | TRACE_EVENT(kvm_page_fault_enter, | ||
274 | TP_PROTO(struct kvm_vcpu *vcpu, unsigned long *hptep, | ||
275 | struct kvm_memory_slot *memslot, unsigned long ea, | ||
276 | unsigned long dsisr), | ||
277 | |||
278 | TP_ARGS(vcpu, hptep, memslot, ea, dsisr), | ||
279 | |||
280 | TP_STRUCT__entry( | ||
281 | __field(int, vcpu_id) | ||
282 | __field(unsigned long, hpte_v) | ||
283 | __field(unsigned long, hpte_r) | ||
284 | __field(unsigned long, gpte_r) | ||
285 | __field(unsigned long, ea) | ||
286 | __field(u64, base_gfn) | ||
287 | __field(u32, slot_flags) | ||
288 | __field(u32, dsisr) | ||
289 | ), | ||
290 | |||
291 | TP_fast_assign( | ||
292 | __entry->vcpu_id = vcpu->vcpu_id; | ||
293 | __entry->hpte_v = hptep[0]; | ||
294 | __entry->hpte_r = hptep[1]; | ||
295 | __entry->gpte_r = hptep[2]; | ||
296 | __entry->ea = ea; | ||
297 | __entry->dsisr = dsisr; | ||
298 | __entry->base_gfn = memslot ? memslot->base_gfn : -1UL; | ||
299 | __entry->slot_flags = memslot ? memslot->flags : 0; | ||
300 | ), | ||
301 | |||
302 | TP_printk("VCPU %d: hpte=0x%lx:0x%lx guest=0x%lx ea=0x%lx,%x slot=0x%llx,0x%x", | ||
303 | __entry->vcpu_id, | ||
304 | __entry->hpte_v, __entry->hpte_r, __entry->gpte_r, | ||
305 | __entry->ea, __entry->dsisr, | ||
306 | __entry->base_gfn, __entry->slot_flags) | ||
307 | ); | ||
308 | |||
309 | TRACE_EVENT(kvm_page_fault_exit, | ||
310 | TP_PROTO(struct kvm_vcpu *vcpu, unsigned long *hptep, long ret), | ||
311 | |||
312 | TP_ARGS(vcpu, hptep, ret), | ||
313 | |||
314 | TP_STRUCT__entry( | ||
315 | __field(int, vcpu_id) | ||
316 | __field(unsigned long, hpte_v) | ||
317 | __field(unsigned long, hpte_r) | ||
318 | __field(long, ret) | ||
319 | ), | ||
320 | |||
321 | TP_fast_assign( | ||
322 | __entry->vcpu_id = vcpu->vcpu_id; | ||
323 | __entry->hpte_v = hptep[0]; | ||
324 | __entry->hpte_r = hptep[1]; | ||
325 | __entry->ret = ret; | ||
326 | ), | ||
327 | |||
328 | TP_printk("VCPU %d: hpte=0x%lx:0x%lx ret=0x%lx", | ||
329 | __entry->vcpu_id, | ||
330 | __entry->hpte_v, __entry->hpte_r, __entry->ret) | ||
331 | ); | ||
332 | |||
333 | TRACE_EVENT(kvm_hcall_enter, | ||
334 | TP_PROTO(struct kvm_vcpu *vcpu), | ||
335 | |||
336 | TP_ARGS(vcpu), | ||
337 | |||
338 | TP_STRUCT__entry( | ||
339 | __field(int, vcpu_id) | ||
340 | __field(unsigned long, req) | ||
341 | __field(unsigned long, gpr4) | ||
342 | __field(unsigned long, gpr5) | ||
343 | __field(unsigned long, gpr6) | ||
344 | __field(unsigned long, gpr7) | ||
345 | ), | ||
346 | |||
347 | TP_fast_assign( | ||
348 | __entry->vcpu_id = vcpu->vcpu_id; | ||
349 | __entry->req = kvmppc_get_gpr(vcpu, 3); | ||
350 | __entry->gpr4 = kvmppc_get_gpr(vcpu, 4); | ||
351 | __entry->gpr5 = kvmppc_get_gpr(vcpu, 5); | ||
352 | __entry->gpr6 = kvmppc_get_gpr(vcpu, 6); | ||
353 | __entry->gpr7 = kvmppc_get_gpr(vcpu, 7); | ||
354 | ), | ||
355 | |||
356 | TP_printk("VCPU %d: hcall=%s GPR4-7=0x%lx,0x%lx,0x%lx,0x%lx", | ||
357 | __entry->vcpu_id, | ||
358 | __print_symbolic(__entry->req, kvm_trace_symbol_hcall), | ||
359 | __entry->gpr4, __entry->gpr5, __entry->gpr6, __entry->gpr7) | ||
360 | ); | ||
361 | |||
362 | TRACE_EVENT(kvm_hcall_exit, | ||
363 | TP_PROTO(struct kvm_vcpu *vcpu, int ret), | ||
364 | |||
365 | TP_ARGS(vcpu, ret), | ||
366 | |||
367 | TP_STRUCT__entry( | ||
368 | __field(int, vcpu_id) | ||
369 | __field(unsigned long, ret) | ||
370 | __field(unsigned long, hcall_rc) | ||
371 | ), | ||
372 | |||
373 | TP_fast_assign( | ||
374 | __entry->vcpu_id = vcpu->vcpu_id; | ||
375 | __entry->ret = ret; | ||
376 | __entry->hcall_rc = kvmppc_get_gpr(vcpu, 3); | ||
377 | ), | ||
378 | |||
379 | TP_printk("VCPU %d: ret=%s hcall_rc=%s", | ||
380 | __entry->vcpu_id, | ||
381 | __print_symbolic(__entry->ret, kvm_trace_symbol_kvmret), | ||
382 | __print_symbolic(__entry->ret & RESUME_FLAG_HOST ? | ||
383 | H_TOO_HARD : __entry->hcall_rc, | ||
384 | kvm_trace_symbol_hcall_rc)) | ||
385 | ); | ||
386 | |||
387 | TRACE_EVENT(kvmppc_run_core, | ||
388 | TP_PROTO(struct kvmppc_vcore *vc, int where), | ||
389 | |||
390 | TP_ARGS(vc, where), | ||
391 | |||
392 | TP_STRUCT__entry( | ||
393 | __field(int, n_runnable) | ||
394 | __field(int, runner_vcpu) | ||
395 | __field(int, where) | ||
396 | __field(pid_t, tgid) | ||
397 | ), | ||
398 | |||
399 | TP_fast_assign( | ||
400 | __entry->runner_vcpu = vc->runner->vcpu_id; | ||
401 | __entry->n_runnable = vc->n_runnable; | ||
402 | __entry->where = where; | ||
403 | __entry->tgid = current->tgid; | ||
404 | ), | ||
405 | |||
406 | TP_printk("%s runner_vcpu==%d runnable=%d tgid=%d", | ||
407 | __entry->where ? "Exit" : "Enter", | ||
408 | __entry->runner_vcpu, __entry->n_runnable, __entry->tgid) | ||
409 | ); | ||
410 | |||
411 | TRACE_EVENT(kvmppc_vcore_blocked, | ||
412 | TP_PROTO(struct kvmppc_vcore *vc, int where), | ||
413 | |||
414 | TP_ARGS(vc, where), | ||
415 | |||
416 | TP_STRUCT__entry( | ||
417 | __field(int, n_runnable) | ||
418 | __field(int, runner_vcpu) | ||
419 | __field(int, where) | ||
420 | __field(pid_t, tgid) | ||
421 | ), | ||
422 | |||
423 | TP_fast_assign( | ||
424 | __entry->runner_vcpu = vc->runner->vcpu_id; | ||
425 | __entry->n_runnable = vc->n_runnable; | ||
426 | __entry->where = where; | ||
427 | __entry->tgid = current->tgid; | ||
428 | ), | ||
429 | |||
430 | TP_printk("%s runner_vcpu=%d runnable=%d tgid=%d", | ||
431 | __entry->where ? "Exit" : "Enter", | ||
432 | __entry->runner_vcpu, __entry->n_runnable, __entry->tgid) | ||
433 | ); | ||
434 | |||
435 | TRACE_EVENT(kvmppc_run_vcpu_enter, | ||
436 | TP_PROTO(struct kvm_vcpu *vcpu), | ||
437 | |||
438 | TP_ARGS(vcpu), | ||
439 | |||
440 | TP_STRUCT__entry( | ||
441 | __field(int, vcpu_id) | ||
442 | __field(pid_t, tgid) | ||
443 | ), | ||
444 | |||
445 | TP_fast_assign( | ||
446 | __entry->vcpu_id = vcpu->vcpu_id; | ||
447 | __entry->tgid = current->tgid; | ||
448 | ), | ||
449 | |||
450 | TP_printk("VCPU %d: tgid=%d", __entry->vcpu_id, __entry->tgid) | ||
451 | ); | ||
452 | |||
453 | TRACE_EVENT(kvmppc_run_vcpu_exit, | ||
454 | TP_PROTO(struct kvm_vcpu *vcpu, struct kvm_run *run), | ||
455 | |||
456 | TP_ARGS(vcpu, run), | ||
457 | |||
458 | TP_STRUCT__entry( | ||
459 | __field(int, vcpu_id) | ||
460 | __field(int, exit) | ||
461 | __field(int, ret) | ||
462 | ), | ||
463 | |||
464 | TP_fast_assign( | ||
465 | __entry->vcpu_id = vcpu->vcpu_id; | ||
466 | __entry->exit = run->exit_reason; | ||
467 | __entry->ret = vcpu->arch.ret; | ||
468 | ), | ||
469 | |||
470 | TP_printk("VCPU %d: exit=%d, ret=%d", | ||
471 | __entry->vcpu_id, __entry->exit, __entry->ret) | ||
472 | ); | ||
473 | |||
474 | #endif /* _TRACE_KVM_HV_H */ | ||
475 | |||
476 | /* This part must be outside protection */ | ||
477 | #include <trace/define_trace.h> | ||
diff --git a/arch/powerpc/kvm/trace_pr.h b/arch/powerpc/kvm/trace_pr.h index e1357cd8dc1f..810507cb688a 100644 --- a/arch/powerpc/kvm/trace_pr.h +++ b/arch/powerpc/kvm/trace_pr.h | |||
@@ -3,36 +3,13 @@ | |||
3 | #define _TRACE_KVM_PR_H | 3 | #define _TRACE_KVM_PR_H |
4 | 4 | ||
5 | #include <linux/tracepoint.h> | 5 | #include <linux/tracepoint.h> |
6 | #include "trace_book3s.h" | ||
6 | 7 | ||
7 | #undef TRACE_SYSTEM | 8 | #undef TRACE_SYSTEM |
8 | #define TRACE_SYSTEM kvm_pr | 9 | #define TRACE_SYSTEM kvm_pr |
9 | #define TRACE_INCLUDE_PATH . | 10 | #define TRACE_INCLUDE_PATH . |
10 | #define TRACE_INCLUDE_FILE trace_pr | 11 | #define TRACE_INCLUDE_FILE trace_pr |
11 | 12 | ||
12 | #define kvm_trace_symbol_exit \ | ||
13 | {0x100, "SYSTEM_RESET"}, \ | ||
14 | {0x200, "MACHINE_CHECK"}, \ | ||
15 | {0x300, "DATA_STORAGE"}, \ | ||
16 | {0x380, "DATA_SEGMENT"}, \ | ||
17 | {0x400, "INST_STORAGE"}, \ | ||
18 | {0x480, "INST_SEGMENT"}, \ | ||
19 | {0x500, "EXTERNAL"}, \ | ||
20 | {0x501, "EXTERNAL_LEVEL"}, \ | ||
21 | {0x502, "EXTERNAL_HV"}, \ | ||
22 | {0x600, "ALIGNMENT"}, \ | ||
23 | {0x700, "PROGRAM"}, \ | ||
24 | {0x800, "FP_UNAVAIL"}, \ | ||
25 | {0x900, "DECREMENTER"}, \ | ||
26 | {0x980, "HV_DECREMENTER"}, \ | ||
27 | {0xc00, "SYSCALL"}, \ | ||
28 | {0xd00, "TRACE"}, \ | ||
29 | {0xe00, "H_DATA_STORAGE"}, \ | ||
30 | {0xe20, "H_INST_STORAGE"}, \ | ||
31 | {0xe40, "H_EMUL_ASSIST"}, \ | ||
32 | {0xf00, "PERFMON"}, \ | ||
33 | {0xf20, "ALTIVEC"}, \ | ||
34 | {0xf40, "VSX"} | ||
35 | |||
36 | TRACE_EVENT(kvm_book3s_reenter, | 13 | TRACE_EVENT(kvm_book3s_reenter, |
37 | TP_PROTO(int r, struct kvm_vcpu *vcpu), | 14 | TP_PROTO(int r, struct kvm_vcpu *vcpu), |
38 | TP_ARGS(r, vcpu), | 15 | TP_ARGS(r, vcpu), |