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

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
...@@ -70,7 +70,6 @@ struct kvmppc_vcpu_book3s { ...@@ -70,7 +70,6 @@ struct kvmppc_vcpu_book3s {
u64 vsid; u64 vsid;
} slb_shadow[64]; } slb_shadow[64];
u8 slb_shadow_max; u8 slb_shadow_max;
u32 sr[16];
struct kvmppc_bat ibat[8]; struct kvmppc_bat ibat[8];
struct kvmppc_bat dbat[8]; struct kvmppc_bat dbat[8];
u64 hid[6]; u64 hid[6];
......
...@@ -38,6 +38,7 @@ struct kvm_vcpu_arch_shared { ...@@ -38,6 +38,7 @@ struct kvm_vcpu_arch_shared {
__u64 msr; __u64 msr;
__u32 dsisr; __u32 dsisr;
__u32 int_pending; /* Tells the guest if we have an interrupt */ __u32 int_pending; /* Tells the guest if we have an interrupt */
__u32 sr[16];
}; };
#define KVM_SC_MAGIC_R0 0x4b564d21 /* "KVM!" */ #define KVM_SC_MAGIC_R0 0x4b564d21 /* "KVM!" */
......
...@@ -1161,10 +1161,9 @@ int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu, ...@@ -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; sregs->u.s.ppc64.slb[i].slbv = vcpu3s->slb[i].origv;
} }
} else { } else {
for (i = 0; i < 16; i++) { for (i = 0; i < 16; i++)
sregs->u.s.ppc32.sr[i] = vcpu3s->sr[i]; sregs->u.s.ppc32.sr[i] = vcpu->arch.shared->sr[i];
sregs->u.s.ppc32.sr[i] = vcpu3s->sr[i];
}
for (i = 0; i < 8; i++) { for (i = 0; i < 8; i++) {
sregs->u.s.ppc32.ibat[i] = vcpu3s->ibat[i].raw; sregs->u.s.ppc32.ibat[i] = vcpu3s->ibat[i].raw;
sregs->u.s.ppc32.dbat[i] = vcpu3s->dbat[i].raw; sregs->u.s.ppc32.dbat[i] = vcpu3s->dbat[i].raw;
......
...@@ -88,9 +88,9 @@ static int kvmppc_mmu_book3s_32_xlate_bat(struct kvm_vcpu *vcpu, gva_t eaddr, ...@@ -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, static int kvmppc_mmu_book3s_32_esid_to_vsid(struct kvm_vcpu *vcpu, ulong esid,
u64 *vsid); 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, 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, ...@@ -211,7 +211,7 @@ static int kvmppc_mmu_book3s_32_xlate_pte(struct kvm_vcpu *vcpu, gva_t eaddr,
int i; int i;
int found = 0; 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, dprintk_pte("SR 0x%lx: vsid=0x%x, raw=0x%x\n", eaddr >> 28,
sr_vsid(sre), sre); sr_vsid(sre), sre);
...@@ -335,13 +335,13 @@ static int kvmppc_mmu_book3s_32_xlate(struct kvm_vcpu *vcpu, gva_t eaddr, ...@@ -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) 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, static void kvmppc_mmu_book3s_32_mtsrin(struct kvm_vcpu *vcpu, u32 srnum,
ulong value) ulong value)
{ {
to_book3s(vcpu)->sr[srnum] = value; vcpu->arch.shared->sr[srnum] = value;
kvmppc_mmu_map_segment(vcpu, srnum << SID_SHIFT); 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, ...@@ -358,7 +358,7 @@ static int kvmppc_mmu_book3s_32_esid_to_vsid(struct kvm_vcpu *vcpu, ulong esid,
u64 gvsid = esid; u64 gvsid = esid;
if (vcpu->arch.shared->msr & (MSR_DR|MSR_IR)) { 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)) if (sr_valid(sr))
gvsid = sr_vsid(sr); gvsid = sr_vsid(sr);
} }
......
...@@ -66,7 +66,7 @@ int kvmppc_kvm_pv(struct kvm_vcpu *vcpu) ...@@ -66,7 +66,7 @@ int kvmppc_kvm_pv(struct kvm_vcpu *vcpu)
vcpu->arch.magic_page_pa = param1; vcpu->arch.magic_page_pa = param1;
vcpu->arch.magic_page_ea = param2; vcpu->arch.magic_page_ea = param2;
r2 = 0; r2 = KVM_MAGIC_FEAT_SR;
r = HC_EV_SUCCESS; r = HC_EV_SUCCESS;
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment