diff mbox series

[v2,22/28] target/ppc: Remove ppc_hash32_pp_prot() and reuse common function

Message ID cc6221f9333bae65037c42ca9ba0540f9e96c493.1714606359.git.balaton@eik.bme.hu (mailing list archive)
State New, archived
Headers show
Series Misc PPC exception and BookE MMU clean ups | expand

Commit Message

BALATON Zoltan May 1, 2024, 11:43 p.m. UTC
The ppc_hash32_pp_prot() function in mmu-hash32.c is the same as
pp_check() in mmu_common.c. Rename the latter to ppc_pte_prot() and
merge with ppc_hash32_pp_prot() to remove duplicated code.

Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
---
 target/ppc/internal.h   |  2 +-
 target/ppc/mmu-hash32.c | 47 +----------------------------------------
 target/ppc/mmu_common.c | 19 +++++++++--------
 3 files changed, 12 insertions(+), 56 deletions(-)

Comments

Nicholas Piggin May 7, 2024, 11:35 a.m. UTC | #1
On Thu May 2, 2024 at 9:43 AM AEST, BALATON Zoltan wrote:
> The ppc_hash32_pp_prot() function in mmu-hash32.c is the same as
> pp_check() in mmu_common.c. Rename the latter to ppc_pte_prot() and
> merge with ppc_hash32_pp_prot() to remove duplicated code.
>
> Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
> ---
>  target/ppc/internal.h   |  2 +-
>  target/ppc/mmu-hash32.c | 47 +----------------------------------------
>  target/ppc/mmu_common.c | 19 +++++++++--------
>  3 files changed, 12 insertions(+), 56 deletions(-)
>
> diff --git a/target/ppc/internal.h b/target/ppc/internal.h
> index 61c2aadd0d..d7c923b017 100644
> --- a/target/ppc/internal.h
> +++ b/target/ppc/internal.h
> @@ -255,7 +255,7 @@ static inline int prot_for_access_type(MMUAccessType access_type)
>  #ifndef CONFIG_USER_ONLY
>  
>  /* PowerPC MMU emulation */
> -
> +int ppc_pte_prot(int key, int pp, int nx);

Hmm, these were split by 496272a7018. 64 was being split
out too at the time, so maybe not immediately obvious
they were the same.

Good consolidation but can you keep pp in the name?
It's taking ppc's PTE[pp] (page protection) field and
converting it to QEMU prot value.

ppc_hash32_pp_prot is probably fine, 6xx is hash too.
and could stay in mmu-hash32.c, so just use that
version unchanged?

Thanks,
Nick

