Home | History | Annotate | Line # | Download | only in arch-x86
      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 #define PMU_CACHED         (1<<0) /* PMU MSRs are cached in the context */
     98 #define PMU_SAMPLE_USER    (1<<1) /* Sample is from user or kernel mode */
     99 #define PMU_SAMPLE_REAL    (1<<2) /* Sample is from realmode */
    100 #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 
    168