Lines Matching refs:vcpu
53 static inline void vcpu_cp15_reg64_set(struct kvm_vcpu *vcpu, in vcpu_cp15_reg64_set() argument
57 vcpu->arch.cp15[r->reg] = val & 0xffffffff; in vcpu_cp15_reg64_set()
58 vcpu->arch.cp15[r->reg + 1] = val >> 32; in vcpu_cp15_reg64_set()
61 static inline u64 vcpu_cp15_reg64_get(struct kvm_vcpu *vcpu, in vcpu_cp15_reg64_get() argument
66 val = vcpu->arch.cp15[r->reg + 1]; in vcpu_cp15_reg64_get()
68 val = val | vcpu->arch.cp15[r->reg]; in vcpu_cp15_reg64_get()
72 int kvm_handle_cp10_id(struct kvm_vcpu *vcpu, struct kvm_run *run) in kvm_handle_cp10_id() argument
74 kvm_inject_undefined(vcpu); in kvm_handle_cp10_id()
78 int kvm_handle_cp_0_13_access(struct kvm_vcpu *vcpu, struct kvm_run *run) in kvm_handle_cp_0_13_access() argument
84 kvm_inject_undefined(vcpu); in kvm_handle_cp_0_13_access()
88 int kvm_handle_cp14_load_store(struct kvm_vcpu *vcpu, struct kvm_run *run) in kvm_handle_cp14_load_store() argument
90 kvm_inject_undefined(vcpu); in kvm_handle_cp14_load_store()
94 int kvm_handle_cp14_access(struct kvm_vcpu *vcpu, struct kvm_run *run) in kvm_handle_cp14_access() argument
96 kvm_inject_undefined(vcpu); in kvm_handle_cp14_access()
100 static void reset_mpidr(struct kvm_vcpu *vcpu, const struct coproc_reg *r) in reset_mpidr() argument
107 vcpu->arch.cp15[c0_MPIDR] = ((read_cpuid_mpidr() & MPIDR_SMP_BITMASK) | in reset_mpidr()
108 ((vcpu->vcpu_id >> 2) << MPIDR_LEVEL_BITS) | in reset_mpidr()
109 (vcpu->vcpu_id & 3)); in reset_mpidr()
113 static bool access_actlr(struct kvm_vcpu *vcpu, in access_actlr() argument
118 return ignore_write(vcpu, p); in access_actlr()
120 *vcpu_reg(vcpu, p->Rt1) = vcpu->arch.cp15[c1_ACTLR]; in access_actlr()
125 static bool access_cbar(struct kvm_vcpu *vcpu, in access_cbar() argument
130 return write_to_read_only(vcpu, p); in access_cbar()
131 return read_zero(vcpu, p); in access_cbar()
135 static bool access_l2ctlr(struct kvm_vcpu *vcpu, in access_l2ctlr() argument
140 return ignore_write(vcpu, p); in access_l2ctlr()
142 *vcpu_reg(vcpu, p->Rt1) = vcpu->arch.cp15[c9_L2CTLR]; in access_l2ctlr()
146 static void reset_l2ctlr(struct kvm_vcpu *vcpu, const struct coproc_reg *r) in reset_l2ctlr() argument
152 ncores = atomic_read(&vcpu->kvm->online_vcpus) - 1; in reset_l2ctlr()
154 ncores -= (vcpu->vcpu_id & ~3); in reset_l2ctlr()
159 vcpu->arch.cp15[c9_L2CTLR] = l2ctlr; in reset_l2ctlr()
162 static void reset_actlr(struct kvm_vcpu *vcpu, const struct coproc_reg *r) in reset_actlr() argument
169 if (atomic_read(&vcpu->kvm->online_vcpus) > 1) in reset_actlr()
174 vcpu->arch.cp15[c1_ACTLR] = actlr; in reset_actlr()
181 static bool access_l2ectlr(struct kvm_vcpu *vcpu, in access_l2ectlr() argument
186 return ignore_write(vcpu, p); in access_l2ectlr()
188 *vcpu_reg(vcpu, p->Rt1) = 0; in access_l2ectlr()
195 static bool access_dcsw(struct kvm_vcpu *vcpu, in access_dcsw() argument
200 return read_from_write_only(vcpu, p); in access_dcsw()
202 kvm_set_way_flush(vcpu); in access_dcsw()
213 bool access_vm_reg(struct kvm_vcpu *vcpu, in access_vm_reg() argument
217 bool was_enabled = vcpu_has_cache_enabled(vcpu); in access_vm_reg()
221 vcpu->arch.cp15[r->reg] = *vcpu_reg(vcpu, p->Rt1); in access_vm_reg()
223 vcpu->arch.cp15[r->reg + 1] = *vcpu_reg(vcpu, p->Rt2); in access_vm_reg()
225 kvm_toggle_cache(vcpu, was_enabled); in access_vm_reg()
238 static bool pm_fake(struct kvm_vcpu *vcpu, in pm_fake() argument
243 return ignore_write(vcpu, p); in pm_fake()
245 return read_zero(vcpu, p); in pm_fake()
433 static int emulate_cp15(struct kvm_vcpu *vcpu, in emulate_cp15() argument
442 table = get_target_table(vcpu->arch.target, &num); in emulate_cp15()
453 if (likely(r->access(vcpu, params, r))) { in emulate_cp15()
455 kvm_skip_instr(vcpu, kvm_vcpu_trap_il_is32bit(vcpu)); in emulate_cp15()
461 *vcpu_pc(vcpu)); in emulate_cp15()
464 kvm_inject_undefined(vcpu); in emulate_cp15()
473 int kvm_handle_cp15_64(struct kvm_vcpu *vcpu, struct kvm_run *run) in kvm_handle_cp15_64() argument
477 params.CRn = (kvm_vcpu_get_hsr(vcpu) >> 1) & 0xf; in kvm_handle_cp15_64()
478 params.Rt1 = (kvm_vcpu_get_hsr(vcpu) >> 5) & 0xf; in kvm_handle_cp15_64()
479 params.is_write = ((kvm_vcpu_get_hsr(vcpu) & 1) == 0); in kvm_handle_cp15_64()
482 params.Op1 = (kvm_vcpu_get_hsr(vcpu) >> 16) & 0xf; in kvm_handle_cp15_64()
484 params.Rt2 = (kvm_vcpu_get_hsr(vcpu) >> 10) & 0xf; in kvm_handle_cp15_64()
487 return emulate_cp15(vcpu, ¶ms); in kvm_handle_cp15_64()
490 static void reset_coproc_regs(struct kvm_vcpu *vcpu, in reset_coproc_regs() argument
497 table[i].reset(vcpu, &table[i]); in reset_coproc_regs()
505 int kvm_handle_cp15_32(struct kvm_vcpu *vcpu, struct kvm_run *run) in kvm_handle_cp15_32() argument
509 params.CRm = (kvm_vcpu_get_hsr(vcpu) >> 1) & 0xf; in kvm_handle_cp15_32()
510 params.Rt1 = (kvm_vcpu_get_hsr(vcpu) >> 5) & 0xf; in kvm_handle_cp15_32()
511 params.is_write = ((kvm_vcpu_get_hsr(vcpu) & 1) == 0); in kvm_handle_cp15_32()
514 params.CRn = (kvm_vcpu_get_hsr(vcpu) >> 10) & 0xf; in kvm_handle_cp15_32()
515 params.Op1 = (kvm_vcpu_get_hsr(vcpu) >> 14) & 0x7; in kvm_handle_cp15_32()
516 params.Op2 = (kvm_vcpu_get_hsr(vcpu) >> 17) & 0x7; in kvm_handle_cp15_32()
519 return emulate_cp15(vcpu, ¶ms); in kvm_handle_cp15_32()
571 static const struct coproc_reg *index_to_coproc_reg(struct kvm_vcpu *vcpu, in index_to_coproc_reg() argument
585 table = get_target_table(vcpu->arch.target, &num); in index_to_coproc_reg()
891 static int vfp_get_reg(const struct kvm_vcpu *vcpu, u64 id, void __user *uaddr) in vfp_get_reg() argument
904 return reg_to_user(uaddr, &vcpu->arch.vfp_guest.fpregs[vfpid], in vfp_get_reg()
914 return reg_to_user(uaddr, &vcpu->arch.vfp_guest.fpexc, id); in vfp_get_reg()
916 return reg_to_user(uaddr, &vcpu->arch.vfp_guest.fpscr, id); in vfp_get_reg()
918 return reg_to_user(uaddr, &vcpu->arch.vfp_guest.fpinst, id); in vfp_get_reg()
920 return reg_to_user(uaddr, &vcpu->arch.vfp_guest.fpinst2, id); in vfp_get_reg()
935 static int vfp_set_reg(struct kvm_vcpu *vcpu, u64 id, const void __user *uaddr) in vfp_set_reg() argument
948 return reg_from_user(&vcpu->arch.vfp_guest.fpregs[vfpid], in vfp_set_reg()
958 return reg_from_user(&vcpu->arch.vfp_guest.fpexc, uaddr, id); in vfp_set_reg()
960 return reg_from_user(&vcpu->arch.vfp_guest.fpscr, uaddr, id); in vfp_set_reg()
962 return reg_from_user(&vcpu->arch.vfp_guest.fpinst, uaddr, id); in vfp_set_reg()
964 return reg_from_user(&vcpu->arch.vfp_guest.fpinst2, uaddr, id); in vfp_set_reg()
999 static int vfp_get_reg(const struct kvm_vcpu *vcpu, u64 id, void __user *uaddr) in vfp_get_reg() argument
1004 static int vfp_set_reg(struct kvm_vcpu *vcpu, u64 id, const void __user *uaddr) in vfp_set_reg() argument
1010 int kvm_arm_coproc_get_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg) in kvm_arm_coproc_get_reg() argument
1020 return vfp_get_reg(vcpu, reg->id, uaddr); in kvm_arm_coproc_get_reg()
1022 r = index_to_coproc_reg(vcpu, reg->id); in kvm_arm_coproc_get_reg()
1030 val = vcpu_cp15_reg64_get(vcpu, r); in kvm_arm_coproc_get_reg()
1033 ret = reg_to_user(uaddr, &vcpu->arch.cp15[r->reg], reg->id); in kvm_arm_coproc_get_reg()
1039 int kvm_arm_coproc_set_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg) in kvm_arm_coproc_set_reg() argument
1049 return vfp_set_reg(vcpu, reg->id, uaddr); in kvm_arm_coproc_set_reg()
1051 r = index_to_coproc_reg(vcpu, reg->id); in kvm_arm_coproc_set_reg()
1061 vcpu_cp15_reg64_set(vcpu, r, val); in kvm_arm_coproc_set_reg()
1063 ret = reg_from_user(&vcpu->arch.cp15[r->reg], uaddr, reg->id); in kvm_arm_coproc_set_reg()
1133 static int walk_cp15(struct kvm_vcpu *vcpu, u64 __user *uind) in walk_cp15() argument
1140 i1 = get_target_table(vcpu->arch.target, &num); in walk_cp15()
1175 unsigned long kvm_arm_num_coproc_regs(struct kvm_vcpu *vcpu) in kvm_arm_num_coproc_regs() argument
1180 + walk_cp15(vcpu, (u64 __user *)NULL); in kvm_arm_num_coproc_regs()
1183 int kvm_arm_copy_coproc_indices(struct kvm_vcpu *vcpu, u64 __user *uindices) in kvm_arm_copy_coproc_indices() argument
1195 err = walk_cp15(vcpu, uindices); in kvm_arm_copy_coproc_indices()
1245 void kvm_reset_coprocs(struct kvm_vcpu *vcpu) in kvm_reset_coprocs() argument
1251 memset(vcpu->arch.cp15, 0x42, sizeof(vcpu->arch.cp15)); in kvm_reset_coprocs()
1254 reset_coproc_regs(vcpu, cp15_regs, ARRAY_SIZE(cp15_regs)); in kvm_reset_coprocs()
1256 table = get_target_table(vcpu->arch.target, &num); in kvm_reset_coprocs()
1257 reset_coproc_regs(vcpu, table, num); in kvm_reset_coprocs()
1260 if (vcpu->arch.cp15[num] == 0x42424242) in kvm_reset_coprocs()