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