| /* SPDX-License-Identifier: MIT */ | 
 | #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__ */ |