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