The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/xen/interface/arch-x86/pmu.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    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 

Cache object: 014e38eb5721118cf085b075980a73e1


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.