mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-12 13:55:32 +00:00
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>
This commit is contained in:
parent
8e8651783f
commit
df1bfa25d8
5 changed files with 11 additions and 12 deletions
|
@ -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 {
|
||||||
__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,
|
||||||
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,
|
||||||
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,
|
||||||
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,
|
||||||
|
|
||||||
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,
|
||||||
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)
|
||||||
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;
|
||||||
|
|
Loading…
Reference in a new issue