forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
2.5 KiB
95 lines
2.5 KiB
/* SPDX-License-Identifier: GPL-2.0 */ |
|
#ifndef __XEN_PUBLIC_XENPMU_H__ |
|
#define __XEN_PUBLIC_XENPMU_H__ |
|
|
|
#include "xen.h" |
|
|
|
#define XENPMU_VER_MAJ 0 |
|
#define XENPMU_VER_MIN 1 |
|
|
|
/* |
|
* ` enum neg_errnoval |
|
* ` HYPERVISOR_xenpmu_op(enum xenpmu_op cmd, struct xenpmu_params *args); |
|
* |
|
* @cmd == XENPMU_* (PMU operation) |
|
* @args == struct xenpmu_params |
|
*/ |
|
/* ` enum xenpmu_op { */ |
|
#define XENPMU_mode_get 0 /* Also used for getting PMU version */ |
|
#define XENPMU_mode_set 1 |
|
#define XENPMU_feature_get 2 |
|
#define XENPMU_feature_set 3 |
|
#define XENPMU_init 4 |
|
#define XENPMU_finish 5 |
|
#define XENPMU_lvtpc_set 6 |
|
#define XENPMU_flush 7 |
|
|
|
/* ` } */ |
|
|
|
/* Parameters structure for HYPERVISOR_xenpmu_op call */ |
|
struct xen_pmu_params { |
|
/* IN/OUT parameters */ |
|
struct { |
|
uint32_t maj; |
|
uint32_t min; |
|
} version; |
|
uint64_t val; |
|
|
|
/* IN parameters */ |
|
uint32_t vcpu; |
|
uint32_t pad; |
|
}; |
|
|
|
/* PMU modes: |
|
* - XENPMU_MODE_OFF: No PMU virtualization |
|
* - XENPMU_MODE_SELF: Guests can profile themselves |
|
* - XENPMU_MODE_HV: Guests can profile themselves, dom0 profiles |
|
* itself and Xen |
|
* - XENPMU_MODE_ALL: Only dom0 has access to VPMU and it profiles |
|
* everyone: itself, the hypervisor and the guests. |
|
*/ |
|
#define XENPMU_MODE_OFF 0 |
|
#define XENPMU_MODE_SELF (1<<0) |
|
#define XENPMU_MODE_HV (1<<1) |
|
#define XENPMU_MODE_ALL (1<<2) |
|
|
|
/* |
|
* PMU features: |
|
* - XENPMU_FEATURE_INTEL_BTS: Intel BTS support (ignored on AMD) |
|
*/ |
|
#define XENPMU_FEATURE_INTEL_BTS 1 |
|
|
|
/* |
|
* Shared PMU data between hypervisor and PV(H) domains. |
|
* |
|
* The hypervisor fills out this structure during PMU interrupt and sends an |
|
* interrupt to appropriate VCPU. |
|
* Architecture-independent fields of xen_pmu_data are WO for the hypervisor |
|
* and RO for the guest but some fields in xen_pmu_arch can be writable |
|
* by both the hypervisor and the guest (see arch-$arch/pmu.h). |
|
*/ |
|
struct xen_pmu_data { |
|
/* Interrupted VCPU */ |
|
uint32_t vcpu_id; |
|
|
|
/* |
|
* Physical processor on which the interrupt occurred. On non-privileged |
|
* guests set to vcpu_id; |
|
*/ |
|
uint32_t pcpu_id; |
|
|
|
/* |
|
* Domain that was interrupted. On non-privileged guests set to |
|
* DOMID_SELF. |
|
* On privileged guests can be DOMID_SELF, DOMID_XEN, or, when in |
|
* XENPMU_MODE_ALL mode, domain ID of another domain. |
|
*/ |
|
domid_t domain_id; |
|
|
|
uint8_t pad[6]; |
|
|
|
/* Architecture-specific information */ |
|
struct xen_pmu_arch pmu; |
|
}; |
|
|
|
#endif /* __XEN_PUBLIC_XENPMU_H__ */
|
|
|