blob: 3851f1f3030cd8be25a23d38218185605022c9a2 [file] [log] [blame]
Avi Kivity07420172009-07-06 12:21:32 +03001#if !defined(_TRACE_KVMMMU_H) || defined(TRACE_HEADER_MULTI_READ)
2#define _TRACE_KVMMMU_H
3
4#include <linux/tracepoint.h>
Avi Kivityf691fe12009-07-06 15:58:14 +03005#include <linux/ftrace_event.h>
Avi Kivity07420172009-07-06 12:21:32 +03006
7#undef TRACE_SYSTEM
8#define TRACE_SYSTEM kvmmmu
Avi Kivity07420172009-07-06 12:21:32 +03009
Avi Kivityf691fe12009-07-06 15:58:14 +030010#define KVM_MMU_PAGE_FIELDS \
11 __field(__u64, gfn) \
12 __field(__u32, role) \
13 __field(__u32, root_count) \
14 __field(__u32, unsync)
15
16#define KVM_MMU_PAGE_ASSIGN(sp) \
17 __entry->gfn = sp->gfn; \
18 __entry->role = sp->role.word; \
19 __entry->root_count = sp->root_count; \
20 __entry->unsync = sp->unsync;
21
22#define KVM_MMU_PAGE_PRINTK() ({ \
23 const char *ret = p->buffer + p->len; \
24 static const char *access_str[] = { \
25 "---", "--x", "w--", "w-x", "-u-", "-ux", "wu-", "wux" \
26 }; \
27 union kvm_mmu_page_role role; \
28 \
29 role.word = __entry->role; \
30 \
Avi Kivity5b7e0102010-04-14 19:20:03 +030031 trace_seq_printf(p, "sp gfn %llx %u%s q%u%s %s%s %spge" \
Avi Kivityf691fe12009-07-06 15:58:14 +030032 " %snxe root %u %s%c", \
Avi Kivity5b7e0102010-04-14 19:20:03 +030033 __entry->gfn, role.level, \
34 role.cr4_pae ? " pae" : "", \
Avi Kivityf691fe12009-07-06 15:58:14 +030035 role.quadrant, \
36 role.direct ? " direct" : "", \
37 access_str[role.access], \
38 role.invalid ? " invalid" : "", \
39 role.cr4_pge ? "" : "!", \
40 role.nxe ? "" : "!", \
41 __entry->root_count, \
42 __entry->unsync ? "unsync" : "sync", 0); \
43 ret; \
44 })
45
Avi Kivity07420172009-07-06 12:21:32 +030046#define kvm_mmu_trace_pferr_flags \
47 { PFERR_PRESENT_MASK, "P" }, \
48 { PFERR_WRITE_MASK, "W" }, \
49 { PFERR_USER_MASK, "U" }, \
50 { PFERR_RSVD_MASK, "RSVD" }, \
51 { PFERR_FETCH_MASK, "F" }
52
53/*
54 * A pagetable walk has started
55 */
56TRACE_EVENT(
57 kvm_mmu_pagetable_walk,
58 TP_PROTO(u64 addr, int write_fault, int user_fault, int fetch_fault),
59 TP_ARGS(addr, write_fault, user_fault, fetch_fault),
60
61 TP_STRUCT__entry(
62 __field(__u64, addr)
63 __field(__u32, pferr)
64 ),
65
66 TP_fast_assign(
67 __entry->addr = addr;
68 __entry->pferr = (!!write_fault << 1) | (!!user_fault << 2)
69 | (!!fetch_fault << 4);
70 ),
71
72 TP_printk("addr %llx pferr %x %s", __entry->addr, __entry->pferr,
73 __print_flags(__entry->pferr, "|", kvm_mmu_trace_pferr_flags))
74);
75
76
77/* We just walked a paging element */
78TRACE_EVENT(
79 kvm_mmu_paging_element,
80 TP_PROTO(u64 pte, int level),
81 TP_ARGS(pte, level),
82
83 TP_STRUCT__entry(
84 __field(__u64, pte)
85 __field(__u32, level)
86 ),
87
88 TP_fast_assign(
89 __entry->pte = pte;
90 __entry->level = level;
91 ),
92
93 TP_printk("pte %llx level %u", __entry->pte, __entry->level)
94);
95
96/* We set a pte accessed bit */
97TRACE_EVENT(
98 kvm_mmu_set_accessed_bit,
99 TP_PROTO(unsigned long table_gfn, unsigned index, unsigned size),
100 TP_ARGS(table_gfn, index, size),
101
102 TP_STRUCT__entry(
103 __field(__u64, gpa)
104 ),
105
106 TP_fast_assign(
107 __entry->gpa = ((u64)table_gfn << PAGE_SHIFT)
108 + index * size;
109 ),
110
111 TP_printk("gpa %llx", __entry->gpa)
112);
113
114/* We set a pte dirty bit */
115TRACE_EVENT(
116 kvm_mmu_set_dirty_bit,
117 TP_PROTO(unsigned long table_gfn, unsigned index, unsigned size),
118 TP_ARGS(table_gfn, index, size),
119
120 TP_STRUCT__entry(
121 __field(__u64, gpa)
122 ),
123
124 TP_fast_assign(
125 __entry->gpa = ((u64)table_gfn << PAGE_SHIFT)
126 + index * size;
127 ),
128
129 TP_printk("gpa %llx", __entry->gpa)
130);
131
132TRACE_EVENT(
133 kvm_mmu_walker_error,
134 TP_PROTO(u32 pferr),
135 TP_ARGS(pferr),
136
137 TP_STRUCT__entry(
138 __field(__u32, pferr)
139 ),
140
141 TP_fast_assign(
142 __entry->pferr = pferr;
143 ),
144
145 TP_printk("pferr %x %s", __entry->pferr,
146 __print_flags(__entry->pferr, "|", kvm_mmu_trace_pferr_flags))
147);
148
Avi Kivityf691fe12009-07-06 15:58:14 +0300149TRACE_EVENT(
150 kvm_mmu_get_page,
151 TP_PROTO(struct kvm_mmu_page *sp, bool created),
152 TP_ARGS(sp, created),
153
154 TP_STRUCT__entry(
155 KVM_MMU_PAGE_FIELDS
156 __field(bool, created)
157 ),
158
159 TP_fast_assign(
160 KVM_MMU_PAGE_ASSIGN(sp)
161 __entry->created = created;
162 ),
163
164 TP_printk("%s %s", KVM_MMU_PAGE_PRINTK(),
165 __entry->created ? "new" : "existing")
166);
167
168TRACE_EVENT(
169 kvm_mmu_sync_page,
170 TP_PROTO(struct kvm_mmu_page *sp),
171 TP_ARGS(sp),
172
173 TP_STRUCT__entry(
174 KVM_MMU_PAGE_FIELDS
175 ),
176
177 TP_fast_assign(
178 KVM_MMU_PAGE_ASSIGN(sp)
179 ),
180
181 TP_printk("%s", KVM_MMU_PAGE_PRINTK())
182);
183
184TRACE_EVENT(
185 kvm_mmu_unsync_page,
186 TP_PROTO(struct kvm_mmu_page *sp),
187 TP_ARGS(sp),
188
189 TP_STRUCT__entry(
190 KVM_MMU_PAGE_FIELDS
191 ),
192
193 TP_fast_assign(
194 KVM_MMU_PAGE_ASSIGN(sp)
195 ),
196
197 TP_printk("%s", KVM_MMU_PAGE_PRINTK())
198);
199
200TRACE_EVENT(
201 kvm_mmu_zap_page,
202 TP_PROTO(struct kvm_mmu_page *sp),
203 TP_ARGS(sp),
204
205 TP_STRUCT__entry(
206 KVM_MMU_PAGE_FIELDS
207 ),
208
209 TP_fast_assign(
210 KVM_MMU_PAGE_ASSIGN(sp)
211 ),
212
213 TP_printk("%s", KVM_MMU_PAGE_PRINTK())
214);
215
Avi Kivity07420172009-07-06 12:21:32 +0300216#endif /* _TRACE_KVMMMU_H */
217
Xiao Guangrong2ed152a2010-03-10 19:00:43 +0800218#undef TRACE_INCLUDE_PATH
219#define TRACE_INCLUDE_PATH .
220#undef TRACE_INCLUDE_FILE
221#define TRACE_INCLUDE_FILE mmutrace
222
Avi Kivity07420172009-07-06 12:21:32 +0300223/* This part must be outside protection */
224#include <trace/define_trace.h>