aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorArnaldo Carvalho de Melo <acme@redhat.com>2016-07-12 09:57:25 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2016-07-12 14:20:36 -0400
commitdd7bd1093622621a910cbb6a77c7addeb20c9984 (patch)
tree187cd37d8805e3f6b0a6c66ea1f51dc91cbac520 /tools
parentf2d3adf46d5763e7154e303e972c891999a4da43 (diff)
tools: Copy the header files needed by perf tools
Those kernel files were being directly accessed, which we're not allowing anymore to avoid that changes in the kernel side break tooling. Warn if these copies drift from the original files. Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Alexander Yarygin <yarygin@linux.vnet.ibm.com> Cc: Christoffer Dall <christoffer.dall@linaro.org> Cc: David Ahern <dsahern@gmail.com> Cc: Eric Auger <eric.auger@linaro.org> Cc: Hemant Kumar <hemant@linux.vnet.ibm.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Marc Zyngier <marc.zyngier@arm.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com> Cc: Srikar Dronamraju <srikar@linux.vnet.ibm.com> Cc: Wang Nan <wangnan0@huawei.com> Cc: Yunlong Song <yunlong.song@huawei.com> Link: http://lkml.kernel.org/n/tip-mnopguymhnwzjhw3mowllvsy@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools')
-rw-r--r--tools/arch/arm/include/uapi/asm/kvm.h224
-rw-r--r--tools/arch/arm64/include/uapi/asm/kvm.h258
-rw-r--r--tools/arch/mips/include/uapi/asm/kvm.h208
-rw-r--r--tools/arch/powerpc/include/uapi/asm/kvm.h612
-rw-r--r--tools/arch/s390/include/uapi/asm/kvm.h192
-rw-r--r--tools/arch/s390/include/uapi/asm/kvm_perf.h25
-rw-r--r--tools/arch/s390/include/uapi/asm/sie.h250
-rw-r--r--tools/arch/x86/include/uapi/asm/kvm.h360
-rw-r--r--tools/arch/x86/include/uapi/asm/kvm_perf.h16
-rw-r--r--tools/arch/x86/include/uapi/asm/svm.h178
-rw-r--r--tools/arch/x86/include/uapi/asm/vmx.h136
-rw-r--r--tools/perf/MANIFEST15
-rw-r--r--tools/perf/Makefile.perf30
13 files changed, 2495 insertions, 9 deletions
diff --git a/tools/arch/arm/include/uapi/asm/kvm.h b/tools/arch/arm/include/uapi/asm/kvm.h
new file mode 100644
index 000000000000..a2b3eb313a25
--- /dev/null
+++ b/tools/arch/arm/include/uapi/asm/kvm.h
@@ -0,0 +1,224 @@
1/*
2 * Copyright (C) 2012 - Virtual Open Systems and Columbia University
3 * Author: Christoffer Dall <c.dall@virtualopensystems.com>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License, version 2, as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 */
18
19#ifndef __ARM_KVM_H__
20#define __ARM_KVM_H__
21
22#include <linux/types.h>
23#include <linux/psci.h>
24#include <asm/ptrace.h>
25
26#define __KVM_HAVE_GUEST_DEBUG
27#define __KVM_HAVE_IRQ_LINE
28#define __KVM_HAVE_READONLY_MEM
29
30#define KVM_REG_SIZE(id) \
31 (1U << (((id) & KVM_REG_SIZE_MASK) >> KVM_REG_SIZE_SHIFT))
32
33/* Valid for svc_regs, abt_regs, und_regs, irq_regs in struct kvm_regs */
34#define KVM_ARM_SVC_sp svc_regs[0]
35#define KVM_ARM_SVC_lr svc_regs[1]
36#define KVM_ARM_SVC_spsr svc_regs[2]
37#define KVM_ARM_ABT_sp abt_regs[0]
38#define KVM_ARM_ABT_lr abt_regs[1]
39#define KVM_ARM_ABT_spsr abt_regs[2]
40#define KVM_ARM_UND_sp und_regs[0]
41#define KVM_ARM_UND_lr und_regs[1]
42#define KVM_ARM_UND_spsr und_regs[2]
43#define KVM_ARM_IRQ_sp irq_regs[0]
44#define KVM_ARM_IRQ_lr irq_regs[1]
45#define KVM_ARM_IRQ_spsr irq_regs[2]
46
47/* Valid only for fiq_regs in struct kvm_regs */
48#define KVM_ARM_FIQ_r8 fiq_regs[0]
49#define KVM_ARM_FIQ_r9 fiq_regs[1]
50#define KVM_ARM_FIQ_r10 fiq_regs[2]
51#define KVM_ARM_FIQ_fp fiq_regs[3]
52#define KVM_ARM_FIQ_ip fiq_regs[4]
53#define KVM_ARM_FIQ_sp fiq_regs[5]
54#define KVM_ARM_FIQ_lr fiq_regs[6]
55#define KVM_ARM_FIQ_spsr fiq_regs[7]
56
57struct kvm_regs {
58 struct pt_regs usr_regs; /* R0_usr - R14_usr, PC, CPSR */
59 unsigned long svc_regs[3]; /* SP_svc, LR_svc, SPSR_svc */
60 unsigned long abt_regs[3]; /* SP_abt, LR_abt, SPSR_abt */
61 unsigned long und_regs[3]; /* SP_und, LR_und, SPSR_und */
62 unsigned long irq_regs[3]; /* SP_irq, LR_irq, SPSR_irq */
63 unsigned long fiq_regs[8]; /* R8_fiq - R14_fiq, SPSR_fiq */
64};
65
66/* Supported Processor Types */
67#define KVM_ARM_TARGET_CORTEX_A15 0
68#define KVM_ARM_TARGET_CORTEX_A7 1
69#define KVM_ARM_NUM_TARGETS 2
70
71/* KVM_ARM_SET_DEVICE_ADDR ioctl id encoding */
72#define KVM_ARM_DEVICE_TYPE_SHIFT 0
73#define KVM_ARM_DEVICE_TYPE_MASK (0xffff << KVM_ARM_DEVICE_TYPE_SHIFT)
74#define KVM_ARM_DEVICE_ID_SHIFT 16
75#define KVM_ARM_DEVICE_ID_MASK (0xffff << KVM_ARM_DEVICE_ID_SHIFT)
76
77/* Supported device IDs */
78#define KVM_ARM_DEVICE_VGIC_V2 0
79
80/* Supported VGIC address types */
81#define KVM_VGIC_V2_ADDR_TYPE_DIST 0
82#define KVM_VGIC_V2_ADDR_TYPE_CPU 1
83
84#define KVM_VGIC_V2_DIST_SIZE 0x1000
85#define KVM_VGIC_V2_CPU_SIZE 0x2000
86
87#define KVM_ARM_VCPU_POWER_OFF 0 /* CPU is started in OFF state */
88#define KVM_ARM_VCPU_PSCI_0_2 1 /* CPU uses PSCI v0.2 */
89
90struct kvm_vcpu_init {
91 __u32 target;
92 __u32 features[7];
93};
94
95struct kvm_sregs {
96};
97
98struct kvm_fpu {
99};
100
101struct kvm_guest_debug_arch {
102};
103
104struct kvm_debug_exit_arch {
105};
106
107struct kvm_sync_regs {
108};
109
110struct kvm_arch_memory_slot {
111};
112
113/* If you need to interpret the index values, here is the key: */
114#define KVM_REG_ARM_COPROC_MASK 0x000000000FFF0000
115#define KVM_REG_ARM_COPROC_SHIFT 16
116#define KVM_REG_ARM_32_OPC2_MASK 0x0000000000000007
117#define KVM_REG_ARM_32_OPC2_SHIFT 0
118#define KVM_REG_ARM_OPC1_MASK 0x0000000000000078
119#define KVM_REG_ARM_OPC1_SHIFT 3
120#define KVM_REG_ARM_CRM_MASK 0x0000000000000780
121#define KVM_REG_ARM_CRM_SHIFT 7
122#define KVM_REG_ARM_32_CRN_MASK 0x0000000000007800
123#define KVM_REG_ARM_32_CRN_SHIFT 11
124
125#define ARM_CP15_REG_SHIFT_MASK(x,n) \
126 (((x) << KVM_REG_ARM_ ## n ## _SHIFT) & KVM_REG_ARM_ ## n ## _MASK)
127
128#define __ARM_CP15_REG(op1,crn,crm,op2) \
129 (KVM_REG_ARM | (15 << KVM_REG_ARM_COPROC_SHIFT) | \
130 ARM_CP15_REG_SHIFT_MASK(op1, OPC1) | \
131 ARM_CP15_REG_SHIFT_MASK(crn, 32_CRN) | \
132 ARM_CP15_REG_SHIFT_MASK(crm, CRM) | \
133 ARM_CP15_REG_SHIFT_MASK(op2, 32_OPC2))
134
135#define ARM_CP15_REG32(...) (__ARM_CP15_REG(__VA_ARGS__) | KVM_REG_SIZE_U32)
136
137#define __ARM_CP15_REG64(op1,crm) \
138 (__ARM_CP15_REG(op1, 0, crm, 0) | KVM_REG_SIZE_U64)
139#define ARM_CP15_REG64(...) __ARM_CP15_REG64(__VA_ARGS__)
140
141#define KVM_REG_ARM_TIMER_CTL ARM_CP15_REG32(0, 14, 3, 1)
142#define KVM_REG_ARM_TIMER_CNT ARM_CP15_REG64(1, 14)
143#define KVM_REG_ARM_TIMER_CVAL ARM_CP15_REG64(3, 14)
144
145/* Normal registers are mapped as coprocessor 16. */
146#define KVM_REG_ARM_CORE (0x0010 << KVM_REG_ARM_COPROC_SHIFT)
147#define KVM_REG_ARM_CORE_REG(name) (offsetof(struct kvm_regs, name) / 4)
148
149/* Some registers need more space to represent values. */
150#define KVM_REG_ARM_DEMUX (0x0011 << KVM_REG_ARM_COPROC_SHIFT)
151#define KVM_REG_ARM_DEMUX_ID_MASK 0x000000000000FF00
152#define KVM_REG_ARM_DEMUX_ID_SHIFT 8
153#define KVM_REG_ARM_DEMUX_ID_CCSIDR (0x00 << KVM_REG_ARM_DEMUX_ID_SHIFT)
154#define KVM_REG_ARM_DEMUX_VAL_MASK 0x00000000000000FF
155#define KVM_REG_ARM_DEMUX_VAL_SHIFT 0
156
157/* VFP registers: we could overload CP10 like ARM does, but that's ugly. */
158#define KVM_REG_ARM_VFP (0x0012 << KVM_REG_ARM_COPROC_SHIFT)
159#define KVM_REG_ARM_VFP_MASK 0x000000000000FFFF
160#define KVM_REG_ARM_VFP_BASE_REG 0x0
161#define KVM_REG_ARM_VFP_FPSID 0x1000
162#define KVM_REG_ARM_VFP_FPSCR 0x1001
163#define KVM_REG_ARM_VFP_MVFR1 0x1006
164#define KVM_REG_ARM_VFP_MVFR0 0x1007
165#define KVM_REG_ARM_VFP_FPEXC 0x1008
166#define KVM_REG_ARM_VFP_FPINST 0x1009
167#define KVM_REG_ARM_VFP_FPINST2 0x100A
168
169/* Device Control API: ARM VGIC */
170#define KVM_DEV_ARM_VGIC_GRP_ADDR 0
171#define KVM_DEV_ARM_VGIC_GRP_DIST_REGS 1
172#define KVM_DEV_ARM_VGIC_GRP_CPU_REGS 2
173#define KVM_DEV_ARM_VGIC_CPUID_SHIFT 32
174#define KVM_DEV_ARM_VGIC_CPUID_MASK (0xffULL << KVM_DEV_ARM_VGIC_CPUID_SHIFT)
175#define KVM_DEV_ARM_VGIC_OFFSET_SHIFT 0
176#define KVM_DEV_ARM_VGIC_OFFSET_MASK (0xffffffffULL << KVM_DEV_ARM_VGIC_OFFSET_SHIFT)
177#define KVM_DEV_ARM_VGIC_GRP_NR_IRQS 3
178#define KVM_DEV_ARM_VGIC_GRP_CTRL 4
179#define KVM_DEV_ARM_VGIC_CTRL_INIT 0
180
181/* KVM_IRQ_LINE irq field index values */
182#define KVM_ARM_IRQ_TYPE_SHIFT 24
183#define KVM_ARM_IRQ_TYPE_MASK 0xff
184#define KVM_ARM_IRQ_VCPU_SHIFT 16
185#define KVM_ARM_IRQ_VCPU_MASK 0xff
186#define KVM_ARM_IRQ_NUM_SHIFT 0
187#define KVM_ARM_IRQ_NUM_MASK 0xffff
188
189/* irq_type field */
190#define KVM_ARM_IRQ_TYPE_CPU 0
191#define KVM_ARM_IRQ_TYPE_SPI 1
192#define KVM_ARM_IRQ_TYPE_PPI 2
193
194/* out-of-kernel GIC cpu interrupt injection irq_number field */
195#define KVM_ARM_IRQ_CPU_IRQ 0
196#define KVM_ARM_IRQ_CPU_FIQ 1
197
198/*
199 * This used to hold the highest supported SPI, but it is now obsolete
200 * and only here to provide source code level compatibility with older
201 * userland. The highest SPI number can be set via KVM_DEV_ARM_VGIC_GRP_NR_IRQS.
202 */
203#ifndef __KERNEL__
204#define KVM_ARM_IRQ_GIC_MAX 127
205#endif
206
207/* One single KVM irqchip, ie. the VGIC */
208#define KVM_NR_IRQCHIPS 1
209
210/* PSCI interface */
211#define KVM_PSCI_FN_BASE 0x95c1ba5e
212#define KVM_PSCI_FN(n) (KVM_PSCI_FN_BASE + (n))
213
214#define KVM_PSCI_FN_CPU_SUSPEND KVM_PSCI_FN(0)
215#define KVM_PSCI_FN_CPU_OFF KVM_PSCI_FN(1)
216#define KVM_PSCI_FN_CPU_ON KVM_PSCI_FN(2)
217#define KVM_PSCI_FN_MIGRATE KVM_PSCI_FN(3)
218
219#define KVM_PSCI_RET_SUCCESS PSCI_RET_SUCCESS
220#define KVM_PSCI_RET_NI PSCI_RET_NOT_SUPPORTED
221#define KVM_PSCI_RET_INVAL PSCI_RET_INVALID_PARAMS
222#define KVM_PSCI_RET_DENIED PSCI_RET_DENIED
223
224#endif /* __ARM_KVM_H__ */
diff --git a/tools/arch/arm64/include/uapi/asm/kvm.h b/tools/arch/arm64/include/uapi/asm/kvm.h
new file mode 100644
index 000000000000..f209ea151dca
--- /dev/null
+++ b/tools/arch/arm64/include/uapi/asm/kvm.h
@@ -0,0 +1,258 @@
1/*
2 * Copyright (C) 2012,2013 - ARM Ltd
3 * Author: Marc Zyngier <marc.zyngier@arm.com>
4 *
5 * Derived from arch/arm/include/uapi/asm/kvm.h:
6 * Copyright (C) 2012 - Virtual Open Systems and Columbia University
7 * Author: Christoffer Dall <c.dall@virtualopensystems.com>
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 */
21
22#ifndef __ARM_KVM_H__
23#define __ARM_KVM_H__
24
25#define KVM_SPSR_EL1 0
26#define KVM_SPSR_SVC KVM_SPSR_EL1
27#define KVM_SPSR_ABT 1
28#define KVM_SPSR_UND 2
29#define KVM_SPSR_IRQ 3
30#define KVM_SPSR_FIQ 4
31#define KVM_NR_SPSR 5
32
33#ifndef __ASSEMBLY__
34#include <linux/psci.h>
35#include <linux/types.h>
36#include <asm/ptrace.h>
37
38#define __KVM_HAVE_GUEST_DEBUG
39#define __KVM_HAVE_IRQ_LINE
40#define __KVM_HAVE_READONLY_MEM
41
42#define KVM_REG_SIZE(id) \
43 (1U << (((id) & KVM_REG_SIZE_MASK) >> KVM_REG_SIZE_SHIFT))
44
45struct kvm_regs {
46 struct user_pt_regs regs; /* sp = sp_el0 */
47
48 __u64 sp_el1;
49 __u64 elr_el1;
50
51 __u64 spsr[KVM_NR_SPSR];
52
53 struct user_fpsimd_state fp_regs;
54};
55
56/*
57 * Supported CPU Targets - Adding a new target type is not recommended,
58 * unless there are some special registers not supported by the
59 * genericv8 syreg table.
60 */
61#define KVM_ARM_TARGET_AEM_V8 0
62#define KVM_ARM_TARGET_FOUNDATION_V8 1
63#define KVM_ARM_TARGET_CORTEX_A57 2
64#define KVM_ARM_TARGET_XGENE_POTENZA 3
65#define KVM_ARM_TARGET_CORTEX_A53 4
66/* Generic ARM v8 target */
67#define KVM_ARM_TARGET_GENERIC_V8 5
68
69#define KVM_ARM_NUM_TARGETS 6
70
71/* KVM_ARM_SET_DEVICE_ADDR ioctl id encoding */
72#define KVM_ARM_DEVICE_TYPE_SHIFT 0
73#define KVM_ARM_DEVICE_TYPE_MASK (0xffff << KVM_ARM_DEVICE_TYPE_SHIFT)
74#define KVM_ARM_DEVICE_ID_SHIFT 16
75#define KVM_ARM_DEVICE_ID_MASK (0xffff << KVM_ARM_DEVICE_ID_SHIFT)
76
77/* Supported device IDs */
78#define KVM_ARM_DEVICE_VGIC_V2 0
79
80/* Supported VGIC address types */
81#define KVM_VGIC_V2_ADDR_TYPE_DIST 0
82#define KVM_VGIC_V2_ADDR_TYPE_CPU 1
83
84#define KVM_VGIC_V2_DIST_SIZE 0x1000
85#define KVM_VGIC_V2_CPU_SIZE 0x2000
86
87/* Supported VGICv3 address types */
88#define KVM_VGIC_V3_ADDR_TYPE_DIST 2
89#define KVM_VGIC_V3_ADDR_TYPE_REDIST 3
90
91#define KVM_VGIC_V3_DIST_SIZE SZ_64K
92#define KVM_VGIC_V3_REDIST_SIZE (2 * SZ_64K)
93
94#define KVM_ARM_VCPU_POWER_OFF 0 /* CPU is started in OFF state */
95#define KVM_ARM_VCPU_EL1_32BIT 1 /* CPU running a 32bit VM */
96#define KVM_ARM_VCPU_PSCI_0_2 2 /* CPU uses PSCI v0.2 */
97#define KVM_ARM_VCPU_PMU_V3 3 /* Support guest PMUv3 */
98
99struct kvm_vcpu_init {
100 __u32 target;
101 __u32 features[7];
102};
103
104struct kvm_sregs {
105};
106
107struct kvm_fpu {
108};
109
110/*
111 * See v8 ARM ARM D7.3: Debug Registers
112 *
113 * The architectural limit is 16 debug registers of each type although
114 * in practice there are usually less (see ID_AA64DFR0_EL1).
115 *
116 * Although the control registers are architecturally defined as 32
117 * bits wide we use a 64 bit structure here to keep parity with
118 * KVM_GET/SET_ONE_REG behaviour which treats all system registers as
119 * 64 bit values. It also allows for the possibility of the
120 * architecture expanding the control registers without having to
121 * change the userspace ABI.
122 */
123#define KVM_ARM_MAX_DBG_REGS 16
124struct kvm_guest_debug_arch {
125 __u64 dbg_bcr[KVM_ARM_MAX_DBG_REGS];
126 __u64 dbg_bvr[KVM_ARM_MAX_DBG_REGS];
127 __u64 dbg_wcr[KVM_ARM_MAX_DBG_REGS];
128 __u64 dbg_wvr[KVM_ARM_MAX_DBG_REGS];
129};
130
131struct kvm_debug_exit_arch {
132 __u32 hsr;
133 __u64 far; /* used for watchpoints */
134};
135
136/*
137 * Architecture specific defines for kvm_guest_debug->control
138 */
139
140#define KVM_GUESTDBG_USE_SW_BP (1 << 16)
141#define KVM_GUESTDBG_USE_HW (1 << 17)
142
143struct kvm_sync_regs {
144};
145
146struct kvm_arch_memory_slot {
147};
148
149/* If you need to interpret the index values, here is the key: */
150#define KVM_REG_ARM_COPROC_MASK 0x000000000FFF0000
151#define KVM_REG_ARM_COPROC_SHIFT 16
152
153/* Normal registers are mapped as coprocessor 16. */
154#define KVM_REG_ARM_CORE (0x0010 << KVM_REG_ARM_COPROC_SHIFT)
155#define KVM_REG_ARM_CORE_REG(name) (offsetof(struct kvm_regs, name) / sizeof(__u32))
156
157/* Some registers need more space to represent values. */
158#define KVM_REG_ARM_DEMUX (0x0011 << KVM_REG_ARM_COPROC_SHIFT)
159#define KVM_REG_ARM_DEMUX_ID_MASK 0x000000000000FF00
160#define KVM_REG_ARM_DEMUX_ID_SHIFT 8
161#define KVM_REG_ARM_DEMUX_ID_CCSIDR (0x00 << KVM_REG_ARM_DEMUX_ID_SHIFT)
162#define KVM_REG_ARM_DEMUX_VAL_MASK 0x00000000000000FF
163#define KVM_REG_ARM_DEMUX_VAL_SHIFT 0
164
165/* AArch64 system registers */
166#define KVM_REG_ARM64_SYSREG (0x0013 << KVM_REG_ARM_COPROC_SHIFT)
167#define KVM_REG_ARM64_SYSREG_OP0_MASK 0x000000000000c000
168#define KVM_REG_ARM64_SYSREG_OP0_SHIFT 14
169#define KVM_REG_ARM64_SYSREG_OP1_MASK 0x0000000000003800
170#define KVM_REG_ARM64_SYSREG_OP1_SHIFT 11
171#define KVM_REG_ARM64_SYSREG_CRN_MASK 0x0000000000000780
172#define KVM_REG_ARM64_SYSREG_CRN_SHIFT 7
173#define KVM_REG_ARM64_SYSREG_CRM_MASK 0x0000000000000078
174#define KVM_REG_ARM64_SYSREG_CRM_SHIFT 3
175#define KVM_REG_ARM64_SYSREG_OP2_MASK 0x0000000000000007
176#define KVM_REG_ARM64_SYSREG_OP2_SHIFT 0
177
178#define ARM64_SYS_REG_SHIFT_MASK(x,n) \
179 (((x) << KVM_REG_ARM64_SYSREG_ ## n ## _SHIFT) & \
180 KVM_REG_ARM64_SYSREG_ ## n ## _MASK)
181
182#define __ARM64_SYS_REG(op0,op1,crn,crm,op2) \
183 (KVM_REG_ARM64 | KVM_REG_ARM64_SYSREG | \
184 ARM64_SYS_REG_SHIFT_MASK(op0, OP0) | \
185 ARM64_SYS_REG_SHIFT_MASK(op1, OP1) | \
186 ARM64_SYS_REG_SHIFT_MASK(crn, CRN) | \
187 ARM64_SYS_REG_SHIFT_MASK(crm, CRM) | \
188 ARM64_SYS_REG_SHIFT_MASK(op2, OP2))
189
190#define ARM64_SYS_REG(...) (__ARM64_SYS_REG(__VA_ARGS__) | KVM_REG_SIZE_U64)
191
192#define KVM_REG_ARM_TIMER_CTL ARM64_SYS_REG(3, 3, 14, 3, 1)
193#define KVM_REG_ARM_TIMER_CNT ARM64_SYS_REG(3, 3, 14, 3, 2)
194#define KVM_REG_ARM_TIMER_CVAL ARM64_SYS_REG(3, 3, 14, 0, 2)
195
196/* Device Control API: ARM VGIC */
197#define KVM_DEV_ARM_VGIC_GRP_ADDR 0
198#define KVM_DEV_ARM_VGIC_GRP_DIST_REGS 1
199#define KVM_DEV_ARM_VGIC_GRP_CPU_REGS 2
200#define KVM_DEV_ARM_VGIC_CPUID_SHIFT 32
201#define KVM_DEV_ARM_VGIC_CPUID_MASK (0xffULL << KVM_DEV_ARM_VGIC_CPUID_SHIFT)
202#define KVM_DEV_ARM_VGIC_OFFSET_SHIFT 0
203#define KVM_DEV_ARM_VGIC_OFFSET_MASK (0xffffffffULL << KVM_DEV_ARM_VGIC_OFFSET_SHIFT)
204#define KVM_DEV_ARM_VGIC_GRP_NR_IRQS 3
205#define KVM_DEV_ARM_VGIC_GRP_CTRL 4
206#define KVM_DEV_ARM_VGIC_CTRL_INIT 0
207
208/* Device Control API on vcpu fd */
209#define KVM_ARM_VCPU_PMU_V3_CTRL 0
210#define KVM_ARM_VCPU_PMU_V3_IRQ 0
211#define KVM_ARM_VCPU_PMU_V3_INIT 1
212
213/* KVM_IRQ_LINE irq field index values */
214#define KVM_ARM_IRQ_TYPE_SHIFT 24
215#define KVM_ARM_IRQ_TYPE_MASK 0xff
216#define KVM_ARM_IRQ_VCPU_SHIFT 16
217#define KVM_ARM_IRQ_VCPU_MASK 0xff
218#define KVM_ARM_IRQ_NUM_SHIFT 0
219#define KVM_ARM_IRQ_NUM_MASK 0xffff
220
221/* irq_type field */
222#define KVM_ARM_IRQ_TYPE_CPU 0
223#define KVM_ARM_IRQ_TYPE_SPI 1
224#define KVM_ARM_IRQ_TYPE_PPI 2
225
226/* out-of-kernel GIC cpu interrupt injection irq_number field */
227#define KVM_ARM_IRQ_CPU_IRQ 0
228#define KVM_ARM_IRQ_CPU_FIQ 1
229
230/*
231 * This used to hold the highest supported SPI, but it is now obsolete
232 * and only here to provide source code level compatibility with older
233 * userland. The highest SPI number can be set via KVM_DEV_ARM_VGIC_GRP_NR_IRQS.
234 */
235#ifndef __KERNEL__
236#define KVM_ARM_IRQ_GIC_MAX 127
237#endif
238
239/* One single KVM irqchip, ie. the VGIC */
240#define KVM_NR_IRQCHIPS 1
241
242/* PSCI interface */
243#define KVM_PSCI_FN_BASE 0x95c1ba5e
244#define KVM_PSCI_FN(n) (KVM_PSCI_FN_BASE + (n))
245
246#define KVM_PSCI_FN_CPU_SUSPEND KVM_PSCI_FN(0)
247#define KVM_PSCI_FN_CPU_OFF KVM_PSCI_FN(1)
248#define KVM_PSCI_FN_CPU_ON KVM_PSCI_FN(2)
249#define KVM_PSCI_FN_MIGRATE KVM_PSCI_FN(3)
250
251#define KVM_PSCI_RET_SUCCESS PSCI_RET_SUCCESS
252#define KVM_PSCI_RET_NI PSCI_RET_NOT_SUPPORTED
253#define KVM_PSCI_RET_INVAL PSCI_RET_INVALID_PARAMS
254#define KVM_PSCI_RET_DENIED PSCI_RET_DENIED
255
256#endif
257
258#endif /* __ARM_KVM_H__ */
diff --git a/tools/arch/mips/include/uapi/asm/kvm.h b/tools/arch/mips/include/uapi/asm/kvm.h
new file mode 100644
index 000000000000..6985eb59b085
--- /dev/null
+++ b/tools/arch/mips/include/uapi/asm/kvm.h
@@ -0,0 +1,208 @@
1/*
2 * This file is subject to the terms and conditions of the GNU General Public
3 * License. See the file "COPYING" in the main directory of this archive
4 * for more details.
5 *
6 * Copyright (C) 2012 MIPS Technologies, Inc. All rights reserved.
7 * Copyright (C) 2013 Cavium, Inc.
8 * Authors: Sanjay Lal <sanjayl@kymasys.com>
9 */
10
11#ifndef __LINUX_KVM_MIPS_H
12#define __LINUX_KVM_MIPS_H
13
14#include <linux/types.h>
15
16/*
17 * KVM MIPS specific structures and definitions.
18 *
19 * Some parts derived from the x86 version of this file.
20 */
21
22/*
23 * for KVM_GET_REGS and KVM_SET_REGS
24 *
25 * If Config[AT] is zero (32-bit CPU), the register contents are
26 * stored in the lower 32-bits of the struct kvm_regs fields and sign
27 * extended to 64-bits.
28 */
29struct kvm_regs {
30 /* out (KVM_GET_REGS) / in (KVM_SET_REGS) */
31 __u64 gpr[32];
32 __u64 hi;
33 __u64 lo;
34 __u64 pc;
35};
36
37/*
38 * for KVM_GET_FPU and KVM_SET_FPU
39 */
40struct kvm_fpu {
41};
42
43
44/*
45 * For MIPS, we use KVM_SET_ONE_REG and KVM_GET_ONE_REG to access various
46 * registers. The id field is broken down as follows:
47 *
48 * bits[63..52] - As per linux/kvm.h
49 * bits[51..32] - Must be zero.
50 * bits[31..16] - Register set.
51 *
52 * Register set = 0: GP registers from kvm_regs (see definitions below).
53 *
54 * Register set = 1: CP0 registers.
55 * bits[15..8] - Must be zero.
56 * bits[7..3] - Register 'rd' index.
57 * bits[2..0] - Register 'sel' index.
58 *
59 * Register set = 2: KVM specific registers (see definitions below).
60 *
61 * Register set = 3: FPU / MSA registers (see definitions below).
62 *
63 * Other sets registers may be added in the future. Each set would
64 * have its own identifier in bits[31..16].
65 */
66
67#define KVM_REG_MIPS_GP (KVM_REG_MIPS | 0x0000000000000000ULL)
68#define KVM_REG_MIPS_CP0 (KVM_REG_MIPS | 0x0000000000010000ULL)
69#define KVM_REG_MIPS_KVM (KVM_REG_MIPS | 0x0000000000020000ULL)
70#define KVM_REG_MIPS_FPU (KVM_REG_MIPS | 0x0000000000030000ULL)
71
72
73/*
74 * KVM_REG_MIPS_GP - General purpose registers from kvm_regs.
75 */
76
77#define KVM_REG_MIPS_R0 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 0)
78#define KVM_REG_MIPS_R1 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 1)
79#define KVM_REG_MIPS_R2 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 2)
80#define KVM_REG_MIPS_R3 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 3)
81#define KVM_REG_MIPS_R4 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 4)
82#define KVM_REG_MIPS_R5 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 5)
83#define KVM_REG_MIPS_R6 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 6)
84#define KVM_REG_MIPS_R7 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 7)
85#define KVM_REG_MIPS_R8 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 8)
86#define KVM_REG_MIPS_R9 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 9)
87#define KVM_REG_MIPS_R10 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 10)
88#define KVM_REG_MIPS_R11 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 11)
89#define KVM_REG_MIPS_R12 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 12)
90#define KVM_REG_MIPS_R13 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 13)
91#define KVM_REG_MIPS_R14 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 14)
92#define KVM_REG_MIPS_R15 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 15)
93#define KVM_REG_MIPS_R16 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 16)
94#define KVM_REG_MIPS_R17 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 17)
95#define KVM_REG_MIPS_R18 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 18)
96#define KVM_REG_MIPS_R19 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 19)
97#define KVM_REG_MIPS_R20 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 20)
98#define KVM_REG_MIPS_R21 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 21)
99#define KVM_REG_MIPS_R22 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 22)
100#define KVM_REG_MIPS_R23 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 23)
101#define KVM_REG_MIPS_R24 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 24)
102#define KVM_REG_MIPS_R25 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 25)
103#define KVM_REG_MIPS_R26 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 26)
104#define KVM_REG_MIPS_R27 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 27)
105#define KVM_REG_MIPS_R28 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 28)
106#define KVM_REG_MIPS_R29 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 29)
107#define KVM_REG_MIPS_R30 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 30)
108#define KVM_REG_MIPS_R31 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 31)
109
110#define KVM_REG_MIPS_HI (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 32)
111#define KVM_REG_MIPS_LO (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 33)
112#define KVM_REG_MIPS_PC (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 34)
113
114
115/*
116 * KVM_REG_MIPS_KVM - KVM specific control registers.
117 */
118
119/*
120 * CP0_Count control
121 * DC: Set 0: Master disable CP0_Count and set COUNT_RESUME to now
122 * Set 1: Master re-enable CP0_Count with unchanged bias, handling timer
123 * interrupts since COUNT_RESUME
124 * This can be used to freeze the timer to get a consistent snapshot of
125 * the CP0_Count and timer interrupt pending state, while also resuming
126 * safely without losing time or guest timer interrupts.
127 * Other: Reserved, do not change.
128 */
129#define KVM_REG_MIPS_COUNT_CTL (KVM_REG_MIPS_KVM | KVM_REG_SIZE_U64 | 0)
130#define KVM_REG_MIPS_COUNT_CTL_DC 0x00000001
131
132/*
133 * CP0_Count resume monotonic nanoseconds
134 * The monotonic nanosecond time of the last set of COUNT_CTL.DC (master
135 * disable). Any reads and writes of Count related registers while
136 * COUNT_CTL.DC=1 will appear to occur at this time. When COUNT_CTL.DC is
137 * cleared again (master enable) any timer interrupts since this time will be
138 * emulated.
139 * Modifications to times in the future are rejected.
140 */
141#define KVM_REG_MIPS_COUNT_RESUME (KVM_REG_MIPS_KVM | KVM_REG_SIZE_U64 | 1)
142/*
143 * CP0_Count rate in Hz
144 * Specifies the rate of the CP0_Count timer in Hz. Modifications occur without
145 * discontinuities in CP0_Count.
146 */
147#define KVM_REG_MIPS_COUNT_HZ (KVM_REG_MIPS_KVM | KVM_REG_SIZE_U64 | 2)
148
149
150/*
151 * KVM_REG_MIPS_FPU - Floating Point and MIPS SIMD Architecture (MSA) registers.
152 *
153 * bits[15..8] - Register subset (see definitions below).
154 * bits[7..5] - Must be zero.
155 * bits[4..0] - Register number within register subset.
156 */
157
158#define KVM_REG_MIPS_FPR (KVM_REG_MIPS_FPU | 0x0000000000000000ULL)
159#define KVM_REG_MIPS_FCR (KVM_REG_MIPS_FPU | 0x0000000000000100ULL)
160#define KVM_REG_MIPS_MSACR (KVM_REG_MIPS_FPU | 0x0000000000000200ULL)
161
162/*
163 * KVM_REG_MIPS_FPR - Floating point / Vector registers.
164 */
165#define KVM_REG_MIPS_FPR_32(n) (KVM_REG_MIPS_FPR | KVM_REG_SIZE_U32 | (n))
166#define KVM_REG_MIPS_FPR_64(n) (KVM_REG_MIPS_FPR | KVM_REG_SIZE_U64 | (n))
167#define KVM_REG_MIPS_VEC_128(n) (KVM_REG_MIPS_FPR | KVM_REG_SIZE_U128 | (n))
168
169/*
170 * KVM_REG_MIPS_FCR - Floating point control registers.
171 */
172#define KVM_REG_MIPS_FCR_IR (KVM_REG_MIPS_FCR | KVM_REG_SIZE_U32 | 0)
173#define KVM_REG_MIPS_FCR_CSR (KVM_REG_MIPS_FCR | KVM_REG_SIZE_U32 | 31)
174
175/*
176 * KVM_REG_MIPS_MSACR - MIPS SIMD Architecture (MSA) control registers.
177 */
178#define KVM_REG_MIPS_MSA_IR (KVM_REG_MIPS_MSACR | KVM_REG_SIZE_U32 | 0)
179#define KVM_REG_MIPS_MSA_CSR (KVM_REG_MIPS_MSACR | KVM_REG_SIZE_U32 | 1)
180
181
182/*
183 * KVM MIPS specific structures and definitions
184 *
185 */
186struct kvm_debug_exit_arch {
187 __u64 epc;
188};
189
190/* for KVM_SET_GUEST_DEBUG */
191struct kvm_guest_debug_arch {
192};
193
194/* definition of registers in kvm_run */
195struct kvm_sync_regs {
196};
197
198/* dummy definition */
199struct kvm_sregs {
200};
201
202struct kvm_mips_interrupt {
203 /* in */
204 __u32 cpu;
205 __u32 irq;
206};
207
208#endif /* __LINUX_KVM_MIPS_H */
diff --git a/tools/arch/powerpc/include/uapi/asm/kvm.h b/tools/arch/powerpc/include/uapi/asm/kvm.h
new file mode 100644
index 000000000000..c93cf35ce379
--- /dev/null
+++ b/tools/arch/powerpc/include/uapi/asm/kvm.h
@@ -0,0 +1,612 @@
1/*
2 * This program is free software; you can redistribute it and/or modify
3 * it under the terms of the GNU General Public License, version 2, as
4 * published by the Free Software Foundation.
5 *
6 * This program is distributed in the hope that it will be useful,
7 * but WITHOUT ANY WARRANTY; without even the implied warranty of
8 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9 * GNU General Public License for more details.
10 *
11 * You should have received a copy of the GNU General Public License
12 * along with this program; if not, write to the Free Software
13 * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
14 *
15 * Copyright IBM Corp. 2007
16 *
17 * Authors: Hollis Blanchard <hollisb@us.ibm.com>
18 */
19
20#ifndef __LINUX_KVM_POWERPC_H
21#define __LINUX_KVM_POWERPC_H
22
23#include <linux/types.h>
24
25/* Select powerpc specific features in <linux/kvm.h> */
26#define __KVM_HAVE_SPAPR_TCE
27#define __KVM_HAVE_PPC_SMT
28#define __KVM_HAVE_IRQCHIP
29#define __KVM_HAVE_IRQ_LINE
30#define __KVM_HAVE_GUEST_DEBUG
31
32struct kvm_regs {
33 __u64 pc;
34 __u64 cr;
35 __u64 ctr;
36 __u64 lr;
37 __u64 xer;
38 __u64 msr;
39 __u64 srr0;
40 __u64 srr1;
41 __u64 pid;
42
43 __u64 sprg0;
44 __u64 sprg1;
45 __u64 sprg2;
46 __u64 sprg3;
47 __u64 sprg4;
48 __u64 sprg5;
49 __u64 sprg6;
50 __u64 sprg7;
51
52 __u64 gpr[32];
53};
54
55#define KVM_SREGS_E_IMPL_NONE 0
56#define KVM_SREGS_E_IMPL_FSL 1
57
58#define KVM_SREGS_E_FSL_PIDn (1 << 0) /* PID1/PID2 */
59
60/*
61 * Feature bits indicate which sections of the sregs struct are valid,
62 * both in KVM_GET_SREGS and KVM_SET_SREGS. On KVM_SET_SREGS, registers
63 * corresponding to unset feature bits will not be modified. This allows
64 * restoring a checkpoint made without that feature, while keeping the
65 * default values of the new registers.
66 *
67 * KVM_SREGS_E_BASE contains:
68 * CSRR0/1 (refers to SRR2/3 on 40x)
69 * ESR
70 * DEAR
71 * MCSR
72 * TSR
73 * TCR
74 * DEC
75 * TB
76 * VRSAVE (USPRG0)
77 */
78#define KVM_SREGS_E_BASE (1 << 0)
79
80/*
81 * KVM_SREGS_E_ARCH206 contains:
82 *
83 * PIR
84 * MCSRR0/1
85 * DECAR
86 * IVPR
87 */
88#define KVM_SREGS_E_ARCH206 (1 << 1)
89
90/*
91 * Contains EPCR, plus the upper half of 64-bit registers
92 * that are 32-bit on 32-bit implementations.
93 */
94#define KVM_SREGS_E_64 (1 << 2)
95
96#define KVM_SREGS_E_SPRG8 (1 << 3)
97#define KVM_SREGS_E_MCIVPR (1 << 4)
98
99/*
100 * IVORs are used -- contains IVOR0-15, plus additional IVORs
101 * in combination with an appropriate feature bit.
102 */
103#define KVM_SREGS_E_IVOR (1 << 5)
104
105/*
106 * Contains MAS0-4, MAS6-7, TLBnCFG, MMUCFG.
107 * Also TLBnPS if MMUCFG[MAVN] = 1.
108 */
109#define KVM_SREGS_E_ARCH206_MMU (1 << 6)
110
111/* DBSR, DBCR, IAC, DAC, DVC */
112#define KVM_SREGS_E_DEBUG (1 << 7)
113
114/* Enhanced debug -- DSRR0/1, SPRG9 */
115#define KVM_SREGS_E_ED (1 << 8)
116
117/* Embedded Floating Point (SPE) -- IVOR32-34 if KVM_SREGS_E_IVOR */
118#define KVM_SREGS_E_SPE (1 << 9)
119
120/*
121 * DEPRECATED! USE ONE_REG FOR THIS ONE!
122 * External Proxy (EXP) -- EPR
123 */
124#define KVM_SREGS_EXP (1 << 10)
125
126/* External PID (E.PD) -- EPSC/EPLC */
127#define KVM_SREGS_E_PD (1 << 11)
128
129/* Processor Control (E.PC) -- IVOR36-37 if KVM_SREGS_E_IVOR */
130#define KVM_SREGS_E_PC (1 << 12)
131
132/* Page table (E.PT) -- EPTCFG */
133#define KVM_SREGS_E_PT (1 << 13)
134
135/* Embedded Performance Monitor (E.PM) -- IVOR35 if KVM_SREGS_E_IVOR */
136#define KVM_SREGS_E_PM (1 << 14)
137
138/*
139 * Special updates:
140 *
141 * Some registers may change even while a vcpu is not running.
142 * To avoid losing these changes, by default these registers are
143 * not updated by KVM_SET_SREGS. To force an update, set the bit
144 * in u.e.update_special corresponding to the register to be updated.
145 *
146 * The update_special field is zero on return from KVM_GET_SREGS.
147 *
148 * When restoring a checkpoint, the caller can set update_special
149 * to 0xffffffff to ensure that everything is restored, even new features
150 * that the caller doesn't know about.
151 */
152#define KVM_SREGS_E_UPDATE_MCSR (1 << 0)
153#define KVM_SREGS_E_UPDATE_TSR (1 << 1)
154#define KVM_SREGS_E_UPDATE_DEC (1 << 2)
155#define KVM_SREGS_E_UPDATE_DBSR (1 << 3)
156
157/*
158 * In KVM_SET_SREGS, reserved/pad fields must be left untouched from a
159 * previous KVM_GET_REGS.
160 *
161 * Unless otherwise indicated, setting any register with KVM_SET_SREGS
162 * directly sets its value. It does not trigger any special semantics such
163 * as write-one-to-clear. Calling KVM_SET_SREGS on an unmodified struct
164 * just received from KVM_GET_SREGS is always a no-op.
165 */
166struct kvm_sregs {
167 __u32 pvr;
168 union {
169 struct {
170 __u64 sdr1;
171 struct {
172 struct {
173 __u64 slbe;
174 __u64 slbv;
175 } slb[64];
176 } ppc64;
177 struct {
178 __u32 sr[16];
179 __u64 ibat[8];
180 __u64 dbat[8];
181 } ppc32;
182 } s;
183 struct {
184 union {
185 struct { /* KVM_SREGS_E_IMPL_FSL */
186 __u32 features; /* KVM_SREGS_E_FSL_ */
187 __u32 svr;
188 __u64 mcar;
189 __u32 hid0;
190
191 /* KVM_SREGS_E_FSL_PIDn */
192 __u32 pid1, pid2;
193 } fsl;
194 __u8 pad[256];
195 } impl;
196
197 __u32 features; /* KVM_SREGS_E_ */
198 __u32 impl_id; /* KVM_SREGS_E_IMPL_ */
199 __u32 update_special; /* KVM_SREGS_E_UPDATE_ */
200 __u32 pir; /* read-only */
201 __u64 sprg8;
202 __u64 sprg9; /* E.ED */
203 __u64 csrr0;
204 __u64 dsrr0; /* E.ED */
205 __u64 mcsrr0;
206 __u32 csrr1;
207 __u32 dsrr1; /* E.ED */
208 __u32 mcsrr1;
209 __u32 esr;
210 __u64 dear;
211 __u64 ivpr;
212 __u64 mcivpr;
213 __u64 mcsr; /* KVM_SREGS_E_UPDATE_MCSR */
214
215 __u32 tsr; /* KVM_SREGS_E_UPDATE_TSR */
216 __u32 tcr;
217 __u32 decar;
218 __u32 dec; /* KVM_SREGS_E_UPDATE_DEC */
219
220 /*
221 * Userspace can read TB directly, but the
222 * value reported here is consistent with "dec".
223 *
224 * Read-only.
225 */
226 __u64 tb;
227
228 __u32 dbsr; /* KVM_SREGS_E_UPDATE_DBSR */
229 __u32 dbcr[3];
230 /*
231 * iac/dac registers are 64bit wide, while this API
232 * interface provides only lower 32 bits on 64 bit
233 * processors. ONE_REG interface is added for 64bit
234 * iac/dac registers.
235 */
236 __u32 iac[4];
237 __u32 dac[2];
238 __u32 dvc[2];
239 __u8 num_iac; /* read-only */
240 __u8 num_dac; /* read-only */
241 __u8 num_dvc; /* read-only */
242 __u8 pad;
243
244 __u32 epr; /* EXP */
245 __u32 vrsave; /* a.k.a. USPRG0 */
246 __u32 epcr; /* KVM_SREGS_E_64 */
247
248 __u32 mas0;
249 __u32 mas1;
250 __u64 mas2;
251 __u64 mas7_3;
252 __u32 mas4;
253 __u32 mas6;
254
255 __u32 ivor_low[16]; /* IVOR0-15 */
256 __u32 ivor_high[18]; /* IVOR32+, plus room to expand */
257
258 __u32 mmucfg; /* read-only */
259 __u32 eptcfg; /* E.PT, read-only */
260 __u32 tlbcfg[4];/* read-only */
261 __u32 tlbps[4]; /* read-only */
262
263 __u32 eplc, epsc; /* E.PD */
264 } e;
265 __u8 pad[1020];
266 } u;
267};
268
269struct kvm_fpu {
270 __u64 fpr[32];
271};
272
273/*
274 * Defines for h/w breakpoint, watchpoint (read, write or both) and
275 * software breakpoint.
276 * These are used as "type" in KVM_SET_GUEST_DEBUG ioctl and "status"
277 * for KVM_DEBUG_EXIT.
278 */
279#define KVMPPC_DEBUG_NONE 0x0
280#define KVMPPC_DEBUG_BREAKPOINT (1UL << 1)
281#define KVMPPC_DEBUG_WATCH_WRITE (1UL << 2)
282#define KVMPPC_DEBUG_WATCH_READ (1UL << 3)
283struct kvm_debug_exit_arch {
284 __u64 address;
285 /*
286 * exiting to userspace because of h/w breakpoint, watchpoint
287 * (read, write or both) and software breakpoint.
288 */
289 __u32 status;
290 __u32 reserved;
291};
292
293/* for KVM_SET_GUEST_DEBUG */
294struct kvm_guest_debug_arch {
295 struct {
296 /* H/W breakpoint/watchpoint address */
297 __u64 addr;
298 /*
299 * Type denotes h/w breakpoint, read watchpoint, write
300 * watchpoint or watchpoint (both read and write).
301 */
302 __u32 type;
303 __u32 reserved;
304 } bp[16];
305};
306
307/* Debug related defines */
308/*
309 * kvm_guest_debug->control is a 32 bit field. The lower 16 bits are generic
310 * and upper 16 bits are architecture specific. Architecture specific defines
311 * that ioctl is for setting hardware breakpoint or software breakpoint.
312 */
313#define KVM_GUESTDBG_USE_SW_BP 0x00010000
314#define KVM_GUESTDBG_USE_HW_BP 0x00020000
315
316/* definition of registers in kvm_run */
317struct kvm_sync_regs {
318};
319
320#define KVM_INTERRUPT_SET -1U
321#define KVM_INTERRUPT_UNSET -2U
322#define KVM_INTERRUPT_SET_LEVEL -3U
323
324#define KVM_CPU_440 1
325#define KVM_CPU_E500V2 2
326#define KVM_CPU_3S_32 3
327#define KVM_CPU_3S_64 4
328#define KVM_CPU_E500MC 5
329
330/* for KVM_CAP_SPAPR_TCE */
331struct kvm_create_spapr_tce {
332 __u64 liobn;
333 __u32 window_size;
334};
335
336/* for KVM_CAP_SPAPR_TCE_64 */
337struct kvm_create_spapr_tce_64 {
338 __u64 liobn;
339 __u32 page_shift;
340 __u32 flags;
341 __u64 offset; /* in pages */
342 __u64 size; /* in pages */
343};
344
345/* for KVM_ALLOCATE_RMA */
346struct kvm_allocate_rma {
347 __u64 rma_size;
348};
349
350/* for KVM_CAP_PPC_RTAS */
351struct kvm_rtas_token_args {
352 char name[120];
353 __u64 token; /* Use a token of 0 to undefine a mapping */
354};
355
356struct kvm_book3e_206_tlb_entry {
357 __u32 mas8;
358 __u32 mas1;
359 __u64 mas2;
360 __u64 mas7_3;
361};
362
363struct kvm_book3e_206_tlb_params {
364 /*
365 * For mmu types KVM_MMU_FSL_BOOKE_NOHV and KVM_MMU_FSL_BOOKE_HV:
366 *
367 * - The number of ways of TLB0 must be a power of two between 2 and
368 * 16.
369 * - TLB1 must be fully associative.
370 * - The size of TLB0 must be a multiple of the number of ways, and
371 * the number of sets must be a power of two.
372 * - The size of TLB1 may not exceed 64 entries.
373 * - TLB0 supports 4 KiB pages.
374 * - The page sizes supported by TLB1 are as indicated by
375 * TLB1CFG (if MMUCFG[MAVN] = 0) or TLB1PS (if MMUCFG[MAVN] = 1)
376 * as returned by KVM_GET_SREGS.
377 * - TLB2 and TLB3 are reserved, and their entries in tlb_sizes[]
378 * and tlb_ways[] must be zero.
379 *
380 * tlb_ways[n] = tlb_sizes[n] means the array is fully associative.
381 *
382 * KVM will adjust TLBnCFG based on the sizes configured here,
383 * though arrays greater than 2048 entries will have TLBnCFG[NENTRY]
384 * set to zero.
385 */
386 __u32 tlb_sizes[4];
387 __u32 tlb_ways[4];
388 __u32 reserved[8];
389};
390
391/* For KVM_PPC_GET_HTAB_FD */
392struct kvm_get_htab_fd {
393 __u64 flags;
394 __u64 start_index;
395 __u64 reserved[2];
396};
397
398/* Values for kvm_get_htab_fd.flags */
399#define KVM_GET_HTAB_BOLTED_ONLY ((__u64)0x1)
400#define KVM_GET_HTAB_WRITE ((__u64)0x2)
401
402/*
403 * Data read on the file descriptor is formatted as a series of
404 * records, each consisting of a header followed by a series of
405 * `n_valid' HPTEs (16 bytes each), which are all valid. Following
406 * those valid HPTEs there are `n_invalid' invalid HPTEs, which
407 * are not represented explicitly in the stream. The same format
408 * is used for writing.
409 */
410struct kvm_get_htab_header {
411 __u32 index;
412 __u16 n_valid;
413 __u16 n_invalid;
414};
415
416/* Per-vcpu XICS interrupt controller state */
417#define KVM_REG_PPC_ICP_STATE (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x8c)
418
419#define KVM_REG_PPC_ICP_CPPR_SHIFT 56 /* current proc priority */
420#define KVM_REG_PPC_ICP_CPPR_MASK 0xff
421#define KVM_REG_PPC_ICP_XISR_SHIFT 32 /* interrupt status field */
422#define KVM_REG_PPC_ICP_XISR_MASK 0xffffff
423#define KVM_REG_PPC_ICP_MFRR_SHIFT 24 /* pending IPI priority */
424#define KVM_REG_PPC_ICP_MFRR_MASK 0xff
425#define KVM_REG_PPC_ICP_PPRI_SHIFT 16 /* pending irq priority */
426#define KVM_REG_PPC_ICP_PPRI_MASK 0xff
427
428/* Device control API: PPC-specific devices */
429#define KVM_DEV_MPIC_GRP_MISC 1
430#define KVM_DEV_MPIC_BASE_ADDR 0 /* 64-bit */
431
432#define KVM_DEV_MPIC_GRP_REGISTER 2 /* 32-bit */
433#define KVM_DEV_MPIC_GRP_IRQ_ACTIVE 3 /* 32-bit */
434
435/* One-Reg API: PPC-specific registers */
436#define KVM_REG_PPC_HIOR (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x1)
437#define KVM_REG_PPC_IAC1 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x2)
438#define KVM_REG_PPC_IAC2 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x3)
439#define KVM_REG_PPC_IAC3 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x4)
440#define KVM_REG_PPC_IAC4 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x5)
441#define KVM_REG_PPC_DAC1 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x6)
442#define KVM_REG_PPC_DAC2 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x7)
443#define KVM_REG_PPC_DABR (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x8)
444#define KVM_REG_PPC_DSCR (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x9)
445#define KVM_REG_PPC_PURR (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xa)
446#define KVM_REG_PPC_SPURR (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xb)
447#define KVM_REG_PPC_DAR (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xc)
448#define KVM_REG_PPC_DSISR (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0xd)
449#define KVM_REG_PPC_AMR (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xe)
450#define KVM_REG_PPC_UAMOR (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xf)
451
452#define KVM_REG_PPC_MMCR0 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x10)
453#define KVM_REG_PPC_MMCR1 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x11)
454#define KVM_REG_PPC_MMCRA (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x12)
455#define KVM_REG_PPC_MMCR2 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x13)
456#define KVM_REG_PPC_MMCRS (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x14)
457#define KVM_REG_PPC_SIAR (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x15)
458#define KVM_REG_PPC_SDAR (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x16)
459#define KVM_REG_PPC_SIER (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x17)
460
461#define KVM_REG_PPC_PMC1 (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x18)
462#define KVM_REG_PPC_PMC2 (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x19)
463#define KVM_REG_PPC_PMC3 (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x1a)
464#define KVM_REG_PPC_PMC4 (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x1b)
465#define KVM_REG_PPC_PMC5 (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x1c)
466#define KVM_REG_PPC_PMC6 (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x1d)
467#define KVM_REG_PPC_PMC7 (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x1e)
468#define KVM_REG_PPC_PMC8 (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x1f)
469
470/* 32 floating-point registers */
471#define KVM_REG_PPC_FPR0 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x20)
472#define KVM_REG_PPC_FPR(n) (KVM_REG_PPC_FPR0 + (n))
473#define KVM_REG_PPC_FPR31 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x3f)
474
475/* 32 VMX/Altivec vector registers */
476#define KVM_REG_PPC_VR0 (KVM_REG_PPC | KVM_REG_SIZE_U128 | 0x40)
477#define KVM_REG_PPC_VR(n) (KVM_REG_PPC_VR0 + (n))
478#define KVM_REG_PPC_VR31 (KVM_REG_PPC | KVM_REG_SIZE_U128 | 0x5f)
479
480/* 32 double-width FP registers for VSX */
481/* High-order halves overlap with FP regs */
482#define KVM_REG_PPC_VSR0 (KVM_REG_PPC | KVM_REG_SIZE_U128 | 0x60)
483#define KVM_REG_PPC_VSR(n) (KVM_REG_PPC_VSR0 + (n))
484#define KVM_REG_PPC_VSR31 (KVM_REG_PPC | KVM_REG_SIZE_U128 | 0x7f)
485
486/* FP and vector status/control registers */
487#define KVM_REG_PPC_FPSCR (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x80)
488/*
489 * VSCR register is documented as a 32-bit register in the ISA, but it can
490 * only be accesses via a vector register. Expose VSCR as a 32-bit register
491 * even though the kernel represents it as a 128-bit vector.
492 */
493#define KVM_REG_PPC_VSCR (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x81)
494
495/* Virtual processor areas */
496/* For SLB & DTL, address in high (first) half, length in low half */
497#define KVM_REG_PPC_VPA_ADDR (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x82)
498#define KVM_REG_PPC_VPA_SLB (KVM_REG_PPC | KVM_REG_SIZE_U128 | 0x83)
499#define KVM_REG_PPC_VPA_DTL (KVM_REG_PPC | KVM_REG_SIZE_U128 | 0x84)
500
501#define KVM_REG_PPC_EPCR (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x85)
502#define KVM_REG_PPC_EPR (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x86)
503
504/* Timer Status Register OR/CLEAR interface */
505#define KVM_REG_PPC_OR_TSR (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x87)
506#define KVM_REG_PPC_CLEAR_TSR (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x88)
507#define KVM_REG_PPC_TCR (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x89)
508#define KVM_REG_PPC_TSR (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x8a)
509
510/* Debugging: Special instruction for software breakpoint */
511#define KVM_REG_PPC_DEBUG_INST (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x8b)
512
513/* MMU registers */
514#define KVM_REG_PPC_MAS0 (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x8c)
515#define KVM_REG_PPC_MAS1 (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x8d)
516#define KVM_REG_PPC_MAS2 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x8e)
517#define KVM_REG_PPC_MAS7_3 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x8f)
518#define KVM_REG_PPC_MAS4 (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x90)
519#define KVM_REG_PPC_MAS6 (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x91)
520#define KVM_REG_PPC_MMUCFG (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x92)
521/*
522 * TLBnCFG fields TLBnCFG_N_ENTRY and TLBnCFG_ASSOC can be changed only using
523 * KVM_CAP_SW_TLB ioctl
524 */
525#define KVM_REG_PPC_TLB0CFG (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x93)
526#define KVM_REG_PPC_TLB1CFG (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x94)
527#define KVM_REG_PPC_TLB2CFG (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x95)
528#define KVM_REG_PPC_TLB3CFG (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x96)
529#define KVM_REG_PPC_TLB0PS (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x97)
530#define KVM_REG_PPC_TLB1PS (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x98)
531#define KVM_REG_PPC_TLB2PS (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x99)
532#define KVM_REG_PPC_TLB3PS (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x9a)
533#define KVM_REG_PPC_EPTCFG (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x9b)
534
535/* Timebase offset */
536#define KVM_REG_PPC_TB_OFFSET (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x9c)
537
538/* POWER8 registers */
539#define KVM_REG_PPC_SPMC1 (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x9d)
540#define KVM_REG_PPC_SPMC2 (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x9e)
541#define KVM_REG_PPC_IAMR (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x9f)
542#define KVM_REG_PPC_TFHAR (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xa0)
543#define KVM_REG_PPC_TFIAR (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xa1)
544#define KVM_REG_PPC_TEXASR (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xa2)
545#define KVM_REG_PPC_FSCR (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xa3)
546#define KVM_REG_PPC_PSPB (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0xa4)
547#define KVM_REG_PPC_EBBHR (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xa5)
548#define KVM_REG_PPC_EBBRR (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xa6)
549#define KVM_REG_PPC_BESCR (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xa7)
550#define KVM_REG_PPC_TAR (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xa8)
551#define KVM_REG_PPC_DPDES (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xa9)
552#define KVM_REG_PPC_DAWR (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xaa)
553#define KVM_REG_PPC_DAWRX (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xab)
554#define KVM_REG_PPC_CIABR (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xac)
555#define KVM_REG_PPC_IC (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xad)
556#define KVM_REG_PPC_VTB (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xae)
557#define KVM_REG_PPC_CSIGR (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xaf)
558#define KVM_REG_PPC_TACR (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xb0)
559#define KVM_REG_PPC_TCSCR (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xb1)
560#define KVM_REG_PPC_PID (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xb2)
561#define KVM_REG_PPC_ACOP (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xb3)
562
563#define KVM_REG_PPC_VRSAVE (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0xb4)
564#define KVM_REG_PPC_LPCR (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0xb5)
565#define KVM_REG_PPC_LPCR_64 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xb5)
566#define KVM_REG_PPC_PPR (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xb6)
567
568/* Architecture compatibility level */
569#define KVM_REG_PPC_ARCH_COMPAT (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0xb7)
570
571#define KVM_REG_PPC_DABRX (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0xb8)
572#define KVM_REG_PPC_WORT (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xb9)
573#define KVM_REG_PPC_SPRG9 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xba)
574#define KVM_REG_PPC_DBSR (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0xbb)
575
576/* Transactional Memory checkpointed state:
577 * This is all GPRs, all VSX regs and a subset of SPRs
578 */
579#define KVM_REG_PPC_TM (KVM_REG_PPC | 0x80000000)
580/* TM GPRs */
581#define KVM_REG_PPC_TM_GPR0 (KVM_REG_PPC_TM | KVM_REG_SIZE_U64 | 0)
582#define KVM_REG_PPC_TM_GPR(n) (KVM_REG_PPC_TM_GPR0 + (n))
583#define KVM_REG_PPC_TM_GPR31 (KVM_REG_PPC_TM | KVM_REG_SIZE_U64 | 0x1f)
584/* TM VSX */
585#define KVM_REG_PPC_TM_VSR0 (KVM_REG_PPC_TM | KVM_REG_SIZE_U128 | 0x20)
586#define KVM_REG_PPC_TM_VSR(n) (KVM_REG_PPC_TM_VSR0 + (n))
587#define KVM_REG_PPC_TM_VSR63 (KVM_REG_PPC_TM | KVM_REG_SIZE_U128 | 0x5f)
588/* TM SPRS */
589#define KVM_REG_PPC_TM_CR (KVM_REG_PPC_TM | KVM_REG_SIZE_U64 | 0x60)
590#define KVM_REG_PPC_TM_LR (KVM_REG_PPC_TM | KVM_REG_SIZE_U64 | 0x61)
591#define KVM_REG_PPC_TM_CTR (KVM_REG_PPC_TM | KVM_REG_SIZE_U64 | 0x62)
592#define KVM_REG_PPC_TM_FPSCR (KVM_REG_PPC_TM | KVM_REG_SIZE_U64 | 0x63)
593#define KVM_REG_PPC_TM_AMR (KVM_REG_PPC_TM | KVM_REG_SIZE_U64 | 0x64)
594#define KVM_REG_PPC_TM_PPR (KVM_REG_PPC_TM | KVM_REG_SIZE_U64 | 0x65)
595#define KVM_REG_PPC_TM_VRSAVE (KVM_REG_PPC_TM | KVM_REG_SIZE_U64 | 0x66)
596#define KVM_REG_PPC_TM_VSCR (KVM_REG_PPC_TM | KVM_REG_SIZE_U32 | 0x67)
597#define KVM_REG_PPC_TM_DSCR (KVM_REG_PPC_TM | KVM_REG_SIZE_U64 | 0x68)
598#define KVM_REG_PPC_TM_TAR (KVM_REG_PPC_TM | KVM_REG_SIZE_U64 | 0x69)
599
600/* PPC64 eXternal Interrupt Controller Specification */
601#define KVM_DEV_XICS_GRP_SOURCES 1 /* 64-bit source attributes */
602
603/* Layout of 64-bit source attribute values */
604#define KVM_XICS_DESTINATION_SHIFT 0
605#define KVM_XICS_DESTINATION_MASK 0xffffffffULL
606#define KVM_XICS_PRIORITY_SHIFT 32
607#define KVM_XICS_PRIORITY_MASK 0xff
608#define KVM_XICS_LEVEL_SENSITIVE (1ULL << 40)
609#define KVM_XICS_MASKED (1ULL << 41)
610#define KVM_XICS_PENDING (1ULL << 42)
611
612#endif /* __LINUX_KVM_POWERPC_H */
diff --git a/tools/arch/s390/include/uapi/asm/kvm.h b/tools/arch/s390/include/uapi/asm/kvm.h
new file mode 100644
index 000000000000..3b8e99ef9d58
--- /dev/null
+++ b/tools/arch/s390/include/uapi/asm/kvm.h
@@ -0,0 +1,192 @@
1#ifndef __LINUX_KVM_S390_H
2#define __LINUX_KVM_S390_H
3/*
4 * KVM s390 specific structures and definitions
5 *
6 * Copyright IBM Corp. 2008
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License (version 2 only)
10 * as published by the Free Software Foundation.
11 *
12 * Author(s): Carsten Otte <cotte@de.ibm.com>
13 * Christian Borntraeger <borntraeger@de.ibm.com>
14 */
15#include <linux/types.h>
16
17#define __KVM_S390
18#define __KVM_HAVE_GUEST_DEBUG
19
20/* Device control API: s390-specific devices */
21#define KVM_DEV_FLIC_GET_ALL_IRQS 1
22#define KVM_DEV_FLIC_ENQUEUE 2
23#define KVM_DEV_FLIC_CLEAR_IRQS 3
24#define KVM_DEV_FLIC_APF_ENABLE 4
25#define KVM_DEV_FLIC_APF_DISABLE_WAIT 5
26#define KVM_DEV_FLIC_ADAPTER_REGISTER 6
27#define KVM_DEV_FLIC_ADAPTER_MODIFY 7
28#define KVM_DEV_FLIC_CLEAR_IO_IRQ 8
29/*
30 * We can have up to 4*64k pending subchannels + 8 adapter interrupts,
31 * as well as up to ASYNC_PF_PER_VCPU*KVM_MAX_VCPUS pfault done interrupts.
32 * There are also sclp and machine checks. This gives us
33 * sizeof(kvm_s390_irq)*(4*65536+8+64*64+1+1) = 72 * 266250 = 19170000
34 * Lets round up to 8192 pages.
35 */
36#define KVM_S390_MAX_FLOAT_IRQS 266250
37#define KVM_S390_FLIC_MAX_BUFFER 0x2000000
38
39struct kvm_s390_io_adapter {
40 __u32 id;
41 __u8 isc;
42 __u8 maskable;
43 __u8 swap;
44 __u8 pad;
45};
46
47#define KVM_S390_IO_ADAPTER_MASK 1
48#define KVM_S390_IO_ADAPTER_MAP 2
49#define KVM_S390_IO_ADAPTER_UNMAP 3
50
51struct kvm_s390_io_adapter_req {
52 __u32 id;
53 __u8 type;
54 __u8 mask;
55 __u16 pad0;
56 __u64 addr;
57};
58
59/* kvm attr_group on vm fd */
60#define KVM_S390_VM_MEM_CTRL 0
61#define KVM_S390_VM_TOD 1
62#define KVM_S390_VM_CRYPTO 2
63#define KVM_S390_VM_CPU_MODEL 3
64
65/* kvm attributes for mem_ctrl */
66#define KVM_S390_VM_MEM_ENABLE_CMMA 0
67#define KVM_S390_VM_MEM_CLR_CMMA 1
68#define KVM_S390_VM_MEM_LIMIT_SIZE 2
69
70#define KVM_S390_NO_MEM_LIMIT U64_MAX
71
72/* kvm attributes for KVM_S390_VM_TOD */
73#define KVM_S390_VM_TOD_LOW 0
74#define KVM_S390_VM_TOD_HIGH 1
75
76/* kvm attributes for KVM_S390_VM_CPU_MODEL */
77/* processor related attributes are r/w */
78#define KVM_S390_VM_CPU_PROCESSOR 0
79struct kvm_s390_vm_cpu_processor {
80 __u64 cpuid;
81 __u16 ibc;
82 __u8 pad[6];
83 __u64 fac_list[256];
84};
85
86/* machine related attributes are r/o */
87#define KVM_S390_VM_CPU_MACHINE 1
88struct kvm_s390_vm_cpu_machine {
89 __u64 cpuid;
90 __u32 ibc;
91 __u8 pad[4];
92 __u64 fac_mask[256];
93 __u64 fac_list[256];
94};
95
96/* kvm attributes for crypto */
97#define KVM_S390_VM_CRYPTO_ENABLE_AES_KW 0
98#define KVM_S390_VM_CRYPTO_ENABLE_DEA_KW 1
99#define KVM_S390_VM_CRYPTO_DISABLE_AES_KW 2
100#define KVM_S390_VM_CRYPTO_DISABLE_DEA_KW 3
101
102/* for KVM_GET_REGS and KVM_SET_REGS */
103struct kvm_regs {
104 /* general purpose regs for s390 */
105 __u64 gprs[16];
106};
107
108/* for KVM_GET_SREGS and KVM_SET_SREGS */
109struct kvm_sregs {
110 __u32 acrs[16];
111 __u64 crs[16];
112};
113
114/* for KVM_GET_FPU and KVM_SET_FPU */
115struct kvm_fpu {
116 __u32 fpc;
117 __u64 fprs[16];
118};
119
120#define KVM_GUESTDBG_USE_HW_BP 0x00010000
121
122#define KVM_HW_BP 1
123#define KVM_HW_WP_WRITE 2
124#define KVM_SINGLESTEP 4
125
126struct kvm_debug_exit_arch {
127 __u64 addr;
128 __u8 type;
129 __u8 pad[7]; /* Should be set to 0 */
130};
131
132struct kvm_hw_breakpoint {
133 __u64 addr;
134 __u64 phys_addr;
135 __u64 len;
136 __u8 type;
137 __u8 pad[7]; /* Should be set to 0 */
138};
139
140/* for KVM_SET_GUEST_DEBUG */
141struct kvm_guest_debug_arch {
142 __u32 nr_hw_bp;
143 __u32 pad; /* Should be set to 0 */
144 struct kvm_hw_breakpoint __user *hw_bp;
145};
146
147/* for KVM_SYNC_PFAULT and KVM_REG_S390_PFTOKEN */
148#define KVM_S390_PFAULT_TOKEN_INVALID 0xffffffffffffffffULL
149
150#define KVM_SYNC_PREFIX (1UL << 0)
151#define KVM_SYNC_GPRS (1UL << 1)
152#define KVM_SYNC_ACRS (1UL << 2)
153#define KVM_SYNC_CRS (1UL << 3)
154#define KVM_SYNC_ARCH0 (1UL << 4)
155#define KVM_SYNC_PFAULT (1UL << 5)
156#define KVM_SYNC_VRS (1UL << 6)
157#define KVM_SYNC_RICCB (1UL << 7)
158#define KVM_SYNC_FPRS (1UL << 8)
159/* definition of registers in kvm_run */
160struct kvm_sync_regs {
161 __u64 prefix; /* prefix register */
162 __u64 gprs[16]; /* general purpose registers */
163 __u32 acrs[16]; /* access registers */
164 __u64 crs[16]; /* control registers */
165 __u64 todpr; /* tod programmable register [ARCH0] */
166 __u64 cputm; /* cpu timer [ARCH0] */
167 __u64 ckc; /* clock comparator [ARCH0] */
168 __u64 pp; /* program parameter [ARCH0] */
169 __u64 gbea; /* guest breaking-event address [ARCH0] */
170 __u64 pft; /* pfault token [PFAULT] */
171 __u64 pfs; /* pfault select [PFAULT] */
172 __u64 pfc; /* pfault compare [PFAULT] */
173 union {
174 __u64 vrs[32][2]; /* vector registers (KVM_SYNC_VRS) */
175 __u64 fprs[16]; /* fp registers (KVM_SYNC_FPRS) */
176 };
177 __u8 reserved[512]; /* for future vector expansion */
178 __u32 fpc; /* valid on KVM_SYNC_VRS or KVM_SYNC_FPRS */
179 __u8 padding[52]; /* riccb needs to be 64byte aligned */
180 __u8 riccb[64]; /* runtime instrumentation controls block */
181};
182
183#define KVM_REG_S390_TODPR (KVM_REG_S390 | KVM_REG_SIZE_U32 | 0x1)
184#define KVM_REG_S390_EPOCHDIFF (KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x2)
185#define KVM_REG_S390_CPU_TIMER (KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x3)
186#define KVM_REG_S390_CLOCK_COMP (KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x4)
187#define KVM_REG_S390_PFTOKEN (KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x5)
188#define KVM_REG_S390_PFCOMPARE (KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x6)
189#define KVM_REG_S390_PFSELECT (KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x7)
190#define KVM_REG_S390_PP (KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x8)
191#define KVM_REG_S390_GBEA (KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x9)
192#endif
diff --git a/tools/arch/s390/include/uapi/asm/kvm_perf.h b/tools/arch/s390/include/uapi/asm/kvm_perf.h
new file mode 100644
index 000000000000..397282727e21
--- /dev/null
+++ b/tools/arch/s390/include/uapi/asm/kvm_perf.h
@@ -0,0 +1,25 @@
1/*
2 * Definitions for perf-kvm on s390
3 *
4 * Copyright 2014 IBM Corp.
5 * Author(s): Alexander Yarygin <yarygin@linux.vnet.ibm.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License (version 2 only)
9 * as published by the Free Software Foundation.
10 */
11
12#ifndef __LINUX_KVM_PERF_S390_H
13#define __LINUX_KVM_PERF_S390_H
14
15#include <asm/sie.h>
16
17#define DECODE_STR_LEN 40
18
19#define VCPU_ID "id"
20
21#define KVM_ENTRY_TRACE "kvm:kvm_s390_sie_enter"
22#define KVM_EXIT_TRACE "kvm:kvm_s390_sie_exit"
23#define KVM_EXIT_REASON "icptcode"
24
25#endif
diff --git a/tools/arch/s390/include/uapi/asm/sie.h b/tools/arch/s390/include/uapi/asm/sie.h
new file mode 100644
index 000000000000..8fb5d4a6dd25
--- /dev/null
+++ b/tools/arch/s390/include/uapi/asm/sie.h
@@ -0,0 +1,250 @@
1#ifndef _UAPI_ASM_S390_SIE_H
2#define _UAPI_ASM_S390_SIE_H
3
4#define diagnose_codes \
5 { 0x10, "DIAG (0x10) release pages" }, \
6 { 0x44, "DIAG (0x44) time slice end" }, \
7 { 0x9c, "DIAG (0x9c) time slice end directed" }, \
8 { 0x204, "DIAG (0x204) logical-cpu utilization" }, \
9 { 0x258, "DIAG (0x258) page-reference services" }, \
10 { 0x288, "DIAG (0x288) watchdog functions" }, \
11 { 0x308, "DIAG (0x308) ipl functions" }, \
12 { 0x500, "DIAG (0x500) KVM virtio functions" }, \
13 { 0x501, "DIAG (0x501) KVM breakpoint" }
14
15#define sigp_order_codes \
16 { 0x01, "SIGP sense" }, \
17 { 0x02, "SIGP external call" }, \
18 { 0x03, "SIGP emergency signal" }, \
19 { 0x04, "SIGP start" }, \
20 { 0x05, "SIGP stop" }, \
21 { 0x06, "SIGP restart" }, \
22 { 0x09, "SIGP stop and store status" }, \
23 { 0x0b, "SIGP initial cpu reset" }, \
24 { 0x0c, "SIGP cpu reset" }, \
25 { 0x0d, "SIGP set prefix" }, \
26 { 0x0e, "SIGP store status at address" }, \
27 { 0x12, "SIGP set architecture" }, \
28 { 0x13, "SIGP conditional emergency signal" }, \
29 { 0x15, "SIGP sense running" }, \
30 { 0x16, "SIGP set multithreading"}, \
31 { 0x17, "SIGP store additional status ait address"}
32
33#define icpt_prog_codes \
34 { 0x0001, "Prog Operation" }, \
35 { 0x0002, "Prog Privileged Operation" }, \
36 { 0x0003, "Prog Execute" }, \
37 { 0x0004, "Prog Protection" }, \
38 { 0x0005, "Prog Addressing" }, \
39 { 0x0006, "Prog Specification" }, \
40 { 0x0007, "Prog Data" }, \
41 { 0x0008, "Prog Fixedpoint overflow" }, \
42 { 0x0009, "Prog Fixedpoint divide" }, \
43 { 0x000A, "Prog Decimal overflow" }, \
44 { 0x000B, "Prog Decimal divide" }, \
45 { 0x000C, "Prog HFP exponent overflow" }, \
46 { 0x000D, "Prog HFP exponent underflow" }, \
47 { 0x000E, "Prog HFP significance" }, \
48 { 0x000F, "Prog HFP divide" }, \
49 { 0x0010, "Prog Segment translation" }, \
50 { 0x0011, "Prog Page translation" }, \
51 { 0x0012, "Prog Translation specification" }, \
52 { 0x0013, "Prog Special operation" }, \
53 { 0x0015, "Prog Operand" }, \
54 { 0x0016, "Prog Trace table" }, \
55 { 0x0017, "Prog ASNtranslation specification" }, \
56 { 0x001C, "Prog Spaceswitch event" }, \
57 { 0x001D, "Prog HFP square root" }, \
58 { 0x001F, "Prog PCtranslation specification" }, \
59 { 0x0020, "Prog AFX translation" }, \
60 { 0x0021, "Prog ASX translation" }, \
61 { 0x0022, "Prog LX translation" }, \
62 { 0x0023, "Prog EX translation" }, \
63 { 0x0024, "Prog Primary authority" }, \
64 { 0x0025, "Prog Secondary authority" }, \
65 { 0x0026, "Prog LFXtranslation exception" }, \
66 { 0x0027, "Prog LSXtranslation exception" }, \
67 { 0x0028, "Prog ALET specification" }, \
68 { 0x0029, "Prog ALEN translation" }, \
69 { 0x002A, "Prog ALE sequence" }, \
70 { 0x002B, "Prog ASTE validity" }, \
71 { 0x002C, "Prog ASTE sequence" }, \
72 { 0x002D, "Prog Extended authority" }, \
73 { 0x002E, "Prog LSTE sequence" }, \
74 { 0x002F, "Prog ASTE instance" }, \
75 { 0x0030, "Prog Stack full" }, \
76 { 0x0031, "Prog Stack empty" }, \
77 { 0x0032, "Prog Stack specification" }, \
78 { 0x0033, "Prog Stack type" }, \
79 { 0x0034, "Prog Stack operation" }, \
80 { 0x0039, "Prog Region first translation" }, \
81 { 0x003A, "Prog Region second translation" }, \
82 { 0x003B, "Prog Region third translation" }, \
83 { 0x0040, "Prog Monitor event" }, \
84 { 0x0080, "Prog PER event" }, \
85 { 0x0119, "Prog Crypto operation" }
86
87#define exit_code_ipa0(ipa0, opcode, mnemonic) \
88 { (ipa0 << 8 | opcode), #ipa0 " " mnemonic }
89#define exit_code(opcode, mnemonic) \
90 { opcode, mnemonic }
91
92#define icpt_insn_codes \
93 exit_code_ipa0(0x01, 0x01, "PR"), \
94 exit_code_ipa0(0x01, 0x04, "PTFF"), \
95 exit_code_ipa0(0x01, 0x07, "SCKPF"), \
96 exit_code_ipa0(0xAA, 0x00, "RINEXT"), \
97 exit_code_ipa0(0xAA, 0x01, "RION"), \
98 exit_code_ipa0(0xAA, 0x02, "TRIC"), \
99 exit_code_ipa0(0xAA, 0x03, "RIOFF"), \
100 exit_code_ipa0(0xAA, 0x04, "RIEMIT"), \
101 exit_code_ipa0(0xB2, 0x02, "STIDP"), \
102 exit_code_ipa0(0xB2, 0x04, "SCK"), \
103 exit_code_ipa0(0xB2, 0x05, "STCK"), \
104 exit_code_ipa0(0xB2, 0x06, "SCKC"), \
105 exit_code_ipa0(0xB2, 0x07, "STCKC"), \
106 exit_code_ipa0(0xB2, 0x08, "SPT"), \
107 exit_code_ipa0(0xB2, 0x09, "STPT"), \
108 exit_code_ipa0(0xB2, 0x0d, "PTLB"), \
109 exit_code_ipa0(0xB2, 0x10, "SPX"), \
110 exit_code_ipa0(0xB2, 0x11, "STPX"), \
111 exit_code_ipa0(0xB2, 0x12, "STAP"), \
112 exit_code_ipa0(0xB2, 0x14, "SIE"), \
113 exit_code_ipa0(0xB2, 0x16, "SETR"), \
114 exit_code_ipa0(0xB2, 0x17, "STETR"), \
115 exit_code_ipa0(0xB2, 0x18, "PC"), \
116 exit_code_ipa0(0xB2, 0x20, "SERVC"), \
117 exit_code_ipa0(0xB2, 0x21, "IPTE"), \
118 exit_code_ipa0(0xB2, 0x28, "PT"), \
119 exit_code_ipa0(0xB2, 0x29, "ISKE"), \
120 exit_code_ipa0(0xB2, 0x2a, "RRBE"), \
121 exit_code_ipa0(0xB2, 0x2b, "SSKE"), \
122 exit_code_ipa0(0xB2, 0x2c, "TB"), \
123 exit_code_ipa0(0xB2, 0x2e, "PGIN"), \
124 exit_code_ipa0(0xB2, 0x2f, "PGOUT"), \
125 exit_code_ipa0(0xB2, 0x30, "CSCH"), \
126 exit_code_ipa0(0xB2, 0x31, "HSCH"), \
127 exit_code_ipa0(0xB2, 0x32, "MSCH"), \
128 exit_code_ipa0(0xB2, 0x33, "SSCH"), \
129 exit_code_ipa0(0xB2, 0x34, "STSCH"), \
130 exit_code_ipa0(0xB2, 0x35, "TSCH"), \
131 exit_code_ipa0(0xB2, 0x36, "TPI"), \
132 exit_code_ipa0(0xB2, 0x37, "SAL"), \
133 exit_code_ipa0(0xB2, 0x38, "RSCH"), \
134 exit_code_ipa0(0xB2, 0x39, "STCRW"), \
135 exit_code_ipa0(0xB2, 0x3a, "STCPS"), \
136 exit_code_ipa0(0xB2, 0x3b, "RCHP"), \
137 exit_code_ipa0(0xB2, 0x3c, "SCHM"), \
138 exit_code_ipa0(0xB2, 0x40, "BAKR"), \
139 exit_code_ipa0(0xB2, 0x48, "PALB"), \
140 exit_code_ipa0(0xB2, 0x4c, "TAR"), \
141 exit_code_ipa0(0xB2, 0x50, "CSP"), \
142 exit_code_ipa0(0xB2, 0x54, "MVPG"), \
143 exit_code_ipa0(0xB2, 0x58, "BSG"), \
144 exit_code_ipa0(0xB2, 0x5a, "BSA"), \
145 exit_code_ipa0(0xB2, 0x5f, "CHSC"), \
146 exit_code_ipa0(0xB2, 0x74, "SIGA"), \
147 exit_code_ipa0(0xB2, 0x76, "XSCH"), \
148 exit_code_ipa0(0xB2, 0x78, "STCKE"), \
149 exit_code_ipa0(0xB2, 0x7c, "STCKF"), \
150 exit_code_ipa0(0xB2, 0x7d, "STSI"), \
151 exit_code_ipa0(0xB2, 0xb0, "STFLE"), \
152 exit_code_ipa0(0xB2, 0xb1, "STFL"), \
153 exit_code_ipa0(0xB2, 0xb2, "LPSWE"), \
154 exit_code_ipa0(0xB2, 0xf8, "TEND"), \
155 exit_code_ipa0(0xB2, 0xfc, "TABORT"), \
156 exit_code_ipa0(0xB9, 0x1e, "KMAC"), \
157 exit_code_ipa0(0xB9, 0x28, "PCKMO"), \
158 exit_code_ipa0(0xB9, 0x2a, "KMF"), \
159 exit_code_ipa0(0xB9, 0x2b, "KMO"), \
160 exit_code_ipa0(0xB9, 0x2d, "KMCTR"), \
161 exit_code_ipa0(0xB9, 0x2e, "KM"), \
162 exit_code_ipa0(0xB9, 0x2f, "KMC"), \
163 exit_code_ipa0(0xB9, 0x3e, "KIMD"), \
164 exit_code_ipa0(0xB9, 0x3f, "KLMD"), \
165 exit_code_ipa0(0xB9, 0x8a, "CSPG"), \
166 exit_code_ipa0(0xB9, 0x8d, "EPSW"), \
167 exit_code_ipa0(0xB9, 0x8e, "IDTE"), \
168 exit_code_ipa0(0xB9, 0x8f, "CRDTE"), \
169 exit_code_ipa0(0xB9, 0x9c, "EQBS"), \
170 exit_code_ipa0(0xB9, 0xa2, "PTF"), \
171 exit_code_ipa0(0xB9, 0xab, "ESSA"), \
172 exit_code_ipa0(0xB9, 0xae, "RRBM"), \
173 exit_code_ipa0(0xB9, 0xaf, "PFMF"), \
174 exit_code_ipa0(0xE3, 0x03, "LRAG"), \
175 exit_code_ipa0(0xE3, 0x13, "LRAY"), \
176 exit_code_ipa0(0xE3, 0x25, "NTSTG"), \
177 exit_code_ipa0(0xE5, 0x00, "LASP"), \
178 exit_code_ipa0(0xE5, 0x01, "TPROT"), \
179 exit_code_ipa0(0xE5, 0x60, "TBEGIN"), \
180 exit_code_ipa0(0xE5, 0x61, "TBEGINC"), \
181 exit_code_ipa0(0xEB, 0x25, "STCTG"), \
182 exit_code_ipa0(0xEB, 0x2f, "LCTLG"), \
183 exit_code_ipa0(0xEB, 0x60, "LRIC"), \
184 exit_code_ipa0(0xEB, 0x61, "STRIC"), \
185 exit_code_ipa0(0xEB, 0x62, "MRIC"), \
186 exit_code_ipa0(0xEB, 0x8a, "SQBS"), \
187 exit_code_ipa0(0xC8, 0x01, "ECTG"), \
188 exit_code(0x0a, "SVC"), \
189 exit_code(0x80, "SSM"), \
190 exit_code(0x82, "LPSW"), \
191 exit_code(0x83, "DIAG"), \
192 exit_code(0xae, "SIGP"), \
193 exit_code(0xac, "STNSM"), \
194 exit_code(0xad, "STOSM"), \
195 exit_code(0xb1, "LRA"), \
196 exit_code(0xb6, "STCTL"), \
197 exit_code(0xb7, "LCTL"), \
198 exit_code(0xee, "PLO")
199
200#define sie_intercept_code \
201 { 0x00, "Host interruption" }, \
202 { 0x04, "Instruction" }, \
203 { 0x08, "Program interruption" }, \
204 { 0x0c, "Instruction and program interruption" }, \
205 { 0x10, "External request" }, \
206 { 0x14, "External interruption" }, \
207 { 0x18, "I/O request" }, \
208 { 0x1c, "Wait state" }, \
209 { 0x20, "Validity" }, \
210 { 0x28, "Stop request" }, \
211 { 0x2c, "Operation exception" }, \
212 { 0x38, "Partial-execution" }, \
213 { 0x3c, "I/O interruption" }, \
214 { 0x40, "I/O instruction" }, \
215 { 0x48, "Timing subset" }
216
217/*
218 * This is the simple interceptable instructions decoder.
219 *
220 * It will be used as userspace interface and it can be used in places
221 * that does not allow to use general decoder functions,
222 * such as trace events declarations.
223 *
224 * Some userspace tools may want to parse this code
225 * and would be confused by switch(), if() and other statements,
226 * but they can understand conditional operator.
227 */
228#define INSN_DECODE_IPA0(ipa0, insn, rshift, mask) \
229 (insn >> 56) == (ipa0) ? \
230 ((ipa0 << 8) | ((insn >> rshift) & mask)) :
231
232#define INSN_DECODE(insn) (insn >> 56)
233
234/*
235 * The macro icpt_insn_decoder() takes an intercepted instruction
236 * and returns a key, which can be used to find a mnemonic name
237 * of the instruction in the icpt_insn_codes table.
238 */
239#define icpt_insn_decoder(insn) ( \
240 INSN_DECODE_IPA0(0x01, insn, 48, 0xff) \
241 INSN_DECODE_IPA0(0xaa, insn, 48, 0x0f) \
242 INSN_DECODE_IPA0(0xb2, insn, 48, 0xff) \
243 INSN_DECODE_IPA0(0xb9, insn, 48, 0xff) \
244 INSN_DECODE_IPA0(0xe3, insn, 48, 0xff) \
245 INSN_DECODE_IPA0(0xe5, insn, 48, 0xff) \
246 INSN_DECODE_IPA0(0xeb, insn, 16, 0xff) \
247 INSN_DECODE_IPA0(0xc8, insn, 48, 0x0f) \
248 INSN_DECODE(insn))
249
250#endif /* _UAPI_ASM_S390_SIE_H */
diff --git a/tools/arch/x86/include/uapi/asm/kvm.h b/tools/arch/x86/include/uapi/asm/kvm.h
new file mode 100644
index 000000000000..739c0c594022
--- /dev/null
+++ b/tools/arch/x86/include/uapi/asm/kvm.h
@@ -0,0 +1,360 @@
1#ifndef _ASM_X86_KVM_H
2#define _ASM_X86_KVM_H
3
4/*
5 * KVM x86 specific structures and definitions
6 *
7 */
8
9#include <linux/types.h>
10#include <linux/ioctl.h>
11
12#define DE_VECTOR 0
13#define DB_VECTOR 1
14#define BP_VECTOR 3
15#define OF_VECTOR 4
16#define BR_VECTOR 5
17#define UD_VECTOR 6
18#define NM_VECTOR 7
19#define DF_VECTOR 8
20#define TS_VECTOR 10
21#define NP_VECTOR 11
22#define SS_VECTOR 12
23#define GP_VECTOR 13
24#define PF_VECTOR 14
25#define MF_VECTOR 16
26#define AC_VECTOR 17
27#define MC_VECTOR 18
28#define XM_VECTOR 19
29#define VE_VECTOR 20
30
31/* Select x86 specific features in <linux/kvm.h> */
32#define __KVM_HAVE_PIT
33#define __KVM_HAVE_IOAPIC
34#define __KVM_HAVE_IRQ_LINE
35#define __KVM_HAVE_MSI
36#define __KVM_HAVE_USER_NMI
37#define __KVM_HAVE_GUEST_DEBUG
38#define __KVM_HAVE_MSIX
39#define __KVM_HAVE_MCE
40#define __KVM_HAVE_PIT_STATE2
41#define __KVM_HAVE_XEN_HVM
42#define __KVM_HAVE_VCPU_EVENTS
43#define __KVM_HAVE_DEBUGREGS
44#define __KVM_HAVE_XSAVE
45#define __KVM_HAVE_XCRS
46#define __KVM_HAVE_READONLY_MEM
47
48/* Architectural interrupt line count. */
49#define KVM_NR_INTERRUPTS 256
50
51struct kvm_memory_alias {
52 __u32 slot; /* this has a different namespace than memory slots */
53 __u32 flags;
54 __u64 guest_phys_addr;
55 __u64 memory_size;
56 __u64 target_phys_addr;
57};
58
59/* for KVM_GET_IRQCHIP and KVM_SET_IRQCHIP */
60struct kvm_pic_state {
61 __u8 last_irr; /* edge detection */
62 __u8 irr; /* interrupt request register */
63 __u8 imr; /* interrupt mask register */
64 __u8 isr; /* interrupt service register */
65 __u8 priority_add; /* highest irq priority */
66 __u8 irq_base;
67 __u8 read_reg_select;
68 __u8 poll;
69 __u8 special_mask;
70 __u8 init_state;
71 __u8 auto_eoi;
72 __u8 rotate_on_auto_eoi;
73 __u8 special_fully_nested_mode;
74 __u8 init4; /* true if 4 byte init */
75 __u8 elcr; /* PIIX edge/trigger selection */
76 __u8 elcr_mask;
77};
78
79#define KVM_IOAPIC_NUM_PINS 24
80struct kvm_ioapic_state {
81 __u64 base_address;
82 __u32 ioregsel;
83 __u32 id;
84 __u32 irr;
85 __u32 pad;
86 union {
87 __u64 bits;
88 struct {
89 __u8 vector;
90 __u8 delivery_mode:3;
91 __u8 dest_mode:1;
92 __u8 delivery_status:1;
93 __u8 polarity:1;
94 __u8 remote_irr:1;
95 __u8 trig_mode:1;
96 __u8 mask:1;
97 __u8 reserve:7;
98 __u8 reserved[4];
99 __u8 dest_id;
100 } fields;
101 } redirtbl[KVM_IOAPIC_NUM_PINS];
102};
103
104#define KVM_IRQCHIP_PIC_MASTER 0
105#define KVM_IRQCHIP_PIC_SLAVE 1
106#define KVM_IRQCHIP_IOAPIC 2
107#define KVM_NR_IRQCHIPS 3
108
109#define KVM_RUN_X86_SMM (1 << 0)
110
111/* for KVM_GET_REGS and KVM_SET_REGS */
112struct kvm_regs {
113 /* out (KVM_GET_REGS) / in (KVM_SET_REGS) */
114 __u64 rax, rbx, rcx, rdx;
115 __u64 rsi, rdi, rsp, rbp;
116 __u64 r8, r9, r10, r11;
117 __u64 r12, r13, r14, r15;
118 __u64 rip, rflags;
119};
120
121/* for KVM_GET_LAPIC and KVM_SET_LAPIC */
122#define KVM_APIC_REG_SIZE 0x400
123struct kvm_lapic_state {
124 char regs[KVM_APIC_REG_SIZE];
125};
126
127struct kvm_segment {
128 __u64 base;
129 __u32 limit;
130 __u16 selector;
131 __u8 type;
132 __u8 present, dpl, db, s, l, g, avl;
133 __u8 unusable;
134 __u8 padding;
135};
136
137struct kvm_dtable {
138 __u64 base;
139 __u16 limit;
140 __u16 padding[3];
141};
142
143
144/* for KVM_GET_SREGS and KVM_SET_SREGS */
145struct kvm_sregs {
146 /* out (KVM_GET_SREGS) / in (KVM_SET_SREGS) */
147 struct kvm_segment cs, ds, es, fs, gs, ss;
148 struct kvm_segment tr, ldt;
149 struct kvm_dtable gdt, idt;
150 __u64 cr0, cr2, cr3, cr4, cr8;
151 __u64 efer;
152 __u64 apic_base;
153 __u64 interrupt_bitmap[(KVM_NR_INTERRUPTS + 63) / 64];
154};
155
156/* for KVM_GET_FPU and KVM_SET_FPU */
157struct kvm_fpu {
158 __u8 fpr[8][16];
159 __u16 fcw;
160 __u16 fsw;
161 __u8 ftwx; /* in fxsave format */
162 __u8 pad1;
163 __u16 last_opcode;
164 __u64 last_ip;
165 __u64 last_dp;
166 __u8 xmm[16][16];
167 __u32 mxcsr;
168 __u32 pad2;
169};
170
171struct kvm_msr_entry {
172 __u32 index;
173 __u32 reserved;
174 __u64 data;
175};
176
177/* for KVM_GET_MSRS and KVM_SET_MSRS */
178struct kvm_msrs {
179 __u32 nmsrs; /* number of msrs in entries */
180 __u32 pad;
181
182 struct kvm_msr_entry entries[0];
183};
184
185/* for KVM_GET_MSR_INDEX_LIST */
186struct kvm_msr_list {
187 __u32 nmsrs; /* number of msrs in entries */
188 __u32 indices[0];
189};
190
191
192struct kvm_cpuid_entry {
193 __u32 function;
194 __u32 eax;
195 __u32 ebx;
196 __u32 ecx;
197 __u32 edx;
198 __u32 padding;
199};
200
201/* for KVM_SET_CPUID */
202struct kvm_cpuid {
203 __u32 nent;
204 __u32 padding;
205 struct kvm_cpuid_entry entries[0];
206};
207
208struct kvm_cpuid_entry2 {
209 __u32 function;
210 __u32 index;
211 __u32 flags;
212 __u32 eax;
213 __u32 ebx;
214 __u32 ecx;
215 __u32 edx;
216 __u32 padding[3];
217};
218
219#define KVM_CPUID_FLAG_SIGNIFCANT_INDEX (1 << 0)
220#define KVM_CPUID_FLAG_STATEFUL_FUNC (1 << 1)
221#define KVM_CPUID_FLAG_STATE_READ_NEXT (1 << 2)
222
223/* for KVM_SET_CPUID2 */
224struct kvm_cpuid2 {
225 __u32 nent;
226 __u32 padding;
227 struct kvm_cpuid_entry2 entries[0];
228};
229
230/* for KVM_GET_PIT and KVM_SET_PIT */
231struct kvm_pit_channel_state {
232 __u32 count; /* can be 65536 */
233 __u16 latched_count;
234 __u8 count_latched;
235 __u8 status_latched;
236 __u8 status;
237 __u8 read_state;
238 __u8 write_state;
239 __u8 write_latch;
240 __u8 rw_mode;
241 __u8 mode;
242 __u8 bcd;
243 __u8 gate;
244 __s64 count_load_time;
245};
246
247struct kvm_debug_exit_arch {
248 __u32 exception;
249 __u32 pad;
250 __u64 pc;
251 __u64 dr6;
252 __u64 dr7;
253};
254
255#define KVM_GUESTDBG_USE_SW_BP 0x00010000
256#define KVM_GUESTDBG_USE_HW_BP 0x00020000
257#define KVM_GUESTDBG_INJECT_DB 0x00040000
258#define KVM_GUESTDBG_INJECT_BP 0x00080000
259
260/* for KVM_SET_GUEST_DEBUG */
261struct kvm_guest_debug_arch {
262 __u64 debugreg[8];
263};
264
265struct kvm_pit_state {
266 struct kvm_pit_channel_state channels[3];
267};
268
269#define KVM_PIT_FLAGS_HPET_LEGACY 0x00000001
270
271struct kvm_pit_state2 {
272 struct kvm_pit_channel_state channels[3];
273 __u32 flags;
274 __u32 reserved[9];
275};
276
277struct kvm_reinject_control {
278 __u8 pit_reinject;
279 __u8 reserved[31];
280};
281
282/* When set in flags, include corresponding fields on KVM_SET_VCPU_EVENTS */
283#define KVM_VCPUEVENT_VALID_NMI_PENDING 0x00000001
284#define KVM_VCPUEVENT_VALID_SIPI_VECTOR 0x00000002
285#define KVM_VCPUEVENT_VALID_SHADOW 0x00000004
286#define KVM_VCPUEVENT_VALID_SMM 0x00000008
287
288/* Interrupt shadow states */
289#define KVM_X86_SHADOW_INT_MOV_SS 0x01
290#define KVM_X86_SHADOW_INT_STI 0x02
291
292/* for KVM_GET/SET_VCPU_EVENTS */
293struct kvm_vcpu_events {
294 struct {
295 __u8 injected;
296 __u8 nr;
297 __u8 has_error_code;
298 __u8 pad;
299 __u32 error_code;
300 } exception;
301 struct {
302 __u8 injected;
303 __u8 nr;
304 __u8 soft;
305 __u8 shadow;
306 } interrupt;
307 struct {
308 __u8 injected;
309 __u8 pending;
310 __u8 masked;
311 __u8 pad;
312 } nmi;
313 __u32 sipi_vector;
314 __u32 flags;
315 struct {
316 __u8 smm;
317 __u8 pending;
318 __u8 smm_inside_nmi;
319 __u8 latched_init;
320 } smi;
321 __u32 reserved[9];
322};
323
324/* for KVM_GET/SET_DEBUGREGS */
325struct kvm_debugregs {
326 __u64 db[4];
327 __u64 dr6;
328 __u64 dr7;
329 __u64 flags;
330 __u64 reserved[9];
331};
332
333/* for KVM_CAP_XSAVE */
334struct kvm_xsave {
335 __u32 region[1024];
336};
337
338#define KVM_MAX_XCRS 16
339
340struct kvm_xcr {
341 __u32 xcr;
342 __u32 reserved;
343 __u64 value;
344};
345
346struct kvm_xcrs {
347 __u32 nr_xcrs;
348 __u32 flags;
349 struct kvm_xcr xcrs[KVM_MAX_XCRS];
350 __u64 padding[16];
351};
352
353/* definition of registers in kvm_run */
354struct kvm_sync_regs {
355};
356
357#define KVM_X86_QUIRK_LINT0_REENABLED (1 << 0)
358#define KVM_X86_QUIRK_CD_NW_CLEARED (1 << 1)
359
360#endif /* _ASM_X86_KVM_H */
diff --git a/tools/arch/x86/include/uapi/asm/kvm_perf.h b/tools/arch/x86/include/uapi/asm/kvm_perf.h
new file mode 100644
index 000000000000..3bb964f88aa1
--- /dev/null
+++ b/tools/arch/x86/include/uapi/asm/kvm_perf.h
@@ -0,0 +1,16 @@
1#ifndef _ASM_X86_KVM_PERF_H
2#define _ASM_X86_KVM_PERF_H
3
4#include <asm/svm.h>
5#include <asm/vmx.h>
6#include <asm/kvm.h>
7
8#define DECODE_STR_LEN 20
9
10#define VCPU_ID "vcpu_id"
11
12#define KVM_ENTRY_TRACE "kvm:kvm_entry"
13#define KVM_EXIT_TRACE "kvm:kvm_exit"
14#define KVM_EXIT_REASON "exit_reason"
15
16#endif /* _ASM_X86_KVM_PERF_H */
diff --git a/tools/arch/x86/include/uapi/asm/svm.h b/tools/arch/x86/include/uapi/asm/svm.h
new file mode 100644
index 000000000000..3725e145aa58
--- /dev/null
+++ b/tools/arch/x86/include/uapi/asm/svm.h
@@ -0,0 +1,178 @@
1#ifndef _UAPI__SVM_H
2#define _UAPI__SVM_H
3
4#define SVM_EXIT_READ_CR0 0x000
5#define SVM_EXIT_READ_CR2 0x002
6#define SVM_EXIT_READ_CR3 0x003
7#define SVM_EXIT_READ_CR4 0x004
8#define SVM_EXIT_READ_CR8 0x008
9#define SVM_EXIT_WRITE_CR0 0x010
10#define SVM_EXIT_WRITE_CR2 0x012
11#define SVM_EXIT_WRITE_CR3 0x013
12#define SVM_EXIT_WRITE_CR4 0x014
13#define SVM_EXIT_WRITE_CR8 0x018
14#define SVM_EXIT_READ_DR0 0x020
15#define SVM_EXIT_READ_DR1 0x021
16#define SVM_EXIT_READ_DR2 0x022
17#define SVM_EXIT_READ_DR3 0x023
18#define SVM_EXIT_READ_DR4 0x024
19#define SVM_EXIT_READ_DR5 0x025
20#define SVM_EXIT_READ_DR6 0x026
21#define SVM_EXIT_READ_DR7 0x027
22#define SVM_EXIT_WRITE_DR0 0x030
23#define SVM_EXIT_WRITE_DR1 0x031
24#define SVM_EXIT_WRITE_DR2 0x032
25#define SVM_EXIT_WRITE_DR3 0x033
26#define SVM_EXIT_WRITE_DR4 0x034
27#define SVM_EXIT_WRITE_DR5 0x035
28#define SVM_EXIT_WRITE_DR6 0x036
29#define SVM_EXIT_WRITE_DR7 0x037
30#define SVM_EXIT_EXCP_BASE 0x040
31#define SVM_EXIT_INTR 0x060
32#define SVM_EXIT_NMI 0x061
33#define SVM_EXIT_SMI 0x062
34#define SVM_EXIT_INIT 0x063
35#define SVM_EXIT_VINTR 0x064
36#define SVM_EXIT_CR0_SEL_WRITE 0x065
37#define SVM_EXIT_IDTR_READ 0x066
38#define SVM_EXIT_GDTR_READ 0x067
39#define SVM_EXIT_LDTR_READ 0x068
40#define SVM_EXIT_TR_READ 0x069
41#define SVM_EXIT_IDTR_WRITE 0x06a
42#define SVM_EXIT_GDTR_WRITE 0x06b
43#define SVM_EXIT_LDTR_WRITE 0x06c
44#define SVM_EXIT_TR_WRITE 0x06d
45#define SVM_EXIT_RDTSC 0x06e
46#define SVM_EXIT_RDPMC 0x06f
47#define SVM_EXIT_PUSHF 0x070
48#define SVM_EXIT_POPF 0x071
49#define SVM_EXIT_CPUID 0x072
50#define SVM_EXIT_RSM 0x073
51#define SVM_EXIT_IRET 0x074
52#define SVM_EXIT_SWINT 0x075
53#define SVM_EXIT_INVD 0x076
54#define SVM_EXIT_PAUSE 0x077
55#define SVM_EXIT_HLT 0x078
56#define SVM_EXIT_INVLPG 0x079
57#define SVM_EXIT_INVLPGA 0x07a
58#define SVM_EXIT_IOIO 0x07b
59#define SVM_EXIT_MSR 0x07c
60#define SVM_EXIT_TASK_SWITCH 0x07d
61#define SVM_EXIT_FERR_FREEZE 0x07e
62#define SVM_EXIT_SHUTDOWN 0x07f
63#define SVM_EXIT_VMRUN 0x080
64#define SVM_EXIT_VMMCALL 0x081
65#define SVM_EXIT_VMLOAD 0x082
66#define SVM_EXIT_VMSAVE 0x083
67#define SVM_EXIT_STGI 0x084
68#define SVM_EXIT_CLGI 0x085
69#define SVM_EXIT_SKINIT 0x086
70#define SVM_EXIT_RDTSCP 0x087
71#define SVM_EXIT_ICEBP 0x088
72#define SVM_EXIT_WBINVD 0x089
73#define SVM_EXIT_MONITOR 0x08a
74#define SVM_EXIT_MWAIT 0x08b
75#define SVM_EXIT_MWAIT_COND 0x08c
76#define SVM_EXIT_XSETBV 0x08d
77#define SVM_EXIT_NPF 0x400
78#define SVM_EXIT_AVIC_INCOMPLETE_IPI 0x401
79#define SVM_EXIT_AVIC_UNACCELERATED_ACCESS 0x402
80
81#define SVM_EXIT_ERR -1
82
83#define SVM_EXIT_REASONS \
84 { SVM_EXIT_READ_CR0, "read_cr0" }, \
85 { SVM_EXIT_READ_CR2, "read_cr2" }, \
86 { SVM_EXIT_READ_CR3, "read_cr3" }, \
87 { SVM_EXIT_READ_CR4, "read_cr4" }, \
88 { SVM_EXIT_READ_CR8, "read_cr8" }, \
89 { SVM_EXIT_WRITE_CR0, "write_cr0" }, \
90 { SVM_EXIT_WRITE_CR2, "write_cr2" }, \
91 { SVM_EXIT_WRITE_CR3, "write_cr3" }, \
92 { SVM_EXIT_WRITE_CR4, "write_cr4" }, \
93 { SVM_EXIT_WRITE_CR8, "write_cr8" }, \
94 { SVM_EXIT_READ_DR0, "read_dr0" }, \
95 { SVM_EXIT_READ_DR1, "read_dr1" }, \
96 { SVM_EXIT_READ_DR2, "read_dr2" }, \
97 { SVM_EXIT_READ_DR3, "read_dr3" }, \
98 { SVM_EXIT_READ_DR4, "read_dr4" }, \
99 { SVM_EXIT_READ_DR5, "read_dr5" }, \
100 { SVM_EXIT_READ_DR6, "read_dr6" }, \
101 { SVM_EXIT_READ_DR7, "read_dr7" }, \
102 { SVM_EXIT_WRITE_DR0, "write_dr0" }, \
103 { SVM_EXIT_WRITE_DR1, "write_dr1" }, \
104 { SVM_EXIT_WRITE_DR2, "write_dr2" }, \
105 { SVM_EXIT_WRITE_DR3, "write_dr3" }, \
106 { SVM_EXIT_WRITE_DR4, "write_dr4" }, \
107 { SVM_EXIT_WRITE_DR5, "write_dr5" }, \
108 { SVM_EXIT_WRITE_DR6, "write_dr6" }, \
109 { SVM_EXIT_WRITE_DR7, "write_dr7" }, \
110 { SVM_EXIT_EXCP_BASE + DE_VECTOR, "DE excp" }, \
111 { SVM_EXIT_EXCP_BASE + DB_VECTOR, "DB excp" }, \
112 { SVM_EXIT_EXCP_BASE + BP_VECTOR, "BP excp" }, \
113 { SVM_EXIT_EXCP_BASE + OF_VECTOR, "OF excp" }, \
114 { SVM_EXIT_EXCP_BASE + BR_VECTOR, "BR excp" }, \
115 { SVM_EXIT_EXCP_BASE + UD_VECTOR, "UD excp" }, \
116 { SVM_EXIT_EXCP_BASE + NM_VECTOR, "NM excp" }, \
117 { SVM_EXIT_EXCP_BASE + DF_VECTOR, "DF excp" }, \
118 { SVM_EXIT_EXCP_BASE + TS_VECTOR, "TS excp" }, \
119 { SVM_EXIT_EXCP_BASE + NP_VECTOR, "NP excp" }, \
120 { SVM_EXIT_EXCP_BASE + SS_VECTOR, "SS excp" }, \
121 { SVM_EXIT_EXCP_BASE + GP_VECTOR, "GP excp" }, \
122 { SVM_EXIT_EXCP_BASE + PF_VECTOR, "PF excp" }, \
123 { SVM_EXIT_EXCP_BASE + MF_VECTOR, "MF excp" }, \
124 { SVM_EXIT_EXCP_BASE + AC_VECTOR, "AC excp" }, \
125 { SVM_EXIT_EXCP_BASE + MC_VECTOR, "MC excp" }, \
126 { SVM_EXIT_EXCP_BASE + XM_VECTOR, "XF excp" }, \
127 { SVM_EXIT_INTR, "interrupt" }, \
128 { SVM_EXIT_NMI, "nmi" }, \
129 { SVM_EXIT_SMI, "smi" }, \
130 { SVM_EXIT_INIT, "init" }, \
131 { SVM_EXIT_VINTR, "vintr" }, \
132 { SVM_EXIT_CR0_SEL_WRITE, "cr0_sel_write" }, \
133 { SVM_EXIT_IDTR_READ, "read_idtr" }, \
134 { SVM_EXIT_GDTR_READ, "read_gdtr" }, \
135 { SVM_EXIT_LDTR_READ, "read_ldtr" }, \
136 { SVM_EXIT_TR_READ, "read_rt" }, \
137 { SVM_EXIT_IDTR_WRITE, "write_idtr" }, \
138 { SVM_EXIT_GDTR_WRITE, "write_gdtr" }, \
139 { SVM_EXIT_LDTR_WRITE, "write_ldtr" }, \
140 { SVM_EXIT_TR_WRITE, "write_rt" }, \
141 { SVM_EXIT_RDTSC, "rdtsc" }, \
142 { SVM_EXIT_RDPMC, "rdpmc" }, \
143 { SVM_EXIT_PUSHF, "pushf" }, \
144 { SVM_EXIT_POPF, "popf" }, \
145 { SVM_EXIT_CPUID, "cpuid" }, \
146 { SVM_EXIT_RSM, "rsm" }, \
147 { SVM_EXIT_IRET, "iret" }, \
148 { SVM_EXIT_SWINT, "swint" }, \
149 { SVM_EXIT_INVD, "invd" }, \
150 { SVM_EXIT_PAUSE, "pause" }, \
151 { SVM_EXIT_HLT, "hlt" }, \
152 { SVM_EXIT_INVLPG, "invlpg" }, \
153 { SVM_EXIT_INVLPGA, "invlpga" }, \
154 { SVM_EXIT_IOIO, "io" }, \
155 { SVM_EXIT_MSR, "msr" }, \
156 { SVM_EXIT_TASK_SWITCH, "task_switch" }, \
157 { SVM_EXIT_FERR_FREEZE, "ferr_freeze" }, \
158 { SVM_EXIT_SHUTDOWN, "shutdown" }, \
159 { SVM_EXIT_VMRUN, "vmrun" }, \
160 { SVM_EXIT_VMMCALL, "hypercall" }, \
161 { SVM_EXIT_VMLOAD, "vmload" }, \
162 { SVM_EXIT_VMSAVE, "vmsave" }, \
163 { SVM_EXIT_STGI, "stgi" }, \
164 { SVM_EXIT_CLGI, "clgi" }, \
165 { SVM_EXIT_SKINIT, "skinit" }, \
166 { SVM_EXIT_RDTSCP, "rdtscp" }, \
167 { SVM_EXIT_ICEBP, "icebp" }, \
168 { SVM_EXIT_WBINVD, "wbinvd" }, \
169 { SVM_EXIT_MONITOR, "monitor" }, \
170 { SVM_EXIT_MWAIT, "mwait" }, \
171 { SVM_EXIT_XSETBV, "xsetbv" }, \
172 { SVM_EXIT_NPF, "npf" }, \
173 { SVM_EXIT_AVIC_INCOMPLETE_IPI, "avic_incomplete_ipi" }, \
174 { SVM_EXIT_AVIC_UNACCELERATED_ACCESS, "avic_unaccelerated_access" }, \
175 { SVM_EXIT_ERR, "invalid_guest_state" }
176
177
178#endif /* _UAPI__SVM_H */
diff --git a/tools/arch/x86/include/uapi/asm/vmx.h b/tools/arch/x86/include/uapi/asm/vmx.h
new file mode 100644
index 000000000000..5b15d94a33f8
--- /dev/null
+++ b/tools/arch/x86/include/uapi/asm/vmx.h
@@ -0,0 +1,136 @@
1/*
2 * vmx.h: VMX Architecture related definitions
3 * Copyright (c) 2004, Intel Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms and conditions of the GNU General Public License,
7 * version 2, as published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
16 * Place - Suite 330, Boston, MA 02111-1307 USA.
17 *
18 * A few random additions are:
19 * Copyright (C) 2006 Qumranet
20 * Avi Kivity <avi@qumranet.com>
21 * Yaniv Kamay <yaniv@qumranet.com>
22 *
23 */
24#ifndef _UAPIVMX_H
25#define _UAPIVMX_H
26
27
28#define VMX_EXIT_REASONS_FAILED_VMENTRY 0x80000000
29
30#define EXIT_REASON_EXCEPTION_NMI 0
31#define EXIT_REASON_EXTERNAL_INTERRUPT 1
32#define EXIT_REASON_TRIPLE_FAULT 2
33
34#define EXIT_REASON_PENDING_INTERRUPT 7
35#define EXIT_REASON_NMI_WINDOW 8
36#define EXIT_REASON_TASK_SWITCH 9
37#define EXIT_REASON_CPUID 10
38#define EXIT_REASON_HLT 12
39#define EXIT_REASON_INVD 13
40#define EXIT_REASON_INVLPG 14
41#define EXIT_REASON_RDPMC 15
42#define EXIT_REASON_RDTSC 16
43#define EXIT_REASON_VMCALL 18
44#define EXIT_REASON_VMCLEAR 19
45#define EXIT_REASON_VMLAUNCH 20
46#define EXIT_REASON_VMPTRLD 21
47#define EXIT_REASON_VMPTRST 22
48#define EXIT_REASON_VMREAD 23
49#define EXIT_REASON_VMRESUME 24
50#define EXIT_REASON_VMWRITE 25
51#define EXIT_REASON_VMOFF 26
52#define EXIT_REASON_VMON 27
53#define EXIT_REASON_CR_ACCESS 28
54#define EXIT_REASON_DR_ACCESS 29
55#define EXIT_REASON_IO_INSTRUCTION 30
56#define EXIT_REASON_MSR_READ 31
57#define EXIT_REASON_MSR_WRITE 32
58#define EXIT_REASON_INVALID_STATE 33
59#define EXIT_REASON_MSR_LOAD_FAIL 34
60#define EXIT_REASON_MWAIT_INSTRUCTION 36
61#define EXIT_REASON_MONITOR_TRAP_FLAG 37
62#define EXIT_REASON_MONITOR_INSTRUCTION 39
63#define EXIT_REASON_PAUSE_INSTRUCTION 40
64#define EXIT_REASON_MCE_DURING_VMENTRY 41
65#define EXIT_REASON_TPR_BELOW_THRESHOLD 43
66#define EXIT_REASON_APIC_ACCESS 44
67#define EXIT_REASON_EOI_INDUCED 45
68#define EXIT_REASON_EPT_VIOLATION 48
69#define EXIT_REASON_EPT_MISCONFIG 49
70#define EXIT_REASON_INVEPT 50
71#define EXIT_REASON_RDTSCP 51
72#define EXIT_REASON_PREEMPTION_TIMER 52
73#define EXIT_REASON_INVVPID 53
74#define EXIT_REASON_WBINVD 54
75#define EXIT_REASON_XSETBV 55
76#define EXIT_REASON_APIC_WRITE 56
77#define EXIT_REASON_INVPCID 58
78#define EXIT_REASON_PML_FULL 62
79#define EXIT_REASON_XSAVES 63
80#define EXIT_REASON_XRSTORS 64
81#define EXIT_REASON_PCOMMIT 65
82
83#define VMX_EXIT_REASONS \
84 { EXIT_REASON_EXCEPTION_NMI, "EXCEPTION_NMI" }, \
85 { EXIT_REASON_EXTERNAL_INTERRUPT, "EXTERNAL_INTERRUPT" }, \
86 { EXIT_REASON_TRIPLE_FAULT, "TRIPLE_FAULT" }, \
87 { EXIT_REASON_PENDING_INTERRUPT, "PENDING_INTERRUPT" }, \
88 { EXIT_REASON_NMI_WINDOW, "NMI_WINDOW" }, \
89 { EXIT_REASON_TASK_SWITCH, "TASK_SWITCH" }, \
90 { EXIT_REASON_CPUID, "CPUID" }, \
91 { EXIT_REASON_HLT, "HLT" }, \
92 { EXIT_REASON_INVLPG, "INVLPG" }, \
93 { EXIT_REASON_RDPMC, "RDPMC" }, \
94 { EXIT_REASON_RDTSC, "RDTSC" }, \
95 { EXIT_REASON_VMCALL, "VMCALL" }, \
96 { EXIT_REASON_VMCLEAR, "VMCLEAR" }, \
97 { EXIT_REASON_VMLAUNCH, "VMLAUNCH" }, \
98 { EXIT_REASON_VMPTRLD, "VMPTRLD" }, \
99 { EXIT_REASON_VMPTRST, "VMPTRST" }, \
100 { EXIT_REASON_VMREAD, "VMREAD" }, \
101 { EXIT_REASON_VMRESUME, "VMRESUME" }, \
102 { EXIT_REASON_VMWRITE, "VMWRITE" }, \
103 { EXIT_REASON_VMOFF, "VMOFF" }, \
104 { EXIT_REASON_VMON, "VMON" }, \
105 { EXIT_REASON_CR_ACCESS, "CR_ACCESS" }, \
106 { EXIT_REASON_DR_ACCESS, "DR_ACCESS" }, \
107 { EXIT_REASON_IO_INSTRUCTION, "IO_INSTRUCTION" }, \
108 { EXIT_REASON_MSR_READ, "MSR_READ" }, \
109 { EXIT_REASON_MSR_WRITE, "MSR_WRITE" }, \
110 { EXIT_REASON_MWAIT_INSTRUCTION, "MWAIT_INSTRUCTION" }, \
111 { EXIT_REASON_MONITOR_TRAP_FLAG, "MONITOR_TRAP_FLAG" }, \
112 { EXIT_REASON_MONITOR_INSTRUCTION, "MONITOR_INSTRUCTION" }, \
113 { EXIT_REASON_PAUSE_INSTRUCTION, "PAUSE_INSTRUCTION" }, \
114 { EXIT_REASON_MCE_DURING_VMENTRY, "MCE_DURING_VMENTRY" }, \
115 { EXIT_REASON_TPR_BELOW_THRESHOLD, "TPR_BELOW_THRESHOLD" }, \
116 { EXIT_REASON_APIC_ACCESS, "APIC_ACCESS" }, \
117 { EXIT_REASON_EPT_VIOLATION, "EPT_VIOLATION" }, \
118 { EXIT_REASON_EPT_MISCONFIG, "EPT_MISCONFIG" }, \
119 { EXIT_REASON_INVEPT, "INVEPT" }, \
120 { EXIT_REASON_PREEMPTION_TIMER, "PREEMPTION_TIMER" }, \
121 { EXIT_REASON_WBINVD, "WBINVD" }, \
122 { EXIT_REASON_APIC_WRITE, "APIC_WRITE" }, \
123 { EXIT_REASON_EOI_INDUCED, "EOI_INDUCED" }, \
124 { EXIT_REASON_INVALID_STATE, "INVALID_STATE" }, \
125 { EXIT_REASON_MSR_LOAD_FAIL, "MSR_LOAD_FAIL" }, \
126 { EXIT_REASON_INVD, "INVD" }, \
127 { EXIT_REASON_INVVPID, "INVVPID" }, \
128 { EXIT_REASON_INVPCID, "INVPCID" }, \
129 { EXIT_REASON_XSAVES, "XSAVES" }, \
130 { EXIT_REASON_XRSTORS, "XRSTORS" }, \
131 { EXIT_REASON_PCOMMIT, "PCOMMIT" }
132
133#define VMX_ABORT_SAVE_GUEST_MSR_FAIL 1
134#define VMX_ABORT_LOAD_HOST_MSR_FAIL 4
135
136#endif /* _UAPIVMX_H */
diff --git a/tools/perf/MANIFEST b/tools/perf/MANIFEST
index a4aefaeff355..db7cfb42a675 100644
--- a/tools/perf/MANIFEST
+++ b/tools/perf/MANIFEST
@@ -15,8 +15,14 @@ tools/arch/x86/include/asm/barrier.h
15tools/arch/x86/include/asm/cpufeatures.h 15tools/arch/x86/include/asm/cpufeatures.h
16tools/arch/x86/include/asm/disabled-features.h 16tools/arch/x86/include/asm/disabled-features.h
17tools/arch/x86/include/asm/required-features.h 17tools/arch/x86/include/asm/required-features.h
18tools/arch/x86/include/uapi/asm/svm.h
19tools/arch/x86/include/uapi/asm/vmx.h
20tools/arch/x86/include/uapi/asm/kvm.h
21tools/arch/x86/include/uapi/asm/kvm_perf.h
18tools/arch/x86/lib/memcpy_64.S 22tools/arch/x86/lib/memcpy_64.S
19tools/arch/x86/lib/memset_64.S 23tools/arch/x86/lib/memset_64.S
24tools/arch/s390/include/uapi/asm/kvm_perf.h
25tools/arch/s390/include/uapi/asm/sie.h
20tools/arch/xtensa/include/asm/barrier.h 26tools/arch/xtensa/include/asm/barrier.h
21tools/scripts 27tools/scripts
22tools/build 28tools/build
@@ -85,12 +91,3 @@ tools/arch/*/include/uapi/asm/perf_regs.h
85include/linux/poison.h 91include/linux/poison.h
86include/uapi/linux/const.h 92include/uapi/linux/const.h
87include/uapi/linux/swab.h 93include/uapi/linux/swab.h
88arch/x86/include/asm/svm.h
89arch/x86/include/asm/vmx.h
90arch/x86/include/asm/kvm_host.h
91arch/x86/include/uapi/asm/svm.h
92arch/x86/include/uapi/asm/vmx.h
93arch/x86/include/uapi/asm/kvm.h
94arch/x86/include/uapi/asm/kvm_perf.h
95arch/s390/include/uapi/asm/sie.h
96arch/s390/include/uapi/asm/kvm_perf.h
diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf
index 0d07672c3af7..feb2c66b110b 100644
--- a/tools/perf/Makefile.perf
+++ b/tools/perf/Makefile.perf
@@ -378,6 +378,36 @@ $(PERF_IN): prepare FORCE
378 @(test -f ../../arch/x86/include/uapi/asm/perf_regs.h && ( \ 378 @(test -f ../../arch/x86/include/uapi/asm/perf_regs.h && ( \
379 (diff -B ../arch/x86/include/uapi/asm/perf_regs.h ../../arch/x86/include/uapi/asm/perf_regs.h >/dev/null) \ 379 (diff -B ../arch/x86/include/uapi/asm/perf_regs.h ../../arch/x86/include/uapi/asm/perf_regs.h >/dev/null) \
380 || echo "Warning: tools/arch/x86/include/uapi/asm/perf_regs.h differs from kernel" >&2 )) || true 380 || echo "Warning: tools/arch/x86/include/uapi/asm/perf_regs.h differs from kernel" >&2 )) || true
381 @(test -f ../../arch/x86/include/uapi/asm/kvm.h && ( \
382 (diff -B ../arch/x86/include/uapi/asm/kvm.h ../../arch/x86/include/uapi/asm/kvm.h >/dev/null) \
383 || echo "Warning: tools/arch/x86/include/uapi/asm/kvm.h differs from kernel" >&2 )) || true
384 @(test -f ../../arch/x86/include/uapi/asm/kvm_perf.h && ( \
385 (diff -B ../arch/x86/include/uapi/asm/kvm_perf.h ../../arch/x86/include/uapi/asm/kvm_perf.h >/dev/null) \
386 || echo "Warning: tools/arch/x86/include/uapi/asm/kvm_perf.h differs from kernel" >&2 )) || true
387 @(test -f ../../arch/x86/include/uapi/asm/svm.h && ( \
388 (diff -B ../arch/x86/include/uapi/asm/svm.h ../../arch/x86/include/uapi/asm/svm.h >/dev/null) \
389 || echo "Warning: tools/arch/x86/include/uapi/asm/svm.h differs from kernel" >&2 )) || true
390 @(test -f ../../arch/x86/include/uapi/asm/vmx.h && ( \
391 (diff -B ../arch/x86/include/uapi/asm/vmx.h ../../arch/x86/include/uapi/asm/vmx.h >/dev/null) \
392 || echo "Warning: tools/arch/x86/include/uapi/asm/vmx.h differs from kernel" >&2 )) || true
393 @(test -f ../../arch/powerpc/include/uapi/asm/kvm.h && ( \
394 (diff -B ../arch/powerpc/include/uapi/asm/kvm.h ../../arch/powerpc/include/uapi/asm/kvm.h >/dev/null) \
395 || echo "Warning: tools/arch/powerpc/include/uapi/asm/kvm.h differs from kernel" >&2 )) || true
396 @(test -f ../../arch/s390/include/uapi/asm/kvm.h && ( \
397 (diff -B ../arch/s390/include/uapi/asm/kvm.h ../../arch/s390/include/uapi/asm/kvm.h >/dev/null) \
398 || echo "Warning: tools/arch/s390/include/uapi/asm/kvm.h differs from kernel" >&2 )) || true
399 @(test -f ../../arch/s390/include/uapi/asm/kvm_perf.h && ( \
400 (diff -B ../arch/s390/include/uapi/asm/kvm_perf.h ../../arch/s390/include/uapi/asm/kvm_perf.h >/dev/null) \
401 || echo "Warning: tools/arch/s390/include/uapi/asm/kvm_perf.h differs from kernel" >&2 )) || true
402 @(test -f ../../arch/s390/include/uapi/asm/sie.h && ( \
403 (diff -B ../arch/s390/include/uapi/asm/sie.h ../../arch/s390/include/uapi/asm/sie.h >/dev/null) \
404 || echo "Warning: tools/arch/s390/include/uapi/asm/sie.h differs from kernel" >&2 )) || true
405 @(test -f ../../arch/arm/include/uapi/asm/kvm.h && ( \
406 (diff -B ../arch/arm/include/uapi/asm/kvm.h ../../arch/arm/include/uapi/asm/kvm.h >/dev/null) \
407 || echo "Warning: tools/arch/arm/include/uapi/asm/kvm.h differs from kernel" >&2 )) || true
408 @(test -f ../../arch/arm64/include/uapi/asm/kvm.h && ( \
409 (diff -B ../arch/arm64/include/uapi/asm/kvm.h ../../arch/arm64/include/uapi/asm/kvm.h >/dev/null) \
410 || echo "Warning: tools/arch/arm64/include/uapi/asm/kvm.h differs from kernel" >&2 )) || true
381 $(Q)$(MAKE) $(build)=perf 411 $(Q)$(MAKE) $(build)=perf
382 412
383$(OUTPUT)perf: $(PERFLIBS) $(PERF_IN) $(LIBTRACEEVENT_DYNAMIC_LIST) 413$(OUTPUT)perf: $(PERFLIBS) $(PERF_IN) $(LIBTRACEEVENT_DYNAMIC_LIST)