Coverage Report

Created: 2017-10-25 09:10

/root/src/xen/xen/include/public/arch-x86/pmu.h
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Permission is hereby granted, free of charge, to any person obtaining a copy
3
 * of this software and associated documentation files (the "Software"), to
4
 * deal in the Software without restriction, including without limitation the
5
 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
6
 * sell copies of the Software, and to permit persons to whom the Software is
7
 * furnished to do so, subject to the following conditions:
8
 *
9
 * The above copyright notice and this permission notice shall be included in
10
 * all copies or substantial portions of the Software.
11
 *
12
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
13
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
14
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
15
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
16
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
17
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
18
 * DEALINGS IN THE SOFTWARE.
19
 *
20
 * Copyright (c) 2015 Oracle and/or its affiliates. All rights reserved.
21
 */
22
23
#ifndef __XEN_PUBLIC_ARCH_X86_PMU_H__
24
#define __XEN_PUBLIC_ARCH_X86_PMU_H__
25
26
/* x86-specific PMU definitions */
27
28
/* AMD PMU registers and structures */
29
struct xen_pmu_amd_ctxt {
30
    /*
31
     * Offsets to counter and control MSRs (relative to xen_pmu_arch.c.amd).
32
     * For PV(H) guests these fields are RO.
33
     */
34
    uint32_t counters;
35
    uint32_t ctrls;
36
37
    /* Counter MSRs */
38
#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
39
    uint64_t regs[];
40
#elif defined(__GNUC__)
41
    uint64_t regs[0];
42
#endif
43
};
44
typedef struct xen_pmu_amd_ctxt xen_pmu_amd_ctxt_t;
45
DEFINE_XEN_GUEST_HANDLE(xen_pmu_amd_ctxt_t);
46
47
/* Intel PMU registers and structures */
48
struct xen_pmu_cntr_pair {
49
    uint64_t counter;
50
    uint64_t control;
51
};
52
typedef struct xen_pmu_cntr_pair xen_pmu_cntr_pair_t;
53
DEFINE_XEN_GUEST_HANDLE(xen_pmu_cntr_pair_t);
54
55
struct xen_pmu_intel_ctxt {
56
   /*
57
    * Offsets to fixed and architectural counter MSRs (relative to
58
    * xen_pmu_arch.c.intel).
59
    * For PV(H) guests these fields are RO.
60
    */
61
    uint32_t fixed_counters;
62
    uint32_t arch_counters;
63
64
    /* PMU registers */
65
    uint64_t global_ctrl;
66
    uint64_t global_ovf_ctrl;
67
    uint64_t global_status;
68
    uint64_t fixed_ctrl;
69
    uint64_t ds_area;
70
    uint64_t pebs_enable;
71
    uint64_t debugctl;
72
73
    /* Fixed and architectural counter MSRs */
74
#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
75
    uint64_t regs[];
76
#elif defined(__GNUC__)
77
    uint64_t regs[0];
78
#endif
79
};
80
typedef struct xen_pmu_intel_ctxt xen_pmu_intel_ctxt_t;
81
DEFINE_XEN_GUEST_HANDLE(xen_pmu_intel_ctxt_t);
82
83
/* Sampled domain's registers */
84
struct xen_pmu_regs {
85
    uint64_t ip;
86
    uint64_t sp;
87
    uint64_t flags;
88
    uint16_t cs;
89
    uint16_t ss;
90
    uint8_t cpl;
91
    uint8_t pad[3];
92
};
93
typedef struct xen_pmu_regs xen_pmu_regs_t;
94
DEFINE_XEN_GUEST_HANDLE(xen_pmu_regs_t);
95
96
/* PMU flags */
97
0
#define PMU_CACHED         (1<<0) /* PMU MSRs are cached in the context */
98
0
#define PMU_SAMPLE_USER    (1<<1) /* Sample is from user or kernel mode */
99
0
#define PMU_SAMPLE_REAL    (1<<2) /* Sample is from realmode */
100
0
#define PMU_SAMPLE_PV      (1<<3) /* Sample from a PV guest */
101
102
/*
103
 * Architecture-specific information describing state of the processor at
104
 * the time of PMU interrupt.
105
 * Fields of this structure marked as RW for guest should only be written by
106
 * the guest when PMU_CACHED bit in pmu_flags is set (which is done by the
107
 * hypervisor during PMU interrupt). Hypervisor will read updated data in
108
 * XENPMU_flush hypercall and clear PMU_CACHED bit.
109
 */
110
struct xen_pmu_arch {
111
    union {
112
        /*
113
         * Processor's registers at the time of interrupt.
114
         * WO for hypervisor, RO for guests.
115
         */
116
        struct xen_pmu_regs regs;
117
        /* Padding for adding new registers to xen_pmu_regs in the future */
118
#define XENPMU_REGS_PAD_SZ  64
119
        uint8_t pad[XENPMU_REGS_PAD_SZ];
120
    } r;
121
122
    /* WO for hypervisor, RO for guest */
123
    uint64_t pmu_flags;
124
125
    /*
126
     * APIC LVTPC register.
127
     * RW for both hypervisor and guest.
128
     * Only APIC_LVT_MASKED bit is loaded by the hypervisor into hardware
129
     * during XENPMU_flush or XENPMU_lvtpc_set.
130
     */
131
    union {
132
        uint32_t lapic_lvtpc;
133
        uint64_t pad;
134
    } l;
135
136
    /*
137
     * Vendor-specific PMU registers.
138
     * RW for both hypervisor and guest (see exceptions above).
139
     * Guest's updates to this field are verified and then loaded by the
140
     * hypervisor into hardware during XENPMU_flush
141
     */
142
    union {
143
        struct xen_pmu_amd_ctxt amd;
144
        struct xen_pmu_intel_ctxt intel;
145
146
        /*
147
         * Padding for contexts (fixed parts only, does not include MSR banks
148
         * that are specified by offsets)
149
         */
150
#define XENPMU_CTXT_PAD_SZ  128
151
        uint8_t pad[XENPMU_CTXT_PAD_SZ];
152
    } c;
153
};
154
typedef struct xen_pmu_arch xen_pmu_arch_t;
155
DEFINE_XEN_GUEST_HANDLE(xen_pmu_arch_t);
156
157
#endif /* __XEN_PUBLIC_ARCH_X86_PMU_H__ */
158
/*
159
 * Local variables:
160
 * mode: C
161
 * c-file-style: "BSD"
162
 * c-basic-offset: 4
163
 * tab-width: 4
164
 * indent-tabs-mode: nil
165
 * End:
166
 */
167