diff options
author | Cornelia Huck <cornelia.huck@de.ibm.com> | 2012-07-23 11:20:30 -0400 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2012-07-26 07:04:35 -0400 |
commit | ade38c311a0ad8c32e902fe1d0ae74d0d44bc71e (patch) | |
tree | 489e375232f2b036080cfb5b43dd1c792c85dcf3 /arch/s390/kvm | |
parent | 5786fffa96ae7c3f8111e29fb62e073a45efc557 (diff) |
KVM: s390: Add implementation-specific trace events
Introduce a new trace system, kvm-s390, for some kvm/s390 specific
trace points:
- injection of interrupts
- delivery of interrupts to the guest
- creation/destruction of kvm machines and vcpus
- stop actions for vcpus
- reset requests for userspace
Reviewed-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch/s390/kvm')
-rw-r--r-- | arch/s390/kvm/diag.c | 2 | ||||
-rw-r--r-- | arch/s390/kvm/intercept.c | 3 | ||||
-rw-r--r-- | arch/s390/kvm/interrupt.c | 23 | ||||
-rw-r--r-- | arch/s390/kvm/kvm-s390.c | 3 | ||||
-rw-r--r-- | arch/s390/kvm/trace-s390.h | 210 |
5 files changed, 241 insertions, 0 deletions
diff --git a/arch/s390/kvm/diag.c b/arch/s390/kvm/diag.c index f5d4416ebfed..a390687feb13 100644 --- a/arch/s390/kvm/diag.c +++ b/arch/s390/kvm/diag.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/kvm_host.h> | 15 | #include <linux/kvm_host.h> |
16 | #include "kvm-s390.h" | 16 | #include "kvm-s390.h" |
17 | #include "trace.h" | 17 | #include "trace.h" |
18 | #include "trace-s390.h" | ||
18 | 19 | ||
19 | static int diag_release_pages(struct kvm_vcpu *vcpu) | 20 | static int diag_release_pages(struct kvm_vcpu *vcpu) |
20 | { | 21 | { |
@@ -99,6 +100,7 @@ static int __diag_ipl_functions(struct kvm_vcpu *vcpu) | |||
99 | vcpu->run->exit_reason = KVM_EXIT_S390_RESET; | 100 | vcpu->run->exit_reason = KVM_EXIT_S390_RESET; |
100 | VCPU_EVENT(vcpu, 3, "requesting userspace resets %llx", | 101 | VCPU_EVENT(vcpu, 3, "requesting userspace resets %llx", |
101 | vcpu->run->s390_reset_flags); | 102 | vcpu->run->s390_reset_flags); |
103 | trace_kvm_s390_request_resets(vcpu->run->s390_reset_flags); | ||
102 | return -EREMOTE; | 104 | return -EREMOTE; |
103 | } | 105 | } |
104 | 106 | ||
diff --git a/arch/s390/kvm/intercept.c b/arch/s390/kvm/intercept.c index db541d62c771..22798ec33fd1 100644 --- a/arch/s390/kvm/intercept.c +++ b/arch/s390/kvm/intercept.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include "kvm-s390.h" | 20 | #include "kvm-s390.h" |
21 | #include "gaccess.h" | 21 | #include "gaccess.h" |
22 | #include "trace.h" | 22 | #include "trace.h" |
23 | #include "trace-s390.h" | ||
23 | 24 | ||
24 | static int handle_lctlg(struct kvm_vcpu *vcpu) | 25 | static int handle_lctlg(struct kvm_vcpu *vcpu) |
25 | { | 26 | { |
@@ -138,6 +139,8 @@ static int handle_stop(struct kvm_vcpu *vcpu) | |||
138 | vcpu->stat.exit_stop_request++; | 139 | vcpu->stat.exit_stop_request++; |
139 | spin_lock_bh(&vcpu->arch.local_int.lock); | 140 | spin_lock_bh(&vcpu->arch.local_int.lock); |
140 | 141 | ||
142 | trace_kvm_s390_stop_request(vcpu->arch.local_int.action_bits); | ||
143 | |||
141 | if (vcpu->arch.local_int.action_bits & ACTION_RELOADVCPU_ON_STOP) { | 144 | if (vcpu->arch.local_int.action_bits & ACTION_RELOADVCPU_ON_STOP) { |
142 | vcpu->arch.local_int.action_bits &= ~ACTION_RELOADVCPU_ON_STOP; | 145 | vcpu->arch.local_int.action_bits &= ~ACTION_RELOADVCPU_ON_STOP; |
143 | rc = SIE_INTERCEPT_RERUNVCPU; | 146 | rc = SIE_INTERCEPT_RERUNVCPU; |
diff --git a/arch/s390/kvm/interrupt.c b/arch/s390/kvm/interrupt.c index b7bc1aac8ed2..7556231fb073 100644 --- a/arch/s390/kvm/interrupt.c +++ b/arch/s390/kvm/interrupt.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <asm/uaccess.h> | 19 | #include <asm/uaccess.h> |
20 | #include "kvm-s390.h" | 20 | #include "kvm-s390.h" |
21 | #include "gaccess.h" | 21 | #include "gaccess.h" |
22 | #include "trace-s390.h" | ||
22 | 23 | ||
23 | static int psw_extint_disabled(struct kvm_vcpu *vcpu) | 24 | static int psw_extint_disabled(struct kvm_vcpu *vcpu) |
24 | { | 25 | { |
@@ -130,6 +131,8 @@ static void __do_deliver_interrupt(struct kvm_vcpu *vcpu, | |||
130 | case KVM_S390_INT_EMERGENCY: | 131 | case KVM_S390_INT_EMERGENCY: |
131 | VCPU_EVENT(vcpu, 4, "%s", "interrupt: sigp emerg"); | 132 | VCPU_EVENT(vcpu, 4, "%s", "interrupt: sigp emerg"); |
132 | vcpu->stat.deliver_emergency_signal++; | 133 | vcpu->stat.deliver_emergency_signal++; |
134 | trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id, inti->type, | ||
135 | inti->emerg.code, 0); | ||
133 | rc = put_guest_u16(vcpu, __LC_EXT_INT_CODE, 0x1201); | 136 | rc = put_guest_u16(vcpu, __LC_EXT_INT_CODE, 0x1201); |
134 | if (rc == -EFAULT) | 137 | if (rc == -EFAULT) |
135 | exception = 1; | 138 | exception = 1; |
@@ -152,6 +155,8 @@ static void __do_deliver_interrupt(struct kvm_vcpu *vcpu, | |||
152 | case KVM_S390_INT_EXTERNAL_CALL: | 155 | case KVM_S390_INT_EXTERNAL_CALL: |
153 | VCPU_EVENT(vcpu, 4, "%s", "interrupt: sigp ext call"); | 156 | VCPU_EVENT(vcpu, 4, "%s", "interrupt: sigp ext call"); |
154 | vcpu->stat.deliver_external_call++; | 157 | vcpu->stat.deliver_external_call++; |
158 | trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id, inti->type, | ||
159 | inti->extcall.code, 0); | ||
155 | rc = put_guest_u16(vcpu, __LC_EXT_INT_CODE, 0x1202); | 160 | rc = put_guest_u16(vcpu, __LC_EXT_INT_CODE, 0x1202); |
156 | if (rc == -EFAULT) | 161 | if (rc == -EFAULT) |
157 | exception = 1; | 162 | exception = 1; |
@@ -175,6 +180,8 @@ static void __do_deliver_interrupt(struct kvm_vcpu *vcpu, | |||
175 | VCPU_EVENT(vcpu, 4, "interrupt: sclp parm:%x", | 180 | VCPU_EVENT(vcpu, 4, "interrupt: sclp parm:%x", |
176 | inti->ext.ext_params); | 181 | inti->ext.ext_params); |
177 | vcpu->stat.deliver_service_signal++; | 182 | vcpu->stat.deliver_service_signal++; |
183 | trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id, inti->type, | ||
184 | inti->ext.ext_params, 0); | ||
178 | rc = put_guest_u16(vcpu, __LC_EXT_INT_CODE, 0x2401); | 185 | rc = put_guest_u16(vcpu, __LC_EXT_INT_CODE, 0x2401); |
179 | if (rc == -EFAULT) | 186 | if (rc == -EFAULT) |
180 | exception = 1; | 187 | exception = 1; |
@@ -198,6 +205,9 @@ static void __do_deliver_interrupt(struct kvm_vcpu *vcpu, | |||
198 | VCPU_EVENT(vcpu, 4, "interrupt: virtio parm:%x,parm64:%llx", | 205 | VCPU_EVENT(vcpu, 4, "interrupt: virtio parm:%x,parm64:%llx", |
199 | inti->ext.ext_params, inti->ext.ext_params2); | 206 | inti->ext.ext_params, inti->ext.ext_params2); |
200 | vcpu->stat.deliver_virtio_interrupt++; | 207 | vcpu->stat.deliver_virtio_interrupt++; |
208 | trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id, inti->type, | ||
209 | inti->ext.ext_params, | ||
210 | inti->ext.ext_params2); | ||
201 | rc = put_guest_u16(vcpu, __LC_EXT_INT_CODE, 0x2603); | 211 | rc = put_guest_u16(vcpu, __LC_EXT_INT_CODE, 0x2603); |
202 | if (rc == -EFAULT) | 212 | if (rc == -EFAULT) |
203 | exception = 1; | 213 | exception = 1; |
@@ -229,6 +239,8 @@ static void __do_deliver_interrupt(struct kvm_vcpu *vcpu, | |||
229 | case KVM_S390_SIGP_STOP: | 239 | case KVM_S390_SIGP_STOP: |
230 | VCPU_EVENT(vcpu, 4, "%s", "interrupt: cpu stop"); | 240 | VCPU_EVENT(vcpu, 4, "%s", "interrupt: cpu stop"); |
231 | vcpu->stat.deliver_stop_signal++; | 241 | vcpu->stat.deliver_stop_signal++; |
242 | trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id, inti->type, | ||
243 | 0, 0); | ||
232 | __set_intercept_indicator(vcpu, inti); | 244 | __set_intercept_indicator(vcpu, inti); |
233 | break; | 245 | break; |
234 | 246 | ||
@@ -236,12 +248,16 @@ static void __do_deliver_interrupt(struct kvm_vcpu *vcpu, | |||
236 | VCPU_EVENT(vcpu, 4, "interrupt: set prefix to %x", | 248 | VCPU_EVENT(vcpu, 4, "interrupt: set prefix to %x", |
237 | inti->prefix.address); | 249 | inti->prefix.address); |
238 | vcpu->stat.deliver_prefix_signal++; | 250 | vcpu->stat.deliver_prefix_signal++; |
251 | trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id, inti->type, | ||
252 | inti->prefix.address, 0); | ||
239 | kvm_s390_set_prefix(vcpu, inti->prefix.address); | 253 | kvm_s390_set_prefix(vcpu, inti->prefix.address); |
240 | break; | 254 | break; |
241 | 255 | ||
242 | case KVM_S390_RESTART: | 256 | case KVM_S390_RESTART: |
243 | VCPU_EVENT(vcpu, 4, "%s", "interrupt: cpu restart"); | 257 | VCPU_EVENT(vcpu, 4, "%s", "interrupt: cpu restart"); |
244 | vcpu->stat.deliver_restart_signal++; | 258 | vcpu->stat.deliver_restart_signal++; |
259 | trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id, inti->type, | ||
260 | 0, 0); | ||
245 | rc = copy_to_guest(vcpu, offsetof(struct _lowcore, | 261 | rc = copy_to_guest(vcpu, offsetof(struct _lowcore, |
246 | restart_old_psw), &vcpu->arch.sie_block->gpsw, sizeof(psw_t)); | 262 | restart_old_psw), &vcpu->arch.sie_block->gpsw, sizeof(psw_t)); |
247 | if (rc == -EFAULT) | 263 | if (rc == -EFAULT) |
@@ -259,6 +275,8 @@ static void __do_deliver_interrupt(struct kvm_vcpu *vcpu, | |||
259 | inti->pgm.code, | 275 | inti->pgm.code, |
260 | table[vcpu->arch.sie_block->ipa >> 14]); | 276 | table[vcpu->arch.sie_block->ipa >> 14]); |
261 | vcpu->stat.deliver_program_int++; | 277 | vcpu->stat.deliver_program_int++; |
278 | trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id, inti->type, | ||
279 | inti->pgm.code, 0); | ||
262 | rc = put_guest_u16(vcpu, __LC_PGM_INT_CODE, inti->pgm.code); | 280 | rc = put_guest_u16(vcpu, __LC_PGM_INT_CODE, inti->pgm.code); |
263 | if (rc == -EFAULT) | 281 | if (rc == -EFAULT) |
264 | exception = 1; | 282 | exception = 1; |
@@ -515,6 +533,7 @@ int kvm_s390_inject_program_int(struct kvm_vcpu *vcpu, u16 code) | |||
515 | inti->pgm.code = code; | 533 | inti->pgm.code = code; |
516 | 534 | ||
517 | VCPU_EVENT(vcpu, 3, "inject: program check %d (from kernel)", code); | 535 | VCPU_EVENT(vcpu, 3, "inject: program check %d (from kernel)", code); |
536 | trace_kvm_s390_inject_vcpu(vcpu->vcpu_id, inti->type, code, 0, 1); | ||
518 | spin_lock_bh(&li->lock); | 537 | spin_lock_bh(&li->lock); |
519 | list_add(&inti->list, &li->list); | 538 | list_add(&inti->list, &li->list); |
520 | atomic_set(&li->active, 1); | 539 | atomic_set(&li->active, 1); |
@@ -556,6 +575,8 @@ int kvm_s390_inject_vm(struct kvm *kvm, | |||
556 | kfree(inti); | 575 | kfree(inti); |
557 | return -EINVAL; | 576 | return -EINVAL; |
558 | } | 577 | } |
578 | trace_kvm_s390_inject_vm(s390int->type, s390int->parm, s390int->parm64, | ||
579 | 2); | ||
559 | 580 | ||
560 | mutex_lock(&kvm->lock); | 581 | mutex_lock(&kvm->lock); |
561 | fi = &kvm->arch.float_int; | 582 | fi = &kvm->arch.float_int; |
@@ -621,6 +642,8 @@ int kvm_s390_inject_vcpu(struct kvm_vcpu *vcpu, | |||
621 | kfree(inti); | 642 | kfree(inti); |
622 | return -EINVAL; | 643 | return -EINVAL; |
623 | } | 644 | } |
645 | trace_kvm_s390_inject_vcpu(vcpu->vcpu_id, s390int->type, s390int->parm, | ||
646 | s390int->parm64, 2); | ||
624 | 647 | ||
625 | mutex_lock(&vcpu->kvm->lock); | 648 | mutex_lock(&vcpu->kvm->lock); |
626 | li = &vcpu->arch.local_int; | 649 | li = &vcpu->arch.local_int; |
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index 4613602e123e..e83df7f0fedd 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c | |||
@@ -34,6 +34,7 @@ | |||
34 | 34 | ||
35 | #define CREATE_TRACE_POINTS | 35 | #define CREATE_TRACE_POINTS |
36 | #include "trace.h" | 36 | #include "trace.h" |
37 | #include "trace-s390.h" | ||
37 | 38 | ||
38 | #define VCPU_STAT(x) offsetof(struct kvm_vcpu, stat.x), KVM_STAT_VCPU | 39 | #define VCPU_STAT(x) offsetof(struct kvm_vcpu, stat.x), KVM_STAT_VCPU |
39 | 40 | ||
@@ -245,6 +246,7 @@ out_err: | |||
245 | void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu) | 246 | void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu) |
246 | { | 247 | { |
247 | VCPU_EVENT(vcpu, 3, "%s", "free cpu"); | 248 | VCPU_EVENT(vcpu, 3, "%s", "free cpu"); |
249 | trace_kvm_s390_destroy_vcpu(vcpu->vcpu_id); | ||
248 | if (!kvm_is_ucontrol(vcpu->kvm)) { | 250 | if (!kvm_is_ucontrol(vcpu->kvm)) { |
249 | clear_bit(63 - vcpu->vcpu_id, | 251 | clear_bit(63 - vcpu->vcpu_id, |
250 | (unsigned long *) &vcpu->kvm->arch.sca->mcn); | 252 | (unsigned long *) &vcpu->kvm->arch.sca->mcn); |
@@ -420,6 +422,7 @@ struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm, | |||
420 | goto out_free_sie_block; | 422 | goto out_free_sie_block; |
421 | VM_EVENT(kvm, 3, "create cpu %d at %p, sie block at %p", id, vcpu, | 423 | VM_EVENT(kvm, 3, "create cpu %d at %p, sie block at %p", id, vcpu, |
422 | vcpu->arch.sie_block); | 424 | vcpu->arch.sie_block); |
425 | trace_kvm_s390_create_vcpu(id, vcpu, vcpu->arch.sie_block); | ||
423 | 426 | ||
424 | return vcpu; | 427 | return vcpu; |
425 | out_free_sie_block: | 428 | out_free_sie_block: |
diff --git a/arch/s390/kvm/trace-s390.h b/arch/s390/kvm/trace-s390.h new file mode 100644 index 000000000000..90fdf85b5ff7 --- /dev/null +++ b/arch/s390/kvm/trace-s390.h | |||
@@ -0,0 +1,210 @@ | |||
1 | #if !defined(_TRACE_KVMS390_H) || defined(TRACE_HEADER_MULTI_READ) | ||
2 | #define _TRACE_KVMS390_H | ||
3 | |||
4 | #include <linux/tracepoint.h> | ||
5 | |||
6 | #undef TRACE_SYSTEM | ||
7 | #define TRACE_SYSTEM kvm-s390 | ||
8 | #define TRACE_INCLUDE_PATH . | ||
9 | #undef TRACE_INCLUDE_FILE | ||
10 | #define TRACE_INCLUDE_FILE trace-s390 | ||
11 | |||
12 | /* | ||
13 | * Trace point for the creation of the kvm instance. | ||
14 | */ | ||
15 | TRACE_EVENT(kvm_s390_create_vm, | ||
16 | TP_PROTO(unsigned long type), | ||
17 | TP_ARGS(type), | ||
18 | |||
19 | TP_STRUCT__entry( | ||
20 | __field(unsigned long, type) | ||
21 | ), | ||
22 | |||
23 | TP_fast_assign( | ||
24 | __entry->type = type; | ||
25 | ), | ||
26 | |||
27 | TP_printk("create vm%s", | ||
28 | __entry->type & KVM_VM_S390_UCONTROL ? " (UCONTROL)" : "") | ||
29 | ); | ||
30 | |||
31 | /* | ||
32 | * Trace points for creation and destruction of vpcus. | ||
33 | */ | ||
34 | TRACE_EVENT(kvm_s390_create_vcpu, | ||
35 | TP_PROTO(unsigned int id, struct kvm_vcpu *vcpu, | ||
36 | struct kvm_s390_sie_block *sie_block), | ||
37 | TP_ARGS(id, vcpu, sie_block), | ||
38 | |||
39 | TP_STRUCT__entry( | ||
40 | __field(unsigned int, id) | ||
41 | __field(struct kvm_vcpu *, vcpu) | ||
42 | __field(struct kvm_s390_sie_block *, sie_block) | ||
43 | ), | ||
44 | |||
45 | TP_fast_assign( | ||
46 | __entry->id = id; | ||
47 | __entry->vcpu = vcpu; | ||
48 | __entry->sie_block = sie_block; | ||
49 | ), | ||
50 | |||
51 | TP_printk("create cpu %d at %p, sie block at %p", __entry->id, | ||
52 | __entry->vcpu, __entry->sie_block) | ||
53 | ); | ||
54 | |||
55 | TRACE_EVENT(kvm_s390_destroy_vcpu, | ||
56 | TP_PROTO(unsigned int id), | ||
57 | TP_ARGS(id), | ||
58 | |||
59 | TP_STRUCT__entry( | ||
60 | __field(unsigned int, id) | ||
61 | ), | ||
62 | |||
63 | TP_fast_assign( | ||
64 | __entry->id = id; | ||
65 | ), | ||
66 | |||
67 | TP_printk("destroy cpu %d", __entry->id) | ||
68 | ); | ||
69 | |||
70 | /* | ||
71 | * Trace points for injection of interrupts, either per machine or | ||
72 | * per vcpu. | ||
73 | */ | ||
74 | |||
75 | #define kvm_s390_int_type \ | ||
76 | {KVM_S390_SIGP_STOP, "sigp stop"}, \ | ||
77 | {KVM_S390_PROGRAM_INT, "program interrupt"}, \ | ||
78 | {KVM_S390_SIGP_SET_PREFIX, "sigp set prefix"}, \ | ||
79 | {KVM_S390_RESTART, "sigp restart"}, \ | ||
80 | {KVM_S390_INT_VIRTIO, "virtio interrupt"}, \ | ||
81 | {KVM_S390_INT_SERVICE, "sclp interrupt"}, \ | ||
82 | {KVM_S390_INT_EMERGENCY, "sigp emergency"}, \ | ||
83 | {KVM_S390_INT_EXTERNAL_CALL, "sigp ext call"} | ||
84 | |||
85 | TRACE_EVENT(kvm_s390_inject_vm, | ||
86 | TP_PROTO(__u64 type, __u32 parm, __u64 parm64, int who), | ||
87 | TP_ARGS(type, parm, parm64, who), | ||
88 | |||
89 | TP_STRUCT__entry( | ||
90 | __field(__u32, inttype) | ||
91 | __field(__u32, parm) | ||
92 | __field(__u64, parm64) | ||
93 | __field(int, who) | ||
94 | ), | ||
95 | |||
96 | TP_fast_assign( | ||
97 | __entry->inttype = type & 0x00000000ffffffff; | ||
98 | __entry->parm = parm; | ||
99 | __entry->parm64 = parm64; | ||
100 | __entry->who = who; | ||
101 | ), | ||
102 | |||
103 | TP_printk("inject%s: type:%x (%s) parm:%x parm64:%llx", | ||
104 | (__entry->who == 1) ? " (from kernel)" : | ||
105 | (__entry->who == 2) ? " (from user)" : "", | ||
106 | __entry->inttype, | ||
107 | __print_symbolic(__entry->inttype, kvm_s390_int_type), | ||
108 | __entry->parm, __entry->parm64) | ||
109 | ); | ||
110 | |||
111 | TRACE_EVENT(kvm_s390_inject_vcpu, | ||
112 | TP_PROTO(unsigned int id, __u64 type, __u32 parm, __u64 parm64, \ | ||
113 | int who), | ||
114 | TP_ARGS(id, type, parm, parm64, who), | ||
115 | |||
116 | TP_STRUCT__entry( | ||
117 | __field(int, id) | ||
118 | __field(__u32, inttype) | ||
119 | __field(__u32, parm) | ||
120 | __field(__u64, parm64) | ||
121 | __field(int, who) | ||
122 | ), | ||
123 | |||
124 | TP_fast_assign( | ||
125 | __entry->id = id; | ||
126 | __entry->inttype = type & 0x00000000ffffffff; | ||
127 | __entry->parm = parm; | ||
128 | __entry->parm64 = parm64; | ||
129 | __entry->who = who; | ||
130 | ), | ||
131 | |||
132 | TP_printk("inject%s (vcpu %d): type:%x (%s) parm:%x parm64:%llx", | ||
133 | (__entry->who == 1) ? " (from kernel)" : | ||
134 | (__entry->who == 2) ? " (from user)" : "", | ||
135 | __entry->id, __entry->inttype, | ||
136 | __print_symbolic(__entry->inttype, kvm_s390_int_type), | ||
137 | __entry->parm, __entry->parm64) | ||
138 | ); | ||
139 | |||
140 | /* | ||
141 | * Trace point for the actual delivery of interrupts. | ||
142 | */ | ||
143 | TRACE_EVENT(kvm_s390_deliver_interrupt, | ||
144 | TP_PROTO(unsigned int id, __u64 type, __u32 data0, __u64 data1), | ||
145 | TP_ARGS(id, type, data0, data1), | ||
146 | |||
147 | TP_STRUCT__entry( | ||
148 | __field(int, id) | ||
149 | __field(__u32, inttype) | ||
150 | __field(__u32, data0) | ||
151 | __field(__u64, data1) | ||
152 | ), | ||
153 | |||
154 | TP_fast_assign( | ||
155 | __entry->id = id; | ||
156 | __entry->inttype = type & 0x00000000ffffffff; | ||
157 | __entry->data0 = data0; | ||
158 | __entry->data1 = data1; | ||
159 | ), | ||
160 | |||
161 | TP_printk("deliver interrupt (vcpu %d): type:%x (%s) " \ | ||
162 | "data:%08x %016llx", | ||
163 | __entry->id, __entry->inttype, | ||
164 | __print_symbolic(__entry->inttype, kvm_s390_int_type), | ||
165 | __entry->data0, __entry->data1) | ||
166 | ); | ||
167 | |||
168 | /* | ||
169 | * Trace point for resets that may be requested from userspace. | ||
170 | */ | ||
171 | TRACE_EVENT(kvm_s390_request_resets, | ||
172 | TP_PROTO(__u64 resets), | ||
173 | TP_ARGS(resets), | ||
174 | |||
175 | TP_STRUCT__entry( | ||
176 | __field(__u64, resets) | ||
177 | ), | ||
178 | |||
179 | TP_fast_assign( | ||
180 | __entry->resets = resets; | ||
181 | ), | ||
182 | |||
183 | TP_printk("requesting userspace resets %llx", | ||
184 | __entry->resets) | ||
185 | ); | ||
186 | |||
187 | /* | ||
188 | * Trace point for a vcpu's stop requests. | ||
189 | */ | ||
190 | TRACE_EVENT(kvm_s390_stop_request, | ||
191 | TP_PROTO(unsigned int action_bits), | ||
192 | TP_ARGS(action_bits), | ||
193 | |||
194 | TP_STRUCT__entry( | ||
195 | __field(unsigned int, action_bits) | ||
196 | ), | ||
197 | |||
198 | TP_fast_assign( | ||
199 | __entry->action_bits = action_bits; | ||
200 | ), | ||
201 | |||
202 | TP_printk("stop request, action_bits = %08x", | ||
203 | __entry->action_bits) | ||
204 | ); | ||
205 | |||
206 | |||
207 | #endif /* _TRACE_KVMS390_H */ | ||
208 | |||
209 | /* This part must be outside protection */ | ||
210 | #include <trace/define_trace.h> | ||