/root/src/xen/xen/include/xen/trace.h
Line | Count | Source (jump to first uncovered line) |
1 | | /****************************************************************************** |
2 | | * include/xen/trace.h |
3 | | * |
4 | | * Xen Trace Buffer |
5 | | * |
6 | | * Copyright (C) 2003 by Intel Research Cambridge |
7 | | * |
8 | | * Author: Mark Williamson, mark.a.williamson@intel.com |
9 | | * Date: January 2004 |
10 | | * |
11 | | * Copyright (C) 2005 Bin Ren |
12 | | * |
13 | | * The trace buffer code is designed to allow debugging traces of Xen to be |
14 | | * generated on UP / SMP machines. Each trace entry is timestamped so that |
15 | | * it's possible to reconstruct a chronological record of trace events. |
16 | | * |
17 | | * Access to the trace buffers is via a dom0 hypervisor op and analysis of |
18 | | * trace buffer contents can then be performed using a userland tool. |
19 | | */ |
20 | | |
21 | | #ifndef __XEN_TRACE_H__ |
22 | | #define __XEN_TRACE_H__ |
23 | | |
24 | | extern int tb_init_done; |
25 | | |
26 | | #include <public/sysctl.h> |
27 | | #include <public/trace.h> |
28 | | #include <asm/trace.h> |
29 | | |
30 | | /* Used to initialise trace buffer functionality */ |
31 | | void init_trace_bufs(void); |
32 | | |
33 | | /* used to retrieve the physical address of the trace buffers */ |
34 | | int tb_control(struct xen_sysctl_tbuf_op *tbc); |
35 | | |
36 | | int trace_will_trace_event(u32 event); |
37 | | |
38 | | void __trace_var(u32 event, bool_t cycles, unsigned int extra, const void *); |
39 | | |
40 | | static inline void trace_var(u32 event, int cycles, int extra, |
41 | | const void *extra_data) |
42 | 130 | { |
43 | 130 | if ( unlikely(tb_init_done) ) |
44 | 0 | __trace_var(event, cycles, extra, extra_data); |
45 | 130 | } Unexecuted instantiation: domctl.c:trace_var Unexecuted instantiation: domain.c:trace_var Unexecuted instantiation: grant_table.c:trace_var Unexecuted instantiation: memory.c:trace_var Unexecuted instantiation: multicall.c:trace_var Line | Count | Source | 42 | 44 | { | 43 | 44 | if ( unlikely(tb_init_done) ) | 44 | 0 | __trace_var(event, cycles, extra, extra_data); | 45 | 44 | } |
Unexecuted instantiation: sched_credit2.c:trace_var Unexecuted instantiation: sched_rt.c:trace_var Unexecuted instantiation: sched_null.c:trace_var Unexecuted instantiation: schedule.c:trace_var Unexecuted instantiation: sysctl.c:trace_var Unexecuted instantiation: trace.c:trace_var Unexecuted instantiation: utility.c:trace_var Unexecuted instantiation: iommu.c:trace_var Unexecuted instantiation: compat.c:trace_var Unexecuted instantiation: io_apic.c:trace_var Line | Count | Source | 42 | 62 | { | 43 | 62 | if ( unlikely(tb_init_done) ) | 44 | 0 | __trace_var(event, cycles, extra, extra_data); | 45 | 62 | } |
Unexecuted instantiation: mm.c:trace_var Unexecuted instantiation: platform_hypercall.c:trace_var Unexecuted instantiation: setup.c:trace_var Unexecuted instantiation: traps.c:trace_var Unexecuted instantiation: cpu_idle.c:trace_var Unexecuted instantiation: mwait-idle.c:trace_var Unexecuted instantiation: vpmu.c:trace_var Unexecuted instantiation: vpmu_intel.c:trace_var Unexecuted instantiation: emulate.c:trace_var Unexecuted instantiation: hpet.c:trace_var Unexecuted instantiation: hvm.c:trace_var Unexecuted instantiation: i8254.c:trace_var Unexecuted instantiation: io.c:trace_var Unexecuted instantiation: ioreq.c:trace_var Unexecuted instantiation: rtc.c:trace_var Line | Count | Source | 42 | 24 | { | 43 | 24 | if ( unlikely(tb_init_done) ) | 44 | 0 | __trace_var(event, cycles, extra, extra_data); | 45 | 24 | } |
Unexecuted instantiation: vpic.c:trace_var Unexecuted instantiation: intr.c:trace_var Unexecuted instantiation: svm.c:trace_var Unexecuted instantiation: realmode.c:trace_var Unexecuted instantiation: vmcs.c:trace_var Unexecuted instantiation: vmx.c:trace_var Unexecuted instantiation: vvmx.c:trace_var Unexecuted instantiation: p2m.c:trace_var Unexecuted instantiation: p2m-pt.c:trace_var Unexecuted instantiation: p2m-ept.c:trace_var Unexecuted instantiation: p2m-pod.c:trace_var Unexecuted instantiation: common.c:trace_var Unexecuted instantiation: multi.c:trace_var Unexecuted instantiation: hap.c:trace_var Unexecuted instantiation: nested_ept.c:trace_var Unexecuted instantiation: emul-gate-op.c:trace_var Unexecuted instantiation: emul-inv-op.c:trace_var Unexecuted instantiation: emul-priv-op.c:trace_var Unexecuted instantiation: hypercall.c:trace_var Unexecuted instantiation: ro-page-fault.c:trace_var |
46 | | |
47 | | void __trace_hypercall(uint32_t event, unsigned long op, |
48 | | const xen_ulong_t *args); |
49 | | |
50 | | /* Convenience macros for calling the trace function. */ |
51 | | #define TRACE_0D(_e) \ |
52 | 68 | do { \ |
53 | 68 | trace_var(_e, 1, 0, NULL); \ |
54 | 68 | } while ( 0 ) |
55 | | |
56 | | #define TRACE_1D(_e,d1) \ |
57 | 18.4E | do { \ |
58 | 18.4E | if ( unlikely(tb_init_done) ) \ |
59 | 0 | { \ |
60 | 0 | u32 _d[1]; \ |
61 | 0 | _d[0] = d1; \ |
62 | 0 | __trace_var(_e, 1, sizeof(_d), _d); \ |
63 | 0 | } \ |
64 | 18.4E | } while ( 0 ) |
65 | | |
66 | | #define TRACE_2D(_e,d1,d2) \ |
67 | 10.6M | do { \ |
68 | 10.6M | if ( unlikely(tb_init_done) ) \ |
69 | 0 | { \ |
70 | 0 | u32 _d[2]; \ |
71 | 0 | _d[0] = d1; \ |
72 | 0 | _d[1] = d2; \ |
73 | 0 | __trace_var(_e, 1, sizeof(_d), _d); \ |
74 | 0 | } \ |
75 | 10.6M | } while ( 0 ) |
76 | | |
77 | | #define TRACE_3D(_e,d1,d2,d3) \ |
78 | 340k | do { \ |
79 | 340k | if ( unlikely(tb_init_done) ) \ |
80 | 0 | { \ |
81 | 0 | u32 _d[3]; \ |
82 | 0 | _d[0] = d1; \ |
83 | 0 | _d[1] = d2; \ |
84 | 0 | _d[2] = d3; \ |
85 | 0 | __trace_var(_e, 1, sizeof(_d), _d); \ |
86 | 0 | } \ |
87 | 340k | } while ( 0 ) |
88 | | |
89 | | #define TRACE_4D(_e,d1,d2,d3,d4) \ |
90 | 7.30M | do { \ |
91 | 7.30M | if ( unlikely(tb_init_done) ) \ |
92 | 0 | { \ |
93 | 0 | u32 _d[4]; \ |
94 | 0 | _d[0] = d1; \ |
95 | 0 | _d[1] = d2; \ |
96 | 0 | _d[2] = d3; \ |
97 | 0 | _d[3] = d4; \ |
98 | 0 | __trace_var(_e, 1, sizeof(_d), _d); \ |
99 | 0 | } \ |
100 | 7.30M | } while ( 0 ) |
101 | | |
102 | | #define TRACE_5D(_e,d1,d2,d3,d4,d5) \ |
103 | 0 | do { \ |
104 | 0 | if ( unlikely(tb_init_done) ) \ |
105 | 0 | { \ |
106 | 0 | u32 _d[5]; \ |
107 | 0 | _d[0] = d1; \ |
108 | 0 | _d[1] = d2; \ |
109 | 0 | _d[2] = d3; \ |
110 | 0 | _d[3] = d4; \ |
111 | 0 | _d[4] = d5; \ |
112 | 0 | __trace_var(_e, 1, sizeof(_d), _d); \ |
113 | 0 | } \ |
114 | 0 | } while ( 0 ) |
115 | | |
116 | | #define TRACE_6D(_e,d1,d2,d3,d4,d5,d6) \ |
117 | 2.10M | do { \ |
118 | 2.10M | if ( unlikely(tb_init_done) ) \ |
119 | 0 | { \ |
120 | 0 | u32 _d[6]; \ |
121 | 0 | _d[0] = d1; \ |
122 | 0 | _d[1] = d2; \ |
123 | 0 | _d[2] = d3; \ |
124 | 0 | _d[3] = d4; \ |
125 | 0 | _d[4] = d5; \ |
126 | 0 | _d[5] = d6; \ |
127 | 0 | __trace_var(_e, 1, sizeof(_d), _d); \ |
128 | 0 | } \ |
129 | 2.10M | } while ( 0 ) |
130 | | |
131 | | #endif /* __XEN_TRACE_H__ */ |