qemu-ppc
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-ppc] [PATCH V2 05/10] target/ppc: Add ibm, processor-radix-AP-enc


From: Suraj Jitindar Singh
Subject: [Qemu-ppc] [PATCH V2 05/10] target/ppc: Add ibm, processor-radix-AP-encodings for TCG
Date: Wed, 1 Mar 2017 18:12:56 +1100

The ibm,processor-radix-AP-encodings device tree property of the cpu node
is used to specify the radix mode supported page sizes of the processor
to the guest os. Contained in the top 3 bits of the msb is the actual
page size (AP) encoding associated with the corresponding radix mode
supported page size. Add this property for a TCG guest, note the TCG code
is capable of translating any format so just add the 4 default page sizes.

The ibm,processor-radix-AP-encodings device tree property is defined as:
One to n cells in ascending order of radix mode supported page sizes
encoded as BE ints (32bit on ppc) in the form:
0bxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
- 0bxxx -> AP encoding
- 0byyyyyyyyyyyyyyyyyyyyyyyyyyyyy -> supported page size encoded as a shift

Signed-off-by: Suraj Jitindar Singh <address@hidden>

---

V1 -> V2:
 - Rework to use the interfaces introduced by the KVM code path
---
 target/ppc/Makefile.objs    |  1 +
 target/ppc/kvm.c            |  2 --
 target/ppc/mmu-radix64.c    | 51 +++++++++++++++++++++++++++++++++++++++++++++
 target/ppc/mmu-radix64.h    | 14 +++++++++++++
 target/ppc/translate_init.c |  2 ++
 5 files changed, 68 insertions(+), 2 deletions(-)
 create mode 100644 target/ppc/mmu-radix64.c
 create mode 100644 target/ppc/mmu-radix64.h

diff --git a/target/ppc/Makefile.objs b/target/ppc/Makefile.objs
index ed2174c..5bc39c4 100644
--- a/target/ppc/Makefile.objs
+++ b/target/ppc/Makefile.objs
@@ -4,6 +4,7 @@ obj-y += translate.o
 ifeq ($(CONFIG_SOFTMMU),y)
 obj-y += machine.o mmu_helper.o mmu-hash32.o monitor.o
 obj-$(TARGET_PPC64) += mmu-hash64.o mmu-book3s-v3.o arch_dump.o compat.o
+obj-$(TARGET_PPC64) += mmu-radix64.o
 endif
 obj-$(CONFIG_KVM) += kvm.o
 obj-$(call lnot,$(CONFIG_KVM)) += kvm-stub.o
diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
index 75cb8e6..b11abfd 100644
--- a/target/ppc/kvm.c
+++ b/target/ppc/kvm.c
@@ -2425,8 +2425,6 @@ static void kvmppc_host_cpu_class_init(ObjectClass *oc, 
void *data)
         pcc->l1_icache_size = icache_size;
     }
 
-    pcc->radix_page_info = kvm_enabled() ? kvm_get_radix_page_info() : NULL;
-
     /* Reason: kvmppc_host_cpu_initfn() dies when !kvm_enabled() */
     dc->cannot_destroy_with_object_finalize_yet = true;
 }
diff --git a/target/ppc/mmu-radix64.c b/target/ppc/mmu-radix64.c
new file mode 100644
index 0000000..92025cf
--- /dev/null
+++ b/target/ppc/mmu-radix64.c
@@ -0,0 +1,51 @@
+/*
+ *  PowerPC Radix MMU mulation helpers for QEMU.
+ *
+ *  Copyright (c) 2016 Suraj Jitindar Singh, IBM Corporation
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+#include "qemu/osdep.h"
+#include "qapi/error.h"
+#include "cpu.h"
+#include "exec/exec-all.h"
+#include "exec/helper-proto.h"
+#include "qemu/error-report.h"
+#include "sysemu/kvm.h"
+#include "kvm_ppc.h"
+#include "exec/log.h"
+#include "mmu-radix64.h"
+#include "mmu-book3s-v3.h"
+
+/*
+ * Radix pg sizes and AP encodings for dt node ibm,processor-radix-AP-encodings
+ * Encoded as array of int_32s in the form:
+ *  0bxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
+ *  x -> AP encoding
+ *  y -> radix mode supported page size (encoded as a shift)
+ */
+static struct ppc_radix_page_info radix_page_info = {
+    .count = 4,
+    .entries = {
+                0x0000000c, /*  4K - enc: 0x0 */
+                0xa0000010, /* 64K - enc: 0x5 */
+                0x20000015, /*  2M - enc: 0x1 */
+                0x4000001e  /*  1G - enc: 0x2 */
+    }
+};
+
+struct ppc_radix_page_info *ppc_radix64_get_page_info(void)
+{
+    return kvm_enabled() ? kvm_get_radix_page_info() : &radix_page_info;
+}
diff --git a/target/ppc/mmu-radix64.h b/target/ppc/mmu-radix64.h
new file mode 100644
index 0000000..9bd283c
--- /dev/null
+++ b/target/ppc/mmu-radix64.h
@@ -0,0 +1,14 @@
+#ifndef MMU_RADIX64_H
+#define MMU_RADIX64_H
+
+#ifndef CONFIG_USER_ONLY
+
+#ifdef TARGET_PPC64
+
+struct ppc_radix_page_info *ppc_radix64_get_page_info(void);
+
+#endif /* TARGET_PPC64 */
+
+#endif /* CONFIG_USER_ONLY */
+
+#endif /* MMU_RADIX64_H */
diff --git a/target/ppc/translate_init.c b/target/ppc/translate_init.c
index d8f5b61..b2dc452 100644
--- a/target/ppc/translate_init.c
+++ b/target/ppc/translate_init.c
@@ -33,6 +33,7 @@
 #include "hw/qdev-properties.h"
 #include "hw/ppc/ppc.h"
 #include "mmu-book3s-v3.h"
+#include "mmu-radix64.h"
 
 //#define PPC_DUMP_CPU
 //#define PPC_DEBUG_SPR
@@ -8959,6 +8960,7 @@ POWERPC_FAMILY(POWER9)(ObjectClass *oc, void *data)
     pcc->handle_mmu_fault = ppc64_v3_handle_mmu_fault;
     /* segment page size remain the same */
     pcc->sps = &POWER7_POWER8_sps;
+    pcc->radix_page_info = ppc_radix64_get_page_info();
 #endif
     pcc->excp_model = POWERPC_EXCP_POWER8;
     pcc->bus_model = PPC_FLAGS_INPUT_POWER7;
-- 
2.5.5




reply via email to

[Prev in Thread] Current Thread [Next in Thread]