Lines Matching +full:close +full:- +full:pr

13  * See the COPYING file in the top-level directory.
25 #include "qemu/error-report.h"
27 #include "cpu-models.h"
33 #include "mmu-hash64.h"
39 #include "migration/qemu-file-types.h"
47 #include "qemu/main-loop.h"
48 #include "qemu/mmap-alloc.h"
52 #include "accel/accel-cpu-target.h"
56 #define PROC_DEVTREE_CPU "/proc/device-tree/cpus/"
106 * Check whether we are running with KVM-PR (instead of KVM-HV). This
107 * should only be used for fallback tests - generally we should use
113 /* Assume KVM-PR if the GET_PVINFO capability is available */ in kvmppc_is_pr()
185 CPUPPCState *cenv = &cpu->env; in kvm_arch_sync_sregs()
190 if (cenv->excp_model == POWERPC_EXCP_BOOKE) { in kvm_arch_sync_sregs()
202 return -ENOSYS; in kvm_arch_sync_sregs()
211 sregs.pvr = cenv->spr[SPR_PVR]; in kvm_arch_sync_sregs()
218 CPUPPCState *env = &cpu->env; in kvm_booke206_tlb_init()
226 !kvm_check_extension(cs->kvm_state, KVM_CAP_SW_TLB)) { in kvm_booke206_tlb_init()
238 assert(entries == env->nb_tlb); in kvm_booke206_tlb_init()
241 env->tlb_dirty = true; in kvm_booke206_tlb_init()
243 cfg.array = (uintptr_t)env->tlb.tlbm; in kvm_booke206_tlb_init()
251 __func__, strerror(-ret)); in kvm_booke206_tlb_init()
255 env->kvm_sw_tlb = true; in kvm_booke206_tlb_init()
278 error_setg_errno(errp, -ret, in kvm_get_smmu_info()
296 radix_page_info->count = 0; in kvmppc_get_radix_page_info()
299 radix_page_info->entries[i] = rmmu_info.ap_encodings[i]; in kvmppc_get_radix_page_info()
300 radix_page_info->count++; in kvmppc_get_radix_page_info()
324 ret = kvm_vm_ioctl(cs->kvm_state, KVM_PPC_CONFIGURE_V3_MMU, &cfg); in kvmppc_configure_v3_mmu()
328 case -EINVAL: in kvmppc_configure_v3_mmu()
330 case -ENODEV: in kvmppc_configure_v3_mmu()
356 if (!cpu->hash64_opts || !kvm_enabled()) { in kvm_check_mmu()
373 if (smmu_info.slb_size < cpu->hash64_opts->slb_size) { in kvm_check_mmu()
375 smmu_info.slb_size, cpu->hash64_opts->slb_size); in kvm_check_mmu()
383 for (iq = 0; iq < ARRAY_SIZE(cpu->hash64_opts->sps); iq++) { in kvm_check_mmu()
384 PPCHash64SegmentPageSizes *qsps = &cpu->hash64_opts->sps[iq]; in kvm_check_mmu()
388 if (qsps->page_shift == smmu_info.sps[ik].page_shift) { in kvm_check_mmu()
394 qsps->page_shift); in kvm_check_mmu()
399 if (ksps->slb_enc != qsps->slb_enc) { in kvm_check_mmu()
402 ksps->slb_enc, ksps->page_shift, qsps->slb_enc); in kvm_check_mmu()
406 for (jq = 0; jq < ARRAY_SIZE(qsps->enc); jq++) { in kvm_check_mmu()
407 for (jk = 0; jk < ARRAY_SIZE(ksps->enc); jk++) { in kvm_check_mmu()
408 if (qsps->enc[jq].page_shift == ksps->enc[jk].page_shift) { in kvm_check_mmu()
413 if (jk >= ARRAY_SIZE(ksps->enc)) { in kvm_check_mmu()
415 qsps->enc[jq].page_shift, qsps->page_shift); in kvm_check_mmu()
418 if (qsps->enc[jq].pte_enc != ksps->enc[jk].pte_enc) { in kvm_check_mmu()
421 ksps->enc[jk].pte_enc, qsps->enc[jq].page_shift, in kvm_check_mmu()
422 qsps->page_shift, qsps->enc[jq].pte_enc); in kvm_check_mmu()
432 * platform code. Cache-Inhibited largepages (64k) however are in kvm_check_mmu()
447 return POWERPC_CPU(cpu)->vcpu_id; in kvm_arch_vcpu_id()
471 if (cenv->excp_model == POWERPC_EXCP_BOOKE) { in kvmppc_hw_debug_points_init()
490 CPUPPCState *cenv = &cpu->env; in kvm_arch_init_vcpu()
496 if (ret == -EINVAL) { in kvm_arch_init_vcpu()
497 error_report("Register sync failed... If you're using kvm-hv.ko," in kvm_arch_init_vcpu()
498 " only \"-cpu host\" is possible"); in kvm_arch_init_vcpu()
503 switch (cenv->mmu_model) { in kvm_arch_init_vcpu()
509 if (!cap_htm && !kvmppc_is_pr(cs->kvm_state)) { in kvm_arch_init_vcpu()
511 * KVM-HV has transactional memory on POWER8 also without in kvm_arch_init_vcpu()
538 CPUPPCState *env = &cpu->env; in kvm_sw_tlb_put()
544 if (!env->kvm_sw_tlb) { in kvm_sw_tlb_put()
548 bitmap = g_malloc((env->nb_tlb + 7) / 8); in kvm_sw_tlb_put()
549 memset(bitmap, 0xFF, (env->nb_tlb + 7) / 8); in kvm_sw_tlb_put()
552 dirty_tlb.num_dirty = env->nb_tlb; in kvm_sw_tlb_put()
557 __func__, strerror(-ret)); in kvm_sw_tlb_put()
583 env->spr[spr] = val.u32; in kvm_get_one_spr()
587 env->spr[spr] = val.u64; in kvm_get_one_spr()
612 val.u32 = env->spr[spr]; in kvm_put_one_spr()
616 val.u64 = env->spr[spr]; in kvm_put_one_spr()
637 if (env->insns_flags & PPC_FLOAT) { in kvm_put_fp()
638 uint64_t fpscr = env->fpscr; in kvm_put_fp()
639 bool vsx = !!(env->insns_flags2 & PPC2_VSX); in kvm_put_fp()
673 if (env->insns_flags & PPC_ALTIVEC) { in kvm_put_fp()
675 reg.addr = (uintptr_t)&env->vscr; in kvm_put_fp()
703 if (env->insns_flags & PPC_FLOAT) { in kvm_get_fp()
705 bool vsx = !!(env->insns_flags2 & PPC2_VSX); in kvm_get_fp()
714 env->fpscr = fpscr; in kvm_get_fp()
746 if (env->insns_flags & PPC_ALTIVEC) { in kvm_get_fp()
748 reg.addr = (uintptr_t)&env->vscr; in kvm_get_fp()
778 reg.addr = (uintptr_t)&spapr_cpu->vpa_addr; in kvm_get_vpa()
785 assert((uintptr_t)&spapr_cpu->slb_shadow_size in kvm_get_vpa()
786 == ((uintptr_t)&spapr_cpu->slb_shadow_addr + 8)); in kvm_get_vpa()
788 reg.addr = (uintptr_t)&spapr_cpu->slb_shadow_addr; in kvm_get_vpa()
795 assert((uintptr_t)&spapr_cpu->dtl_size in kvm_get_vpa()
796 == ((uintptr_t)&spapr_cpu->dtl_addr + 8)); in kvm_get_vpa()
798 reg.addr = (uintptr_t)&spapr_cpu->dtl_addr; in kvm_get_vpa()
821 assert(spapr_cpu->vpa_addr in kvm_put_vpa()
822 || !(spapr_cpu->slb_shadow_addr || spapr_cpu->dtl_addr)); in kvm_put_vpa()
824 if (spapr_cpu->vpa_addr) { in kvm_put_vpa()
826 reg.addr = (uintptr_t)&spapr_cpu->vpa_addr; in kvm_put_vpa()
834 assert((uintptr_t)&spapr_cpu->slb_shadow_size in kvm_put_vpa()
835 == ((uintptr_t)&spapr_cpu->slb_shadow_addr + 8)); in kvm_put_vpa()
837 reg.addr = (uintptr_t)&spapr_cpu->slb_shadow_addr; in kvm_put_vpa()
844 assert((uintptr_t)&spapr_cpu->dtl_size in kvm_put_vpa()
845 == ((uintptr_t)&spapr_cpu->dtl_addr + 8)); in kvm_put_vpa()
847 reg.addr = (uintptr_t)&spapr_cpu->dtl_addr; in kvm_put_vpa()
854 if (!spapr_cpu->vpa_addr) { in kvm_put_vpa()
856 reg.addr = (uintptr_t)&spapr_cpu->vpa_addr; in kvm_put_vpa()
870 CPUPPCState *env = &cpu->env; in kvmppc_put_books_sregs()
874 sregs.pvr = env->spr[SPR_PVR]; in kvmppc_put_books_sregs()
876 if (cpu->vhyp) { in kvmppc_put_books_sregs()
877 sregs.u.s.sdr1 = cpu->vhyp_class->encode_hpt_for_kvm_pr(cpu->vhyp); in kvmppc_put_books_sregs()
879 sregs.u.s.sdr1 = env->spr[SPR_SDR1]; in kvmppc_put_books_sregs()
884 for (i = 0; i < ARRAY_SIZE(env->slb); i++) { in kvmppc_put_books_sregs()
885 sregs.u.s.ppc64.slb[i].slbe = env->slb[i].esid; in kvmppc_put_books_sregs()
886 if (env->slb[i].esid & SLB_ESID_V) { in kvmppc_put_books_sregs()
889 sregs.u.s.ppc64.slb[i].slbv = env->slb[i].vsid; in kvmppc_put_books_sregs()
895 sregs.u.s.ppc32.sr[i] = env->sr[i]; in kvmppc_put_books_sregs()
901 sregs.u.s.ppc32.dbat[i] = ((uint64_t)env->DBAT[0][i] << 32) in kvmppc_put_books_sregs()
902 | env->DBAT[1][i]; in kvmppc_put_books_sregs()
903 sregs.u.s.ppc32.ibat[i] = ((uint64_t)env->IBAT[0][i] << 32) in kvmppc_put_books_sregs()
904 | env->IBAT[1][i]; in kvmppc_put_books_sregs()
913 CPUPPCState *env = &cpu->env; in kvm_arch_put_registers()
923 regs.ctr = env->ctr; in kvm_arch_put_registers()
924 regs.lr = env->lr; in kvm_arch_put_registers()
926 regs.msr = env->msr; in kvm_arch_put_registers()
927 regs.pc = env->nip; in kvm_arch_put_registers()
929 regs.srr0 = env->spr[SPR_SRR0]; in kvm_arch_put_registers()
930 regs.srr1 = env->spr[SPR_SRR1]; in kvm_arch_put_registers()
932 regs.sprg0 = env->spr[SPR_SPRG0]; in kvm_arch_put_registers()
933 regs.sprg1 = env->spr[SPR_SPRG1]; in kvm_arch_put_registers()
934 regs.sprg2 = env->spr[SPR_SPRG2]; in kvm_arch_put_registers()
935 regs.sprg3 = env->spr[SPR_SPRG3]; in kvm_arch_put_registers()
936 regs.sprg4 = env->spr[SPR_SPRG4]; in kvm_arch_put_registers()
937 regs.sprg5 = env->spr[SPR_SPRG5]; in kvm_arch_put_registers()
938 regs.sprg6 = env->spr[SPR_SPRG6]; in kvm_arch_put_registers()
939 regs.sprg7 = env->spr[SPR_SPRG7]; in kvm_arch_put_registers()
941 regs.pid = env->spr[SPR_BOOKE_PID]; in kvm_arch_put_registers()
944 regs.gpr[i] = env->gpr[i]; in kvm_arch_put_registers()
956 if (env->tlb_dirty) { in kvm_arch_put_registers()
958 env->tlb_dirty = false; in kvm_arch_put_registers()
980 uint64_t id = env->spr_cb[i].one_reg_id; in kvm_arch_put_registers()
988 if (FIELD_EX64(env->msr, MSR, TS)) { in kvm_arch_put_registers()
989 for (i = 0; i < ARRAY_SIZE(env->tm_gpr); i++) { in kvm_arch_put_registers()
990 kvm_set_one_reg(cs, KVM_REG_PPC_TM_GPR(i), &env->tm_gpr[i]); in kvm_arch_put_registers()
992 for (i = 0; i < ARRAY_SIZE(env->tm_vsr); i++) { in kvm_arch_put_registers()
993 kvm_set_one_reg(cs, KVM_REG_PPC_TM_VSR(i), &env->tm_vsr[i]); in kvm_arch_put_registers()
995 kvm_set_one_reg(cs, KVM_REG_PPC_TM_CR, &env->tm_cr); in kvm_arch_put_registers()
996 kvm_set_one_reg(cs, KVM_REG_PPC_TM_LR, &env->tm_lr); in kvm_arch_put_registers()
997 kvm_set_one_reg(cs, KVM_REG_PPC_TM_CTR, &env->tm_ctr); in kvm_arch_put_registers()
998 kvm_set_one_reg(cs, KVM_REG_PPC_TM_FPSCR, &env->tm_fpscr); in kvm_arch_put_registers()
999 kvm_set_one_reg(cs, KVM_REG_PPC_TM_AMR, &env->tm_amr); in kvm_arch_put_registers()
1000 kvm_set_one_reg(cs, KVM_REG_PPC_TM_PPR, &env->tm_ppr); in kvm_arch_put_registers()
1001 kvm_set_one_reg(cs, KVM_REG_PPC_TM_VRSAVE, &env->tm_vrsave); in kvm_arch_put_registers()
1002 kvm_set_one_reg(cs, KVM_REG_PPC_TM_VSCR, &env->tm_vscr); in kvm_arch_put_registers()
1003 kvm_set_one_reg(cs, KVM_REG_PPC_TM_DSCR, &env->tm_dscr); in kvm_arch_put_registers()
1004 kvm_set_one_reg(cs, KVM_REG_PPC_TM_TAR, &env->tm_tar); in kvm_arch_put_registers()
1013 kvm_set_one_reg(cs, KVM_REG_PPC_TB_OFFSET, &env->tb_env->tb_offset); in kvm_arch_put_registers()
1026 env->excp_vectors[vector] = env->spr[ivor] + env->spr[SPR_BOOKE_IVPR]; in kvm_sync_excp()
1031 CPUPPCState *env = &cpu->env; in kvmppc_get_booke_sregs()
1041 env->spr[SPR_BOOKE_CSRR0] = sregs.u.e.csrr0; in kvmppc_get_booke_sregs()
1042 env->spr[SPR_BOOKE_CSRR1] = sregs.u.e.csrr1; in kvmppc_get_booke_sregs()
1043 env->spr[SPR_BOOKE_ESR] = sregs.u.e.esr; in kvmppc_get_booke_sregs()
1044 env->spr[SPR_BOOKE_DEAR] = sregs.u.e.dear; in kvmppc_get_booke_sregs()
1045 env->spr[SPR_BOOKE_MCSR] = sregs.u.e.mcsr; in kvmppc_get_booke_sregs()
1046 env->spr[SPR_BOOKE_TSR] = sregs.u.e.tsr; in kvmppc_get_booke_sregs()
1047 env->spr[SPR_BOOKE_TCR] = sregs.u.e.tcr; in kvmppc_get_booke_sregs()
1048 env->spr[SPR_DECR] = sregs.u.e.dec; in kvmppc_get_booke_sregs()
1049 env->spr[SPR_TBL] = sregs.u.e.tb & 0xffffffff; in kvmppc_get_booke_sregs()
1050 env->spr[SPR_TBU] = sregs.u.e.tb >> 32; in kvmppc_get_booke_sregs()
1051 env->spr[SPR_VRSAVE] = sregs.u.e.vrsave; in kvmppc_get_booke_sregs()
1055 env->spr[SPR_BOOKE_PIR] = sregs.u.e.pir; in kvmppc_get_booke_sregs()
1056 env->spr[SPR_BOOKE_MCSRR0] = sregs.u.e.mcsrr0; in kvmppc_get_booke_sregs()
1057 env->spr[SPR_BOOKE_MCSRR1] = sregs.u.e.mcsrr1; in kvmppc_get_booke_sregs()
1058 env->spr[SPR_BOOKE_DECAR] = sregs.u.e.decar; in kvmppc_get_booke_sregs()
1059 env->spr[SPR_BOOKE_IVPR] = sregs.u.e.ivpr; in kvmppc_get_booke_sregs()
1063 env->spr[SPR_BOOKE_EPCR] = sregs.u.e.epcr; in kvmppc_get_booke_sregs()
1067 env->spr[SPR_BOOKE_SPRG8] = sregs.u.e.sprg8; in kvmppc_get_booke_sregs()
1071 env->spr[SPR_BOOKE_IVOR0] = sregs.u.e.ivor_low[0]; in kvmppc_get_booke_sregs()
1073 env->spr[SPR_BOOKE_IVOR1] = sregs.u.e.ivor_low[1]; in kvmppc_get_booke_sregs()
1075 env->spr[SPR_BOOKE_IVOR2] = sregs.u.e.ivor_low[2]; in kvmppc_get_booke_sregs()
1077 env->spr[SPR_BOOKE_IVOR3] = sregs.u.e.ivor_low[3]; in kvmppc_get_booke_sregs()
1079 env->spr[SPR_BOOKE_IVOR4] = sregs.u.e.ivor_low[4]; in kvmppc_get_booke_sregs()
1081 env->spr[SPR_BOOKE_IVOR5] = sregs.u.e.ivor_low[5]; in kvmppc_get_booke_sregs()
1083 env->spr[SPR_BOOKE_IVOR6] = sregs.u.e.ivor_low[6]; in kvmppc_get_booke_sregs()
1085 env->spr[SPR_BOOKE_IVOR7] = sregs.u.e.ivor_low[7]; in kvmppc_get_booke_sregs()
1087 env->spr[SPR_BOOKE_IVOR8] = sregs.u.e.ivor_low[8]; in kvmppc_get_booke_sregs()
1089 env->spr[SPR_BOOKE_IVOR9] = sregs.u.e.ivor_low[9]; in kvmppc_get_booke_sregs()
1091 env->spr[SPR_BOOKE_IVOR10] = sregs.u.e.ivor_low[10]; in kvmppc_get_booke_sregs()
1093 env->spr[SPR_BOOKE_IVOR11] = sregs.u.e.ivor_low[11]; in kvmppc_get_booke_sregs()
1095 env->spr[SPR_BOOKE_IVOR12] = sregs.u.e.ivor_low[12]; in kvmppc_get_booke_sregs()
1097 env->spr[SPR_BOOKE_IVOR13] = sregs.u.e.ivor_low[13]; in kvmppc_get_booke_sregs()
1099 env->spr[SPR_BOOKE_IVOR14] = sregs.u.e.ivor_low[14]; in kvmppc_get_booke_sregs()
1101 env->spr[SPR_BOOKE_IVOR15] = sregs.u.e.ivor_low[15]; in kvmppc_get_booke_sregs()
1105 env->spr[SPR_BOOKE_IVOR32] = sregs.u.e.ivor_high[0]; in kvmppc_get_booke_sregs()
1107 env->spr[SPR_BOOKE_IVOR33] = sregs.u.e.ivor_high[1]; in kvmppc_get_booke_sregs()
1109 env->spr[SPR_BOOKE_IVOR34] = sregs.u.e.ivor_high[2]; in kvmppc_get_booke_sregs()
1114 env->spr[SPR_BOOKE_IVOR35] = sregs.u.e.ivor_high[3]; in kvmppc_get_booke_sregs()
1119 env->spr[SPR_BOOKE_IVOR36] = sregs.u.e.ivor_high[4]; in kvmppc_get_booke_sregs()
1121 env->spr[SPR_BOOKE_IVOR37] = sregs.u.e.ivor_high[5]; in kvmppc_get_booke_sregs()
1127 env->spr[SPR_BOOKE_MAS0] = sregs.u.e.mas0; in kvmppc_get_booke_sregs()
1128 env->spr[SPR_BOOKE_MAS1] = sregs.u.e.mas1; in kvmppc_get_booke_sregs()
1129 env->spr[SPR_BOOKE_MAS2] = sregs.u.e.mas2; in kvmppc_get_booke_sregs()
1130 env->spr[SPR_BOOKE_MAS3] = sregs.u.e.mas7_3 & 0xffffffff; in kvmppc_get_booke_sregs()
1131 env->spr[SPR_BOOKE_MAS4] = sregs.u.e.mas4; in kvmppc_get_booke_sregs()
1132 env->spr[SPR_BOOKE_MAS6] = sregs.u.e.mas6; in kvmppc_get_booke_sregs()
1133 env->spr[SPR_BOOKE_MAS7] = sregs.u.e.mas7_3 >> 32; in kvmppc_get_booke_sregs()
1134 env->spr[SPR_MMUCFG] = sregs.u.e.mmucfg; in kvmppc_get_booke_sregs()
1135 env->spr[SPR_BOOKE_TLB0CFG] = sregs.u.e.tlbcfg[0]; in kvmppc_get_booke_sregs()
1136 env->spr[SPR_BOOKE_TLB1CFG] = sregs.u.e.tlbcfg[1]; in kvmppc_get_booke_sregs()
1140 env->spr[SPR_BOOKE_EPR] = sregs.u.e.epr; in kvmppc_get_booke_sregs()
1144 env->spr[SPR_BOOKE_EPLC] = sregs.u.e.eplc; in kvmppc_get_booke_sregs()
1145 env->spr[SPR_BOOKE_EPSC] = sregs.u.e.epsc; in kvmppc_get_booke_sregs()
1149 env->spr[SPR_E500_SVR] = sregs.u.e.impl.fsl.svr; in kvmppc_get_booke_sregs()
1150 env->spr[SPR_Exxx_MCAR] = sregs.u.e.impl.fsl.mcar; in kvmppc_get_booke_sregs()
1151 env->spr[SPR_HID0] = sregs.u.e.impl.fsl.hid0; in kvmppc_get_booke_sregs()
1154 env->spr[SPR_BOOKE_PID1] = sregs.u.e.impl.fsl.pid1; in kvmppc_get_booke_sregs()
1155 env->spr[SPR_BOOKE_PID2] = sregs.u.e.impl.fsl.pid2; in kvmppc_get_booke_sregs()
1164 CPUPPCState *env = &cpu->env; in kvmppc_get_books_sregs()
1174 if (!cpu->vhyp) { in kvmppc_get_books_sregs()
1186 memset(env->slb, 0, sizeof(env->slb)); in kvmppc_get_books_sregs()
1187 for (i = 0; i < ARRAY_SIZE(env->slb); i++) { in kvmppc_get_books_sregs()
1201 env->sr[i] = sregs.u.s.ppc32.sr[i]; in kvmppc_get_books_sregs()
1206 env->DBAT[0][i] = sregs.u.s.ppc32.dbat[i] & 0xffffffff; in kvmppc_get_books_sregs()
1207 env->DBAT[1][i] = sregs.u.s.ppc32.dbat[i] >> 32; in kvmppc_get_books_sregs()
1208 env->IBAT[0][i] = sregs.u.s.ppc32.ibat[i] & 0xffffffff; in kvmppc_get_books_sregs()
1209 env->IBAT[1][i] = sregs.u.s.ppc32.ibat[i] >> 32; in kvmppc_get_books_sregs()
1218 CPUPPCState *env = &cpu->env; in kvm_arch_get_registers()
1228 env->ctr = regs.ctr; in kvm_arch_get_registers()
1229 env->lr = regs.lr; in kvm_arch_get_registers()
1231 env->msr = regs.msr; in kvm_arch_get_registers()
1232 env->nip = regs.pc; in kvm_arch_get_registers()
1234 env->spr[SPR_SRR0] = regs.srr0; in kvm_arch_get_registers()
1235 env->spr[SPR_SRR1] = regs.srr1; in kvm_arch_get_registers()
1237 env->spr[SPR_SPRG0] = regs.sprg0; in kvm_arch_get_registers()
1238 env->spr[SPR_SPRG1] = regs.sprg1; in kvm_arch_get_registers()
1239 env->spr[SPR_SPRG2] = regs.sprg2; in kvm_arch_get_registers()
1240 env->spr[SPR_SPRG3] = regs.sprg3; in kvm_arch_get_registers()
1241 env->spr[SPR_SPRG4] = regs.sprg4; in kvm_arch_get_registers()
1242 env->spr[SPR_SPRG5] = regs.sprg5; in kvm_arch_get_registers()
1243 env->spr[SPR_SPRG6] = regs.sprg6; in kvm_arch_get_registers()
1244 env->spr[SPR_SPRG7] = regs.sprg7; in kvm_arch_get_registers()
1246 env->spr[SPR_BOOKE_PID] = regs.pid; in kvm_arch_get_registers()
1249 env->gpr[i] = regs.gpr[i]; in kvm_arch_get_registers()
1280 uint64_t id = env->spr_cb[i].one_reg_id; in kvm_arch_get_registers()
1288 if (FIELD_EX64(env->msr, MSR, TS)) { in kvm_arch_get_registers()
1289 for (i = 0; i < ARRAY_SIZE(env->tm_gpr); i++) { in kvm_arch_get_registers()
1290 kvm_get_one_reg(cs, KVM_REG_PPC_TM_GPR(i), &env->tm_gpr[i]); in kvm_arch_get_registers()
1292 for (i = 0; i < ARRAY_SIZE(env->tm_vsr); i++) { in kvm_arch_get_registers()
1293 kvm_get_one_reg(cs, KVM_REG_PPC_TM_VSR(i), &env->tm_vsr[i]); in kvm_arch_get_registers()
1295 kvm_get_one_reg(cs, KVM_REG_PPC_TM_CR, &env->tm_cr); in kvm_arch_get_registers()
1296 kvm_get_one_reg(cs, KVM_REG_PPC_TM_LR, &env->tm_lr); in kvm_arch_get_registers()
1297 kvm_get_one_reg(cs, KVM_REG_PPC_TM_CTR, &env->tm_ctr); in kvm_arch_get_registers()
1298 kvm_get_one_reg(cs, KVM_REG_PPC_TM_FPSCR, &env->tm_fpscr); in kvm_arch_get_registers()
1299 kvm_get_one_reg(cs, KVM_REG_PPC_TM_AMR, &env->tm_amr); in kvm_arch_get_registers()
1300 kvm_get_one_reg(cs, KVM_REG_PPC_TM_PPR, &env->tm_ppr); in kvm_arch_get_registers()
1301 kvm_get_one_reg(cs, KVM_REG_PPC_TM_VRSAVE, &env->tm_vrsave); in kvm_arch_get_registers()
1302 kvm_get_one_reg(cs, KVM_REG_PPC_TM_VSCR, &env->tm_vscr); in kvm_arch_get_registers()
1303 kvm_get_one_reg(cs, KVM_REG_PPC_TM_DSCR, &env->tm_dscr); in kvm_arch_get_registers()
1304 kvm_get_one_reg(cs, KVM_REG_PPC_TM_TAR, &env->tm_tar); in kvm_arch_get_registers()
1313 kvm_get_one_reg(cs, KVM_REG_PPC_TB_OFFSET, &env->tb_env->tb_offset); in kvm_arch_get_registers()
1349 return cs->halted; in kvm_arch_process_async_events()
1355 CPUPPCState *env = &cpu->env; in kvmppc_handle_halt()
1357 if (!(cs->interrupt_request & CPU_INTERRUPT_HARD) && in kvmppc_handle_halt()
1358 FIELD_EX64(env->msr, MSR, EE)) { in kvmppc_handle_halt()
1359 cs->halted = 1; in kvmppc_handle_halt()
1360 cs->exception_index = EXCP_HLT; in kvmppc_handle_halt()
1370 if (ppc_dcr_read(env->dcr_env, dcrn, data) < 0) { in kvmppc_handle_dcr_read()
1380 if (ppc_dcr_write(env->dcr_env, dcrn, data) < 0) { in kvmppc_handle_dcr_write()
1392 if (cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&bp->saved_insn, in kvm_arch_insert_sw_breakpoint()
1394 cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&sc, sizeof(sc), 1)) { in kvm_arch_insert_sw_breakpoint()
1395 return -EINVAL; in kvm_arch_insert_sw_breakpoint()
1405 if (cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&sc, sizeof(sc), 0) || in kvm_arch_remove_sw_breakpoint()
1407 cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&bp->saved_insn, in kvm_arch_remove_sw_breakpoint()
1409 return -EINVAL; in kvm_arch_remove_sw_breakpoint()
1429 return -1; in find_hw_breakpoint()
1454 return -1; in find_hw_watchpoint()
1461 return -ENOBUFS; in kvm_arch_insert_hw_breakpoint()
1470 return -ENOBUFS; in kvm_arch_insert_hw_breakpoint()
1474 return -EEXIST; in kvm_arch_insert_hw_breakpoint()
1484 return -ENOBUFS; in kvm_arch_insert_hw_breakpoint()
1488 return -EEXIST; in kvm_arch_insert_hw_breakpoint()
1495 return -ENOSYS; in kvm_arch_insert_hw_breakpoint()
1507 return -ENOENT; in kvm_arch_remove_hw_breakpoint()
1512 nb_hw_breakpoint--; in kvm_arch_remove_hw_breakpoint()
1518 nb_hw_watchpoint--; in kvm_arch_remove_hw_breakpoint()
1522 return -ENOSYS; in kvm_arch_remove_hw_breakpoint()
1540 dbg->control |= KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_USE_SW_BP; in kvm_arch_update_guest_debug()
1545 assert((nb_hw_breakpoint + nb_hw_watchpoint) <= ARRAY_SIZE(dbg->arch.bp)); in kvm_arch_update_guest_debug()
1548 dbg->control |= KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_USE_HW_BP; in kvm_arch_update_guest_debug()
1549 memset(dbg->arch.bp, 0, sizeof(dbg->arch.bp)); in kvm_arch_update_guest_debug()
1553 dbg->arch.bp[n].type = KVMPPC_DEBUG_BREAKPOINT; in kvm_arch_update_guest_debug()
1556 dbg->arch.bp[n].type = KVMPPC_DEBUG_WATCH_WRITE; in kvm_arch_update_guest_debug()
1559 dbg->arch.bp[n].type = KVMPPC_DEBUG_WATCH_READ; in kvm_arch_update_guest_debug()
1562 dbg->arch.bp[n].type = KVMPPC_DEBUG_WATCH_WRITE | in kvm_arch_update_guest_debug()
1568 dbg->arch.bp[n].addr = hw_debug_points[n].addr; in kvm_arch_update_guest_debug()
1581 if (arch_info->status & KVMPPC_DEBUG_BREAKPOINT) { in kvm_handle_hw_breakpoint()
1582 n = find_hw_breakpoint(arch_info->address, GDB_BREAKPOINT_HW); in kvm_handle_hw_breakpoint()
1586 } else if (arch_info->status & (KVMPPC_DEBUG_WATCH_READ | in kvm_handle_hw_breakpoint()
1588 n = find_hw_watchpoint(arch_info->address, &flag); in kvm_handle_hw_breakpoint()
1591 cs->watchpoint_hit = &hw_watchpoint; in kvm_handle_hw_breakpoint()
1613 CPUPPCState *env = &cpu->env; in kvm_handle_debug()
1614 struct kvm_debug_exit_arch *arch_info = &run->debug.arch; in kvm_handle_debug()
1616 if (cs->singlestep_enabled) { in kvm_handle_debug()
1620 if (arch_info->status) { in kvm_handle_debug()
1624 if (kvm_find_sw_breakpoint(cs, arch_info->address)) { in kvm_handle_debug()
1651 * env->nip is PC, so increment this by 4 to use in kvm_handle_debug()
1652 * ppc_cpu_do_interrupt(), which set srr0 = env->nip - 4. in kvm_handle_debug()
1654 env->nip += 4; in kvm_handle_debug()
1655 cs->exception_index = POWERPC_EXCP_PROGRAM; in kvm_handle_debug()
1656 env->error_code = POWERPC_EXCP_INVAL; in kvm_handle_debug()
1665 CPUPPCState *env = &cpu->env; in kvm_arch_handle_exit()
1670 switch (run->exit_reason) { in kvm_arch_handle_exit()
1672 if (run->dcr.is_write) { in kvm_arch_handle_exit()
1674 ret = kvmppc_handle_dcr_write(env, run->dcr.dcrn, run->dcr.data); in kvm_arch_handle_exit()
1677 ret = kvmppc_handle_dcr_read(env, run->dcr.dcrn, &run->dcr.data); in kvm_arch_handle_exit()
1686 trace_kvm_handle_papr_hcall(run->papr_hcall.nr); in kvm_arch_handle_exit()
1687 run->papr_hcall.ret = spapr_hypercall(cpu, in kvm_arch_handle_exit()
1688 run->papr_hcall.nr, in kvm_arch_handle_exit()
1689 run->papr_hcall.args); in kvm_arch_handle_exit()
1695 run->epr.epr = ldl_phys(cs->as, env->mpic_iack); in kvm_arch_handle_exit()
1710 /* re-enter, this exception was guest-internal */ in kvm_arch_handle_exit()
1722 fprintf(stderr, "KVM: unknown exit reason %d\n", run->exit_reason); in kvm_arch_handle_exit()
1723 ret = -1; in kvm_arch_handle_exit()
1767 CPUPPCState *env = &cpu->env; in kvmppc_set_tcr()
1768 uint32_t tcr = env->spr[SPR_BOOKE_TCR]; in kvmppc_set_tcr()
1788 return -1; in kvmppc_booke_watchdog_enable()
1793 return -1; in kvmppc_booke_watchdog_enable()
1799 __func__, strerror(-ret)); in kvmppc_booke_watchdog_enable()
1809 int ret = -1; in read_cpuinfo()
1815 return -1; in read_cpuinfo()
1869 return g_file_get_contents("/proc/device-tree/system-id", value, NULL, in kvmppc_get_host_serial()
1875 return g_file_get_contents("/proc/device-tree/model", value, NULL, NULL); in kvmppc_get_host_model()
1878 /* Try to find a device tree node for a CPU with clock-frequency property */
1887 return -1; in kvmppc_find_cpu_dt()
1895 if (strcmp(dirp->d_name, ".") == 0 || strcmp(dirp->d_name, "..") == 0) { in kvmppc_find_cpu_dt()
1899 snprintf(buf, buf_len, "%s%s/clock-frequency", PROC_DEVTREE_CPU, in kvmppc_find_cpu_dt()
1900 dirp->d_name); in kvmppc_find_cpu_dt()
1903 snprintf(buf, buf_len, "%s%s", PROC_DEVTREE_CPU, dirp->d_name); in kvmppc_find_cpu_dt()
1912 return -1; in kvmppc_find_cpu_dt()
1929 return -1; in kvmppc_read_int_dt()
1936 /* property is a 32-bit quantity */ in kvmppc_read_int_dt()
1947 * integer (32-bit or 64-bit). Returns 0 if anything goes wrong
1956 return -1; in kvmppc_read_int_cpu_dt()
1968 return kvmppc_read_int_cpu_dt("clock-frequency"); in kvmppc_get_clockfreq()
1973 int nr_bits = kvmppc_read_int_cpu_dt("ibm,dec-bits"); in kvmppc_get_dec_bits()
1985 if (kvm_vm_check_extension(cs->kvm_state, KVM_CAP_PPC_GET_PVINFO) && in kvmppc_get_pvinfo()
1986 !kvm_vm_ioctl(cs->kvm_state, KVM_PPC_GET_PVINFO, pvinfo)) { in kvmppc_get_pvinfo()
2019 * li r3, -1 in kvmppc_get_hypercall()
2021 * bswap32(li r3, -1) in kvmppc_get_hypercall()
2158 for (i = 63; i >= 0; i--) { in kvmppc_error_append_smt_possible_hint()
2191 if (!sps->page_shift) { in kvmppc_vrma_limit()
2195 if ((sps->page_shift > best_page_shift) in kvmppc_vrma_limit()
2196 && ((1UL << sps->page_shift) <= rampagesize)) { in kvmppc_vrma_limit()
2197 best_page_shift = sps->page_shift; in kvmppc_vrma_limit()
2201 return 1ULL << (best_page_shift + hash_shift - 7); in kvmppc_vrma_limit()
2233 * Must set fd to -1 so we don't try to munmap when called for in kvmppc_create_spapr_tce()
2234 * destroying the table, which the upper layers -will- do in kvmppc_create_spapr_tce()
2236 *pfd = -1; in kvmppc_create_spapr_tce()
2282 close(fd); in kvmppc_create_spapr_tce()
2295 return -1; in kvmppc_remove_spapr_tce()
2300 (close(fd) < 0)) { in kvmppc_remove_spapr_tce()
2320 if (ret == -ENOTTY) { in kvmppc_reset_htab()
2322 * At least some versions of PR KVM advertise the in kvmppc_reset_htab()
2325 * correct for PR. in kvmppc_reset_htab()
2335 * We have a kernel that predates the htab reset calls. For PR in kvmppc_reset_htab()
2341 /* PR - tell caller to allocate htab */ in kvmppc_reset_htab()
2344 /* HV - assume 16MB kernel allocated htab */ in kvmppc_reset_htab()
2370 const char *vcpu_str = (cs->parent_obj.hotplugged == true) ? in kvmppc_cpu_realize()
2372 cs->cpu_index = cpu_get_free_index(); in kvmppc_cpu_realize()
2374 POWERPC_CPU(cs)->vcpu_id = cs->cpu_index; in kvmppc_cpu_realize()
2394 uint32_t dcache_size = kvmppc_read_int_cpu_dt("d-cache-size"); in kvmppc_host_cpu_class_init()
2395 uint32_t icache_size = kvmppc_read_int_cpu_dt("i-cache-size"); in kvmppc_host_cpu_class_init()
2398 pcc->pvr = mfpvr(); in kvmppc_host_cpu_class_init()
2400 alter_insns(&pcc->insns_flags, PPC_ALTIVEC, in kvmppc_host_cpu_class_init()
2402 alter_insns(&pcc->insns_flags2, PPC2_VSX, in kvmppc_host_cpu_class_init()
2404 alter_insns(&pcc->insns_flags2, PPC2_DFP, in kvmppc_host_cpu_class_init()
2407 if (dcache_size != -1) { in kvmppc_host_cpu_class_init()
2408 pcc->l1_dcache_size = dcache_size; in kvmppc_host_cpu_class_init()
2411 if (icache_size != -1) { in kvmppc_host_cpu_class_init()
2412 pcc->l1_icache_size = icache_size; in kvmppc_host_cpu_class_init()
2416 pcc->radix_page_info = kvmppc_get_radix_page_info(); in kvmppc_host_cpu_class_init()
2599 return -1; in kvmppc_enable_cap_large_decr()
2633 mc->default_cpu_type = TYPE_HOST_POWERPC_CPU; in pseries_machine_class_fixup()
2649 return -1; in kvm_ppc_register_host_cpu_type()
2667 if (strcasecmp(ppc_cpu_aliases[i].alias, dc->desc) == 0) { in kvm_ppc_register_host_cpu_type()
2689 return -ENOENT; in kvmppc_define_rtas_kernel_token()
2692 strncpy(args.name, function, sizeof(args.name) - 1); in kvmppc_define_rtas_kernel_token()
2708 return -ENOTSUP; in kvmppc_get_htab_fd()
2716 return -errno; in kvmppc_get_htab_fd()
2741 HASH_PTE_SIZE_64 * head->n_valid; in kvmppc_save_htab()
2743 qemu_put_be32(f, head->index); in kvmppc_save_htab()
2744 qemu_put_be16(f, head->n_valid); in kvmppc_save_htab()
2745 qemu_put_be16(f, head->n_invalid); in kvmppc_save_htab()
2747 HASH_PTE_SIZE_64 * head->n_valid); in kvmppc_save_htab()
2750 n -= chunksize; in kvmppc_save_htab()
2755 ((qemu_clock_get_ns(QEMU_CLOCK_REALTIME) - starttime) < max_ns))); in kvmppc_save_htab()
2768 buf->index = index; in kvmppc_load_htab_chunk()
2769 buf->n_valid = n_valid; in kvmppc_load_htab_chunk()
2770 buf->n_invalid = n_invalid; in kvmppc_load_htab_chunk()
2777 return -errno; in kvmppc_load_htab_chunk()
2782 return -ENOSPC; in kvmppc_load_htab_chunk()
2816 int invalid = hdr->n_invalid, valid = hdr->n_valid; in kvmppc_read_hptes()
2818 if (hdr->index != (ptex + i)) { in kvmppc_read_hptes()
2820 " != (%"HWADDR_PRIu" + %d", hdr->index, ptex, i); in kvmppc_read_hptes()
2823 if (n - i < valid) { in kvmppc_read_hptes()
2824 valid = n - i; in kvmppc_read_hptes()
2829 if ((n - i) < invalid) { in kvmppc_read_hptes()
2830 invalid = n - i; in kvmppc_read_hptes()
2836 ((char *)(hdr + 1) + HASH_PTE_SIZE_64 * hdr->n_valid); in kvmppc_read_hptes()
2840 close(fd); in kvmppc_read_hptes()
2864 close(fd); in kvmppc_write_hpte()
2892 uint16_t flags = run->flags & KVM_RUN_PPC_NMI_DISP_MASK; in kvm_handle_nmi()
2905 return -1; in kvmppc_enable_hwrng()
2921 /* Otherwise fallback on looking for PR KVM */ in kvmppc_check_papr_resize_hpt()
2939 return -ENOSYS; in kvmppc_resize_hpt_prepare()
2942 return kvm_vm_ioctl(cs->kvm_state, KVM_PPC_RESIZE_HPT_PREPARE, &rhpt); in kvmppc_resize_hpt_prepare()
2954 return -ENOSYS; in kvmppc_resize_hpt_commit()
2957 return kvm_vm_ioctl(cs->kvm_state, KVM_PPC_RESIZE_HPT_COMMIT, &rhpt); in kvmppc_resize_hpt_commit()
2962 * in which a guest, running as KVM-HV, freezes in cpu_post_load because
2966 * If we don't have cap_ppc_pvr_compat and we're not running in PR
2970 * The order here is important: we'll only check for KVM PR as a
2987 return !kvmppc_is_pr(cs->kvm_state); in kvmppc_pvr_workaround_required()
3016 acc->cpu_target_realize = kvmppc_cpu_realize; in kvm_cpu_accel_class_init()