yeahuh / rpms / qemu-kvm

Forked from rpms/qemu-kvm 2 years ago
Clone
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