root / linux-headers / asm-arm / kvm.h @ ce603d8e
History | View | Annotate | Download (5.7 kB)
1 | eadd0e44 | Peter Maydell | /*
|
---|---|---|---|
2 | eadd0e44 | Peter Maydell | * Copyright (C) 2012 - Virtual Open Systems and Columbia University
|
3 | eadd0e44 | Peter Maydell | * Author: Christoffer Dall <c.dall@virtualopensystems.com>
|
4 | eadd0e44 | Peter Maydell | *
|
5 | eadd0e44 | Peter Maydell | * This program is free software; you can redistribute it and/or modify
|
6 | eadd0e44 | Peter Maydell | * it under the terms of the GNU General Public License, version 2, as
|
7 | eadd0e44 | Peter Maydell | * published by the Free Software Foundation.
|
8 | eadd0e44 | Peter Maydell | *
|
9 | eadd0e44 | Peter Maydell | * This program is distributed in the hope that it will be useful,
|
10 | eadd0e44 | Peter Maydell | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11 | eadd0e44 | Peter Maydell | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
12 | eadd0e44 | Peter Maydell | * GNU General Public License for more details.
|
13 | eadd0e44 | Peter Maydell | *
|
14 | eadd0e44 | Peter Maydell | * You should have received a copy of the GNU General Public License
|
15 | eadd0e44 | Peter Maydell | * along with this program; if not, write to the Free Software
|
16 | eadd0e44 | Peter Maydell | * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
17 | eadd0e44 | Peter Maydell | */
|
18 | eadd0e44 | Peter Maydell | |
19 | eadd0e44 | Peter Maydell | #ifndef __ARM_KVM_H__
|
20 | eadd0e44 | Peter Maydell | #define __ARM_KVM_H__
|
21 | eadd0e44 | Peter Maydell | |
22 | eadd0e44 | Peter Maydell | #include <linux/types.h> |
23 | eadd0e44 | Peter Maydell | #include <asm/ptrace.h> |
24 | eadd0e44 | Peter Maydell | |
25 | eadd0e44 | Peter Maydell | #define __KVM_HAVE_GUEST_DEBUG
|
26 | eadd0e44 | Peter Maydell | #define __KVM_HAVE_IRQ_LINE
|
27 | eadd0e44 | Peter Maydell | |
28 | eadd0e44 | Peter Maydell | #define KVM_REG_SIZE(id) \
|
29 | eadd0e44 | Peter Maydell | (1U << (((id) & KVM_REG_SIZE_MASK) >> KVM_REG_SIZE_SHIFT))
|
30 | eadd0e44 | Peter Maydell | |
31 | eadd0e44 | Peter Maydell | /* Valid for svc_regs, abt_regs, und_regs, irq_regs in struct kvm_regs */
|
32 | eadd0e44 | Peter Maydell | #define KVM_ARM_SVC_sp svc_regs[0] |
33 | eadd0e44 | Peter Maydell | #define KVM_ARM_SVC_lr svc_regs[1] |
34 | eadd0e44 | Peter Maydell | #define KVM_ARM_SVC_spsr svc_regs[2] |
35 | eadd0e44 | Peter Maydell | #define KVM_ARM_ABT_sp abt_regs[0] |
36 | eadd0e44 | Peter Maydell | #define KVM_ARM_ABT_lr abt_regs[1] |
37 | eadd0e44 | Peter Maydell | #define KVM_ARM_ABT_spsr abt_regs[2] |
38 | eadd0e44 | Peter Maydell | #define KVM_ARM_UND_sp und_regs[0] |
39 | eadd0e44 | Peter Maydell | #define KVM_ARM_UND_lr und_regs[1] |
40 | eadd0e44 | Peter Maydell | #define KVM_ARM_UND_spsr und_regs[2] |
41 | eadd0e44 | Peter Maydell | #define KVM_ARM_IRQ_sp irq_regs[0] |
42 | eadd0e44 | Peter Maydell | #define KVM_ARM_IRQ_lr irq_regs[1] |
43 | eadd0e44 | Peter Maydell | #define KVM_ARM_IRQ_spsr irq_regs[2] |
44 | eadd0e44 | Peter Maydell | |
45 | eadd0e44 | Peter Maydell | /* Valid only for fiq_regs in struct kvm_regs */
|
46 | eadd0e44 | Peter Maydell | #define KVM_ARM_FIQ_r8 fiq_regs[0] |
47 | eadd0e44 | Peter Maydell | #define KVM_ARM_FIQ_r9 fiq_regs[1] |
48 | eadd0e44 | Peter Maydell | #define KVM_ARM_FIQ_r10 fiq_regs[2] |
49 | eadd0e44 | Peter Maydell | #define KVM_ARM_FIQ_fp fiq_regs[3] |
50 | eadd0e44 | Peter Maydell | #define KVM_ARM_FIQ_ip fiq_regs[4] |
51 | eadd0e44 | Peter Maydell | #define KVM_ARM_FIQ_sp fiq_regs[5] |
52 | eadd0e44 | Peter Maydell | #define KVM_ARM_FIQ_lr fiq_regs[6] |
53 | eadd0e44 | Peter Maydell | #define KVM_ARM_FIQ_spsr fiq_regs[7] |
54 | eadd0e44 | Peter Maydell | |
55 | eadd0e44 | Peter Maydell | struct kvm_regs {
|
56 | e098b453 | Alexey Kardashevskiy | struct pt_regs usr_regs; /* R0_usr - R14_usr, PC, CPSR */ |
57 | e098b453 | Alexey Kardashevskiy | unsigned long svc_regs[3]; /* SP_svc, LR_svc, SPSR_svc */ |
58 | e098b453 | Alexey Kardashevskiy | unsigned long abt_regs[3]; /* SP_abt, LR_abt, SPSR_abt */ |
59 | e098b453 | Alexey Kardashevskiy | unsigned long und_regs[3]; /* SP_und, LR_und, SPSR_und */ |
60 | e098b453 | Alexey Kardashevskiy | unsigned long irq_regs[3]; /* SP_irq, LR_irq, SPSR_irq */ |
61 | e098b453 | Alexey Kardashevskiy | unsigned long fiq_regs[8]; /* R8_fiq - R14_fiq, SPSR_fiq */ |
62 | eadd0e44 | Peter Maydell | }; |
63 | eadd0e44 | Peter Maydell | |
64 | eadd0e44 | Peter Maydell | /* Supported Processor Types */
|
65 | eadd0e44 | Peter Maydell | #define KVM_ARM_TARGET_CORTEX_A15 0 |
66 | bf63839f | Alex Williamson | #define KVM_ARM_TARGET_CORTEX_A7 1 |
67 | bf63839f | Alex Williamson | #define KVM_ARM_NUM_TARGETS 2 |
68 | eadd0e44 | Peter Maydell | |
69 | eadd0e44 | Peter Maydell | /* KVM_ARM_SET_DEVICE_ADDR ioctl id encoding */
|
70 | eadd0e44 | Peter Maydell | #define KVM_ARM_DEVICE_TYPE_SHIFT 0 |
71 | eadd0e44 | Peter Maydell | #define KVM_ARM_DEVICE_TYPE_MASK (0xffff << KVM_ARM_DEVICE_TYPE_SHIFT) |
72 | eadd0e44 | Peter Maydell | #define KVM_ARM_DEVICE_ID_SHIFT 16 |
73 | eadd0e44 | Peter Maydell | #define KVM_ARM_DEVICE_ID_MASK (0xffff << KVM_ARM_DEVICE_ID_SHIFT) |
74 | eadd0e44 | Peter Maydell | |
75 | eadd0e44 | Peter Maydell | /* Supported device IDs */
|
76 | eadd0e44 | Peter Maydell | #define KVM_ARM_DEVICE_VGIC_V2 0 |
77 | eadd0e44 | Peter Maydell | |
78 | eadd0e44 | Peter Maydell | /* Supported VGIC address types */
|
79 | eadd0e44 | Peter Maydell | #define KVM_VGIC_V2_ADDR_TYPE_DIST 0 |
80 | eadd0e44 | Peter Maydell | #define KVM_VGIC_V2_ADDR_TYPE_CPU 1 |
81 | eadd0e44 | Peter Maydell | |
82 | eadd0e44 | Peter Maydell | #define KVM_VGIC_V2_DIST_SIZE 0x1000 |
83 | eadd0e44 | Peter Maydell | #define KVM_VGIC_V2_CPU_SIZE 0x2000 |
84 | eadd0e44 | Peter Maydell | |
85 | eadd0e44 | Peter Maydell | #define KVM_ARM_VCPU_POWER_OFF 0 /* CPU is started in OFF state */ |
86 | eadd0e44 | Peter Maydell | |
87 | eadd0e44 | Peter Maydell | struct kvm_vcpu_init {
|
88 | eadd0e44 | Peter Maydell | __u32 target; |
89 | eadd0e44 | Peter Maydell | __u32 features[7];
|
90 | eadd0e44 | Peter Maydell | }; |
91 | eadd0e44 | Peter Maydell | |
92 | eadd0e44 | Peter Maydell | struct kvm_sregs {
|
93 | eadd0e44 | Peter Maydell | }; |
94 | eadd0e44 | Peter Maydell | |
95 | eadd0e44 | Peter Maydell | struct kvm_fpu {
|
96 | eadd0e44 | Peter Maydell | }; |
97 | eadd0e44 | Peter Maydell | |
98 | eadd0e44 | Peter Maydell | struct kvm_guest_debug_arch {
|
99 | eadd0e44 | Peter Maydell | }; |
100 | eadd0e44 | Peter Maydell | |
101 | eadd0e44 | Peter Maydell | struct kvm_debug_exit_arch {
|
102 | eadd0e44 | Peter Maydell | }; |
103 | eadd0e44 | Peter Maydell | |
104 | eadd0e44 | Peter Maydell | struct kvm_sync_regs {
|
105 | eadd0e44 | Peter Maydell | }; |
106 | eadd0e44 | Peter Maydell | |
107 | eadd0e44 | Peter Maydell | struct kvm_arch_memory_slot {
|
108 | eadd0e44 | Peter Maydell | }; |
109 | eadd0e44 | Peter Maydell | |
110 | eadd0e44 | Peter Maydell | /* If you need to interpret the index values, here is the key: */
|
111 | eadd0e44 | Peter Maydell | #define KVM_REG_ARM_COPROC_MASK 0x000000000FFF0000 |
112 | eadd0e44 | Peter Maydell | #define KVM_REG_ARM_COPROC_SHIFT 16 |
113 | eadd0e44 | Peter Maydell | #define KVM_REG_ARM_32_OPC2_MASK 0x0000000000000007 |
114 | eadd0e44 | Peter Maydell | #define KVM_REG_ARM_32_OPC2_SHIFT 0 |
115 | eadd0e44 | Peter Maydell | #define KVM_REG_ARM_OPC1_MASK 0x0000000000000078 |
116 | eadd0e44 | Peter Maydell | #define KVM_REG_ARM_OPC1_SHIFT 3 |
117 | eadd0e44 | Peter Maydell | #define KVM_REG_ARM_CRM_MASK 0x0000000000000780 |
118 | eadd0e44 | Peter Maydell | #define KVM_REG_ARM_CRM_SHIFT 7 |
119 | eadd0e44 | Peter Maydell | #define KVM_REG_ARM_32_CRN_MASK 0x0000000000007800 |
120 | eadd0e44 | Peter Maydell | #define KVM_REG_ARM_32_CRN_SHIFT 11 |
121 | eadd0e44 | Peter Maydell | |
122 | eadd0e44 | Peter Maydell | /* Normal registers are mapped as coprocessor 16. */
|
123 | eadd0e44 | Peter Maydell | #define KVM_REG_ARM_CORE (0x0010 << KVM_REG_ARM_COPROC_SHIFT) |
124 | eadd0e44 | Peter Maydell | #define KVM_REG_ARM_CORE_REG(name) (offsetof(struct kvm_regs, name) / 4) |
125 | eadd0e44 | Peter Maydell | |
126 | eadd0e44 | Peter Maydell | /* Some registers need more space to represent values. */
|
127 | eadd0e44 | Peter Maydell | #define KVM_REG_ARM_DEMUX (0x0011 << KVM_REG_ARM_COPROC_SHIFT) |
128 | eadd0e44 | Peter Maydell | #define KVM_REG_ARM_DEMUX_ID_MASK 0x000000000000FF00 |
129 | eadd0e44 | Peter Maydell | #define KVM_REG_ARM_DEMUX_ID_SHIFT 8 |
130 | eadd0e44 | Peter Maydell | #define KVM_REG_ARM_DEMUX_ID_CCSIDR (0x00 << KVM_REG_ARM_DEMUX_ID_SHIFT) |
131 | eadd0e44 | Peter Maydell | #define KVM_REG_ARM_DEMUX_VAL_MASK 0x00000000000000FF |
132 | eadd0e44 | Peter Maydell | #define KVM_REG_ARM_DEMUX_VAL_SHIFT 0 |
133 | eadd0e44 | Peter Maydell | |
134 | eadd0e44 | Peter Maydell | /* VFP registers: we could overload CP10 like ARM does, but that's ugly. */
|
135 | eadd0e44 | Peter Maydell | #define KVM_REG_ARM_VFP (0x0012 << KVM_REG_ARM_COPROC_SHIFT) |
136 | eadd0e44 | Peter Maydell | #define KVM_REG_ARM_VFP_MASK 0x000000000000FFFF |
137 | eadd0e44 | Peter Maydell | #define KVM_REG_ARM_VFP_BASE_REG 0x0 |
138 | eadd0e44 | Peter Maydell | #define KVM_REG_ARM_VFP_FPSID 0x1000 |
139 | eadd0e44 | Peter Maydell | #define KVM_REG_ARM_VFP_FPSCR 0x1001 |
140 | eadd0e44 | Peter Maydell | #define KVM_REG_ARM_VFP_MVFR1 0x1006 |
141 | eadd0e44 | Peter Maydell | #define KVM_REG_ARM_VFP_MVFR0 0x1007 |
142 | eadd0e44 | Peter Maydell | #define KVM_REG_ARM_VFP_FPEXC 0x1008 |
143 | eadd0e44 | Peter Maydell | #define KVM_REG_ARM_VFP_FPINST 0x1009 |
144 | eadd0e44 | Peter Maydell | #define KVM_REG_ARM_VFP_FPINST2 0x100A |
145 | eadd0e44 | Peter Maydell | |
146 | eadd0e44 | Peter Maydell | |
147 | eadd0e44 | Peter Maydell | /* KVM_IRQ_LINE irq field index values */
|
148 | eadd0e44 | Peter Maydell | #define KVM_ARM_IRQ_TYPE_SHIFT 24 |
149 | eadd0e44 | Peter Maydell | #define KVM_ARM_IRQ_TYPE_MASK 0xff |
150 | eadd0e44 | Peter Maydell | #define KVM_ARM_IRQ_VCPU_SHIFT 16 |
151 | eadd0e44 | Peter Maydell | #define KVM_ARM_IRQ_VCPU_MASK 0xff |
152 | eadd0e44 | Peter Maydell | #define KVM_ARM_IRQ_NUM_SHIFT 0 |
153 | eadd0e44 | Peter Maydell | #define KVM_ARM_IRQ_NUM_MASK 0xffff |
154 | eadd0e44 | Peter Maydell | |
155 | eadd0e44 | Peter Maydell | /* irq_type field */
|
156 | eadd0e44 | Peter Maydell | #define KVM_ARM_IRQ_TYPE_CPU 0 |
157 | eadd0e44 | Peter Maydell | #define KVM_ARM_IRQ_TYPE_SPI 1 |
158 | eadd0e44 | Peter Maydell | #define KVM_ARM_IRQ_TYPE_PPI 2 |
159 | eadd0e44 | Peter Maydell | |
160 | eadd0e44 | Peter Maydell | /* out-of-kernel GIC cpu interrupt injection irq_number field */
|
161 | eadd0e44 | Peter Maydell | #define KVM_ARM_IRQ_CPU_IRQ 0 |
162 | eadd0e44 | Peter Maydell | #define KVM_ARM_IRQ_CPU_FIQ 1 |
163 | eadd0e44 | Peter Maydell | |
164 | eadd0e44 | Peter Maydell | /* Highest supported SPI, from VGIC_NR_IRQS */
|
165 | eadd0e44 | Peter Maydell | #define KVM_ARM_IRQ_GIC_MAX 127 |
166 | eadd0e44 | Peter Maydell | |
167 | eadd0e44 | Peter Maydell | /* PSCI interface */
|
168 | eadd0e44 | Peter Maydell | #define KVM_PSCI_FN_BASE 0x95c1ba5e |
169 | eadd0e44 | Peter Maydell | #define KVM_PSCI_FN(n) (KVM_PSCI_FN_BASE + (n))
|
170 | eadd0e44 | Peter Maydell | |
171 | eadd0e44 | Peter Maydell | #define KVM_PSCI_FN_CPU_SUSPEND KVM_PSCI_FN(0) |
172 | eadd0e44 | Peter Maydell | #define KVM_PSCI_FN_CPU_OFF KVM_PSCI_FN(1) |
173 | eadd0e44 | Peter Maydell | #define KVM_PSCI_FN_CPU_ON KVM_PSCI_FN(2) |
174 | eadd0e44 | Peter Maydell | #define KVM_PSCI_FN_MIGRATE KVM_PSCI_FN(3) |
175 | eadd0e44 | Peter Maydell | |
176 | eadd0e44 | Peter Maydell | #define KVM_PSCI_RET_SUCCESS 0 |
177 | eadd0e44 | Peter Maydell | #define KVM_PSCI_RET_NI ((unsigned long)-1) |
178 | eadd0e44 | Peter Maydell | #define KVM_PSCI_RET_INVAL ((unsigned long)-2) |
179 | eadd0e44 | Peter Maydell | #define KVM_PSCI_RET_DENIED ((unsigned long)-3) |
180 | eadd0e44 | Peter Maydell | |
181 | eadd0e44 | Peter Maydell | #endif /* __ARM_KVM_H__ */ |