| .. | .. |
|---|
| 35 | 35 | #include <linux/psci.h> |
|---|
| 36 | 36 | #include <linux/types.h> |
|---|
| 37 | 37 | #include <asm/ptrace.h> |
|---|
| 38 | +#include <asm/sve_context.h> |
|---|
| 38 | 39 | |
|---|
| 39 | 40 | #define __KVM_HAVE_GUEST_DEBUG |
|---|
| 40 | 41 | #define __KVM_HAVE_IRQ_LINE |
|---|
| .. | .. |
|---|
| 102 | 103 | #define KVM_ARM_VCPU_EL1_32BIT 1 /* CPU running a 32bit VM */ |
|---|
| 103 | 104 | #define KVM_ARM_VCPU_PSCI_0_2 2 /* CPU uses PSCI v0.2 */ |
|---|
| 104 | 105 | #define KVM_ARM_VCPU_PMU_V3 3 /* Support guest PMUv3 */ |
|---|
| 106 | +#define KVM_ARM_VCPU_SVE 4 /* enable SVE for this CPU */ |
|---|
| 107 | +#define KVM_ARM_VCPU_PTRAUTH_ADDRESS 5 /* VCPU uses address authentication */ |
|---|
| 108 | +#define KVM_ARM_VCPU_PTRAUTH_GENERIC 6 /* VCPU uses generic authentication */ |
|---|
| 105 | 109 | |
|---|
| 106 | 110 | struct kvm_vcpu_init { |
|---|
| 107 | 111 | __u32 target; |
|---|
| .. | .. |
|---|
| 155 | 159 | struct kvm_arch_memory_slot { |
|---|
| 156 | 160 | }; |
|---|
| 157 | 161 | |
|---|
| 162 | +/* |
|---|
| 163 | + * PMU filter structure. Describe a range of events with a particular |
|---|
| 164 | + * action. To be used with KVM_ARM_VCPU_PMU_V3_FILTER. |
|---|
| 165 | + */ |
|---|
| 166 | +struct kvm_pmu_event_filter { |
|---|
| 167 | + __u16 base_event; |
|---|
| 168 | + __u16 nevents; |
|---|
| 169 | + |
|---|
| 170 | +#define KVM_PMU_EVENT_ALLOW 0 |
|---|
| 171 | +#define KVM_PMU_EVENT_DENY 1 |
|---|
| 172 | + |
|---|
| 173 | + __u8 action; |
|---|
| 174 | + __u8 pad[3]; |
|---|
| 175 | +}; |
|---|
| 176 | + |
|---|
| 158 | 177 | /* for KVM_GET/SET_VCPU_EVENTS */ |
|---|
| 159 | 178 | struct kvm_vcpu_events { |
|---|
| 160 | 179 | struct { |
|---|
| 161 | 180 | __u8 serror_pending; |
|---|
| 162 | 181 | __u8 serror_has_esr; |
|---|
| 182 | + __u8 ext_dabt_pending; |
|---|
| 163 | 183 | /* Align it to 8 bytes */ |
|---|
| 164 | | - __u8 pad[6]; |
|---|
| 184 | + __u8 pad[5]; |
|---|
| 165 | 185 | __u64 serror_esr; |
|---|
| 166 | 186 | } exception; |
|---|
| 167 | 187 | __u32 reserved[12]; |
|---|
| .. | .. |
|---|
| 215 | 235 | #define KVM_REG_ARM_PTIMER_CVAL ARM64_SYS_REG(3, 3, 14, 2, 2) |
|---|
| 216 | 236 | #define KVM_REG_ARM_PTIMER_CNT ARM64_SYS_REG(3, 3, 14, 0, 1) |
|---|
| 217 | 237 | |
|---|
| 218 | | -/* EL0 Virtual Timer Registers */ |
|---|
| 238 | +/* |
|---|
| 239 | + * EL0 Virtual Timer Registers |
|---|
| 240 | + * |
|---|
| 241 | + * WARNING: |
|---|
| 242 | + * KVM_REG_ARM_TIMER_CVAL and KVM_REG_ARM_TIMER_CNT are not defined |
|---|
| 243 | + * with the appropriate register encodings. Their values have been |
|---|
| 244 | + * accidentally swapped. As this is set API, the definitions here |
|---|
| 245 | + * must be used, rather than ones derived from the encodings. |
|---|
| 246 | + */ |
|---|
| 219 | 247 | #define KVM_REG_ARM_TIMER_CTL ARM64_SYS_REG(3, 3, 14, 3, 1) |
|---|
| 220 | | -#define KVM_REG_ARM_TIMER_CNT ARM64_SYS_REG(3, 3, 14, 3, 2) |
|---|
| 221 | 248 | #define KVM_REG_ARM_TIMER_CVAL ARM64_SYS_REG(3, 3, 14, 0, 2) |
|---|
| 249 | +#define KVM_REG_ARM_TIMER_CNT ARM64_SYS_REG(3, 3, 14, 3, 2) |
|---|
| 222 | 250 | |
|---|
| 223 | 251 | /* KVM-as-firmware specific pseudo-registers */ |
|---|
| 224 | 252 | #define KVM_REG_ARM_FW (0x0014 << KVM_REG_ARM_COPROC_SHIFT) |
|---|
| 225 | 253 | #define KVM_REG_ARM_FW_REG(r) (KVM_REG_ARM64 | KVM_REG_SIZE_U64 | \ |
|---|
| 226 | 254 | KVM_REG_ARM_FW | ((r) & 0xffff)) |
|---|
| 227 | 255 | #define KVM_REG_ARM_PSCI_VERSION KVM_REG_ARM_FW_REG(0) |
|---|
| 256 | +#define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_1 KVM_REG_ARM_FW_REG(1) |
|---|
| 257 | +#define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_1_NOT_AVAIL 0 |
|---|
| 258 | +#define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_1_AVAIL 1 |
|---|
| 259 | +#define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_1_NOT_REQUIRED 2 |
|---|
| 260 | + |
|---|
| 261 | +/* |
|---|
| 262 | + * Only two states can be presented by the host kernel: |
|---|
| 263 | + * - NOT_REQUIRED: the guest doesn't need to do anything |
|---|
| 264 | + * - NOT_AVAIL: the guest isn't mitigated (it can still use SSBS if available) |
|---|
| 265 | + * |
|---|
| 266 | + * All the other values are deprecated. The host still accepts all |
|---|
| 267 | + * values (they are ABI), but will narrow them to the above two. |
|---|
| 268 | + */ |
|---|
| 269 | +#define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2 KVM_REG_ARM_FW_REG(2) |
|---|
| 270 | +#define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2_NOT_AVAIL 0 |
|---|
| 271 | +#define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2_UNKNOWN 1 |
|---|
| 272 | +#define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2_AVAIL 2 |
|---|
| 273 | +#define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2_NOT_REQUIRED 3 |
|---|
| 274 | +#define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2_ENABLED (1U << 4) |
|---|
| 275 | + |
|---|
| 276 | +/* SVE registers */ |
|---|
| 277 | +#define KVM_REG_ARM64_SVE (0x15 << KVM_REG_ARM_COPROC_SHIFT) |
|---|
| 278 | + |
|---|
| 279 | +/* Z- and P-regs occupy blocks at the following offsets within this range: */ |
|---|
| 280 | +#define KVM_REG_ARM64_SVE_ZREG_BASE 0 |
|---|
| 281 | +#define KVM_REG_ARM64_SVE_PREG_BASE 0x400 |
|---|
| 282 | +#define KVM_REG_ARM64_SVE_FFR_BASE 0x600 |
|---|
| 283 | + |
|---|
| 284 | +#define KVM_ARM64_SVE_NUM_ZREGS __SVE_NUM_ZREGS |
|---|
| 285 | +#define KVM_ARM64_SVE_NUM_PREGS __SVE_NUM_PREGS |
|---|
| 286 | + |
|---|
| 287 | +#define KVM_ARM64_SVE_MAX_SLICES 32 |
|---|
| 288 | + |
|---|
| 289 | +#define KVM_REG_ARM64_SVE_ZREG(n, i) \ |
|---|
| 290 | + (KVM_REG_ARM64 | KVM_REG_ARM64_SVE | KVM_REG_ARM64_SVE_ZREG_BASE | \ |
|---|
| 291 | + KVM_REG_SIZE_U2048 | \ |
|---|
| 292 | + (((n) & (KVM_ARM64_SVE_NUM_ZREGS - 1)) << 5) | \ |
|---|
| 293 | + ((i) & (KVM_ARM64_SVE_MAX_SLICES - 1))) |
|---|
| 294 | + |
|---|
| 295 | +#define KVM_REG_ARM64_SVE_PREG(n, i) \ |
|---|
| 296 | + (KVM_REG_ARM64 | KVM_REG_ARM64_SVE | KVM_REG_ARM64_SVE_PREG_BASE | \ |
|---|
| 297 | + KVM_REG_SIZE_U256 | \ |
|---|
| 298 | + (((n) & (KVM_ARM64_SVE_NUM_PREGS - 1)) << 5) | \ |
|---|
| 299 | + ((i) & (KVM_ARM64_SVE_MAX_SLICES - 1))) |
|---|
| 300 | + |
|---|
| 301 | +#define KVM_REG_ARM64_SVE_FFR(i) \ |
|---|
| 302 | + (KVM_REG_ARM64 | KVM_REG_ARM64_SVE | KVM_REG_ARM64_SVE_FFR_BASE | \ |
|---|
| 303 | + KVM_REG_SIZE_U256 | \ |
|---|
| 304 | + ((i) & (KVM_ARM64_SVE_MAX_SLICES - 1))) |
|---|
| 305 | + |
|---|
| 306 | +/* |
|---|
| 307 | + * Register values for KVM_REG_ARM64_SVE_ZREG(), KVM_REG_ARM64_SVE_PREG() and |
|---|
| 308 | + * KVM_REG_ARM64_SVE_FFR() are represented in memory in an endianness- |
|---|
| 309 | + * invariant layout which differs from the layout used for the FPSIMD |
|---|
| 310 | + * V-registers on big-endian systems: see sigcontext.h for more explanation. |
|---|
| 311 | + */ |
|---|
| 312 | + |
|---|
| 313 | +#define KVM_ARM64_SVE_VQ_MIN __SVE_VQ_MIN |
|---|
| 314 | +#define KVM_ARM64_SVE_VQ_MAX __SVE_VQ_MAX |
|---|
| 315 | + |
|---|
| 316 | +/* Vector lengths pseudo-register: */ |
|---|
| 317 | +#define KVM_REG_ARM64_SVE_VLS (KVM_REG_ARM64 | KVM_REG_ARM64_SVE | \ |
|---|
| 318 | + KVM_REG_SIZE_U512 | 0xffff) |
|---|
| 319 | +#define KVM_ARM64_SVE_VLS_WORDS \ |
|---|
| 320 | + ((KVM_ARM64_SVE_VQ_MAX - KVM_ARM64_SVE_VQ_MIN) / 64 + 1) |
|---|
| 228 | 321 | |
|---|
| 229 | 322 | /* Device Control API: ARM VGIC */ |
|---|
| 230 | 323 | #define KVM_DEV_ARM_VGIC_GRP_ADDR 0 |
|---|
| .. | .. |
|---|
| 260 | 353 | #define KVM_ARM_VCPU_PMU_V3_CTRL 0 |
|---|
| 261 | 354 | #define KVM_ARM_VCPU_PMU_V3_IRQ 0 |
|---|
| 262 | 355 | #define KVM_ARM_VCPU_PMU_V3_INIT 1 |
|---|
| 356 | +#define KVM_ARM_VCPU_PMU_V3_FILTER 2 |
|---|
| 263 | 357 | #define KVM_ARM_VCPU_TIMER_CTRL 1 |
|---|
| 264 | 358 | #define KVM_ARM_VCPU_TIMER_IRQ_VTIMER 0 |
|---|
| 265 | 359 | #define KVM_ARM_VCPU_TIMER_IRQ_PTIMER 1 |
|---|
| 360 | +#define KVM_ARM_VCPU_PVTIME_CTRL 2 |
|---|
| 361 | +#define KVM_ARM_VCPU_PVTIME_IPA 0 |
|---|
| 266 | 362 | |
|---|
| 267 | 363 | /* KVM_IRQ_LINE irq field index values */ |
|---|
| 364 | +#define KVM_ARM_IRQ_VCPU2_SHIFT 28 |
|---|
| 365 | +#define KVM_ARM_IRQ_VCPU2_MASK 0xf |
|---|
| 268 | 366 | #define KVM_ARM_IRQ_TYPE_SHIFT 24 |
|---|
| 269 | | -#define KVM_ARM_IRQ_TYPE_MASK 0xff |
|---|
| 367 | +#define KVM_ARM_IRQ_TYPE_MASK 0xf |
|---|
| 270 | 368 | #define KVM_ARM_IRQ_VCPU_SHIFT 16 |
|---|
| 271 | 369 | #define KVM_ARM_IRQ_VCPU_MASK 0xff |
|---|
| 272 | 370 | #define KVM_ARM_IRQ_NUM_SHIFT 0 |
|---|