|
|
76daa3 |
From d5da2921f38e85ea27932a26764156df5ebdaad9 Mon Sep 17 00:00:00 2001
|
|
|
76daa3 |
From: Laurent Vivier <lvivier@redhat.com>
|
|
|
76daa3 |
Date: Thu, 13 Jul 2017 16:36:30 +0200
|
|
|
76daa3 |
Subject: [PATCH 6/6] target/ppc: Add debug function for radix mmu translation
|
|
|
76daa3 |
|
|
|
76daa3 |
RH-Author: Laurent Vivier <lvivier@redhat.com>
|
|
|
76daa3 |
Message-id: <20170713163630.24848-5-lvivier@redhat.com>
|
|
|
76daa3 |
Patchwork-id: 75766
|
|
|
76daa3 |
O-Subject: [RHEL-ALT-7.4 qemu-kvm PATCH 4/4] target/ppc: Add debug function for radix mmu translation
|
|
|
76daa3 |
Bugzilla: 1470558
|
|
|
76daa3 |
RH-Acked-by: David Gibson <dgibson@redhat.com>
|
|
|
76daa3 |
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
|
|
76daa3 |
RH-Acked-by: Suraj Jitindar Singh <sursingh@redhat.com>
|
|
|
76daa3 |
|
|
|
76daa3 |
From: Suraj Jitindar Singh <sjitindarsingh@gmail.com>
|
|
|
76daa3 |
|
|
|
76daa3 |
In target/ppc/mmu-hash64.c there already exists the function
|
|
|
76daa3 |
ppc_hash64_get_phys_page_debug() to get the physical (real) address for
|
|
|
76daa3 |
a given effective address in hash mode.
|
|
|
76daa3 |
|
|
|
76daa3 |
Implement the function ppc_radix64_get_phys_page_debug() to allow a real
|
|
|
76daa3 |
address to be obtained for a given effective address in radix mode.
|
|
|
76daa3 |
This is used when a debugger is attached to qemu.
|
|
|
76daa3 |
|
|
|
76daa3 |
Previously we just had a comment saying this is unimplemented which then
|
|
|
76daa3 |
fell through to the default case and caused an abort due to
|
|
|
76daa3 |
unrecognised mmu model as the default had no case for the V3 mmu, which
|
|
|
76daa3 |
was misleading at best.
|
|
|
76daa3 |
|
|
|
76daa3 |
We reuse ppc_radix64_walk_tree() which is used by the radix fault
|
|
|
76daa3 |
handler since the process of walking the radix tree is identical.
|
|
|
76daa3 |
|
|
|
76daa3 |
Reported-by: Balbir Singh <bsingharora@gmail.com>
|
|
|
76daa3 |
Signed-off-by: Suraj Jitindar Singh <sjitindarsingh@gmail.com>
|
|
|
76daa3 |
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
|
|
|
76daa3 |
(cherry picked from commit 95cb0657766a495ca54caa15ab9feb5681c20f15)
|
|
|
76daa3 |
Signed-off-by: Laurent Vivier <lvivier@redhat.com>
|
|
|
76daa3 |
|
|
|
76daa3 |
BZ: https://bugzilla.redhat.com/show_bug.cgi?id=1470558
|
|
|
76daa3 |
BREW: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=13654102
|
|
|
76daa3 |
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
76daa3 |
---
|
|
|
76daa3 |
target/ppc/mmu-radix64.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
|
|
|
76daa3 |
target/ppc/mmu-radix64.h | 1 +
|
|
|
76daa3 |
target/ppc/mmu_helper.c | 3 ++-
|
|
|
76daa3 |
3 files changed, 48 insertions(+), 1 deletion(-)
|
|
|
76daa3 |
|
|
|
76daa3 |
diff --git a/target/ppc/mmu-radix64.c b/target/ppc/mmu-radix64.c
|
|
|
76daa3 |
index 1a650fd..bbd37e3 100644
|
|
|
76daa3 |
--- a/target/ppc/mmu-radix64.c
|
|
|
76daa3 |
+++ b/target/ppc/mmu-radix64.c
|
|
|
76daa3 |
@@ -251,3 +251,48 @@ int ppc_radix64_handle_mmu_fault(PowerPCCPU *cpu, vaddr eaddr, int rwx,
|
|
|
76daa3 |
prot, mmu_idx, 1UL << page_size);
|
|
|
76daa3 |
return 0;
|
|
|
76daa3 |
}
|
|
|
76daa3 |
+
|
|
|
76daa3 |
+hwaddr ppc_radix64_get_phys_page_debug(PowerPCCPU *cpu, target_ulong eaddr)
|
|
|
76daa3 |
+{
|
|
|
76daa3 |
+ CPUState *cs = CPU(cpu);
|
|
|
76daa3 |
+ CPUPPCState *env = &cpu->env;
|
|
|
76daa3 |
+ PPCVirtualHypervisorClass *vhc =
|
|
|
76daa3 |
+ PPC_VIRTUAL_HYPERVISOR_GET_CLASS(cpu->vhyp);
|
|
|
76daa3 |
+ hwaddr raddr, pte_addr;
|
|
|
76daa3 |
+ uint64_t lpid = 0, pid = 0, offset, size, patbe, prtbe0, pte;
|
|
|
76daa3 |
+ int page_size, fault_cause = 0;
|
|
|
76daa3 |
+
|
|
|
76daa3 |
+ /* Handle Real Mode */
|
|
|
76daa3 |
+ if (msr_dr == 0) {
|
|
|
76daa3 |
+ /* In real mode top 4 effective addr bits (mostly) ignored */
|
|
|
76daa3 |
+ return eaddr & 0x0FFFFFFFFFFFFFFFULL;
|
|
|
76daa3 |
+ }
|
|
|
76daa3 |
+
|
|
|
76daa3 |
+ /* Virtual Mode Access - get the fully qualified address */
|
|
|
76daa3 |
+ if (!ppc_radix64_get_fully_qualified_addr(env, eaddr, &lpid, &pid)) {
|
|
|
76daa3 |
+ return -1;
|
|
|
76daa3 |
+ }
|
|
|
76daa3 |
+
|
|
|
76daa3 |
+ /* Get Process Table */
|
|
|
76daa3 |
+ patbe = vhc->get_patbe(cpu->vhyp);
|
|
|
76daa3 |
+
|
|
|
76daa3 |
+ /* Index Process Table by PID to Find Corresponding Process Table Entry */
|
|
|
76daa3 |
+ offset = pid * sizeof(struct prtb_entry);
|
|
|
76daa3 |
+ size = 1ULL << ((patbe & PATBE1_R_PRTS) + 12);
|
|
|
76daa3 |
+ if (offset >= size) {
|
|
|
76daa3 |
+ /* offset exceeds size of the process table */
|
|
|
76daa3 |
+ return -1;
|
|
|
76daa3 |
+ }
|
|
|
76daa3 |
+ prtbe0 = ldq_phys(cs->as, (patbe & PATBE1_R_PRTB) + offset);
|
|
|
76daa3 |
+
|
|
|
76daa3 |
+ /* Walk Radix Tree from Process Table Entry to Convert EA to RA */
|
|
|
76daa3 |
+ page_size = PRTBE_R_GET_RTS(prtbe0);
|
|
|
76daa3 |
+ pte = ppc_radix64_walk_tree(cpu, eaddr & R_EADDR_MASK,
|
|
|
76daa3 |
+ prtbe0 & PRTBE_R_RPDB, prtbe0 & PRTBE_R_RPDS,
|
|
|
76daa3 |
+ &raddr, &page_size, &fault_cause, &pte_addr);
|
|
|
76daa3 |
+ if (!pte) {
|
|
|
76daa3 |
+ return -1;
|
|
|
76daa3 |
+ }
|
|
|
76daa3 |
+
|
|
|
76daa3 |
+ return raddr & TARGET_PAGE_MASK;
|
|
|
76daa3 |
+}
|
|
|
76daa3 |
diff --git a/target/ppc/mmu-radix64.h b/target/ppc/mmu-radix64.h
|
|
|
76daa3 |
index 1d5c7cf..0ecf063 100644
|
|
|
76daa3 |
--- a/target/ppc/mmu-radix64.h
|
|
|
76daa3 |
+++ b/target/ppc/mmu-radix64.h
|
|
|
76daa3 |
@@ -46,6 +46,7 @@
|
|
|
76daa3 |
|
|
|
76daa3 |
int ppc_radix64_handle_mmu_fault(PowerPCCPU *cpu, vaddr eaddr, int rwx,
|
|
|
76daa3 |
int mmu_idx);
|
|
|
76daa3 |
+hwaddr ppc_radix64_get_phys_page_debug(PowerPCCPU *cpu, target_ulong addr);
|
|
|
76daa3 |
|
|
|
76daa3 |
static inline int ppc_radix64_get_prot_eaa(uint64_t pte)
|
|
|
76daa3 |
{
|
|
|
76daa3 |
diff --git a/target/ppc/mmu_helper.c b/target/ppc/mmu_helper.c
|
|
|
76daa3 |
index 65d1c86..b7b9088 100644
|
|
|
76daa3 |
--- a/target/ppc/mmu_helper.c
|
|
|
76daa3 |
+++ b/target/ppc/mmu_helper.c
|
|
|
76daa3 |
@@ -30,6 +30,7 @@
|
|
|
76daa3 |
#include "helper_regs.h"
|
|
|
76daa3 |
#include "qemu/error-report.h"
|
|
|
76daa3 |
#include "mmu-book3s-v3.h"
|
|
|
76daa3 |
+#include "mmu-radix64.h"
|
|
|
76daa3 |
|
|
|
76daa3 |
//#define DEBUG_MMU
|
|
|
76daa3 |
//#define DEBUG_BATS
|
|
|
76daa3 |
@@ -1432,7 +1433,7 @@ hwaddr ppc_cpu_get_phys_page_debug(CPUState *cs, vaddr addr)
|
|
|
76daa3 |
return ppc_hash64_get_phys_page_debug(cpu, addr);
|
|
|
76daa3 |
case POWERPC_MMU_VER_3_00:
|
|
|
76daa3 |
if (ppc64_radix_guest(ppc_env_get_cpu(env))) {
|
|
|
76daa3 |
- /* TODO - Unsupported */
|
|
|
76daa3 |
+ return ppc_radix64_get_phys_page_debug(cpu, addr);
|
|
|
76daa3 |
} else {
|
|
|
76daa3 |
return ppc_hash64_get_phys_page_debug(cpu, addr);
|
|
|
76daa3 |
}
|
|
|
76daa3 |
--
|
|
|
76daa3 |
1.8.3.1
|
|
|
76daa3 |
|