0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023 #ifndef __ARM_KVM_H__
0024 #define __ARM_KVM_H__
0025
0026 #define KVM_SPSR_EL1 0
0027 #define KVM_SPSR_SVC KVM_SPSR_EL1
0028 #define KVM_SPSR_ABT 1
0029 #define KVM_SPSR_UND 2
0030 #define KVM_SPSR_IRQ 3
0031 #define KVM_SPSR_FIQ 4
0032 #define KVM_NR_SPSR 5
0033
0034 #ifndef __ASSEMBLY__
0035 #include <linux/psci.h>
0036 #include <linux/types.h>
0037 #include <asm/ptrace.h>
0038 #include <asm/sve_context.h>
0039
0040 #define __KVM_HAVE_GUEST_DEBUG
0041 #define __KVM_HAVE_IRQ_LINE
0042 #define __KVM_HAVE_READONLY_MEM
0043 #define __KVM_HAVE_VCPU_EVENTS
0044
0045 #define KVM_COALESCED_MMIO_PAGE_OFFSET 1
0046
0047 #define KVM_REG_SIZE(id) \
0048 (1U << (((id) & KVM_REG_SIZE_MASK) >> KVM_REG_SIZE_SHIFT))
0049
0050 struct kvm_regs {
0051 struct user_pt_regs regs;
0052
0053 __u64 sp_el1;
0054 __u64 elr_el1;
0055
0056 __u64 spsr[KVM_NR_SPSR];
0057
0058 struct user_fpsimd_state fp_regs;
0059 };
0060
0061
0062
0063
0064
0065
0066 #define KVM_ARM_TARGET_AEM_V8 0
0067 #define KVM_ARM_TARGET_FOUNDATION_V8 1
0068 #define KVM_ARM_TARGET_CORTEX_A57 2
0069 #define KVM_ARM_TARGET_XGENE_POTENZA 3
0070 #define KVM_ARM_TARGET_CORTEX_A53 4
0071
0072 #define KVM_ARM_TARGET_GENERIC_V8 5
0073
0074 #define KVM_ARM_NUM_TARGETS 6
0075
0076
0077 #define KVM_ARM_DEVICE_TYPE_SHIFT 0
0078 #define KVM_ARM_DEVICE_TYPE_MASK GENMASK(KVM_ARM_DEVICE_TYPE_SHIFT + 15, \
0079 KVM_ARM_DEVICE_TYPE_SHIFT)
0080 #define KVM_ARM_DEVICE_ID_SHIFT 16
0081 #define KVM_ARM_DEVICE_ID_MASK GENMASK(KVM_ARM_DEVICE_ID_SHIFT + 15, \
0082 KVM_ARM_DEVICE_ID_SHIFT)
0083
0084
0085 #define KVM_ARM_DEVICE_VGIC_V2 0
0086
0087
0088 #define KVM_VGIC_V2_ADDR_TYPE_DIST 0
0089 #define KVM_VGIC_V2_ADDR_TYPE_CPU 1
0090
0091 #define KVM_VGIC_V2_DIST_SIZE 0x1000
0092 #define KVM_VGIC_V2_CPU_SIZE 0x2000
0093
0094
0095 #define KVM_VGIC_V3_ADDR_TYPE_DIST 2
0096 #define KVM_VGIC_V3_ADDR_TYPE_REDIST 3
0097 #define KVM_VGIC_ITS_ADDR_TYPE 4
0098 #define KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION 5
0099
0100 #define KVM_VGIC_V3_DIST_SIZE SZ_64K
0101 #define KVM_VGIC_V3_REDIST_SIZE (2 * SZ_64K)
0102 #define KVM_VGIC_V3_ITS_SIZE (2 * SZ_64K)
0103
0104 #define KVM_ARM_VCPU_POWER_OFF 0
0105 #define KVM_ARM_VCPU_EL1_32BIT 1
0106 #define KVM_ARM_VCPU_PSCI_0_2 2
0107 #define KVM_ARM_VCPU_PMU_V3 3
0108 #define KVM_ARM_VCPU_SVE 4
0109 #define KVM_ARM_VCPU_PTRAUTH_ADDRESS 5
0110 #define KVM_ARM_VCPU_PTRAUTH_GENERIC 6
0111
0112 struct kvm_vcpu_init {
0113 __u32 target;
0114 __u32 features[7];
0115 };
0116
0117 struct kvm_sregs {
0118 };
0119
0120 struct kvm_fpu {
0121 };
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136 #define KVM_ARM_MAX_DBG_REGS 16
0137 struct kvm_guest_debug_arch {
0138 __u64 dbg_bcr[KVM_ARM_MAX_DBG_REGS];
0139 __u64 dbg_bvr[KVM_ARM_MAX_DBG_REGS];
0140 __u64 dbg_wcr[KVM_ARM_MAX_DBG_REGS];
0141 __u64 dbg_wvr[KVM_ARM_MAX_DBG_REGS];
0142 };
0143
0144 #define KVM_DEBUG_ARCH_HSR_HIGH_VALID (1 << 0)
0145 struct kvm_debug_exit_arch {
0146 __u32 hsr;
0147 __u32 hsr_high;
0148 __u64 far;
0149 };
0150
0151
0152
0153
0154
0155 #define KVM_GUESTDBG_USE_SW_BP (1 << 16)
0156 #define KVM_GUESTDBG_USE_HW (1 << 17)
0157
0158 struct kvm_sync_regs {
0159
0160 __u64 device_irq_level;
0161 };
0162
0163
0164
0165
0166
0167 struct kvm_pmu_event_filter {
0168 __u16 base_event;
0169 __u16 nevents;
0170
0171 #define KVM_PMU_EVENT_ALLOW 0
0172 #define KVM_PMU_EVENT_DENY 1
0173
0174 __u8 action;
0175 __u8 pad[3];
0176 };
0177
0178
0179 struct kvm_vcpu_events {
0180 struct {
0181 __u8 serror_pending;
0182 __u8 serror_has_esr;
0183 __u8 ext_dabt_pending;
0184
0185 __u8 pad[5];
0186 __u64 serror_esr;
0187 } exception;
0188 __u32 reserved[12];
0189 };
0190
0191 struct kvm_arm_copy_mte_tags {
0192 __u64 guest_ipa;
0193 __u64 length;
0194 void __user *addr;
0195 __u64 flags;
0196 __u64 reserved[2];
0197 };
0198
0199 #define KVM_ARM_TAGS_TO_GUEST 0
0200 #define KVM_ARM_TAGS_FROM_GUEST 1
0201
0202
0203 #define KVM_REG_ARM_COPROC_MASK 0x000000000FFF0000
0204 #define KVM_REG_ARM_COPROC_SHIFT 16
0205
0206
0207 #define KVM_REG_ARM_CORE (0x0010 << KVM_REG_ARM_COPROC_SHIFT)
0208 #define KVM_REG_ARM_CORE_REG(name) (offsetof(struct kvm_regs, name) / sizeof(__u32))
0209
0210
0211 #define KVM_REG_ARM_DEMUX (0x0011 << KVM_REG_ARM_COPROC_SHIFT)
0212 #define KVM_REG_ARM_DEMUX_ID_MASK 0x000000000000FF00
0213 #define KVM_REG_ARM_DEMUX_ID_SHIFT 8
0214 #define KVM_REG_ARM_DEMUX_ID_CCSIDR (0x00 << KVM_REG_ARM_DEMUX_ID_SHIFT)
0215 #define KVM_REG_ARM_DEMUX_VAL_MASK 0x00000000000000FF
0216 #define KVM_REG_ARM_DEMUX_VAL_SHIFT 0
0217
0218
0219 #define KVM_REG_ARM64_SYSREG (0x0013 << KVM_REG_ARM_COPROC_SHIFT)
0220 #define KVM_REG_ARM64_SYSREG_OP0_MASK 0x000000000000c000
0221 #define KVM_REG_ARM64_SYSREG_OP0_SHIFT 14
0222 #define KVM_REG_ARM64_SYSREG_OP1_MASK 0x0000000000003800
0223 #define KVM_REG_ARM64_SYSREG_OP1_SHIFT 11
0224 #define KVM_REG_ARM64_SYSREG_CRN_MASK 0x0000000000000780
0225 #define KVM_REG_ARM64_SYSREG_CRN_SHIFT 7
0226 #define KVM_REG_ARM64_SYSREG_CRM_MASK 0x0000000000000078
0227 #define KVM_REG_ARM64_SYSREG_CRM_SHIFT 3
0228 #define KVM_REG_ARM64_SYSREG_OP2_MASK 0x0000000000000007
0229 #define KVM_REG_ARM64_SYSREG_OP2_SHIFT 0
0230
0231 #define ARM64_SYS_REG_SHIFT_MASK(x,n) \
0232 (((x) << KVM_REG_ARM64_SYSREG_ ## n ## _SHIFT) & \
0233 KVM_REG_ARM64_SYSREG_ ## n ## _MASK)
0234
0235 #define __ARM64_SYS_REG(op0,op1,crn,crm,op2) \
0236 (KVM_REG_ARM64 | KVM_REG_ARM64_SYSREG | \
0237 ARM64_SYS_REG_SHIFT_MASK(op0, OP0) | \
0238 ARM64_SYS_REG_SHIFT_MASK(op1, OP1) | \
0239 ARM64_SYS_REG_SHIFT_MASK(crn, CRN) | \
0240 ARM64_SYS_REG_SHIFT_MASK(crm, CRM) | \
0241 ARM64_SYS_REG_SHIFT_MASK(op2, OP2))
0242
0243 #define ARM64_SYS_REG(...) (__ARM64_SYS_REG(__VA_ARGS__) | KVM_REG_SIZE_U64)
0244
0245
0246 #define KVM_REG_ARM_PTIMER_CTL ARM64_SYS_REG(3, 3, 14, 2, 1)
0247 #define KVM_REG_ARM_PTIMER_CVAL ARM64_SYS_REG(3, 3, 14, 2, 2)
0248 #define KVM_REG_ARM_PTIMER_CNT ARM64_SYS_REG(3, 3, 14, 0, 1)
0249
0250
0251
0252
0253
0254
0255
0256
0257
0258
0259 #define KVM_REG_ARM_TIMER_CTL ARM64_SYS_REG(3, 3, 14, 3, 1)
0260 #define KVM_REG_ARM_TIMER_CVAL ARM64_SYS_REG(3, 3, 14, 0, 2)
0261 #define KVM_REG_ARM_TIMER_CNT ARM64_SYS_REG(3, 3, 14, 3, 2)
0262
0263
0264 #define KVM_REG_ARM_FW (0x0014 << KVM_REG_ARM_COPROC_SHIFT)
0265 #define KVM_REG_ARM_FW_REG(r) (KVM_REG_ARM64 | KVM_REG_SIZE_U64 | \
0266 KVM_REG_ARM_FW | ((r) & 0xffff))
0267 #define KVM_REG_ARM_PSCI_VERSION KVM_REG_ARM_FW_REG(0)
0268 #define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_1 KVM_REG_ARM_FW_REG(1)
0269 #define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_1_NOT_AVAIL 0
0270 #define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_1_AVAIL 1
0271 #define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_1_NOT_REQUIRED 2
0272
0273
0274
0275
0276
0277
0278
0279
0280
0281 #define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2 KVM_REG_ARM_FW_REG(2)
0282 #define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2_NOT_AVAIL 0
0283 #define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2_UNKNOWN 1
0284 #define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2_AVAIL 2
0285 #define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2_NOT_REQUIRED 3
0286 #define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2_ENABLED (1U << 4)
0287
0288 #define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3 KVM_REG_ARM_FW_REG(3)
0289 #define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3_NOT_AVAIL 0
0290 #define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3_AVAIL 1
0291 #define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3_NOT_REQUIRED 2
0292
0293
0294 #define KVM_REG_ARM64_SVE (0x15 << KVM_REG_ARM_COPROC_SHIFT)
0295
0296
0297 #define KVM_REG_ARM64_SVE_ZREG_BASE 0
0298 #define KVM_REG_ARM64_SVE_PREG_BASE 0x400
0299 #define KVM_REG_ARM64_SVE_FFR_BASE 0x600
0300
0301 #define KVM_ARM64_SVE_NUM_ZREGS __SVE_NUM_ZREGS
0302 #define KVM_ARM64_SVE_NUM_PREGS __SVE_NUM_PREGS
0303
0304 #define KVM_ARM64_SVE_MAX_SLICES 32
0305
0306 #define KVM_REG_ARM64_SVE_ZREG(n, i) \
0307 (KVM_REG_ARM64 | KVM_REG_ARM64_SVE | KVM_REG_ARM64_SVE_ZREG_BASE | \
0308 KVM_REG_SIZE_U2048 | \
0309 (((n) & (KVM_ARM64_SVE_NUM_ZREGS - 1)) << 5) | \
0310 ((i) & (KVM_ARM64_SVE_MAX_SLICES - 1)))
0311
0312 #define KVM_REG_ARM64_SVE_PREG(n, i) \
0313 (KVM_REG_ARM64 | KVM_REG_ARM64_SVE | KVM_REG_ARM64_SVE_PREG_BASE | \
0314 KVM_REG_SIZE_U256 | \
0315 (((n) & (KVM_ARM64_SVE_NUM_PREGS - 1)) << 5) | \
0316 ((i) & (KVM_ARM64_SVE_MAX_SLICES - 1)))
0317
0318 #define KVM_REG_ARM64_SVE_FFR(i) \
0319 (KVM_REG_ARM64 | KVM_REG_ARM64_SVE | KVM_REG_ARM64_SVE_FFR_BASE | \
0320 KVM_REG_SIZE_U256 | \
0321 ((i) & (KVM_ARM64_SVE_MAX_SLICES - 1)))
0322
0323
0324
0325
0326
0327
0328
0329
0330 #define KVM_ARM64_SVE_VQ_MIN __SVE_VQ_MIN
0331 #define KVM_ARM64_SVE_VQ_MAX __SVE_VQ_MAX
0332
0333
0334 #define KVM_REG_ARM64_SVE_VLS (KVM_REG_ARM64 | KVM_REG_ARM64_SVE | \
0335 KVM_REG_SIZE_U512 | 0xffff)
0336 #define KVM_ARM64_SVE_VLS_WORDS \
0337 ((KVM_ARM64_SVE_VQ_MAX - KVM_ARM64_SVE_VQ_MIN) / 64 + 1)
0338
0339
0340 #define KVM_REG_ARM_FW_FEAT_BMAP (0x0016 << KVM_REG_ARM_COPROC_SHIFT)
0341 #define KVM_REG_ARM_FW_FEAT_BMAP_REG(r) (KVM_REG_ARM64 | KVM_REG_SIZE_U64 | \
0342 KVM_REG_ARM_FW_FEAT_BMAP | \
0343 ((r) & 0xffff))
0344
0345 #define KVM_REG_ARM_STD_BMAP KVM_REG_ARM_FW_FEAT_BMAP_REG(0)
0346
0347 enum {
0348 KVM_REG_ARM_STD_BIT_TRNG_V1_0 = 0,
0349 #ifdef __KERNEL__
0350 KVM_REG_ARM_STD_BMAP_BIT_COUNT,
0351 #endif
0352 };
0353
0354 #define KVM_REG_ARM_STD_HYP_BMAP KVM_REG_ARM_FW_FEAT_BMAP_REG(1)
0355
0356 enum {
0357 KVM_REG_ARM_STD_HYP_BIT_PV_TIME = 0,
0358 #ifdef __KERNEL__
0359 KVM_REG_ARM_STD_HYP_BMAP_BIT_COUNT,
0360 #endif
0361 };
0362
0363 #define KVM_REG_ARM_VENDOR_HYP_BMAP KVM_REG_ARM_FW_FEAT_BMAP_REG(2)
0364
0365 enum {
0366 KVM_REG_ARM_VENDOR_HYP_BIT_FUNC_FEAT = 0,
0367 KVM_REG_ARM_VENDOR_HYP_BIT_PTP = 1,
0368 #ifdef __KERNEL__
0369 KVM_REG_ARM_VENDOR_HYP_BMAP_BIT_COUNT,
0370 #endif
0371 };
0372
0373
0374 #define KVM_DEV_ARM_VGIC_GRP_ADDR 0
0375 #define KVM_DEV_ARM_VGIC_GRP_DIST_REGS 1
0376 #define KVM_DEV_ARM_VGIC_GRP_CPU_REGS 2
0377 #define KVM_DEV_ARM_VGIC_CPUID_SHIFT 32
0378 #define KVM_DEV_ARM_VGIC_CPUID_MASK (0xffULL << KVM_DEV_ARM_VGIC_CPUID_SHIFT)
0379 #define KVM_DEV_ARM_VGIC_V3_MPIDR_SHIFT 32
0380 #define KVM_DEV_ARM_VGIC_V3_MPIDR_MASK \
0381 (0xffffffffULL << KVM_DEV_ARM_VGIC_V3_MPIDR_SHIFT)
0382 #define KVM_DEV_ARM_VGIC_OFFSET_SHIFT 0
0383 #define KVM_DEV_ARM_VGIC_OFFSET_MASK (0xffffffffULL << KVM_DEV_ARM_VGIC_OFFSET_SHIFT)
0384 #define KVM_DEV_ARM_VGIC_SYSREG_INSTR_MASK (0xffff)
0385 #define KVM_DEV_ARM_VGIC_GRP_NR_IRQS 3
0386 #define KVM_DEV_ARM_VGIC_GRP_CTRL 4
0387 #define KVM_DEV_ARM_VGIC_GRP_REDIST_REGS 5
0388 #define KVM_DEV_ARM_VGIC_GRP_CPU_SYSREGS 6
0389 #define KVM_DEV_ARM_VGIC_GRP_LEVEL_INFO 7
0390 #define KVM_DEV_ARM_VGIC_GRP_ITS_REGS 8
0391 #define KVM_DEV_ARM_VGIC_LINE_LEVEL_INFO_SHIFT 10
0392 #define KVM_DEV_ARM_VGIC_LINE_LEVEL_INFO_MASK \
0393 (0x3fffffULL << KVM_DEV_ARM_VGIC_LINE_LEVEL_INFO_SHIFT)
0394 #define KVM_DEV_ARM_VGIC_LINE_LEVEL_INTID_MASK 0x3ff
0395 #define VGIC_LEVEL_INFO_LINE_LEVEL 0
0396
0397 #define KVM_DEV_ARM_VGIC_CTRL_INIT 0
0398 #define KVM_DEV_ARM_ITS_SAVE_TABLES 1
0399 #define KVM_DEV_ARM_ITS_RESTORE_TABLES 2
0400 #define KVM_DEV_ARM_VGIC_SAVE_PENDING_TABLES 3
0401 #define KVM_DEV_ARM_ITS_CTRL_RESET 4
0402
0403
0404 #define KVM_ARM_VCPU_PMU_V3_CTRL 0
0405 #define KVM_ARM_VCPU_PMU_V3_IRQ 0
0406 #define KVM_ARM_VCPU_PMU_V3_INIT 1
0407 #define KVM_ARM_VCPU_PMU_V3_FILTER 2
0408 #define KVM_ARM_VCPU_PMU_V3_SET_PMU 3
0409 #define KVM_ARM_VCPU_TIMER_CTRL 1
0410 #define KVM_ARM_VCPU_TIMER_IRQ_VTIMER 0
0411 #define KVM_ARM_VCPU_TIMER_IRQ_PTIMER 1
0412 #define KVM_ARM_VCPU_PVTIME_CTRL 2
0413 #define KVM_ARM_VCPU_PVTIME_IPA 0
0414
0415
0416 #define KVM_ARM_IRQ_VCPU2_SHIFT 28
0417 #define KVM_ARM_IRQ_VCPU2_MASK 0xf
0418 #define KVM_ARM_IRQ_TYPE_SHIFT 24
0419 #define KVM_ARM_IRQ_TYPE_MASK 0xf
0420 #define KVM_ARM_IRQ_VCPU_SHIFT 16
0421 #define KVM_ARM_IRQ_VCPU_MASK 0xff
0422 #define KVM_ARM_IRQ_NUM_SHIFT 0
0423 #define KVM_ARM_IRQ_NUM_MASK 0xffff
0424
0425
0426 #define KVM_ARM_IRQ_TYPE_CPU 0
0427 #define KVM_ARM_IRQ_TYPE_SPI 1
0428 #define KVM_ARM_IRQ_TYPE_PPI 2
0429
0430
0431 #define KVM_ARM_IRQ_CPU_IRQ 0
0432 #define KVM_ARM_IRQ_CPU_FIQ 1
0433
0434
0435
0436
0437
0438
0439 #ifndef __KERNEL__
0440 #define KVM_ARM_IRQ_GIC_MAX 127
0441 #endif
0442
0443
0444 #define KVM_NR_IRQCHIPS 1
0445
0446
0447 #define KVM_PSCI_FN_BASE 0x95c1ba5e
0448 #define KVM_PSCI_FN(n) (KVM_PSCI_FN_BASE + (n))
0449
0450 #define KVM_PSCI_FN_CPU_SUSPEND KVM_PSCI_FN(0)
0451 #define KVM_PSCI_FN_CPU_OFF KVM_PSCI_FN(1)
0452 #define KVM_PSCI_FN_CPU_ON KVM_PSCI_FN(2)
0453 #define KVM_PSCI_FN_MIGRATE KVM_PSCI_FN(3)
0454
0455 #define KVM_PSCI_RET_SUCCESS PSCI_RET_SUCCESS
0456 #define KVM_PSCI_RET_NI PSCI_RET_NOT_SUPPORTED
0457 #define KVM_PSCI_RET_INVAL PSCI_RET_INVALID_PARAMS
0458 #define KVM_PSCI_RET_DENIED PSCI_RET_DENIED
0459
0460
0461
0462
0463
0464
0465 #define KVM_SYSTEM_EVENT_RESET_FLAG_PSCI_RESET2 (1ULL << 0)
0466
0467
0468 #define KVM_EXIT_FAIL_ENTRY_CPU_UNSUPPORTED (1ULL << 0)
0469
0470 #endif
0471
0472 #endif