xref: /openbmc/linux/include/xen/interface/xenpmu.h (revision 9e2b3e83)
1*9e2b3e83SJuergen Gross /* SPDX-License-Identifier: MIT */
25f141548SBoris Ostrovsky #ifndef __XEN_PUBLIC_XENPMU_H__
35f141548SBoris Ostrovsky #define __XEN_PUBLIC_XENPMU_H__
45f141548SBoris Ostrovsky 
55f141548SBoris Ostrovsky #include "xen.h"
65f141548SBoris Ostrovsky 
75f141548SBoris Ostrovsky #define XENPMU_VER_MAJ    0
85f141548SBoris Ostrovsky #define XENPMU_VER_MIN    1
95f141548SBoris Ostrovsky 
105f141548SBoris Ostrovsky /*
115f141548SBoris Ostrovsky  * ` enum neg_errnoval
125f141548SBoris Ostrovsky  * ` HYPERVISOR_xenpmu_op(enum xenpmu_op cmd, struct xenpmu_params *args);
135f141548SBoris Ostrovsky  *
145f141548SBoris Ostrovsky  * @cmd  == XENPMU_* (PMU operation)
155f141548SBoris Ostrovsky  * @args == struct xenpmu_params
165f141548SBoris Ostrovsky  */
175f141548SBoris Ostrovsky /* ` enum xenpmu_op { */
185f141548SBoris Ostrovsky #define XENPMU_mode_get        0 /* Also used for getting PMU version */
195f141548SBoris Ostrovsky #define XENPMU_mode_set        1
205f141548SBoris Ostrovsky #define XENPMU_feature_get     2
215f141548SBoris Ostrovsky #define XENPMU_feature_set     3
225f141548SBoris Ostrovsky #define XENPMU_init            4
235f141548SBoris Ostrovsky #define XENPMU_finish          5
246b08cd63SBoris Ostrovsky #define XENPMU_lvtpc_set       6
256b08cd63SBoris Ostrovsky #define XENPMU_flush           7
265f141548SBoris Ostrovsky 
275f141548SBoris Ostrovsky /* ` } */
285f141548SBoris Ostrovsky 
295f141548SBoris Ostrovsky /* Parameters structure for HYPERVISOR_xenpmu_op call */
305f141548SBoris Ostrovsky struct xen_pmu_params {
315f141548SBoris Ostrovsky 	/* IN/OUT parameters */
325f141548SBoris Ostrovsky 	struct {
335f141548SBoris Ostrovsky 		uint32_t maj;
345f141548SBoris Ostrovsky 		uint32_t min;
355f141548SBoris Ostrovsky 	} version;
365f141548SBoris Ostrovsky 	uint64_t val;
375f141548SBoris Ostrovsky 
385f141548SBoris Ostrovsky 	/* IN parameters */
395f141548SBoris Ostrovsky 	uint32_t vcpu;
405f141548SBoris Ostrovsky 	uint32_t pad;
415f141548SBoris Ostrovsky };
425f141548SBoris Ostrovsky 
435f141548SBoris Ostrovsky /* PMU modes:
445f141548SBoris Ostrovsky  * - XENPMU_MODE_OFF:   No PMU virtualization
455f141548SBoris Ostrovsky  * - XENPMU_MODE_SELF:  Guests can profile themselves
465f141548SBoris Ostrovsky  * - XENPMU_MODE_HV:    Guests can profile themselves, dom0 profiles
475f141548SBoris Ostrovsky  *                      itself and Xen
485f141548SBoris Ostrovsky  * - XENPMU_MODE_ALL:   Only dom0 has access to VPMU and it profiles
495f141548SBoris Ostrovsky  *                      everyone: itself, the hypervisor and the guests.
505f141548SBoris Ostrovsky  */
515f141548SBoris Ostrovsky #define XENPMU_MODE_OFF           0
525f141548SBoris Ostrovsky #define XENPMU_MODE_SELF          (1<<0)
535f141548SBoris Ostrovsky #define XENPMU_MODE_HV            (1<<1)
545f141548SBoris Ostrovsky #define XENPMU_MODE_ALL           (1<<2)
555f141548SBoris Ostrovsky 
565f141548SBoris Ostrovsky /*
575f141548SBoris Ostrovsky  * PMU features:
585f141548SBoris Ostrovsky  * - XENPMU_FEATURE_INTEL_BTS: Intel BTS support (ignored on AMD)
595f141548SBoris Ostrovsky  */
605f141548SBoris Ostrovsky #define XENPMU_FEATURE_INTEL_BTS  1
615f141548SBoris Ostrovsky 
6265d0cf0bSBoris Ostrovsky /*
6365d0cf0bSBoris Ostrovsky  * Shared PMU data between hypervisor and PV(H) domains.
6465d0cf0bSBoris Ostrovsky  *
6565d0cf0bSBoris Ostrovsky  * The hypervisor fills out this structure during PMU interrupt and sends an
6665d0cf0bSBoris Ostrovsky  * interrupt to appropriate VCPU.
6765d0cf0bSBoris Ostrovsky  * Architecture-independent fields of xen_pmu_data are WO for the hypervisor
6865d0cf0bSBoris Ostrovsky  * and RO for the guest but some fields in xen_pmu_arch can be writable
6965d0cf0bSBoris Ostrovsky  * by both the hypervisor and the guest (see arch-$arch/pmu.h).
7065d0cf0bSBoris Ostrovsky  */
7165d0cf0bSBoris Ostrovsky struct xen_pmu_data {
7265d0cf0bSBoris Ostrovsky 	/* Interrupted VCPU */
7365d0cf0bSBoris Ostrovsky 	uint32_t vcpu_id;
7465d0cf0bSBoris Ostrovsky 
7565d0cf0bSBoris Ostrovsky 	/*
7665d0cf0bSBoris Ostrovsky 	 * Physical processor on which the interrupt occurred. On non-privileged
7765d0cf0bSBoris Ostrovsky 	 * guests set to vcpu_id;
7865d0cf0bSBoris Ostrovsky 	 */
7965d0cf0bSBoris Ostrovsky 	uint32_t pcpu_id;
8065d0cf0bSBoris Ostrovsky 
8165d0cf0bSBoris Ostrovsky 	/*
8265d0cf0bSBoris Ostrovsky 	 * Domain that was interrupted. On non-privileged guests set to
8365d0cf0bSBoris Ostrovsky 	 * DOMID_SELF.
8465d0cf0bSBoris Ostrovsky 	 * On privileged guests can be DOMID_SELF, DOMID_XEN, or, when in
8565d0cf0bSBoris Ostrovsky 	 * XENPMU_MODE_ALL mode, domain ID of another domain.
8665d0cf0bSBoris Ostrovsky 	 */
8765d0cf0bSBoris Ostrovsky 	domid_t  domain_id;
8865d0cf0bSBoris Ostrovsky 
8965d0cf0bSBoris Ostrovsky 	uint8_t pad[6];
9065d0cf0bSBoris Ostrovsky 
9165d0cf0bSBoris Ostrovsky 	/* Architecture-specific information */
9265d0cf0bSBoris Ostrovsky 	struct xen_pmu_arch pmu;
9365d0cf0bSBoris Ostrovsky };
9465d0cf0bSBoris Ostrovsky 
955f141548SBoris Ostrovsky #endif /* __XEN_PUBLIC_XENPMU_H__ */
96