|
|
76daa3 |
From e5b6053e3055a79d9275e1cc4b48f12beaa851dc Mon Sep 17 00:00:00 2001
|
|
|
76daa3 |
From: Laurent Vivier <lvivier@redhat.com>
|
|
|
76daa3 |
Date: Thu, 13 Jul 2017 16:36:29 +0200
|
|
|
76daa3 |
Subject: [PATCH 5/6] target/ppc: Refactor tcg radix mmu code
|
|
|
76daa3 |
|
|
|
76daa3 |
RH-Author: Laurent Vivier <lvivier@redhat.com>
|
|
|
76daa3 |
Message-id: <20170713163630.24848-4-lvivier@redhat.com>
|
|
|
76daa3 |
Patchwork-id: 75765
|
|
|
76daa3 |
O-Subject: [RHEL-ALT-7.4 qemu-kvm PATCH 3/4] target/ppc: Refactor tcg radix mmu code
|
|
|
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 |
The mmu-radix64.c file implements functions to enable the radix mmu
|
|
|
76daa3 |
emulation in tcg mode. There is a function ppc_radix64_walk_tree() which
|
|
|
76daa3 |
performs the radix tree walk and also implicitly checks the pte
|
|
|
76daa3 |
protection.
|
|
|
76daa3 |
|
|
|
76daa3 |
Move the protection checking of the pte from the ppc_radix64_walk_tree()
|
|
|
76daa3 |
function into the caller. This means the ppc_radix64_walk_tree() function
|
|
|
76daa3 |
can be used without protection checking which is useful for debugging.
|
|
|
76daa3 |
|
|
|
76daa3 |
ppc_radix64_walk_tree() no longer needs to take the rwx and prot variables.
|
|
|
76daa3 |
|
|
|
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 6a042827b638dc73da6a72c72596f5be80bd4581)
|
|
|
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 | 22 ++++++++--------------
|
|
|
76daa3 |
1 file changed, 8 insertions(+), 14 deletions(-)
|
|
|
76daa3 |
|
|
|
76daa3 |
diff --git a/target/ppc/mmu-radix64.c b/target/ppc/mmu-radix64.c
|
|
|
76daa3 |
index 69fde65..1a650fd 100644
|
|
|
76daa3 |
--- a/target/ppc/mmu-radix64.c
|
|
|
76daa3 |
+++ b/target/ppc/mmu-radix64.c
|
|
|
76daa3 |
@@ -147,11 +147,10 @@ static void ppc_radix64_set_rc(PowerPCCPU *cpu, int rwx, uint64_t pte,
|
|
|
76daa3 |
}
|
|
|
76daa3 |
}
|
|
|
76daa3 |
|
|
|
76daa3 |
-static uint64_t ppc_radix64_walk_tree(PowerPCCPU *cpu, int rwx, vaddr eaddr,
|
|
|
76daa3 |
+static uint64_t ppc_radix64_walk_tree(PowerPCCPU *cpu, vaddr eaddr,
|
|
|
76daa3 |
uint64_t base_addr, uint64_t nls,
|
|
|
76daa3 |
hwaddr *raddr, int *psize,
|
|
|
76daa3 |
- int *fault_cause, int *prot,
|
|
|
76daa3 |
- hwaddr *pte_addr)
|
|
|
76daa3 |
+ int *fault_cause, hwaddr *pte_addr)
|
|
|
76daa3 |
{
|
|
|
76daa3 |
CPUState *cs = CPU(cpu);
|
|
|
76daa3 |
uint64_t index, pde;
|
|
|
76daa3 |
@@ -177,10 +176,6 @@ static uint64_t ppc_radix64_walk_tree(PowerPCCPU *cpu, int rwx, vaddr eaddr,
|
|
|
76daa3 |
uint64_t rpn = pde & R_PTE_RPN;
|
|
|
76daa3 |
uint64_t mask = (1UL << *psize) - 1;
|
|
|
76daa3 |
|
|
|
76daa3 |
- if (ppc_radix64_check_prot(cpu, rwx, pde, fault_cause, prot)) {
|
|
|
76daa3 |
- return 0; /* Protection Denied Access */
|
|
|
76daa3 |
- }
|
|
|
76daa3 |
-
|
|
|
76daa3 |
/* Or high bits of rpn and low bits to ea to form whole real addr */
|
|
|
76daa3 |
*raddr = (rpn & ~mask) | (eaddr & mask);
|
|
|
76daa3 |
*pte_addr = base_addr + (index * sizeof(pde));
|
|
|
76daa3 |
@@ -188,9 +183,8 @@ static uint64_t ppc_radix64_walk_tree(PowerPCCPU *cpu, int rwx, vaddr eaddr,
|
|
|
76daa3 |
}
|
|
|
76daa3 |
|
|
|
76daa3 |
/* Next Level of Radix Tree */
|
|
|
76daa3 |
- return ppc_radix64_walk_tree(cpu, rwx, eaddr, pde & R_PDE_NLB,
|
|
|
76daa3 |
- pde & R_PDE_NLS, raddr, psize,
|
|
|
76daa3 |
- fault_cause, prot, pte_addr);
|
|
|
76daa3 |
+ return ppc_radix64_walk_tree(cpu, eaddr, pde & R_PDE_NLB, pde & R_PDE_NLS,
|
|
|
76daa3 |
+ raddr, psize, fault_cause, pte_addr);
|
|
|
76daa3 |
}
|
|
|
76daa3 |
|
|
|
76daa3 |
int ppc_radix64_handle_mmu_fault(PowerPCCPU *cpu, vaddr eaddr, int rwx,
|
|
|
76daa3 |
@@ -241,11 +235,11 @@ int ppc_radix64_handle_mmu_fault(PowerPCCPU *cpu, vaddr eaddr, int rwx,
|
|
|
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, rwx, eaddr & R_EADDR_MASK,
|
|
|
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, &prot,
|
|
|
76daa3 |
- &pte_addr);
|
|
|
76daa3 |
- if (!pte) {
|
|
|
76daa3 |
+ &raddr, &page_size, &fault_cause, &pte_addr);
|
|
|
76daa3 |
+ if (!pte || ppc_radix64_check_prot(cpu, rwx, pte, &fault_cause, &prot)) {
|
|
|
76daa3 |
+ /* Couldn't get pte or access denied due to protection */
|
|
|
76daa3 |
ppc_radix64_raise_si(cpu, rwx, eaddr, fault_cause);
|
|
|
76daa3 |
return 1;
|
|
|
76daa3 |
}
|
|
|
76daa3 |
--
|
|
|
76daa3 |
1.8.3.1
|
|
|
76daa3 |
|