Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

KVM: PPC: Put segment registers in shared page

Now that the actual mtsr doesn't do anything anymore, we can move the sr
contents over to the shared page, so a guest can directly read and write
its sr contents from guest context.

Signed-off-by: Alexander Graf <agraf@suse.de>

authored by

Alexander Graf and committed by
Avi Kivity
df1bfa25 8e865178

+11 -12
-1
arch/powerpc/include/asm/kvm_book3s.h
··· 70 70 u64 vsid; 71 71 } slb_shadow[64]; 72 72 u8 slb_shadow_max; 73 - u32 sr[16]; 74 73 struct kvmppc_bat ibat[8]; 75 74 struct kvmppc_bat dbat[8]; 76 75 u64 hid[6];
+1
arch/powerpc/include/asm/kvm_para.h
··· 38 38 __u64 msr; 39 39 __u32 dsisr; 40 40 __u32 int_pending; /* Tells the guest if we have an interrupt */ 41 + __u32 sr[16]; 41 42 }; 42 43 43 44 #define KVM_SC_MAGIC_R0 0x4b564d21 /* "KVM!" */
+3 -4
arch/powerpc/kvm/book3s.c
··· 1161 1161 sregs->u.s.ppc64.slb[i].slbv = vcpu3s->slb[i].origv; 1162 1162 } 1163 1163 } else { 1164 - for (i = 0; i < 16; i++) { 1165 - sregs->u.s.ppc32.sr[i] = vcpu3s->sr[i]; 1166 - sregs->u.s.ppc32.sr[i] = vcpu3s->sr[i]; 1167 - } 1164 + for (i = 0; i < 16; i++) 1165 + sregs->u.s.ppc32.sr[i] = vcpu->arch.shared->sr[i]; 1166 + 1168 1167 for (i = 0; i < 8; i++) { 1169 1168 sregs->u.s.ppc32.ibat[i] = vcpu3s->ibat[i].raw; 1170 1169 sregs->u.s.ppc32.dbat[i] = vcpu3s->dbat[i].raw;
+6 -6
arch/powerpc/kvm/book3s_32_mmu.c
··· 88 88 static int kvmppc_mmu_book3s_32_esid_to_vsid(struct kvm_vcpu *vcpu, ulong esid, 89 89 u64 *vsid); 90 90 91 - static u32 find_sr(struct kvmppc_vcpu_book3s *vcpu_book3s, gva_t eaddr) 91 + static u32 find_sr(struct kvm_vcpu *vcpu, gva_t eaddr) 92 92 { 93 - return vcpu_book3s->sr[(eaddr >> 28) & 0xf]; 93 + return vcpu->arch.shared->sr[(eaddr >> 28) & 0xf]; 94 94 } 95 95 96 96 static u64 kvmppc_mmu_book3s_32_ea_to_vp(struct kvm_vcpu *vcpu, gva_t eaddr, ··· 211 211 int i; 212 212 int found = 0; 213 213 214 - sre = find_sr(vcpu_book3s, eaddr); 214 + sre = find_sr(vcpu, eaddr); 215 215 216 216 dprintk_pte("SR 0x%lx: vsid=0x%x, raw=0x%x\n", eaddr >> 28, 217 217 sr_vsid(sre), sre); ··· 335 335 336 336 static u32 kvmppc_mmu_book3s_32_mfsrin(struct kvm_vcpu *vcpu, u32 srnum) 337 337 { 338 - return to_book3s(vcpu)->sr[srnum]; 338 + return vcpu->arch.shared->sr[srnum]; 339 339 } 340 340 341 341 static void kvmppc_mmu_book3s_32_mtsrin(struct kvm_vcpu *vcpu, u32 srnum, 342 342 ulong value) 343 343 { 344 - to_book3s(vcpu)->sr[srnum] = value; 344 + vcpu->arch.shared->sr[srnum] = value; 345 345 kvmppc_mmu_map_segment(vcpu, srnum << SID_SHIFT); 346 346 } 347 347 ··· 358 358 u64 gvsid = esid; 359 359 360 360 if (vcpu->arch.shared->msr & (MSR_DR|MSR_IR)) { 361 - sr = find_sr(to_book3s(vcpu), ea); 361 + sr = find_sr(vcpu, ea); 362 362 if (sr_valid(sr)) 363 363 gvsid = sr_vsid(sr); 364 364 }
+1 -1
arch/powerpc/kvm/powerpc.c
··· 66 66 vcpu->arch.magic_page_pa = param1; 67 67 vcpu->arch.magic_page_ea = param2; 68 68 69 - r2 = 0; 69 + r2 = KVM_MAGIC_FEAT_SR; 70 70 71 71 r = HC_EV_SUCCESS; 72 72 break;