Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit df1bfa25 authored by Alexander Graf's avatar Alexander Graf Committed by Avi Kivity
Browse files

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: default avatarAlexander Graf <agraf@suse.de>
parent 8e865178
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -70,7 +70,6 @@ struct kvmppc_vcpu_book3s {
		u64 vsid;
	} slb_shadow[64];
	u8 slb_shadow_max;
	u32 sr[16];
	struct kvmppc_bat ibat[8];
	struct kvmppc_bat dbat[8];
	u64 hid[6];
+1 −0
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@ struct kvm_vcpu_arch_shared {
	__u64 msr;
	__u32 dsisr;
	__u32 int_pending;	/* Tells the guest if we have an interrupt */
	__u32 sr[16];
};

#define KVM_SC_MAGIC_R0		0x4b564d21 /* "KVM!" */
+3 −4
Original line number Diff line number Diff line
@@ -1161,10 +1161,9 @@ int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu,
			sregs->u.s.ppc64.slb[i].slbv = vcpu3s->slb[i].origv;
		}
	} else {
		for (i = 0; i < 16; i++) {
			sregs->u.s.ppc32.sr[i] = vcpu3s->sr[i];
			sregs->u.s.ppc32.sr[i] = vcpu3s->sr[i];
		}
		for (i = 0; i < 16; i++)
			sregs->u.s.ppc32.sr[i] = vcpu->arch.shared->sr[i];

		for (i = 0; i < 8; i++) {
			sregs->u.s.ppc32.ibat[i] = vcpu3s->ibat[i].raw;
			sregs->u.s.ppc32.dbat[i] = vcpu3s->dbat[i].raw;
+6 −6
Original line number Diff line number Diff line
@@ -88,9 +88,9 @@ static int kvmppc_mmu_book3s_32_xlate_bat(struct kvm_vcpu *vcpu, gva_t eaddr,
static int kvmppc_mmu_book3s_32_esid_to_vsid(struct kvm_vcpu *vcpu, ulong esid,
					     u64 *vsid);

static u32 find_sr(struct kvmppc_vcpu_book3s *vcpu_book3s, gva_t eaddr)
static u32 find_sr(struct kvm_vcpu *vcpu, gva_t eaddr)
{
	return vcpu_book3s->sr[(eaddr >> 28) & 0xf];
	return vcpu->arch.shared->sr[(eaddr >> 28) & 0xf];
}

static u64 kvmppc_mmu_book3s_32_ea_to_vp(struct kvm_vcpu *vcpu, gva_t eaddr,
@@ -211,7 +211,7 @@ static int kvmppc_mmu_book3s_32_xlate_pte(struct kvm_vcpu *vcpu, gva_t eaddr,
	int i;
	int found = 0;

	sre = find_sr(vcpu_book3s, eaddr);
	sre = find_sr(vcpu, eaddr);

	dprintk_pte("SR 0x%lx: vsid=0x%x, raw=0x%x\n", eaddr >> 28,
		    sr_vsid(sre), sre);
@@ -335,13 +335,13 @@ static int kvmppc_mmu_book3s_32_xlate(struct kvm_vcpu *vcpu, gva_t eaddr,

static u32 kvmppc_mmu_book3s_32_mfsrin(struct kvm_vcpu *vcpu, u32 srnum)
{
	return to_book3s(vcpu)->sr[srnum];
	return vcpu->arch.shared->sr[srnum];
}

static void kvmppc_mmu_book3s_32_mtsrin(struct kvm_vcpu *vcpu, u32 srnum,
					ulong value)
{
	to_book3s(vcpu)->sr[srnum] = value;
	vcpu->arch.shared->sr[srnum] = value;
	kvmppc_mmu_map_segment(vcpu, srnum << SID_SHIFT);
}

@@ -358,7 +358,7 @@ static int kvmppc_mmu_book3s_32_esid_to_vsid(struct kvm_vcpu *vcpu, ulong esid,
	u64 gvsid = esid;

	if (vcpu->arch.shared->msr & (MSR_DR|MSR_IR)) {
		sr = find_sr(to_book3s(vcpu), ea);
		sr = find_sr(vcpu, ea);
		if (sr_valid(sr))
			gvsid = sr_vsid(sr);
	}
+1 −1
Original line number Diff line number Diff line
@@ -66,7 +66,7 @@ int kvmppc_kvm_pv(struct kvm_vcpu *vcpu)
		vcpu->arch.magic_page_pa = param1;
		vcpu->arch.magic_page_ea = param2;

		r2 = 0;
		r2 = KVM_MAGIC_FEAT_SR;

		r = HC_EV_SUCCESS;
		break;