From: Alexander Graf <agraf-l3A5Bk7waGM@public.gmane.org>
To: kvm-ppc-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Cc: KVM list <kvm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
linuxppc-dev
<linuxppc-dev-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org>
Subject: [PATCH 13/26] KVM: PPC: Magic Page Book3s support
Date: Sat, 26 Jun 2010 01:25:01 +0200 [thread overview]
Message-ID: <1277508314-915-14-git-send-email-agraf@suse.de> (raw)
In-Reply-To: <1277508314-915-1-git-send-email-agraf-l3A5Bk7waGM@public.gmane.org>
We need to override EA as well as PA lookups for the magic page. When the guest
tells us to project it, the magic page overrides any guest mappings.
In order to reflect that, we need to hook into all the MMU layers of KVM to
force map the magic page if necessary.
Signed-off-by: Alexander Graf <agraf-l3A5Bk7waGM@public.gmane.org>
---
arch/powerpc/kvm/book3s.c | 7 +++++++
arch/powerpc/kvm/book3s_32_mmu.c | 16 ++++++++++++++++
arch/powerpc/kvm/book3s_32_mmu_host.c | 12 ++++++++++++
arch/powerpc/kvm/book3s_64_mmu.c | 30 +++++++++++++++++++++++++++++-
arch/powerpc/kvm/book3s_64_mmu_host.c | 12 ++++++++++++
5 files changed, 76 insertions(+), 1 deletions(-)
diff --git a/arch/powerpc/kvm/book3s.c b/arch/powerpc/kvm/book3s.c
index 2f55aa5..6ce7fa1 100644
--- a/arch/powerpc/kvm/book3s.c
+++ b/arch/powerpc/kvm/book3s.c
@@ -551,6 +551,13 @@ mmio:
static int kvmppc_visible_gfn(struct kvm_vcpu *vcpu, gfn_t gfn)
{
+ ulong mp_pa = vcpu->arch.magic_page_pa;
+
+ if (unlikely(mp_pa) &&
+ unlikely((mp_pa & KVM_RMO) >> PAGE_SHIFT == gfn)) {
+ return 1;
+ }
+
return kvm_is_visible_gfn(vcpu->kvm, gfn);
}
diff --git a/arch/powerpc/kvm/book3s_32_mmu.c b/arch/powerpc/kvm/book3s_32_mmu.c
index 41130c8..d2bd1a6 100644
--- a/arch/powerpc/kvm/book3s_32_mmu.c
+++ b/arch/powerpc/kvm/book3s_32_mmu.c
@@ -281,8 +281,24 @@ static int kvmppc_mmu_book3s_32_xlate(struct kvm_vcpu *vcpu, gva_t eaddr,
struct kvmppc_pte *pte, bool data)
{
int r;
+ ulong mp_ea = vcpu->arch.magic_page_ea;
pte->eaddr = eaddr;
+
+ /* Magic page override */
+ if (unlikely(mp_ea) &&
+ unlikely((eaddr & ~0xfffULL) == (mp_ea & ~0xfffULL)) &&
+ !(vcpu->arch.shared->msr & MSR_PR)) {
+ pte->vpage = kvmppc_mmu_book3s_32_ea_to_vp(vcpu, eaddr, data);
+ pte->raddr = vcpu->arch.magic_page_pa | (pte->raddr & 0xfff);
+ pte->raddr &= KVM_RMO;
+ pte->may_execute = true;
+ pte->may_read = true;
+ pte->may_write = true;
+
+ return 0;
+ }
+
r = kvmppc_mmu_book3s_32_xlate_bat(vcpu, eaddr, pte, data);
if (r < 0)
r = kvmppc_mmu_book3s_32_xlate_pte(vcpu, eaddr, pte, data, true);
diff --git a/arch/powerpc/kvm/book3s_32_mmu_host.c b/arch/powerpc/kvm/book3s_32_mmu_host.c
index 67b8c38..658d3e0 100644
--- a/arch/powerpc/kvm/book3s_32_mmu_host.c
+++ b/arch/powerpc/kvm/book3s_32_mmu_host.c
@@ -145,6 +145,16 @@ int kvmppc_mmu_map_page(struct kvm_vcpu *vcpu, struct kvmppc_pte *orig_pte)
bool primary = false;
bool evict = false;
struct hpte_cache *pte;
+ ulong mp_pa = vcpu->arch.magic_page_pa;
+
+ /* Magic page override */
+ if (unlikely(mp_pa) &&
+ unlikely((orig_pte->raddr & ~0xfffUL & KVM_RMO) ==
+ (mp_pa & ~0xfffUL & KVM_RMO))) {
+ hpaddr = (pfn_t)virt_to_phys(vcpu->arch.shared);
+ get_page(pfn_to_page(hpaddr >> PAGE_SHIFT));
+ goto mapped;
+ }
/* Get host physical address for gpa */
hpaddr = gfn_to_pfn(vcpu->kvm, orig_pte->raddr >> PAGE_SHIFT);
@@ -155,6 +165,8 @@ int kvmppc_mmu_map_page(struct kvm_vcpu *vcpu, struct kvmppc_pte *orig_pte)
}
hpaddr <<= PAGE_SHIFT;
+mapped:
+
/* and write the mapping ea -> hpa into the pt */
vcpu->arch.mmu.esid_to_vsid(vcpu, orig_pte->eaddr >> SID_SHIFT, &vsid);
map = find_sid_vsid(vcpu, vsid);
diff --git a/arch/powerpc/kvm/book3s_64_mmu.c b/arch/powerpc/kvm/book3s_64_mmu.c
index 58aa840..4a2e5fc 100644
--- a/arch/powerpc/kvm/book3s_64_mmu.c
+++ b/arch/powerpc/kvm/book3s_64_mmu.c
@@ -163,6 +163,22 @@ static int kvmppc_mmu_book3s_64_xlate(struct kvm_vcpu *vcpu, gva_t eaddr,
bool found = false;
bool perm_err = false;
int second = 0;
+ ulong mp_ea = vcpu->arch.magic_page_ea;
+
+ /* Magic page override */
+ if (unlikely(mp_ea) &&
+ unlikely((eaddr & ~0xfffULL) == (mp_ea & ~0xfffULL)) &&
+ !(vcpu->arch.shared->msr & MSR_PR)) {
+ gpte->eaddr = eaddr;
+ gpte->vpage = kvmppc_mmu_book3s_64_ea_to_vp(vcpu, eaddr, data);
+ gpte->raddr = vcpu->arch.magic_page_pa | (gpte->raddr & 0xfff);
+ gpte->raddr &= KVM_RMO;
+ gpte->may_execute = true;
+ gpte->may_read = true;
+ gpte->may_write = true;
+
+ return 0;
+ }
slbe = kvmppc_mmu_book3s_64_find_slbe(vcpu_book3s, eaddr);
if (!slbe)
@@ -445,6 +461,7 @@ static int kvmppc_mmu_book3s_64_esid_to_vsid(struct kvm_vcpu *vcpu, ulong esid,
ulong ea = esid << SID_SHIFT;
struct kvmppc_slb *slb;
u64 gvsid = esid;
+ ulong mp_ea = vcpu->arch.magic_page_ea;
if (vcpu->arch.shared->msr & (MSR_DR|MSR_IR)) {
slb = kvmppc_mmu_book3s_64_find_slbe(to_book3s(vcpu), ea);
@@ -464,7 +481,7 @@ static int kvmppc_mmu_book3s_64_esid_to_vsid(struct kvm_vcpu *vcpu, ulong esid,
break;
case MSR_DR|MSR_IR:
if (!slb)
- return -ENOENT;
+ goto no_slb;
*vsid = gvsid;
break;
@@ -477,6 +494,17 @@ static int kvmppc_mmu_book3s_64_esid_to_vsid(struct kvm_vcpu *vcpu, ulong esid,
*vsid |= VSID_PR;
return 0;
+
+no_slb:
+ /* Catch magic page case */
+ if (unlikely(mp_ea) &&
+ unlikely(esid == (mp_ea >> SID_SHIFT)) &&
+ !(vcpu->arch.shared->msr & MSR_PR)) {
+ *vsid = VSID_REAL | esid;
+ return 0;
+ }
+
+ return -EINVAL;
}
static bool kvmppc_mmu_book3s_64_is_dcbz32(struct kvm_vcpu *vcpu)
diff --git a/arch/powerpc/kvm/book3s_64_mmu_host.c b/arch/powerpc/kvm/book3s_64_mmu_host.c
index 71c1f90..d880c88 100644
--- a/arch/powerpc/kvm/book3s_64_mmu_host.c
+++ b/arch/powerpc/kvm/book3s_64_mmu_host.c
@@ -99,6 +99,16 @@ int kvmppc_mmu_map_page(struct kvm_vcpu *vcpu, struct kvmppc_pte *orig_pte)
int vflags = 0;
int attempt = 0;
struct kvmppc_sid_map *map;
+ ulong mp_pa = vcpu->arch.magic_page_pa;
+
+ /* Magic page override */
+ if (unlikely(mp_pa) &&
+ unlikely((orig_pte->raddr & ~0xfffULL & KVM_RMO) ==
+ (mp_pa & ~0xfffULL & KVM_RMO))) {
+ hpaddr = (pfn_t)virt_to_phys(vcpu->arch.shared);
+ get_page(pfn_to_page(hpaddr >> PAGE_SHIFT));
+ goto mapped;
+ }
/* Get host physical address for gpa */
hpaddr = gfn_to_pfn(vcpu->kvm, orig_pte->raddr >> PAGE_SHIFT);
@@ -114,6 +124,8 @@ int kvmppc_mmu_map_page(struct kvm_vcpu *vcpu, struct kvmppc_pte *orig_pte)
#error Unknown page size
#endif
+mapped:
+
/* and write the mapping ea -> hpa into the pt */
vcpu->arch.mmu.esid_to_vsid(vcpu, orig_pte->eaddr >> SID_SHIFT, &vsid);
map = find_sid_vsid(vcpu, vsid);
--
1.6.0.2
next prev parent reply other threads:[~2010-06-25 23:25 UTC|newest]
Thread overview: 78+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-06-25 23:24 [PATCH 00/26] KVM PPC PV framework Alexander Graf
2010-06-25 23:24 ` [PATCH 01/26] KVM: PPC: Introduce shared page Alexander Graf
[not found] ` <1277508314-915-2-git-send-email-agraf-l3A5Bk7waGM@public.gmane.org>
2010-06-27 12:12 ` Avi Kivity
[not found] ` <4C274028.7020105-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2010-06-29 9:54 ` Alexander Graf
2010-06-29 10:55 ` Avi Kivity
2010-06-25 23:24 ` [PATCH 03/26] KVM: PPC: Convert DSISR to " Alexander Graf
[not found] ` <1277508314-915-1-git-send-email-agraf-l3A5Bk7waGM@public.gmane.org>
2010-06-25 23:24 ` [PATCH 02/26] KVM: PPC: Convert MSR " Alexander Graf
[not found] ` <1277508314-915-3-git-send-email-agraf-l3A5Bk7waGM@public.gmane.org>
2010-06-27 8:16 ` Avi Kivity
[not found] ` <4C2708EB.9020500-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2010-06-27 9:38 ` Alexander Graf
[not found] ` <651805F1-54AB-466F-8D23-D053D8082177-l3A5Bk7waGM@public.gmane.org>
2010-06-27 9:50 ` Avi Kivity
[not found] ` <4C271EE5.1060401-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2010-06-27 10:40 ` Alexander Graf
2010-06-25 23:24 ` [PATCH 04/26] KVM: PPC: Convert DAR " Alexander Graf
2010-06-25 23:24 ` [PATCH 08/26] KVM: PPC: Add PV guest critical sections Alexander Graf
[not found] ` <1277508314-915-9-git-send-email-agraf-l3A5Bk7waGM@public.gmane.org>
2010-06-27 8:21 ` Avi Kivity
[not found] ` <4C2709F4.10805-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2010-06-27 9:40 ` Alexander Graf
2010-06-27 9:52 ` Avi Kivity
2010-06-27 10:33 ` Alexander Graf
[not found] ` <DFC77851-3BE7-4746-93DE-287D5E27EF7D-l3A5Bk7waGM@public.gmane.org>
2010-06-27 10:59 ` Avi Kivity
[not found] ` <4C272F08.8090709-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2010-06-27 11:49 ` Alexander Graf
2010-06-27 11:53 ` Avi Kivity
[not found] ` <4C273BAD.2090305-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2010-06-27 12:06 ` Alexander Graf
2010-06-27 22:03 ` Benjamin Herrenschmidt
2010-06-27 10:03 ` Avi Kivity
[not found] ` <4C27220D.7090508-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2010-06-27 10:35 ` Alexander Graf
2010-06-25 23:25 ` Alexander Graf [this message]
2010-06-25 23:25 ` [PATCH 14/26] KVM: PPC: Magic Page BookE support Alexander Graf
2010-06-25 23:25 ` [PATCH 17/26] KVM: PPC: Generic KVM PV guest support Alexander Graf
2010-06-25 23:25 ` [PATCH 19/26] KVM: PPC: PV instructions to loads and stores Alexander Graf
2010-06-25 23:25 ` [PATCH 20/26] KVM: PPC: PV tlbsync to nop Alexander Graf
2010-06-25 23:25 ` [PATCH 22/26] KVM: PPC: PV assembler helpers Alexander Graf
2010-06-25 23:25 ` [PATCH 24/26] KVM: PPC: PV mtmsrd L=0 and mtmsr Alexander Graf
[not found] ` <1277508314-915-25-git-send-email-agraf-l3A5Bk7waGM@public.gmane.org>
2010-06-26 17:03 ` Segher Boessenkool
[not found] ` <EDF0A567-C440-4F1B-9AF5-2E0F8203D566-XVmvHMARGAS8U2dJNN8I7kB+6BGkLq7r@public.gmane.org>
2010-06-27 9:10 ` Alexander Graf
2010-06-29 7:37 ` Segher Boessenkool
2010-06-25 23:25 ` [PATCH 26/26] KVM: PPC: Add Documentation about PV interface Alexander Graf
2010-06-27 8:14 ` Avi Kivity
[not found] ` <4C270876.2050806-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2010-06-27 9:33 ` Alexander Graf
2010-06-28 7:18 ` Milton Miller
[not found] ` <1277709531_13308-qolCYAvwHvWlVDA81TZ6el6hYfS7NtTn@public.gmane.org>
2010-06-28 7:49 ` Alexander Graf
[not found] ` <92F4A3F3-A89F-418D-BD4D-66E2489F2E42-l3A5Bk7waGM@public.gmane.org>
2010-06-28 8:13 ` Avi Kivity
[not found] ` <4C285991.1050303-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2010-06-28 8:21 ` Alexander Graf
[not found] ` <4330E5DC-63C5-40EA-9E99-34EE58074D1A-l3A5Bk7waGM@public.gmane.org>
2010-06-28 8:32 ` Avi Kivity
[not found] ` <1277508314-915-27-git-send-email-agraf-l3A5Bk7waGM@public.gmane.org>
2010-06-27 8:34 ` Avi Kivity
2010-06-27 9:49 ` Alexander Graf
2010-06-25 23:24 ` [PATCH 05/26] KVM: PPC: Convert SRR0 and SRR1 to shared page Alexander Graf
2010-06-25 23:24 ` [PATCH 06/26] KVM: PPC: Convert SPRG[0-4] " Alexander Graf
2010-06-25 23:24 ` [PATCH 07/26] KVM: PPC: Implement hypervisor interface Alexander Graf
2010-06-25 23:24 ` [PATCH 09/26] KVM: PPC: Add PV guest scratch registers Alexander Graf
[not found] ` <1277508314-915-10-git-send-email-agraf-l3A5Bk7waGM@public.gmane.org>
2010-06-27 8:22 ` Avi Kivity
[not found] ` <4C270A34.4020706-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2010-06-27 9:41 ` Alexander Graf
[not found] ` <27BB673F-F34E-4CC6-A22D-02CF95E7529F-l3A5Bk7waGM@public.gmane.org>
2010-06-27 9:53 ` Avi Kivity
2010-06-25 23:24 ` [PATCH 10/26] KVM: PPC: Tell guest about pending interrupts Alexander Graf
2010-06-25 23:24 ` [PATCH 11/26] KVM: PPC: Make RMO a define Alexander Graf
[not found] ` <1277508314-915-12-git-send-email-agraf-l3A5Bk7waGM@public.gmane.org>
2010-06-26 16:52 ` Segher Boessenkool
[not found] ` <2078D8A9-7D36-4B5D-A779-9BBAB545A53D-XVmvHMARGAS8U2dJNN8I7kB+6BGkLq7r@public.gmane.org>
2010-06-27 9:08 ` Alexander Graf
[not found] ` <9B84B663-7DC6-4543-96F7-23F77106065C-l3A5Bk7waGM@public.gmane.org>
2010-06-29 7:32 ` Segher Boessenkool
[not found] ` <07830DA6-1B53-4E84-A0E2-8449289C71F1-XVmvHMARGAS8U2dJNN8I7kB+6BGkLq7r@public.gmane.org>
2010-06-29 7:39 ` Alexander Graf
2010-06-29 7:52 ` Segher Boessenkool
[not found] ` <1550A5F0-3A22-48ED-8251-96328E2FEAE3-XVmvHMARGAS8U2dJNN8I7kB+6BGkLq7r@public.gmane.org>
2010-06-29 8:04 ` Alexander Graf
2010-06-25 23:25 ` [PATCH 12/26] KVM: PPC: First magic page steps Alexander Graf
[not found] ` <1277508314-915-13-git-send-email-agraf-l3A5Bk7waGM@public.gmane.org>
2010-06-27 8:24 ` Avi Kivity
2010-06-27 9:44 ` Alexander Graf
2010-06-25 23:25 ` [PATCH 15/26] KVM: PPC: Expose magic page support to guest Alexander Graf
2010-06-25 23:25 ` [PATCH 16/26] KVM: Move kvm_guest_init out of generic code Alexander Graf
2010-06-25 23:25 ` [PATCH 18/26] KVM: PPC: KVM PV guest stubs Alexander Graf
[not found] ` <1277508314-915-19-git-send-email-agraf-l3A5Bk7waGM@public.gmane.org>
2010-06-27 8:28 ` Avi Kivity
[not found] ` <4C270BB8.60404-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2010-06-27 9:47 ` Alexander Graf
2010-06-27 10:16 ` Avi Kivity
[not found] ` <4C272503.7030605-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2010-06-27 10:38 ` Alexander Graf
2010-06-27 22:04 ` Benjamin Herrenschmidt
2010-06-28 4:39 ` Matt Evans
[not found] ` <4C282794.1040209-mnsaURCQ41sdnm+yROfE0A@public.gmane.org>
2010-06-28 6:33 ` Alexander Graf
2010-06-28 8:15 ` Avi Kivity
[not found] ` <4C285A13.8070208-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2010-06-28 8:23 ` Alexander Graf
[not found] ` <AD79CD04-74CF-49B9-BACC-4C190DF5214A-l3A5Bk7waGM@public.gmane.org>
2010-06-28 8:33 ` Avi Kivity
2010-06-25 23:25 ` [PATCH 21/26] KVM: PPC: Introduce kvm_tmp framework Alexander Graf
2010-06-25 23:25 ` [PATCH 23/26] KVM: PPC: PV mtmsrd L=1 Alexander Graf
2010-06-25 23:25 ` [PATCH 25/26] KVM: PPC: PV wrteei Alexander Graf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1277508314-915-14-git-send-email-agraf@suse.de \
--to=agraf-l3a5bk7wagm@public.gmane.org \
--cc=kvm-ppc-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=kvm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linuxppc-dev-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox