Coverage Report

Created: 2017-10-25 09:10

/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
}