101235180SAlexander Graf /* 201235180SAlexander Graf * This program is free software; you can redistribute it and/or modify 301235180SAlexander Graf * it under the terms of the GNU General Public License, version 2, as 401235180SAlexander Graf * published by the Free Software Foundation. 501235180SAlexander Graf * 601235180SAlexander Graf * This program is distributed in the hope that it will be useful, 701235180SAlexander Graf * but WITHOUT ANY WARRANTY; without even the implied warranty of 801235180SAlexander Graf * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 901235180SAlexander Graf * GNU General Public License for more details. 1001235180SAlexander Graf * 1101235180SAlexander Graf * You should have received a copy of the GNU General Public License 1201235180SAlexander Graf * along with this program; if not, write to the Free Software 1301235180SAlexander Graf * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 1401235180SAlexander Graf * 1501235180SAlexander Graf * Copyright SUSE Linux Products GmbH 2009 1601235180SAlexander Graf * 1701235180SAlexander Graf * Authors: Alexander Graf <agraf@suse.de> 1801235180SAlexander Graf */ 1901235180SAlexander Graf 2001235180SAlexander Graf #include <linux/types.h> 2101235180SAlexander Graf #include <linux/string.h> 2201235180SAlexander Graf #include <linux/kvm.h> 2301235180SAlexander Graf #include <linux/kvm_host.h> 2401235180SAlexander Graf #include <linux/highmem.h> 2501235180SAlexander Graf 2601235180SAlexander Graf #include <asm/tlbflush.h> 2701235180SAlexander Graf #include <asm/kvm_ppc.h> 2801235180SAlexander Graf #include <asm/kvm_book3s.h> 2901235180SAlexander Graf 3001235180SAlexander Graf /* #define DEBUG_MMU */ 3101235180SAlexander Graf /* #define DEBUG_MMU_PTE */ 3201235180SAlexander Graf /* #define DEBUG_MMU_PTE_IP 0xfff14c40 */ 3301235180SAlexander Graf 3401235180SAlexander Graf #ifdef DEBUG_MMU 3501235180SAlexander Graf #define dprintk(X...) printk(KERN_INFO X) 3601235180SAlexander Graf #else 3701235180SAlexander Graf #define dprintk(X...) do { } while(0) 3801235180SAlexander Graf #endif 3901235180SAlexander Graf 40e425a6deSAlexander Graf #ifdef DEBUG_MMU_PTE 4101235180SAlexander Graf #define dprintk_pte(X...) printk(KERN_INFO X) 4201235180SAlexander Graf #else 4301235180SAlexander Graf #define dprintk_pte(X...) do { } while(0) 4401235180SAlexander Graf #endif 4501235180SAlexander Graf 4601235180SAlexander Graf #define PTEG_FLAG_ACCESSED 0x00000100 4701235180SAlexander Graf #define PTEG_FLAG_DIRTY 0x00000080 4807b0907dSAlexander Graf #ifndef SID_SHIFT 4907b0907dSAlexander Graf #define SID_SHIFT 28 5007b0907dSAlexander Graf #endif 5101235180SAlexander Graf 5201235180SAlexander Graf static inline bool check_debug_ip(struct kvm_vcpu *vcpu) 5301235180SAlexander Graf { 5401235180SAlexander Graf #ifdef DEBUG_MMU_PTE_IP 5501235180SAlexander Graf return vcpu->arch.pc == DEBUG_MMU_PTE_IP; 5601235180SAlexander Graf #else 5701235180SAlexander Graf return true; 5801235180SAlexander Graf #endif 5901235180SAlexander Graf } 6001235180SAlexander Graf 618e865178SAlexander Graf static inline u32 sr_vsid(u32 sr_raw) 628e865178SAlexander Graf { 638e865178SAlexander Graf return sr_raw & 0x0fffffff; 648e865178SAlexander Graf } 658e865178SAlexander Graf 668e865178SAlexander Graf static inline bool sr_valid(u32 sr_raw) 678e865178SAlexander Graf { 688e865178SAlexander Graf return (sr_raw & 0x80000000) ? false : true; 698e865178SAlexander Graf } 708e865178SAlexander Graf 718e865178SAlexander Graf static inline bool sr_ks(u32 sr_raw) 728e865178SAlexander Graf { 738e865178SAlexander Graf return (sr_raw & 0x40000000) ? true: false; 748e865178SAlexander Graf } 758e865178SAlexander Graf 768e865178SAlexander Graf static inline bool sr_kp(u32 sr_raw) 778e865178SAlexander Graf { 788e865178SAlexander Graf return (sr_raw & 0x20000000) ? true: false; 798e865178SAlexander Graf } 808e865178SAlexander Graf 818e865178SAlexander Graf static inline bool sr_nx(u32 sr_raw) 828e865178SAlexander Graf { 838e865178SAlexander Graf return (sr_raw & 0x10000000) ? true: false; 848e865178SAlexander Graf } 858e865178SAlexander Graf 8601235180SAlexander Graf static int kvmppc_mmu_book3s_32_xlate_bat(struct kvm_vcpu *vcpu, gva_t eaddr, 8701235180SAlexander Graf struct kvmppc_pte *pte, bool data); 88af7b4d10SAlexander Graf static int kvmppc_mmu_book3s_32_esid_to_vsid(struct kvm_vcpu *vcpu, ulong esid, 894b389ca2SAlexander Graf u64 *vsid); 9001235180SAlexander Graf 91df1bfa25SAlexander Graf static u32 find_sr(struct kvm_vcpu *vcpu, gva_t eaddr) 9201235180SAlexander Graf { 93df1bfa25SAlexander Graf return vcpu->arch.shared->sr[(eaddr >> 28) & 0xf]; 9401235180SAlexander Graf } 9501235180SAlexander Graf 9601235180SAlexander Graf static u64 kvmppc_mmu_book3s_32_ea_to_vp(struct kvm_vcpu *vcpu, gva_t eaddr, 9701235180SAlexander Graf bool data) 9801235180SAlexander Graf { 994b389ca2SAlexander Graf u64 vsid; 10001235180SAlexander Graf struct kvmppc_pte pte; 10101235180SAlexander Graf 10201235180SAlexander Graf if (!kvmppc_mmu_book3s_32_xlate_bat(vcpu, eaddr, &pte, data)) 10301235180SAlexander Graf return pte.vpage; 10401235180SAlexander Graf 1054b389ca2SAlexander Graf kvmppc_mmu_book3s_32_esid_to_vsid(vcpu, eaddr >> SID_SHIFT, &vsid); 1064b389ca2SAlexander Graf return (((u64)eaddr >> 12) & 0xffff) | (vsid << 16); 10701235180SAlexander Graf } 10801235180SAlexander Graf 10901235180SAlexander Graf static void kvmppc_mmu_book3s_32_reset_msr(struct kvm_vcpu *vcpu) 11001235180SAlexander Graf { 11101235180SAlexander Graf kvmppc_set_msr(vcpu, 0); 11201235180SAlexander Graf } 11301235180SAlexander Graf 11401235180SAlexander Graf static hva_t kvmppc_mmu_book3s_32_get_pteg(struct kvmppc_vcpu_book3s *vcpu_book3s, 1158e865178SAlexander Graf u32 sre, gva_t eaddr, 11601235180SAlexander Graf bool primary) 11701235180SAlexander Graf { 11801235180SAlexander Graf u32 page, hash, pteg, htabmask; 11901235180SAlexander Graf hva_t r; 12001235180SAlexander Graf 12101235180SAlexander Graf page = (eaddr & 0x0FFFFFFF) >> 12; 12201235180SAlexander Graf htabmask = ((vcpu_book3s->sdr1 & 0x1FF) << 16) | 0xFFC0; 12301235180SAlexander Graf 1248e865178SAlexander Graf hash = ((sr_vsid(sre) ^ page) << 6); 12501235180SAlexander Graf if (!primary) 12601235180SAlexander Graf hash = ~hash; 12701235180SAlexander Graf hash &= htabmask; 12801235180SAlexander Graf 12901235180SAlexander Graf pteg = (vcpu_book3s->sdr1 & 0xffff0000) | hash; 13001235180SAlexander Graf 13101235180SAlexander Graf dprintk("MMU: pc=0x%lx eaddr=0x%lx sdr1=0x%llx pteg=0x%x vsid=0x%x\n", 13253021042SAlexander Graf kvmppc_get_pc(&vcpu_book3s->vcpu), eaddr, vcpu_book3s->sdr1, pteg, 1338e865178SAlexander Graf sr_vsid(sre)); 13401235180SAlexander Graf 13501235180SAlexander Graf r = gfn_to_hva(vcpu_book3s->vcpu.kvm, pteg >> PAGE_SHIFT); 13601235180SAlexander Graf if (kvm_is_error_hva(r)) 13701235180SAlexander Graf return r; 13801235180SAlexander Graf return r | (pteg & ~PAGE_MASK); 13901235180SAlexander Graf } 14001235180SAlexander Graf 1418e865178SAlexander Graf static u32 kvmppc_mmu_book3s_32_get_ptem(u32 sre, gva_t eaddr, bool primary) 14201235180SAlexander Graf { 1438e865178SAlexander Graf return ((eaddr & 0x0fffffff) >> 22) | (sr_vsid(sre) << 7) | 14401235180SAlexander Graf (primary ? 0 : 0x40) | 0x80000000; 14501235180SAlexander Graf } 14601235180SAlexander Graf 14701235180SAlexander Graf static int kvmppc_mmu_book3s_32_xlate_bat(struct kvm_vcpu *vcpu, gva_t eaddr, 14801235180SAlexander Graf struct kvmppc_pte *pte, bool data) 14901235180SAlexander Graf { 15001235180SAlexander Graf struct kvmppc_vcpu_book3s *vcpu_book3s = to_book3s(vcpu); 15101235180SAlexander Graf struct kvmppc_bat *bat; 15201235180SAlexander Graf int i; 15301235180SAlexander Graf 15401235180SAlexander Graf for (i = 0; i < 8; i++) { 15501235180SAlexander Graf if (data) 15601235180SAlexander Graf bat = &vcpu_book3s->dbat[i]; 15701235180SAlexander Graf else 15801235180SAlexander Graf bat = &vcpu_book3s->ibat[i]; 15901235180SAlexander Graf 160666e7252SAlexander Graf if (vcpu->arch.shared->msr & MSR_PR) { 16101235180SAlexander Graf if (!bat->vp) 16201235180SAlexander Graf continue; 16301235180SAlexander Graf } else { 16401235180SAlexander Graf if (!bat->vs) 16501235180SAlexander Graf continue; 16601235180SAlexander Graf } 16701235180SAlexander Graf 16801235180SAlexander Graf if (check_debug_ip(vcpu)) 16901235180SAlexander Graf { 17001235180SAlexander Graf dprintk_pte("%cBAT %02d: 0x%lx - 0x%x (0x%x)\n", 17101235180SAlexander Graf data ? 'd' : 'i', i, eaddr, bat->bepi, 17201235180SAlexander Graf bat->bepi_mask); 17301235180SAlexander Graf } 17401235180SAlexander Graf if ((eaddr & bat->bepi_mask) == bat->bepi) { 1754b389ca2SAlexander Graf u64 vsid; 1764b389ca2SAlexander Graf kvmppc_mmu_book3s_32_esid_to_vsid(vcpu, 1774b389ca2SAlexander Graf eaddr >> SID_SHIFT, &vsid); 1784b389ca2SAlexander Graf vsid <<= 16; 1794b389ca2SAlexander Graf pte->vpage = (((u64)eaddr >> 12) & 0xffff) | vsid; 1804b389ca2SAlexander Graf 18101235180SAlexander Graf pte->raddr = bat->brpn | (eaddr & ~bat->bepi_mask); 18201235180SAlexander Graf pte->may_read = bat->pp; 18301235180SAlexander Graf pte->may_write = bat->pp > 1; 18401235180SAlexander Graf pte->may_execute = true; 18501235180SAlexander Graf if (!pte->may_read) { 18601235180SAlexander Graf printk(KERN_INFO "BAT is not readable!\n"); 18701235180SAlexander Graf continue; 18801235180SAlexander Graf } 18901235180SAlexander Graf if (!pte->may_write) { 19001235180SAlexander Graf /* let's treat r/o BATs as not-readable for now */ 19101235180SAlexander Graf dprintk_pte("BAT is read-only!\n"); 19201235180SAlexander Graf continue; 19301235180SAlexander Graf } 19401235180SAlexander Graf 19501235180SAlexander Graf return 0; 19601235180SAlexander Graf } 19701235180SAlexander Graf } 19801235180SAlexander Graf 19901235180SAlexander Graf return -ENOENT; 20001235180SAlexander Graf } 20101235180SAlexander Graf 20201235180SAlexander Graf static int kvmppc_mmu_book3s_32_xlate_pte(struct kvm_vcpu *vcpu, gva_t eaddr, 20301235180SAlexander Graf struct kvmppc_pte *pte, bool data, 20401235180SAlexander Graf bool primary) 20501235180SAlexander Graf { 20601235180SAlexander Graf struct kvmppc_vcpu_book3s *vcpu_book3s = to_book3s(vcpu); 2078e865178SAlexander Graf u32 sre; 20801235180SAlexander Graf hva_t ptegp; 20901235180SAlexander Graf u32 pteg[16]; 210af7b4d10SAlexander Graf u32 ptem = 0; 21101235180SAlexander Graf int i; 21201235180SAlexander Graf int found = 0; 21301235180SAlexander Graf 214df1bfa25SAlexander Graf sre = find_sr(vcpu, eaddr); 21501235180SAlexander Graf 21601235180SAlexander Graf dprintk_pte("SR 0x%lx: vsid=0x%x, raw=0x%x\n", eaddr >> 28, 2178e865178SAlexander Graf sr_vsid(sre), sre); 21801235180SAlexander Graf 21901235180SAlexander Graf pte->vpage = kvmppc_mmu_book3s_32_ea_to_vp(vcpu, eaddr, data); 22001235180SAlexander Graf 22101235180SAlexander Graf ptegp = kvmppc_mmu_book3s_32_get_pteg(vcpu_book3s, sre, eaddr, primary); 22201235180SAlexander Graf if (kvm_is_error_hva(ptegp)) { 22301235180SAlexander Graf printk(KERN_INFO "KVM: Invalid PTEG!\n"); 22401235180SAlexander Graf goto no_page_found; 22501235180SAlexander Graf } 22601235180SAlexander Graf 22701235180SAlexander Graf ptem = kvmppc_mmu_book3s_32_get_ptem(sre, eaddr, primary); 22801235180SAlexander Graf 22901235180SAlexander Graf if(copy_from_user(pteg, (void __user *)ptegp, sizeof(pteg))) { 23001235180SAlexander Graf printk(KERN_ERR "KVM: Can't copy data from 0x%lx!\n", ptegp); 23101235180SAlexander Graf goto no_page_found; 23201235180SAlexander Graf } 23301235180SAlexander Graf 23401235180SAlexander Graf for (i=0; i<16; i+=2) { 23501235180SAlexander Graf if (ptem == pteg[i]) { 23601235180SAlexander Graf u8 pp; 23701235180SAlexander Graf 23801235180SAlexander Graf pte->raddr = (pteg[i+1] & ~(0xFFFULL)) | (eaddr & 0xFFF); 23901235180SAlexander Graf pp = pteg[i+1] & 3; 24001235180SAlexander Graf 2418e865178SAlexander Graf if ((sr_kp(sre) && (vcpu->arch.shared->msr & MSR_PR)) || 2428e865178SAlexander Graf (sr_ks(sre) && !(vcpu->arch.shared->msr & MSR_PR))) 24301235180SAlexander Graf pp |= 4; 24401235180SAlexander Graf 24501235180SAlexander Graf pte->may_write = false; 24601235180SAlexander Graf pte->may_read = false; 24701235180SAlexander Graf pte->may_execute = true; 24801235180SAlexander Graf switch (pp) { 24901235180SAlexander Graf case 0: 25001235180SAlexander Graf case 1: 25101235180SAlexander Graf case 2: 25201235180SAlexander Graf case 6: 25301235180SAlexander Graf pte->may_write = true; 25401235180SAlexander Graf case 3: 25501235180SAlexander Graf case 5: 25601235180SAlexander Graf case 7: 25701235180SAlexander Graf pte->may_read = true; 25801235180SAlexander Graf break; 25901235180SAlexander Graf } 26001235180SAlexander Graf 26101235180SAlexander Graf if ( !pte->may_read ) 26201235180SAlexander Graf continue; 26301235180SAlexander Graf 26401235180SAlexander Graf dprintk_pte("MMU: Found PTE -> %x %x - %x\n", 26501235180SAlexander Graf pteg[i], pteg[i+1], pp); 26601235180SAlexander Graf found = 1; 26701235180SAlexander Graf break; 26801235180SAlexander Graf } 26901235180SAlexander Graf } 27001235180SAlexander Graf 27101235180SAlexander Graf /* Update PTE C and A bits, so the guest's swapper knows we used the 27201235180SAlexander Graf page */ 27301235180SAlexander Graf if (found) { 27401235180SAlexander Graf u32 oldpte = pteg[i+1]; 27501235180SAlexander Graf 27601235180SAlexander Graf if (pte->may_read) 27701235180SAlexander Graf pteg[i+1] |= PTEG_FLAG_ACCESSED; 27801235180SAlexander Graf if (pte->may_write) 27901235180SAlexander Graf pteg[i+1] |= PTEG_FLAG_DIRTY; 28001235180SAlexander Graf else 28101235180SAlexander Graf dprintk_pte("KVM: Mapping read-only page!\n"); 28201235180SAlexander Graf 28301235180SAlexander Graf /* Write back into the PTEG */ 28401235180SAlexander Graf if (pteg[i+1] != oldpte) 28501235180SAlexander Graf copy_to_user((void __user *)ptegp, pteg, sizeof(pteg)); 28601235180SAlexander Graf 28701235180SAlexander Graf return 0; 28801235180SAlexander Graf } 28901235180SAlexander Graf 29001235180SAlexander Graf no_page_found: 29101235180SAlexander Graf 29201235180SAlexander Graf if (check_debug_ip(vcpu)) { 29301235180SAlexander Graf dprintk_pte("KVM MMU: No PTE found (sdr1=0x%llx ptegp=0x%lx)\n", 29401235180SAlexander Graf to_book3s(vcpu)->sdr1, ptegp); 29501235180SAlexander Graf for (i=0; i<16; i+=2) { 29653021042SAlexander Graf dprintk_pte(" %02d: 0x%x - 0x%x (0x%x)\n", 29701235180SAlexander Graf i, pteg[i], pteg[i+1], ptem); 29801235180SAlexander Graf } 29901235180SAlexander Graf } 30001235180SAlexander Graf 30101235180SAlexander Graf return -ENOENT; 30201235180SAlexander Graf } 30301235180SAlexander Graf 30401235180SAlexander Graf static int kvmppc_mmu_book3s_32_xlate(struct kvm_vcpu *vcpu, gva_t eaddr, 30501235180SAlexander Graf struct kvmppc_pte *pte, bool data) 30601235180SAlexander Graf { 30701235180SAlexander Graf int r; 308e8508940SAlexander Graf ulong mp_ea = vcpu->arch.magic_page_ea; 30901235180SAlexander Graf 31001235180SAlexander Graf pte->eaddr = eaddr; 311e8508940SAlexander Graf 312e8508940SAlexander Graf /* Magic page override */ 313e8508940SAlexander Graf if (unlikely(mp_ea) && 314e8508940SAlexander Graf unlikely((eaddr & ~0xfffULL) == (mp_ea & ~0xfffULL)) && 315e8508940SAlexander Graf !(vcpu->arch.shared->msr & MSR_PR)) { 316e8508940SAlexander Graf pte->vpage = kvmppc_mmu_book3s_32_ea_to_vp(vcpu, eaddr, data); 317e8508940SAlexander Graf pte->raddr = vcpu->arch.magic_page_pa | (pte->raddr & 0xfff); 318e8508940SAlexander Graf pte->raddr &= KVM_PAM; 319e8508940SAlexander Graf pte->may_execute = true; 320e8508940SAlexander Graf pte->may_read = true; 321e8508940SAlexander Graf pte->may_write = true; 322e8508940SAlexander Graf 323e8508940SAlexander Graf return 0; 324e8508940SAlexander Graf } 325e8508940SAlexander Graf 32601235180SAlexander Graf r = kvmppc_mmu_book3s_32_xlate_bat(vcpu, eaddr, pte, data); 32701235180SAlexander Graf if (r < 0) 32801235180SAlexander Graf r = kvmppc_mmu_book3s_32_xlate_pte(vcpu, eaddr, pte, data, true); 32901235180SAlexander Graf if (r < 0) 33001235180SAlexander Graf r = kvmppc_mmu_book3s_32_xlate_pte(vcpu, eaddr, pte, data, false); 33101235180SAlexander Graf 33201235180SAlexander Graf return r; 33301235180SAlexander Graf } 33401235180SAlexander Graf 33501235180SAlexander Graf 33601235180SAlexander Graf static u32 kvmppc_mmu_book3s_32_mfsrin(struct kvm_vcpu *vcpu, u32 srnum) 33701235180SAlexander Graf { 338df1bfa25SAlexander Graf return vcpu->arch.shared->sr[srnum]; 33901235180SAlexander Graf } 34001235180SAlexander Graf 34101235180SAlexander Graf static void kvmppc_mmu_book3s_32_mtsrin(struct kvm_vcpu *vcpu, u32 srnum, 34201235180SAlexander Graf ulong value) 34301235180SAlexander Graf { 344df1bfa25SAlexander Graf vcpu->arch.shared->sr[srnum] = value; 34501235180SAlexander Graf kvmppc_mmu_map_segment(vcpu, srnum << SID_SHIFT); 34601235180SAlexander Graf } 34701235180SAlexander Graf 34801235180SAlexander Graf static void kvmppc_mmu_book3s_32_tlbie(struct kvm_vcpu *vcpu, ulong ea, bool large) 34901235180SAlexander Graf { 3504b389ca2SAlexander Graf kvmppc_mmu_pte_flush(vcpu, ea, 0x0FFFF000); 35101235180SAlexander Graf } 35201235180SAlexander Graf 353af7b4d10SAlexander Graf static int kvmppc_mmu_book3s_32_esid_to_vsid(struct kvm_vcpu *vcpu, ulong esid, 35401235180SAlexander Graf u64 *vsid) 35501235180SAlexander Graf { 356f7bc74e1SAlexander Graf ulong ea = esid << SID_SHIFT; 3578e865178SAlexander Graf u32 sr; 358f7bc74e1SAlexander Graf u64 gvsid = esid; 359f7bc74e1SAlexander Graf 360666e7252SAlexander Graf if (vcpu->arch.shared->msr & (MSR_DR|MSR_IR)) { 361df1bfa25SAlexander Graf sr = find_sr(vcpu, ea); 3628e865178SAlexander Graf if (sr_valid(sr)) 3638e865178SAlexander Graf gvsid = sr_vsid(sr); 364f7bc74e1SAlexander Graf } 365f7bc74e1SAlexander Graf 36601235180SAlexander Graf /* In case we only have one of MSR_IR or MSR_DR set, let's put 36701235180SAlexander Graf that in the real-mode context (and hope RM doesn't access 36801235180SAlexander Graf high memory) */ 369666e7252SAlexander Graf switch (vcpu->arch.shared->msr & (MSR_DR|MSR_IR)) { 37001235180SAlexander Graf case 0: 371f7bc74e1SAlexander Graf *vsid = VSID_REAL | esid; 37201235180SAlexander Graf break; 37301235180SAlexander Graf case MSR_IR: 374f7bc74e1SAlexander Graf *vsid = VSID_REAL_IR | gvsid; 37501235180SAlexander Graf break; 37601235180SAlexander Graf case MSR_DR: 377f7bc74e1SAlexander Graf *vsid = VSID_REAL_DR | gvsid; 37801235180SAlexander Graf break; 37901235180SAlexander Graf case MSR_DR|MSR_IR: 3808e865178SAlexander Graf if (sr_valid(sr)) 3818e865178SAlexander Graf *vsid = sr_vsid(sr); 3824d29bdbfSAlexander Graf else 3834d29bdbfSAlexander Graf *vsid = VSID_BAT | gvsid; 38401235180SAlexander Graf break; 38501235180SAlexander Graf default: 38601235180SAlexander Graf BUG(); 38701235180SAlexander Graf } 38801235180SAlexander Graf 389666e7252SAlexander Graf if (vcpu->arch.shared->msr & MSR_PR) 3904b389ca2SAlexander Graf *vsid |= VSID_PR; 3914b389ca2SAlexander Graf 39201235180SAlexander Graf return 0; 39301235180SAlexander Graf } 39401235180SAlexander Graf 39501235180SAlexander Graf static bool kvmppc_mmu_book3s_32_is_dcbz32(struct kvm_vcpu *vcpu) 39601235180SAlexander Graf { 39701235180SAlexander Graf return true; 39801235180SAlexander Graf } 39901235180SAlexander Graf 40001235180SAlexander Graf 40101235180SAlexander Graf void kvmppc_mmu_book3s_32_init(struct kvm_vcpu *vcpu) 40201235180SAlexander Graf { 40301235180SAlexander Graf struct kvmppc_mmu *mmu = &vcpu->arch.mmu; 40401235180SAlexander Graf 40501235180SAlexander Graf mmu->mtsrin = kvmppc_mmu_book3s_32_mtsrin; 40601235180SAlexander Graf mmu->mfsrin = kvmppc_mmu_book3s_32_mfsrin; 40701235180SAlexander Graf mmu->xlate = kvmppc_mmu_book3s_32_xlate; 40801235180SAlexander Graf mmu->reset_msr = kvmppc_mmu_book3s_32_reset_msr; 40901235180SAlexander Graf mmu->tlbie = kvmppc_mmu_book3s_32_tlbie; 41001235180SAlexander Graf mmu->esid_to_vsid = kvmppc_mmu_book3s_32_esid_to_vsid; 41101235180SAlexander Graf mmu->ea_to_vp = kvmppc_mmu_book3s_32_ea_to_vp; 41201235180SAlexander Graf mmu->is_dcbz32 = kvmppc_mmu_book3s_32_is_dcbz32; 41301235180SAlexander Graf 41401235180SAlexander Graf mmu->slbmte = NULL; 41501235180SAlexander Graf mmu->slbmfee = NULL; 41601235180SAlexander Graf mmu->slbmfev = NULL; 41701235180SAlexander Graf mmu->slbie = NULL; 41801235180SAlexander Graf mmu->slbia = NULL; 41901235180SAlexander Graf } 420