Commit | Line | Data |
---|---|---|
5f141548 BO |
1 | #ifndef __XEN_PUBLIC_XENPMU_H__ |
2 | #define __XEN_PUBLIC_XENPMU_H__ | |
3 | ||
4 | #include "xen.h" | |
5 | ||
6 | #define XENPMU_VER_MAJ 0 | |
7 | #define XENPMU_VER_MIN 1 | |
8 | ||
9 | /* | |
10 | * ` enum neg_errnoval | |
11 | * ` HYPERVISOR_xenpmu_op(enum xenpmu_op cmd, struct xenpmu_params *args); | |
12 | * | |
13 | * @cmd == XENPMU_* (PMU operation) | |
14 | * @args == struct xenpmu_params | |
15 | */ | |
16 | /* ` enum xenpmu_op { */ | |
17 | #define XENPMU_mode_get 0 /* Also used for getting PMU version */ | |
18 | #define XENPMU_mode_set 1 | |
19 | #define XENPMU_feature_get 2 | |
20 | #define XENPMU_feature_set 3 | |
21 | #define XENPMU_init 4 | |
22 | #define XENPMU_finish 5 | |
6b08cd63 BO |
23 | #define XENPMU_lvtpc_set 6 |
24 | #define XENPMU_flush 7 | |
5f141548 BO |
25 | |
26 | /* ` } */ | |
27 | ||
28 | /* Parameters structure for HYPERVISOR_xenpmu_op call */ | |
29 | struct xen_pmu_params { | |
30 | /* IN/OUT parameters */ | |
31 | struct { | |
32 | uint32_t maj; | |
33 | uint32_t min; | |
34 | } version; | |
35 | uint64_t val; | |
36 | ||
37 | /* IN parameters */ | |
38 | uint32_t vcpu; | |
39 | uint32_t pad; | |
40 | }; | |
41 | ||
42 | /* PMU modes: | |
43 | * - XENPMU_MODE_OFF: No PMU virtualization | |
44 | * - XENPMU_MODE_SELF: Guests can profile themselves | |
45 | * - XENPMU_MODE_HV: Guests can profile themselves, dom0 profiles | |
46 | * itself and Xen | |
47 | * - XENPMU_MODE_ALL: Only dom0 has access to VPMU and it profiles | |
48 | * everyone: itself, the hypervisor and the guests. | |
49 | */ | |
50 | #define XENPMU_MODE_OFF 0 | |
51 | #define XENPMU_MODE_SELF (1<<0) | |
52 | #define XENPMU_MODE_HV (1<<1) | |
53 | #define XENPMU_MODE_ALL (1<<2) | |
54 | ||
55 | /* | |
56 | * PMU features: | |
57 | * - XENPMU_FEATURE_INTEL_BTS: Intel BTS support (ignored on AMD) | |
58 | */ | |
59 | #define XENPMU_FEATURE_INTEL_BTS 1 | |
60 | ||
65d0cf0b BO |
61 | /* |
62 | * Shared PMU data between hypervisor and PV(H) domains. | |
63 | * | |
64 | * The hypervisor fills out this structure during PMU interrupt and sends an | |
65 | * interrupt to appropriate VCPU. | |
66 | * Architecture-independent fields of xen_pmu_data are WO for the hypervisor | |
67 | * and RO for the guest but some fields in xen_pmu_arch can be writable | |
68 | * by both the hypervisor and the guest (see arch-$arch/pmu.h). | |
69 | */ | |
70 | struct xen_pmu_data { | |
71 | /* Interrupted VCPU */ | |
72 | uint32_t vcpu_id; | |
73 | ||
74 | /* | |
75 | * Physical processor on which the interrupt occurred. On non-privileged | |
76 | * guests set to vcpu_id; | |
77 | */ | |
78 | uint32_t pcpu_id; | |
79 | ||
80 | /* | |
81 | * Domain that was interrupted. On non-privileged guests set to | |
82 | * DOMID_SELF. | |
83 | * On privileged guests can be DOMID_SELF, DOMID_XEN, or, when in | |
84 | * XENPMU_MODE_ALL mode, domain ID of another domain. | |
85 | */ | |
86 | domid_t domain_id; | |
87 | ||
88 | uint8_t pad[6]; | |
89 | ||
90 | /* Architecture-specific information */ | |
91 | struct xen_pmu_arch pmu; | |
92 | }; | |
93 | ||
5f141548 | 94 | #endif /* __XEN_PUBLIC_XENPMU_H__ */ |