>  bool ppc_xlate(PowerPCCPU *cpu, vaddr eaddr, MMUAccessType access_type,
>                        hwaddr *raddrp, int *psizep, int *protp,
>                        int mmu_idx, bool guest_visible);
> diff --git a/target/ppc/mmu-hash32.c b/target/ppc/mmu-hash32.c
> index 3976416840..ee9df351ae 100644
> --- a/target/ppc/mmu-hash32.c
> +++ b/target/ppc/mmu-hash32.c
> @@ -42,51 +42,6 @@ struct mmu_ctx_hash32 {
>      int key;                       /* Access key                */
>  };
>  
> -static int ppc_hash32_pp_prot(int key, int pp, int nx)
> -{
> -    int prot;
> -
> -    if (key == 0) {
> -        switch (pp) {
> -        case 0x0:
> -        case 0x1:
> -        case 0x2:
> -            prot = PAGE_READ | PAGE_WRITE;
> -            break;
> -
> -        case 0x3:
> -            prot = PAGE_READ;
> -            break;
> -
> -        default:
> -            abort();
> -        }
> -    } else {
> -        switch (pp) {
> -        case 0x0:
> -            prot = 0;
> -            break;
> -
> -        case 0x1:
> -        case 0x3:
> -            prot = PAGE_READ;
> -            break;
> -
> -        case 0x2:
> -            prot = PAGE_READ | PAGE_WRITE;
> -            break;
> -
> -        default:
> -            abort();
> -        }
> -    }
> -    if (nx == 0) {
> -        prot |= PAGE_EXEC;
> -    }
> -
> -    return prot;
> -}
> -
>  static int ppc_hash32_pte_prot(int mmu_idx,
>                                 target_ulong sr, ppc_hash_pte32_t pte)
>  {
> @@ -95,7 +50,7 @@ static int ppc_hash32_pte_prot(int mmu_idx,
>      key = !!(mmuidx_pr(mmu_idx) ? (sr & SR32_KP) : (sr & SR32_KS));
>      pp = pte.pte1 & HPTE32_R_PP;
>  
> -    return ppc_hash32_pp_prot(key, pp, !!(sr & SR32_NX));
> +    return ppc_pte_prot(key, pp, !!(sr & SR32_NX));
>  }
>  
>  static target_ulong hash32_bat_size(int mmu_idx,
> diff --git a/target/ppc/mmu_common.c b/target/ppc/mmu_common.c
> index 41ef174ab4..0ce5c1e841 100644
> --- a/target/ppc/mmu_common.c
> +++ b/target/ppc/mmu_common.c
> @@ -75,22 +75,23 @@ void ppc_store_sdr1(CPUPPCState *env, target_ulong value)
>  /*****************************************************************************/
>  /* PowerPC MMU emulation */
>  
> -static int pp_check(int key, int pp, int nx)
> +int ppc_pte_prot(int key, int pp, int nx)
>  {
>      int access;
>  
>      /* Compute access rights */
> -    access = 0;
>      if (key == 0) {
>          switch (pp) {
>          case 0x0:
>          case 0x1:
>          case 0x2:
> -            access |= PAGE_WRITE;
> -            /* fall through */
> +            access = PAGE_READ | PAGE_WRITE;
> +            break;
>          case 0x3:
> -            access |= PAGE_READ;
> +            access = PAGE_READ;
>              break;
> +        default:
> +            g_assert_not_reached();
>          }
>      } else {
>          switch (pp) {
> @@ -104,6 +105,8 @@ static int pp_check(int key, int pp, int nx)
>          case 0x2:
>              access = PAGE_READ | PAGE_WRITE;
>              break;
> +        default:
> +            g_assert_not_reached();
>          }
>      }
>      if (nx == 0) {
> @@ -140,7 +143,7 @@ static int ppc6xx_tlb_pte_check(mmu_ctx_t *ctx, target_ulong pte0,
>                                  MMUAccessType access_type)
>  {
>      target_ulong ptem, mmask;
> -    int access, ret, pteh, ptev, pp;
> +    int ret, pteh, ptev, pp;
>  
>      ret = -1;
>      /* Check validity and table match */
> @@ -159,11 +162,9 @@ static int ppc6xx_tlb_pte_check(mmu_ctx_t *ctx, target_ulong pte0,
>                      return -3;
>                  }
>              }
> -            /* Compute access rights */
> -            access = pp_check(ctx->key, pp, ctx->nx);
>              /* Keep the matching PTE information */
>              ctx->raddr = pte1;
> -            ctx->prot = access;
> +            ctx->prot = ppc_pte_prot(ctx->key, pp, ctx->nx);
>              ret = check_prot(ctx->prot, access_type);
>              if (ret == 0) {
>                  /* Access granted */
diff mbox series

Patch

diff --git a/target/ppc/internal.h b/target/ppc/internal.h
index 61c2aadd0d..d7c923b017 100644
--- a/target/ppc/internal.h
+++ b/target/ppc/internal.h
@@ -255,7 +255,7 @@  static inline int prot_for_access_type(MMUAccessType access_type)
 #ifndef CONFIG_USER_ONLY
 
 /* PowerPC MMU emulation */
-
+int ppc_pte_prot(int key, int pp, int nx);
 bool ppc_xlate(PowerPCCPU *cpu, vaddr eaddr, MMUAccessType access_type,
                       hwaddr *raddrp, int *psizep, int *protp,
                       int mmu_idx, bool guest_visible);
diff --git a/target/ppc/mmu-hash32.c b/target/ppc/mmu-hash32.c
index 3976416840..ee9df351ae 100644
--- a/target/ppc/mmu-hash32.c
+++ b/target/ppc/mmu-hash32.c
@@ -42,51 +42,6 @@  struct mmu_ctx_hash32 {
     int key;                       /* Access key                */
 };
 
-static int ppc_hash32_pp_prot(int key, int pp, int nx)
-{
-    int prot;
-
-    if (key == 0) {
-        switch (pp) {
-        case 0x0:
-        case 0x1:
-        case 0x2:
-            prot = PAGE_READ | PAGE_WRITE;
-            break;
-
-        case 0x3:
-            prot = PAGE_READ;
-            break;
-
-        default:
-            abort();
-        }
-    } else {
-        switch (pp) {
-        case 0x0:
-            prot = 0;
-            break;
-
-        case 0x1:
-        case 0x3:
-            prot = PAGE_READ;
-            break;
-
-        case 0x2:
-            prot = PAGE_READ | PAGE_WRITE;
-            break;
-
-        default:
-            abort();
-        }
-    }
-    if (nx == 0) {
-        prot |= PAGE_EXEC;
-    }
-
-    return prot;
-}
-
 static int ppc_hash32_pte_prot(int mmu_idx,
                                target_ulong sr, ppc_hash_pte32_t pte)
 {
@@ -95,7 +50,7 @@  static int ppc_hash32_pte_prot(int mmu_idx,
     key = !!(mmuidx_pr(mmu_idx) ? (sr & SR32_KP) : (sr & SR32_KS));
     pp = pte.pte1 & HPTE32_R_PP;
 
-    return ppc_hash32_pp_prot(key, pp, !!(sr & SR32_NX));
+    return ppc_pte_prot(key, pp, !!(sr & SR32_NX));
 }
 
 static target_ulong hash32_bat_size(int mmu_idx,
diff --git a/target/ppc/mmu_common.c b/target/ppc/mmu_common.c
index 41ef174ab4..0ce5c1e841 100644
--- a/target/ppc/mmu_common.c
+++ b/target/ppc/mmu_common.c
@@ -75,22 +75,23 @@  void ppc_store_sdr1(CPUPPCState *env, target_ulong value)
 /*****************************************************************************/
 /* PowerPC MMU emulation */
 
-static int pp_check(int key, int pp, int nx)
+int ppc_pte_prot(int key, int pp, int nx)
 {
     int access;
 
     /* Compute access rights */
-    access = 0;
     if (key == 0) {
         switch (pp) {
         case 0x0:
         case 0x1:
         case 0x2:
-            access |= PAGE_WRITE;
-            /* fall through */
+            access = PAGE_READ | PAGE_WRITE;
+            break;
         case 0x3:
-            access |= PAGE_READ;
+            access = PAGE_READ;
             break;
+        default:
+            g_assert_not_reached();
         }
     } else {
         switch (pp) {
@@ -104,6 +105,8 @@  static int pp_check(int key, int pp, int nx)
         case 0x2:
             access = PAGE_READ | PAGE_WRITE;
             break;
+        default:
+            g_assert_not_reached();
         }
     }
     if (nx == 0) {
@@ -140,7 +143,7 @@  static int ppc6xx_tlb_pte_check(mmu_ctx_t *ctx, target_ulong pte0,
                                 MMUAccessType access_type)
 {
     target_ulong ptem, mmask;
-    int access, ret, pteh, ptev, pp;
+    int ret, pteh, ptev, pp;
 
     ret = -1;
     /* Check validity and table match */
@@ -159,11 +162,9 @@  static int ppc6xx_tlb_pte_check(mmu_ctx_t *ctx, target_ulong pte0,
                     return -3;
                 }
             }
-            /* Compute access rights */
-            access = pp_check(ctx->key, pp, ctx->nx);
             /* Keep the matching PTE information */
             ctx->raddr = pte1;
-            ctx->prot = access;
+            ctx->prot = ppc_pte_prot(ctx->key, pp, ctx->nx);
             ret = check_prot(ctx->prot, access_type);
             if (ret == 0) {
                 /* Access granted */