1/* 2 * Copyright (C) 2012,2013 - ARM Ltd 3 * Author: Marc Zyngier <marc.zyngier@arm.com> 4 * 5 * Derived from arch/arm/kvm/guest.c: 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#include <linux/errno.h> 23#include <linux/err.h> 24#include <linux/kvm_host.h> 25#include <linux/module.h> 26#include <linux/vmalloc.h> 27#include <linux/fs.h> 28#include <asm/cputype.h> 29#include <asm/uaccess.h> 30#include <asm/kvm.h> 31#include <asm/kvm_asm.h> 32#include <asm/kvm_emulate.h> 33#include <asm/kvm_coproc.h> 34 35struct kvm_stats_debugfs_item debugfs_entries[] = { 36 { NULL } 37}; 38 39int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu) 40{ 41 return 0; 42} 43 44static u64 core_reg_offset_from_id(u64 id) 45{ 46 return id & ~(KVM_REG_ARCH_MASK | KVM_REG_SIZE_MASK | KVM_REG_ARM_CORE); 47} 48 49static int get_core_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg) 50{ 51 /* 52 * Because the kvm_regs structure is a mix of 32, 64 and 53 * 128bit fields, we index it as if it was a 32bit 54 * array. Hence below, nr_regs is the number of entries, and 55 * off the index in the "array". 56 */ 57 __u32 __user *uaddr = (__u32 __user *)(unsigned long)reg->addr; 58 struct kvm_regs *regs = vcpu_gp_regs(vcpu); 59 int nr_regs = sizeof(*regs) / sizeof(__u32); 60 u32 off; 61 62 /* Our ID is an index into the kvm_regs struct. */ 63 off = core_reg_offset_from_id(reg->id); 64 if (off >= nr_regs || 65 (off + (KVM_REG_SIZE(reg->id) / sizeof(__u32))) >= nr_regs) 66 return -ENOENT; 67 68 if (copy_to_user(uaddr, ((u32 *)regs) + off, KVM_REG_SIZE(reg->id))) 69 return -EFAULT; 70 71 return 0; 72} 73 74static int set_core_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg) 75{ 76 __u32 __user *uaddr = (__u32 __user *)(unsigned long)reg->addr; 77 struct kvm_regs *regs = vcpu_gp_regs(vcpu); 78 int nr_regs = sizeof(*regs) / sizeof(__u32); 79 __uint128_t tmp; 80 void *valp = &tmp; 81 u64 off; 82 int err = 0; 83 84 /* Our ID is an index into the kvm_regs struct. */ 85 off = core_reg_offset_from_id(reg->id); 86 if (off >= nr_regs || 87 (off + (KVM_REG_SIZE(reg->id) / sizeof(__u32))) >= nr_regs) 88 return -ENOENT; 89 90 if (KVM_REG_SIZE(reg->id) > sizeof(tmp)) 91 return -EINVAL; 92 93 if (copy_from_user(valp, uaddr, KVM_REG_SIZE(reg->id))) { 94 err = -EFAULT; 95 goto out; 96 } 97 98 if (off == KVM_REG_ARM_CORE_REG(regs.pstate)) { 99 u32 mode = (*(u32 *)valp) & COMPAT_PSR_MODE_MASK; 100 switch (mode) { 101 case COMPAT_PSR_MODE_USR: 102 case COMPAT_PSR_MODE_FIQ: 103 case COMPAT_PSR_MODE_IRQ: 104 case COMPAT_PSR_MODE_SVC: 105 case COMPAT_PSR_MODE_ABT: 106 case COMPAT_PSR_MODE_UND: 107 case PSR_MODE_EL0t: 108 case PSR_MODE_EL1t: 109 case PSR_MODE_EL1h: 110 break; 111 default: 112 err = -EINVAL; 113 goto out; 114 } 115 } 116 117 memcpy((u32 *)regs + off, valp, KVM_REG_SIZE(reg->id)); 118out: 119 return err; 120} 121 122int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) 123{ 124 return -EINVAL; 125} 126 127int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) 128{ 129 return -EINVAL; 130} 131 132static unsigned long num_core_regs(void) 133{ 134 return sizeof(struct kvm_regs) / sizeof(__u32); 135} 136 137/** 138 * ARM64 versions of the TIMER registers, always available on arm64 139 */ 140 141#define NUM_TIMER_REGS 3 142 143static bool is_timer_reg(u64 index) 144{ 145 switch (index) { 146 case KVM_REG_ARM_TIMER_CTL: 147 case KVM_REG_ARM_TIMER_CNT: 148 case KVM_REG_ARM_TIMER_CVAL: 149 return true; 150 } 151 return false; 152} 153 154static int copy_timer_indices(struct kvm_vcpu *vcpu, u64 __user *uindices) 155{ 156 if (put_user(KVM_REG_ARM_TIMER_CTL, uindices)) 157 return -EFAULT; 158 uindices++; 159 if (put_user(KVM_REG_ARM_TIMER_CNT, uindices)) 160 return -EFAULT; 161 uindices++; 162 if (put_user(KVM_REG_ARM_TIMER_CVAL, uindices)) 163 return -EFAULT; 164 165 return 0; 166} 167 168static int set_timer_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg) 169{ 170 void __user *uaddr = (void __user *)(long)reg->addr; 171 u64 val; 172 int ret; 173 174 ret = copy_from_user(&val, uaddr, KVM_REG_SIZE(reg->id)); 175 if (ret != 0) 176 return -EFAULT; 177 178 return kvm_arm_timer_set_reg(vcpu, reg->id, val); 179} 180 181static int get_timer_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg) 182{ 183 void __user *uaddr = (void __user *)(long)reg->addr; 184 u64 val; 185 186 val = kvm_arm_timer_get_reg(vcpu, reg->id); 187 return copy_to_user(uaddr, &val, KVM_REG_SIZE(reg->id)) ? -EFAULT : 0; 188} 189 190/** 191 * kvm_arm_num_regs - how many registers do we present via KVM_GET_ONE_REG 192 * 193 * This is for all registers. 194 */ 195unsigned long kvm_arm_num_regs(struct kvm_vcpu *vcpu) 196{ 197 return num_core_regs() + kvm_arm_num_sys_reg_descs(vcpu) 198 + NUM_TIMER_REGS; 199} 200 201/** 202 * kvm_arm_copy_reg_indices - get indices of all registers. 203 * 204 * We do core registers right here, then we apppend system regs. 205 */ 206int kvm_arm_copy_reg_indices(struct kvm_vcpu *vcpu, u64 __user *uindices) 207{ 208 unsigned int i; 209 const u64 core_reg = KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE; 210 int ret; 211 212 for (i = 0; i < sizeof(struct kvm_regs) / sizeof(__u32); i++) { 213 if (put_user(core_reg | i, uindices)) 214 return -EFAULT; 215 uindices++; 216 } 217 218 ret = copy_timer_indices(vcpu, uindices); 219 if (ret) 220 return ret; 221 uindices += NUM_TIMER_REGS; 222 223 return kvm_arm_copy_sys_reg_indices(vcpu, uindices); 224} 225 226int kvm_arm_get_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg) 227{ 228 /* We currently use nothing arch-specific in upper 32 bits */ 229 if ((reg->id & ~KVM_REG_SIZE_MASK) >> 32 != KVM_REG_ARM64 >> 32) 230 return -EINVAL; 231 232 /* Register group 16 means we want a core register. */ 233 if ((reg->id & KVM_REG_ARM_COPROC_MASK) == KVM_REG_ARM_CORE) 234 return get_core_reg(vcpu, reg); 235 236 if (is_timer_reg(reg->id)) 237 return get_timer_reg(vcpu, reg); 238 239 return kvm_arm_sys_reg_get_reg(vcpu, reg); 240} 241 242int kvm_arm_set_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg) 243{ 244 /* We currently use nothing arch-specific in upper 32 bits */ 245 if ((reg->id & ~KVM_REG_SIZE_MASK) >> 32 != KVM_REG_ARM64 >> 32) 246 return -EINVAL; 247 248 /* Register group 16 means we set a core register. */ 249 if ((reg->id & KVM_REG_ARM_COPROC_MASK) == KVM_REG_ARM_CORE) 250 return set_core_reg(vcpu, reg); 251 252 if (is_timer_reg(reg->id)) 253 return set_timer_reg(vcpu, reg); 254 255 return kvm_arm_sys_reg_set_reg(vcpu, reg); 256} 257 258int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu, 259 struct kvm_sregs *sregs) 260{ 261 return -EINVAL; 262} 263 264int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, 265 struct kvm_sregs *sregs) 266{ 267 return -EINVAL; 268} 269 270int __attribute_const__ kvm_target_cpu(void) 271{ 272 unsigned long implementor = read_cpuid_implementor(); 273 unsigned long part_number = read_cpuid_part_number(); 274 275 switch (implementor) { 276 case ARM_CPU_IMP_ARM: 277 switch (part_number) { 278 case ARM_CPU_PART_AEM_V8: 279 return KVM_ARM_TARGET_AEM_V8; 280 case ARM_CPU_PART_FOUNDATION: 281 return KVM_ARM_TARGET_FOUNDATION_V8; 282 case ARM_CPU_PART_CORTEX_A53: 283 return KVM_ARM_TARGET_CORTEX_A53; 284 case ARM_CPU_PART_CORTEX_A57: 285 return KVM_ARM_TARGET_CORTEX_A57; 286 }; 287 break; 288 case ARM_CPU_IMP_APM: 289 switch (part_number) { 290 case APM_CPU_PART_POTENZA: 291 return KVM_ARM_TARGET_XGENE_POTENZA; 292 }; 293 break; 294 }; 295 296 return -EINVAL; 297} 298 299int kvm_vcpu_preferred_target(struct kvm_vcpu_init *init) 300{ 301 int target = kvm_target_cpu(); 302 303 if (target < 0) 304 return -ENODEV; 305 306 memset(init, 0, sizeof(*init)); 307 308 /* 309 * For now, we don't return any features. 310 * In future, we might use features to return target 311 * specific features available for the preferred 312 * target type. 313 */ 314 init->target = (__u32)target; 315 316 return 0; 317} 318 319int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu) 320{ 321 return -EINVAL; 322} 323 324int kvm_arch_vcpu_ioctl_set_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu) 325{ 326 return -EINVAL; 327} 328 329int kvm_arch_vcpu_ioctl_translate(struct kvm_vcpu *vcpu, 330 struct kvm_translation *tr) 331{ 332 return -EINVAL; 333} 334