mirror of https://github.com/xemu-project/xemu.git
target/ppc: Improve logging in Radix MMU
Signed-off-by: Cédric Le Goater <clg@kaod.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20211222071002.1568894-1-clg@kaod.org> Signed-off-by: Cédric Le Goater <clg@kaod.org>
This commit is contained in:
parent
9747d061ca
commit
932de56970
|
@ -97,12 +97,22 @@ static void ppc_radix64_raise_segi(PowerPCCPU *cpu, MMUAccessType access_type,
|
||||||
env->error_code = 0;
|
env->error_code = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline const char *access_str(MMUAccessType access_type)
|
||||||
|
{
|
||||||
|
return access_type == MMU_DATA_LOAD ? "reading" :
|
||||||
|
(access_type == MMU_DATA_STORE ? "writing" : "execute");
|
||||||
|
}
|
||||||
|
|
||||||
static void ppc_radix64_raise_si(PowerPCCPU *cpu, MMUAccessType access_type,
|
static void ppc_radix64_raise_si(PowerPCCPU *cpu, MMUAccessType access_type,
|
||||||
vaddr eaddr, uint32_t cause)
|
vaddr eaddr, uint32_t cause)
|
||||||
{
|
{
|
||||||
CPUState *cs = CPU(cpu);
|
CPUState *cs = CPU(cpu);
|
||||||
CPUPPCState *env = &cpu->env;
|
CPUPPCState *env = &cpu->env;
|
||||||
|
|
||||||
|
qemu_log_mask(CPU_LOG_MMU, "%s for %s @0x%"VADDR_PRIx" cause %08x\n",
|
||||||
|
__func__, access_str(access_type),
|
||||||
|
eaddr, cause);
|
||||||
|
|
||||||
switch (access_type) {
|
switch (access_type) {
|
||||||
case MMU_INST_FETCH:
|
case MMU_INST_FETCH:
|
||||||
/* Instruction Storage Interrupt */
|
/* Instruction Storage Interrupt */
|
||||||
|
@ -130,6 +140,11 @@ static void ppc_radix64_raise_hsi(PowerPCCPU *cpu, MMUAccessType access_type,
|
||||||
CPUState *cs = CPU(cpu);
|
CPUState *cs = CPU(cpu);
|
||||||
CPUPPCState *env = &cpu->env;
|
CPUPPCState *env = &cpu->env;
|
||||||
|
|
||||||
|
qemu_log_mask(CPU_LOG_MMU, "%s for %s @0x%"VADDR_PRIx" 0x%"
|
||||||
|
HWADDR_PRIx" cause %08x\n",
|
||||||
|
__func__, access_str(access_type),
|
||||||
|
eaddr, g_raddr, cause);
|
||||||
|
|
||||||
switch (access_type) {
|
switch (access_type) {
|
||||||
case MMU_INST_FETCH:
|
case MMU_INST_FETCH:
|
||||||
/* H Instruction Storage Interrupt */
|
/* H Instruction Storage Interrupt */
|
||||||
|
@ -306,6 +321,15 @@ static int ppc_radix64_partition_scoped_xlate(PowerPCCPU *cpu,
|
||||||
hwaddr pte_addr;
|
hwaddr pte_addr;
|
||||||
uint64_t pte;
|
uint64_t pte;
|
||||||
|
|
||||||
|
qemu_log_mask(CPU_LOG_MMU, "%s for %s @0x%"VADDR_PRIx
|
||||||
|
" mmu_idx %u (prot %c%c%c) 0x%"HWADDR_PRIx"\n",
|
||||||
|
__func__, access_str(access_type),
|
||||||
|
eaddr, mmu_idx,
|
||||||
|
*h_prot & PAGE_READ ? 'r' : '-',
|
||||||
|
*h_prot & PAGE_WRITE ? 'w' : '-',
|
||||||
|
*h_prot & PAGE_EXEC ? 'x' : '-',
|
||||||
|
g_raddr);
|
||||||
|
|
||||||
*h_page_size = PRTBE_R_GET_RTS(pate.dw0);
|
*h_page_size = PRTBE_R_GET_RTS(pate.dw0);
|
||||||
/* No valid pte or access denied due to protection */
|
/* No valid pte or access denied due to protection */
|
||||||
if (ppc_radix64_walk_tree(CPU(cpu)->as, g_raddr, pate.dw0 & PRTBE_R_RPDB,
|
if (ppc_radix64_walk_tree(CPU(cpu)->as, g_raddr, pate.dw0 & PRTBE_R_RPDB,
|
||||||
|
@ -343,6 +367,11 @@ static int ppc_radix64_process_scoped_xlate(PowerPCCPU *cpu,
|
||||||
hwaddr h_raddr, pte_addr;
|
hwaddr h_raddr, pte_addr;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
qemu_log_mask(CPU_LOG_MMU, "%s for %s @0x%"VADDR_PRIx
|
||||||
|
" mmu_idx %u pid %"PRIu64"\n",
|
||||||
|
__func__, access_str(access_type),
|
||||||
|
eaddr, mmu_idx, pid);
|
||||||
|
|
||||||
/* Index Process Table by PID to Find Corresponding Process Table Entry */
|
/* Index Process Table by PID to Find Corresponding Process Table Entry */
|
||||||
offset = pid * sizeof(struct prtb_entry);
|
offset = pid * sizeof(struct prtb_entry);
|
||||||
size = 1ULL << ((pate.dw1 & PATE1_R_PRTS) + 12);
|
size = 1ULL << ((pate.dw1 & PATE1_R_PRTS) + 12);
|
||||||
|
@ -468,9 +497,10 @@ static int ppc_radix64_process_scoped_xlate(PowerPCCPU *cpu,
|
||||||
* | = On | Process Scoped | Scoped |
|
* | = On | Process Scoped | Scoped |
|
||||||
* +-------------+----------------+---------------+
|
* +-------------+----------------+---------------+
|
||||||
*/
|
*/
|
||||||
bool ppc_radix64_xlate(PowerPCCPU *cpu, vaddr eaddr, MMUAccessType access_type,
|
static bool ppc_radix64_xlate_impl(PowerPCCPU *cpu, vaddr eaddr,
|
||||||
hwaddr *raddr, int *psizep, int *protp, int mmu_idx,
|
MMUAccessType access_type, hwaddr *raddr,
|
||||||
bool guest_visible)
|
int *psizep, int *protp, int mmu_idx,
|
||||||
|
bool guest_visible)
|
||||||
{
|
{
|
||||||
CPUPPCState *env = &cpu->env;
|
CPUPPCState *env = &cpu->env;
|
||||||
uint64_t lpid, pid;
|
uint64_t lpid, pid;
|
||||||
|
@ -588,3 +618,22 @@ bool ppc_radix64_xlate(PowerPCCPU *cpu, vaddr eaddr, MMUAccessType access_type,
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ppc_radix64_xlate(PowerPCCPU *cpu, vaddr eaddr, MMUAccessType access_type,
|
||||||
|
hwaddr *raddrp, int *psizep, int *protp, int mmu_idx,
|
||||||
|
bool guest_visible)
|
||||||
|
{
|
||||||
|
bool ret = ppc_radix64_xlate_impl(cpu, eaddr, access_type, raddrp,
|
||||||
|
psizep, protp, mmu_idx, guest_visible);
|
||||||
|
|
||||||
|
qemu_log_mask(CPU_LOG_MMU, "%s for %s @0x%"VADDR_PRIx
|
||||||
|
" mmu_idx %u (prot %c%c%c) -> 0x%"HWADDR_PRIx"\n",
|
||||||
|
__func__, access_str(access_type),
|
||||||
|
eaddr, mmu_idx,
|
||||||
|
*protp & PAGE_READ ? 'r' : '-',
|
||||||
|
*protp & PAGE_WRITE ? 'w' : '-',
|
||||||
|
*protp & PAGE_EXEC ? 'x' : '-',
|
||||||
|
*raddrp);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue