1168404Spjd/*
2168404Spjd * Permission is hereby granted, free of charge, to any person obtaining a copy
3168404Spjd * of this software and associated documentation files (the "Software"), to
4168404Spjd * deal in the Software without restriction, including without limitation the
5168404Spjd * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
6168404Spjd * sell copies of the Software, and to permit persons to whom the Software is
7168404Spjd * furnished to do so, subject to the following conditions:
8168404Spjd *
9168404Spjd * The above copyright notice and this permission notice shall be included in
10168404Spjd * all copies or substantial portions of the Software.
11168404Spjd *
12168404Spjd * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
13168404Spjd * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
14168404Spjd * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
15168404Spjd * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
16168404Spjd * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
17168404Spjd * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
18168404Spjd * DEALINGS IN THE SOFTWARE.
19168404Spjd *
20168404Spjd * Copyright (c) 2015 Oracle and/or its affiliates. All rights reserved.
21168404Spjd */
22219089Spjd
23249195Smm#ifndef __XEN_PUBLIC_PMU_H__
24251478Sdelphij#define __XEN_PUBLIC_PMU_H__
25258389Savg
26168404Spjd#include "xen.h"
27168404Spjd#if defined(__i386__) || defined(__x86_64__)
28168404Spjd#include "arch-x86/pmu.h"
29168404Spjd#elif defined (__arm__) || defined (__aarch64__)
30168404Spjd#include "arch-arm.h"
31168404Spjd#else
32168404Spjd#error "Unsupported architecture"
33168404Spjd#endif
34168404Spjd
35168404Spjd#define XENPMU_VER_MAJ    0
36168404Spjd#define XENPMU_VER_MIN    1
37168404Spjd
38168404Spjd/*
39168404Spjd * ` enum neg_errnoval
40168404Spjd * ` HYPERVISOR_xenpmu_op(enum xenpmu_op cmd, struct xenpmu_params *args);
41168404Spjd *
42168404Spjd * @cmd  == XENPMU_* (PMU operation)
43168404Spjd * @args == struct xenpmu_params
44168404Spjd */
45168404Spjd/* ` enum xenpmu_op { */
46168404Spjd#define XENPMU_mode_get        0 /* Also used for getting PMU version */
47168404Spjd#define XENPMU_mode_set        1
48168404Spjd#define XENPMU_feature_get     2
49168404Spjd#define XENPMU_feature_set     3
50185029Spjd#define XENPMU_init            4
51185029Spjd#define XENPMU_finish          5
52168404Spjd#define XENPMU_lvtpc_set       6
53168404Spjd#define XENPMU_flush           7 /* Write cached MSR values to HW     */
54168404Spjd/* ` } */
55168404Spjd
56185029Spjd/* Parameters structure for HYPERVISOR_xenpmu_op call */
57168404Spjdstruct xen_pmu_params {
58168404Spjd    /* IN/OUT parameters */
59168404Spjd    struct {
60168404Spjd        uint32_t maj;
61251631Sdelphij        uint32_t min;
62168404Spjd    } version;
63168404Spjd    uint64_t val;
64168404Spjd
65251631Sdelphij    /* IN parameters */
66168404Spjd    uint32_t vcpu;
67168404Spjd    uint32_t pad;
68168404Spjd};
69168404Spjdtypedef struct xen_pmu_params xen_pmu_params_t;
70168404SpjdDEFINE_XEN_GUEST_HANDLE(xen_pmu_params_t);
71168404Spjd
72168404Spjd/* PMU modes:
73168404Spjd * - XENPMU_MODE_OFF:   No PMU virtualization
74168404Spjd * - XENPMU_MODE_SELF:  Guests can profile themselves
75168404Spjd * - XENPMU_MODE_HV:    Guests can profile themselves, dom0 profiles
76168404Spjd *                      itself and Xen
77168404Spjd * - XENPMU_MODE_ALL:   Only dom0 has access to VPMU and it profiles
78185029Spjd *                      everyone: itself, the hypervisor and the guests.
79168404Spjd */
80251631Sdelphij#define XENPMU_MODE_OFF           0
81168404Spjd#define XENPMU_MODE_SELF          (1<<0)
82168404Spjd#define XENPMU_MODE_HV            (1<<1)
83168404Spjd#define XENPMU_MODE_ALL           (1<<2)
84168404Spjd
85168404Spjd/*
86168404Spjd * PMU features:
87168404Spjd * - XENPMU_FEATURE_INTEL_BTS: Intel BTS support (ignored on AMD)
88168404Spjd */
89168404Spjd#define XENPMU_FEATURE_INTEL_BTS  1
90168404Spjd
91168404Spjd/*
92168404Spjd * Shared PMU data between hypervisor and PV(H) domains.
93168404Spjd *
94168404Spjd * The hypervisor fills out this structure during PMU interrupt and sends an
95168404Spjd * interrupt to appropriate VCPU.
96168404Spjd * Architecture-independent fields of xen_pmu_data are WO for the hypervisor
97168404Spjd * and RO for the guest but some fields in xen_pmu_arch can be writable
98168404Spjd * by both the hypervisor and the guest (see arch-$arch/pmu.h).
99168404Spjd */
100168404Spjdstruct xen_pmu_data {
101168404Spjd    /* Interrupted VCPU */
102168404Spjd    uint32_t vcpu_id;
103168404Spjd
104168404Spjd    /*
105168404Spjd     * Physical processor on which the interrupt occurred. On non-privileged
106168404Spjd     * guests set to vcpu_id;
107168404Spjd     */
108168404Spjd    uint32_t pcpu_id;
109168404Spjd
110168404Spjd    /*
111168404Spjd     * Domain that was interrupted. On non-privileged guests set to DOMID_SELF.
112185029Spjd     * On privileged guests can be DOMID_SELF, DOMID_XEN, or, when in
113185029Spjd     * XENPMU_MODE_ALL mode, domain ID of another domain.
114185029Spjd     */
115185029Spjd    domid_t  domain_id;
116185029Spjd
117185029Spjd    uint8_t pad[6];
118185029Spjd
119185029Spjd    /* Architecture-specific information */
120168404Spjd    struct xen_pmu_arch pmu;
121168404Spjd};
122168404Spjd
123168404Spjd#endif /* __XEN_PUBLIC_PMU_H__ */
124251478Sdelphij
125168404Spjd/*
126168404Spjd * Local variables:
127168404Spjd * mode: C
128185029Spjd * c-file-style: "BSD"
129219089Spjd * c-basic-offset: 4
130258632Savg * tab-width: 4
131168404Spjd * indent-tabs-mode: nil
132168404Spjd * End:
133168404Spjd */
134168404Spjd