qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: BALATON Zoltan <balaton@eik.bme.hu>
To: qemu-devel@nongnu.org, qemu-ppc@nongnu.org
Cc: Nicholas Piggin <npiggin@gmail.com>,
	Daniel Henrique Barboza <danielhb413@gmail.com>
Subject: [PATCH v7 21/61] target/ppc/mmu_common.c: Split off BookE handling from ppc_jumbo_xlate()
Date: Mon, 13 May 2024 01:27:54 +0200 (CEST)	[thread overview]
Message-ID: <f9a322b2cf52f7cb4f0d3edcb15a40ff69986770.1715555763.git.balaton@eik.bme.hu> (raw)
In-Reply-To: <cover.1715555763.git.balaton@eik.bme.hu>

Introduce ppc_booke_xlate() to handle BookE and BookE 2.06 cases to
reduce ppc_jumbo_xlate() further.

Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
---
 target/ppc/mmu_common.c | 146 ++++++++++++++++++++++++++--------------
 1 file changed, 96 insertions(+), 50 deletions(-)

diff --git a/target/ppc/mmu_common.c b/target/ppc/mmu_common.c
index 6c6c7c55b6..09a780bb7a 100644
--- a/target/ppc/mmu_common.c
+++ b/target/ppc/mmu_common.c
@@ -1117,21 +1117,9 @@ int get_physical_address_wtlb(CPUPPCState *env, mmu_ctx_t *ctx,
                                      MMUAccessType access_type, int type,
                                      int mmu_idx)
 {
-    bool real_mode;
-
-    if (env->mmu_model == POWERPC_MMU_BOOKE) {
-        return mmubooke_get_physical_address(env, &ctx->raddr, &ctx->prot,
-                                             eaddr, access_type);
-    } else if (env->mmu_model == POWERPC_MMU_BOOKE206) {
-        return mmubooke206_get_physical_address(env, &ctx->raddr, &ctx->prot,
-                                                eaddr, access_type, mmu_idx);
-    }
-
-    real_mode = (type == ACCESS_CODE) ? !FIELD_EX64(env->msr, MSR, IR)
-                                      : !FIELD_EX64(env->msr, MSR, DR);
-    if (real_mode && (env->mmu_model == POWERPC_MMU_SOFT_6xx ||
-                      env->mmu_model == POWERPC_MMU_SOFT_4xx ||
-                      env->mmu_model == POWERPC_MMU_REAL)) {
+    bool real_mode = (type == ACCESS_CODE) ? !FIELD_EX64(env->msr, MSR, IR)
+                                           : !FIELD_EX64(env->msr, MSR, DR);
+    if (real_mode) {
         ctx->raddr = eaddr;
         ctx->prot = PAGE_RWX;
         return 0;
@@ -1205,6 +1193,93 @@ static void booke206_update_mas_tlb_miss(CPUPPCState *env, target_ulong address,
     env->spr[SPR_BOOKE_MAS0] |= env->last_way << MAS0_NV_SHIFT;
 }
 
+static bool ppc_booke_xlate(PowerPCCPU *cpu, vaddr eaddr,
+                            MMUAccessType access_type,
+                            hwaddr *raddrp, int *psizep, int *protp,
+                            int mmu_idx, bool guest_visible)
+{
+    CPUState *cs = CPU(cpu);
+    CPUPPCState *env = &cpu->env;
+    hwaddr raddr;
+    int prot, ret;
+
+    if (env->mmu_model == POWERPC_MMU_BOOKE206) {
+        ret = mmubooke206_get_physical_address(env, &raddr, &prot, eaddr,
+                                               access_type, mmu_idx);
+    } else {
+        ret = mmubooke_get_physical_address(env, &raddr, &prot, eaddr,
+                                            access_type);
+    }
+    if (ret == 0) {
+        *raddrp = raddr;
+        *protp = prot;
+        *psizep = TARGET_PAGE_BITS;
+        return true;
+    } else if (!guest_visible) {
+        return false;
+    }
+
+    log_cpu_state_mask(CPU_LOG_MMU, cs, 0);
+    if (access_type == MMU_INST_FETCH) {
+        switch (ret) {
+        case -1:
+            /* No matches in page tables or TLB */
+            switch (env->mmu_model) {
+            case POWERPC_MMU_BOOKE206:
+                booke206_update_mas_tlb_miss(env, eaddr, access_type, mmu_idx);
+                /* fall through */
+            case POWERPC_MMU_BOOKE:
+                cs->exception_index = POWERPC_EXCP_ITLB;
+                env->error_code = 0;
+                env->spr[SPR_BOOKE_DEAR] = eaddr;
+                env->spr[SPR_BOOKE_ESR] = mmubooke206_esr(mmu_idx, access_type);
+                break;
+            default:
+                g_assert_not_reached();
+            }
+            break;
+        case -2:
+            /* Access rights violation */
+            cs->exception_index = POWERPC_EXCP_ISI;
+            env->error_code = 0;
+            break;
+        case -3:
+            /* No execute protection violation */
+            cs->exception_index = POWERPC_EXCP_ISI;
+            env->spr[SPR_BOOKE_ESR] = 0;
+            env->error_code = 0;
+            break;
+        }
+    } else {
+        switch (ret) {
+        case -1:
+            /* No matches in page tables or TLB */
+            switch (env->mmu_model) {
+            case POWERPC_MMU_BOOKE206:
+                booke206_update_mas_tlb_miss(env, eaddr, access_type, mmu_idx);
+                /* fall through */
+            case POWERPC_MMU_BOOKE:
+                cs->exception_index = POWERPC_EXCP_DTLB;
+                env->error_code = 0;
+                env->spr[SPR_BOOKE_DEAR] = eaddr;
+                env->spr[SPR_BOOKE_ESR] = mmubooke206_esr(mmu_idx, access_type);
+                break;
+            default:
+                g_assert_not_reached();
+            }
+            break;
+        case -2:
+            /* Access rights violation */
+            cs->exception_index = POWERPC_EXCP_DSI;
+            env->error_code = 0;
+            env->spr[SPR_BOOKE_DEAR] = eaddr;
+            env->spr[SPR_BOOKE_ESR] = mmubooke206_esr(mmu_idx, access_type);
+            break;
+        }
+    }
+    return false;
+}
+
 /* Perform address translation */
 /* TODO: Split this by mmu_model. */
 static bool ppc_jumbo_xlate(PowerPCCPU *cpu, vaddr eaddr,
@@ -1257,15 +1332,6 @@ static bool ppc_jumbo_xlate(PowerPCCPU *cpu, vaddr eaddr,
                 env->spr[SPR_40x_DEAR] = eaddr;
                 env->spr[SPR_40x_ESR] = 0x00000000;
                 break;
-            case POWERPC_MMU_BOOKE206:
-                booke206_update_mas_tlb_miss(env, eaddr, access_type, mmu_idx);
-                /* fall through */
-            case POWERPC_MMU_BOOKE:
-                cs->exception_index = POWERPC_EXCP_ITLB;
-                env->error_code = 0;
-                env->spr[SPR_BOOKE_DEAR] = eaddr;
-                env->spr[SPR_BOOKE_ESR] = mmubooke206_esr(mmu_idx, access_type);
-                break;
             case POWERPC_MMU_REAL:
                 cpu_abort(cs, "PowerPC in real mode should never raise "
                               "any MMU exceptions\n");
@@ -1276,23 +1342,12 @@ static bool ppc_jumbo_xlate(PowerPCCPU *cpu, vaddr eaddr,
         case -2:
             /* Access rights violation */
             cs->exception_index = POWERPC_EXCP_ISI;
-            if ((env->mmu_model == POWERPC_MMU_BOOKE) ||
-                (env->mmu_model == POWERPC_MMU_BOOKE206)) {
-                env->error_code = 0;
-            } else {
-                env->error_code = 0x08000000;
-            }
+            env->error_code = 0x08000000;
             break;
         case -3:
             /* No execute protection violation */
-            if ((env->mmu_model == POWERPC_MMU_BOOKE) ||
-                (env->mmu_model == POWERPC_MMU_BOOKE206)) {
-                env->spr[SPR_BOOKE_ESR] = 0x00000000;
-                env->error_code = 0;
-            } else {
-                env->error_code = 0x10000000;
-            }
             cs->exception_index = POWERPC_EXCP_ISI;
+            env->error_code = 0x10000000;
             break;
         case -4:
             /* Direct store exception */
@@ -1333,15 +1388,6 @@ static bool ppc_jumbo_xlate(PowerPCCPU *cpu, vaddr eaddr,
                     env->spr[SPR_40x_ESR] = 0x00000000;
                 }
                 break;
-            case POWERPC_MMU_BOOKE206:
-                booke206_update_mas_tlb_miss(env, eaddr, access_type, mmu_idx);
-                /* fall through */
-            case POWERPC_MMU_BOOKE:
-                cs->exception_index = POWERPC_EXCP_DTLB;
-                env->error_code = 0;
-                env->spr[SPR_BOOKE_DEAR] = eaddr;
-                env->spr[SPR_BOOKE_ESR] = mmubooke206_esr(mmu_idx, access_type);
-                break;
             case POWERPC_MMU_REAL:
                 cpu_abort(cs, "PowerPC in real mode should never raise "
                               "any MMU exceptions\n");
@@ -1358,10 +1404,6 @@ static bool ppc_jumbo_xlate(PowerPCCPU *cpu, vaddr eaddr,
                 if (access_type == MMU_DATA_STORE) {
                     env->spr[SPR_40x_ESR] |= 0x00800000;
                 }
-            } else if ((env->mmu_model == POWERPC_MMU_BOOKE) ||
-                       (env->mmu_model == POWERPC_MMU_BOOKE206)) {
-                env->spr[SPR_BOOKE_DEAR] = eaddr;
-                env->spr[SPR_BOOKE_ESR] = mmubooke206_esr(mmu_idx, access_type);
             } else {
                 env->spr[SPR_DAR] = eaddr;
                 if (access_type == MMU_DATA_STORE) {
@@ -1440,6 +1482,10 @@ bool ppc_xlate(PowerPCCPU *cpu, vaddr eaddr, MMUAccessType access_type,
     case POWERPC_MMU_32B:
         return ppc_hash32_xlate(cpu, eaddr, access_type, raddrp,
                                psizep, protp, mmu_idx, guest_visible);
+    case POWERPC_MMU_BOOKE:
+    case POWERPC_MMU_BOOKE206:
+        return ppc_booke_xlate(cpu, eaddr, access_type, raddrp,
+                               psizep, protp, mmu_idx, guest_visible);
     case POWERPC_MMU_MPC8xx:
         cpu_abort(env_cpu(&cpu->env), "MPC8xx MMU model is not implemented\n");
     default:
-- 
2.30.9



  parent reply	other threads:[~2024-05-12 23:36 UTC|newest]

Thread overview: 75+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-05-12 23:27 [PATCH v7 00/61] Misc PPC exception and BookE MMU clean ups BALATON Zoltan
2024-05-12 23:27 ` [PATCH v7 01/61] target/ppc: Remove unused struct 'mmu_ctx_hash32' BALATON Zoltan
2024-05-12 23:27 ` [PATCH v7 02/61] target/ppc: Remove unused helper BALATON Zoltan
2024-05-12 23:27 ` [PATCH v7 03/61] target/ppc/mmu_common.c: Move calculation of a value closer to its usage BALATON Zoltan
2024-05-12 23:27 ` [PATCH v7 04/61] target/ppc/mmu_common.c: Remove unneeded local variable BALATON Zoltan
2024-05-12 23:27 ` [PATCH v7 05/61] target/ppc/mmu_common.c: Simplify checking for real mode BALATON Zoltan
2024-05-12 23:27 ` [PATCH v7 06/61] target/ppc/mmu_common.c: Drop cases for unimplemented MPC8xx MMU BALATON Zoltan
2024-05-12 23:27 ` [PATCH v7 07/61] target/ppc/mmu_common.c: Introduce mmu6xx_get_physical_address() BALATON Zoltan
2024-05-12 23:27 ` [PATCH v7 08/61] target/ppc/mmu_common.c: Move else branch to avoid large if block BALATON Zoltan
2024-05-12 23:27 ` [PATCH v7 09/61] target/ppc/mmu_common.c: Move some debug logging BALATON Zoltan
2024-05-12 23:27 ` [PATCH v7 10/61] target/ppc/mmu_common.c: Eliminate ret from mmu6xx_get_physical_address() BALATON Zoltan
2024-05-12 23:27 ` [PATCH v7 11/61] target/ppc/mmu_common.c: Split out BookE cases before checking real mode BALATON Zoltan
2024-05-12 23:27 ` [PATCH v7 12/61] target/ppc/mmu_common.c: Split off real mode cases in get_physical_address_wtlb() BALATON Zoltan
2024-05-12 23:27 ` [PATCH v7 13/61] target/ppc/mmu_common.c: Inline and remove check_physical() BALATON Zoltan
2024-05-12 23:27 ` [PATCH v7 14/61] target/ppc/mmu_common.c: Fix misindented qemu_log_mask() calls BALATON Zoltan
2024-05-12 23:27 ` [PATCH v7 15/61] target/ppc/mmu_common.c: Deindent ppc_jumbo_xlate() BALATON Zoltan
2024-05-12 23:27 ` [PATCH v7 16/61] target/ppc/mmu_common.c: Replace hard coded constants in ppc_jumbo_xlate() BALATON Zoltan
2024-05-12 23:27 ` [PATCH v7 17/61] target/ppc/mmu_common.c: Don't use mmu_ctx_t for mmu40x_get_physical_address() BALATON Zoltan
2024-05-12 23:27 ` [PATCH v7 18/61] target/ppc/mmu_common.c: Don't use mmu_ctx_t in mmubooke_get_physical_address() BALATON Zoltan
2024-05-12 23:27 ` [PATCH v7 19/61] target/ppc/mmu_common.c: Don't use mmu_ctx_t in mmubooke206_get_physical_address() BALATON Zoltan
2024-05-12 23:27 ` [PATCH v7 20/61] target/ppc/mmu_common.c: Remove BookE from direct store handling BALATON Zoltan
2024-05-12 23:27 ` BALATON Zoltan [this message]
2024-05-12 23:27 ` [PATCH v7 22/61] target/ppc/mmu_common.c: Simplify ppc_booke_xlate() part 1 BALATON Zoltan
2024-05-12 23:27 ` [PATCH v7 23/61] target/ppc/mmu_common.c: Simplify ppc_booke_xlate() part 2 BALATON Zoltan
2024-05-12 23:27 ` [PATCH v7 24/61] target/ppc/mmu_common.c: Split off real mode handling from get_physical_address_wtlb() BALATON Zoltan
2024-05-17  5:26   ` Nicholas Piggin
2024-05-12 23:27 ` [PATCH v7 25/61] target/ppc/mmu_common.c: Split off 40x cases from ppc_jumbo_xlate() BALATON Zoltan
2024-05-17  5:49   ` Nicholas Piggin
2024-05-12 23:27 ` [PATCH v7 26/61] target/ppc/mmu_common.c: Transform ppc_jumbo_xlate() into ppc_6xx_xlate() BALATON Zoltan
2024-05-17  5:49   ` Nicholas Piggin
2024-05-12 23:28 ` [PATCH v7 27/61] target/ppc/mmu_common.c: Move mmu_ctx_t type to mmu_common.c BALATON Zoltan
2024-05-12 23:28 ` [PATCH v7 28/61] target/ppc/mmu_common.c: Remove pte_update_flags() BALATON Zoltan
2024-05-17  5:48   ` Nicholas Piggin
2024-05-12 23:28 ` [PATCH v7 29/61] target/ppc: Remove id_tlbs flag from CPU env BALATON Zoltan
2024-05-12 23:28 ` [PATCH v7 30/61] target/ppc: Split off common embedded TLB init BALATON Zoltan
2024-05-12 23:28 ` [PATCH v7 31/61] target/ppc/mmu-hash32.c: Drop a local variable BALATON Zoltan
2024-05-12 23:28 ` [PATCH v7 32/61] target/ppc/mmu-radix64.c: " BALATON Zoltan
2024-05-12 23:28 ` [PATCH v7 33/61] target/ppc: Add a function to check for page protection bit BALATON Zoltan
2024-05-17  5:59   ` Nicholas Piggin
2024-05-12 23:28 ` [PATCH v7 34/61] target/ppc: Move out BookE and related MMU functions from mmu_common.c BALATON Zoltan
2024-05-12 23:28 ` [PATCH v7 35/61] target/ppc: Remove pp_check() and reuse ppc_hash32_pp_prot() BALATON Zoltan
2024-05-17  6:11   ` Nicholas Piggin
2024-05-17  9:01     ` BALATON Zoltan
2024-05-12 23:28 ` [PATCH v7 36/61] target/ppc/mmu_common.c: Remove local name for a constant BALATON Zoltan
2024-05-17  6:21   ` Nicholas Piggin
2024-05-17  9:04     ` BALATON Zoltan
2024-05-12 23:28 ` [PATCH v7 37/61] target/ppc/mmu_common.c: Remove single use local variable BALATON Zoltan
2024-05-12 23:28 ` [PATCH v7 38/61] " BALATON Zoltan
2024-05-12 23:28 ` [PATCH v7 39/61] target/ppc/mmu_common.c: Remove another single use local BALATON Zoltan
2024-05-12 23:28 ` [PATCH v7 40/61] target/ppc/mmu_common.c: Remove yet " BALATON Zoltan
2024-05-12 23:28 ` [PATCH v7 41/61] target/ppc/mmu_common.c: Return directly in ppc6xx_tlb_pte_check() BALATON Zoltan
2024-05-12 23:28 ` [PATCH v7 42/61] target/ppc/mmu_common.c: Simplify ppc6xx_tlb_pte_check() BALATON Zoltan
2024-05-12 23:28 ` [PATCH v7 43/61] target/ppc/mmu_common.c: Remove unused field from mmu_ctx_t BALATON Zoltan
2024-05-12 23:28 ` [PATCH v7 44/61] target/ppc/mmu_common.c: Remove hash " BALATON Zoltan
2024-05-12 23:28 ` [PATCH v7 45/61] target/ppc/mmu_common.c: Remove nx " BALATON Zoltan
2024-05-12 23:28 ` [PATCH v7 46/61] target/ppc/mmu_common.c: Convert local variable to bool BALATON Zoltan
2024-05-12 23:28 ` [PATCH v7 47/61] target/ppc/mmu_common.c: Remove single use local variable BALATON Zoltan
2024-05-12 23:28 ` [PATCH v7 48/61] target/ppc/mmu_common.c: Simplify a switch statement BALATON Zoltan
2024-05-12 23:28 ` [PATCH v7 49/61] target/ppc/mmu_common.c: Inline and remove ppc6xx_tlb_pte_check() BALATON Zoltan
2024-05-12 23:28 ` [PATCH v7 50/61] target/ppc/mmu_common.c: Remove ptem field from mmu_ctx_t BALATON Zoltan
2024-05-12 23:28 ` [PATCH v7 51/61] target/ppc: Add function to get protection key for hash32 MMU BALATON Zoltan
2024-05-12 23:28 ` [PATCH v7 52/61] target/ppc/mmu-hash32.c: Inline and remove ppc_hash32_pte_prot() BALATON Zoltan
2024-05-17  6:24   ` Nicholas Piggin
2024-05-18 19:50     ` BALATON Zoltan
2024-05-12 23:28 ` [PATCH v7 53/61] target/ppc/mmu_common.c: Init variable in function that relies on it BALATON Zoltan
2024-05-12 23:28 ` [PATCH v7 54/61] target/ppc/mmu_common.c: Remove key field from mmu_ctx_t BALATON Zoltan
2024-05-12 23:28 ` [PATCH v7 55/61] target/ppc/mmu_common.c: Stop using ctx in ppc6xx_tlb_check() BALATON Zoltan
2024-05-12 23:28 ` [PATCH v7 56/61] target/ppc/mmu_common.c: Rename function parameter BALATON Zoltan
2024-05-12 23:28 ` [PATCH v7 57/61] targe/ppc/mmu_common.c: Use defines instead of numeric constants BALATON Zoltan
2024-05-12 23:28 ` [PATCH v7 58/61] target/ppc: Remove bat_size_prot() BALATON Zoltan
2024-05-12 23:28 ` [PATCH v7 59/61] target/ppc/mmu_common.c: Stop using ctx in get_bat_6xx_tlb() BALATON Zoltan
2024-05-12 23:28 ` [PATCH v7 60/61] target/ppc/mmu_common.c: Remove mmu_ctx_t BALATON Zoltan
2024-05-12 23:28 ` [PATCH v7 61/61] target/ppc/mmu_common.c: Remove a local variable BALATON Zoltan
2024-05-18  9:14 ` [PATCH v7 00/61] Misc PPC exception and BookE MMU clean ups Nicholas Piggin
2024-05-18  9:40   ` BALATON Zoltan

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=f9a322b2cf52f7cb4f0d3edcb15a40ff69986770.1715555763.git.balaton@eik.bme.hu \
    --to=balaton@eik.bme.hu \
    --cc=danielhb413@gmail.com \
    --cc=npiggin@gmail.com \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-ppc@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).