/root/src/xen/xen/arch/x86/trace.c
Line | Count | Source (jump to first uncovered line) |
1 | | #include <xen/init.h> |
2 | | #include <xen/kernel.h> |
3 | | #include <xen/lib.h> |
4 | | #include <xen/domain.h> |
5 | | #include <xen/sched.h> |
6 | | #include <xen/trace.h> |
7 | | |
8 | | void __trace_pv_trap(int trapnr, unsigned long eip, |
9 | | int use_error_code, unsigned error_code) |
10 | 0 | { |
11 | 0 | if ( is_pv_32bit_vcpu(current) ) |
12 | 0 | { |
13 | 0 | struct __packed { |
14 | 0 | unsigned eip:32, |
15 | 0 | trapnr:15, |
16 | 0 | use_error_code:1, |
17 | 0 | error_code:16; |
18 | 0 | } d; |
19 | 0 |
|
20 | 0 | d.eip = eip; |
21 | 0 | d.trapnr = trapnr; |
22 | 0 | d.error_code = error_code; |
23 | 0 | d.use_error_code=!!use_error_code; |
24 | 0 | |
25 | 0 | __trace_var(TRC_PV_TRAP, 1, sizeof(d), &d); |
26 | 0 | } |
27 | 0 | else |
28 | 0 | { |
29 | 0 | struct __packed { |
30 | 0 | unsigned long eip; |
31 | 0 | unsigned trapnr:15, |
32 | 0 | use_error_code:1, |
33 | 0 | error_code:16; |
34 | 0 | } d; |
35 | 0 | unsigned event; |
36 | 0 |
|
37 | 0 | d.eip = eip; |
38 | 0 | d.trapnr = trapnr; |
39 | 0 | d.error_code = error_code; |
40 | 0 | d.use_error_code=!!use_error_code; |
41 | 0 | |
42 | 0 | event = TRC_PV_TRAP; |
43 | 0 | event |= TRC_64_FLAG; |
44 | 0 | __trace_var(event, 1, sizeof(d), &d); |
45 | 0 | } |
46 | 0 | } |
47 | | |
48 | | void __trace_pv_page_fault(unsigned long addr, unsigned error_code) |
49 | 0 | { |
50 | 0 | unsigned long eip = guest_cpu_user_regs()->rip; |
51 | 0 |
|
52 | 0 | if ( is_pv_32bit_vcpu(current) ) |
53 | 0 | { |
54 | 0 | struct __packed { |
55 | 0 | u32 eip, addr, error_code; |
56 | 0 | } d; |
57 | 0 |
|
58 | 0 | d.eip = eip; |
59 | 0 | d.addr = addr; |
60 | 0 | d.error_code = error_code; |
61 | 0 | |
62 | 0 | __trace_var(TRC_PV_PAGE_FAULT, 1, sizeof(d), &d); |
63 | 0 | } |
64 | 0 | else |
65 | 0 | { |
66 | 0 | struct __packed { |
67 | 0 | unsigned long eip, addr; |
68 | 0 | u32 error_code; |
69 | 0 | } d; |
70 | 0 | unsigned event; |
71 | 0 |
|
72 | 0 | d.eip = eip; |
73 | 0 | d.addr = addr; |
74 | 0 | d.error_code = error_code; |
75 | 0 | event = TRC_PV_PAGE_FAULT; |
76 | 0 | event |= TRC_64_FLAG; |
77 | 0 | __trace_var(event, 1, sizeof(d), &d); |
78 | 0 | } |
79 | 0 | } |
80 | | |
81 | | void __trace_trap_one_addr(unsigned event, unsigned long va) |
82 | 0 | { |
83 | 0 | if ( is_pv_32bit_vcpu(current) ) |
84 | 0 | { |
85 | 0 | u32 d = va; |
86 | 0 | __trace_var(event, 1, sizeof(d), &d); |
87 | 0 | } |
88 | 0 | else |
89 | 0 | { |
90 | 0 | event |= TRC_64_FLAG; |
91 | 0 | __trace_var(event, 1, sizeof(va), &va); |
92 | 0 | } |
93 | 0 | } |
94 | | |
95 | | void __trace_trap_two_addr(unsigned event, unsigned long va1, |
96 | | unsigned long va2) |
97 | 0 | { |
98 | 0 | if ( is_pv_32bit_vcpu(current) ) |
99 | 0 | { |
100 | 0 | struct __packed { |
101 | 0 | u32 va1, va2; |
102 | 0 | } d; |
103 | 0 | d.va1=va1; |
104 | 0 | d.va2=va2; |
105 | 0 | __trace_var(event, 1, sizeof(d), &d); |
106 | 0 | } |
107 | 0 | else |
108 | 0 | { |
109 | 0 | struct __packed { |
110 | 0 | unsigned long va1, va2; |
111 | 0 | } d; |
112 | 0 | d.va1=va1; |
113 | 0 | d.va2=va2; |
114 | 0 | event |= TRC_64_FLAG; |
115 | 0 | __trace_var(event, 1, sizeof(d), &d); |
116 | 0 | } |
117 | 0 | } |
118 | | |
119 | | void __trace_ptwr_emulation(unsigned long addr, l1_pgentry_t npte) |
120 | 0 | { |
121 | 0 | unsigned long eip = guest_cpu_user_regs()->rip; |
122 | 0 |
|
123 | 0 | /* We have a couple of different modes to worry about: |
124 | 0 | * - 32-on-32: 32-bit pte, 32-bit virtual addresses |
125 | 0 | * - pae-on-pae, pae-on-64: 64-bit pte, 32-bit virtual addresses |
126 | 0 | * - 64-on-64: 64-bit pte, 64-bit virtual addresses |
127 | 0 | * pae-on-64 is the only one that requires extra code; in all other |
128 | 0 | * cases, "unsigned long" is the size of a guest virtual address. |
129 | 0 | */ |
130 | 0 |
|
131 | 0 | if ( is_pv_32bit_vcpu(current) ) |
132 | 0 | { |
133 | 0 | struct __packed { |
134 | 0 | l1_pgentry_t pte; |
135 | 0 | u32 addr, eip; |
136 | 0 | } d; |
137 | 0 | d.addr = addr; |
138 | 0 | d.eip = eip; |
139 | 0 | d.pte = npte; |
140 | 0 |
|
141 | 0 | __trace_var(TRC_PV_PTWR_EMULATION_PAE, 1, sizeof(d), &d); |
142 | 0 | } |
143 | 0 | else |
144 | 0 | { |
145 | 0 | struct { |
146 | 0 | l1_pgentry_t pte; |
147 | 0 | unsigned long addr, eip; |
148 | 0 | } d; |
149 | 0 | unsigned event; |
150 | 0 |
|
151 | 0 | d.addr = addr; |
152 | 0 | d.eip = eip; |
153 | 0 | d.pte = npte; |
154 | 0 |
|
155 | 0 | event = TRC_PV_PTWR_EMULATION; |
156 | 0 | event |= TRC_64_FLAG; |
157 | 0 | __trace_var(event, 1/*tsc*/, sizeof(d), &d); |
158 | 0 | } |
159 | 0 | } |