diff mbox series

[1/2] hw/ppc: Consolidate e500 initial mapping creation functions

Message ID 485a90bca642c894d94c8dbcadac58448c0bfa71.1721131193.git.balaton@eik.bme.hu
State New
Headers show
Series Consolidate embedded PPC initial mappung functions | expand

Commit Message

BALATON Zoltan July 16, 2024, 12:07 p.m. UTC
Add booke206_set_tlb() utility function and use it to replace very
similar create_initial_mapping functions in e500 machines.

Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
---
 hw/ppc/e500.c         | 41 +++++++++++++++++++----------------------
 hw/ppc/e500.h         |  2 --
 hw/ppc/ppce500_spin.c | 30 +++++++++---------------------
 include/hw/ppc/ppc.h  |  5 +++++
 4 files changed, 33 insertions(+), 45 deletions(-)

Comments

Bernhard Beschow Aug. 15, 2024, 7:01 p.m. UTC | #1
Am 16. Juli 2024 12:07:57 UTC schrieb BALATON Zoltan <balaton@eik.bme.hu>:
>Add booke206_set_tlb() utility function and use it to replace very
>similar create_initial_mapping functions in e500 machines.
>
>Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
>---
> hw/ppc/e500.c         | 41 +++++++++++++++++++----------------------
> hw/ppc/e500.h         |  2 --
> hw/ppc/ppce500_spin.c | 30 +++++++++---------------------
> include/hw/ppc/ppc.h  |  5 +++++
> 4 files changed, 33 insertions(+), 45 deletions(-)
>
>diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
>index 3bd12b54ab..8682bc7838 100644
>--- a/hw/ppc/e500.c
>+++ b/hw/ppc/e500.c
>@@ -721,11 +721,21 @@ static int ppce500_prep_device_tree(PPCE500MachineState *machine,
>                                     kernel_base, kernel_size, true);
> }
> 
>-hwaddr booke206_page_size_to_tlb(uint64_t size)
>+static hwaddr booke206_page_size_to_tlb(uint64_t size)
> {
>     return 63 - clz64(size / KiB);
> }
> 
>+void booke206_set_tlb(ppcmas_tlb_t *tlb, target_ulong va, hwaddr pa,
>+                      hwaddr len)
>+{
>+    tlb->mas1 = booke206_page_size_to_tlb(len) << MAS1_TSIZE_SHIFT;
>+    tlb->mas1 |= MAS1_VALID;
>+    tlb->mas2 = va & TARGET_PAGE_MASK;
>+    tlb->mas7_3 = pa & TARGET_PAGE_MASK;
>+    tlb->mas7_3 |= MAS3_UR | MAS3_UW | MAS3_UX | MAS3_SR | MAS3_SW | MAS3_SX;
>+}
>+
> static int booke206_initial_map_tsize(CPUPPCState *env)
> {
>     struct boot_info *bi = env->load_info;
>@@ -751,25 +761,6 @@ static uint64_t mmubooke_initial_mapsize(CPUPPCState *env)
>     return (1ULL << 10 << tsize);
> }
> 
>-/* Create -kernel TLB entries for BookE. */
>-static void mmubooke_create_initial_mapping(CPUPPCState *env)
>-{
>-    ppcmas_tlb_t *tlb = booke206_get_tlbm(env, 1, 0, 0);
>-    hwaddr size;
>-    int ps;
>-
>-    ps = booke206_initial_map_tsize(env);
>-    size = (ps << MAS1_TSIZE_SHIFT);
>-    tlb->mas1 = MAS1_VALID | size;
>-    tlb->mas2 = 0;
>-    tlb->mas7_3 = 0;
>-    tlb->mas7_3 |= MAS3_UR | MAS3_UW | MAS3_UX | MAS3_SR | MAS3_SW | MAS3_SX;
>-
>-#ifdef CONFIG_KVM
>-    env->tlb_dirty = true;
>-#endif
>-}
>-
> static void ppce500_cpu_reset_sec(void *opaque)
> {
>     PowerPCCPU *cpu = opaque;
>@@ -786,6 +777,8 @@ static void ppce500_cpu_reset(void *opaque)
>     CPUState *cs = CPU(cpu);
>     CPUPPCState *env = &cpu->env;
>     struct boot_info *bi = env->load_info;
>+    uint64_t map_size = mmubooke_initial_mapsize(env);
>+    ppcmas_tlb_t *tlb = booke206_get_tlbm(env, 1, 0, 0);
> 
>     cpu_reset(cs);
> 
>@@ -796,11 +789,15 @@ static void ppce500_cpu_reset(void *opaque)
>     env->gpr[4] = 0;
>     env->gpr[5] = 0;
>     env->gpr[6] = EPAPR_MAGIC;
>-    env->gpr[7] = mmubooke_initial_mapsize(env);
>+    env->gpr[7] = map_size;
>     env->gpr[8] = 0;
>     env->gpr[9] = 0;
>     env->nip = bi->entry;
>-    mmubooke_create_initial_mapping(env);
>+    /* create initial mapping */
>+    booke206_set_tlb(tlb, 0, 0, map_size);

Both invocations of booke206_set_tlb() are followed by:

>+#ifdef CONFIG_KVM
>+    env->tlb_dirty = true;
>+#endif 

Doesn't it make sense to move these three lines into booke206_set_tlb()? The two copies you're resolving did so, too.

Best regards,
Bernhard

> }
> 
> static DeviceState *ppce500_init_mpic_qemu(PPCE500MachineState *pms,
>diff --git a/hw/ppc/e500.h b/hw/ppc/e500.h
>index 8c09ef92e4..01db102625 100644
>--- a/hw/ppc/e500.h
>+++ b/hw/ppc/e500.h
>@@ -41,8 +41,6 @@ struct PPCE500MachineClass {
> 
> void ppce500_init(MachineState *machine);
> 
>-hwaddr booke206_page_size_to_tlb(uint64_t size);
>-
> #define TYPE_PPCE500_MACHINE      "ppce500-base-machine"
> OBJECT_DECLARE_TYPE(PPCE500MachineState, PPCE500MachineClass, PPCE500_MACHINE)
> 
>diff --git a/hw/ppc/ppce500_spin.c b/hw/ppc/ppce500_spin.c
>index dfbe759481..208d87569a 100644
>--- a/hw/ppc/ppce500_spin.c
>+++ b/hw/ppc/ppce500_spin.c
>@@ -33,6 +33,7 @@
> #include "hw/hw.h"
> #include "hw/sysbus.h"
> #include "sysemu/hw_accel.h"
>+#include "hw/ppc/ppc.h"
> #include "e500.h"
> #include "qom/object.h"
> 
>@@ -70,30 +71,12 @@ static void spin_reset(DeviceState *dev)
>     }
> }
> 
>-static void mmubooke_create_initial_mapping(CPUPPCState *env,
>-                                     target_ulong va,
>-                                     hwaddr pa,
>-                                     hwaddr len)
>-{
>-    ppcmas_tlb_t *tlb = booke206_get_tlbm(env, 1, 0, 1);
>-    hwaddr size;
>-
>-    size = (booke206_page_size_to_tlb(len) << MAS1_TSIZE_SHIFT);
>-    tlb->mas1 = MAS1_VALID | size;
>-    tlb->mas2 = (va & TARGET_PAGE_MASK) | MAS2_M;
>-    tlb->mas7_3 = pa & TARGET_PAGE_MASK;
>-    tlb->mas7_3 |= MAS3_UR | MAS3_UW | MAS3_UX | MAS3_SR | MAS3_SW | MAS3_SX;
>-#ifdef CONFIG_KVM
>-    env->tlb_dirty = true;
>-#endif
>-}
>-
> static void spin_kick(CPUState *cs, run_on_cpu_data data)
> {
>     CPUPPCState *env = cpu_env(cs);
>     SpinInfo *curspin = data.host_ptr;
>-    hwaddr map_size = 64 * MiB;
>-    hwaddr map_start;
>+    hwaddr map_start, map_size = 64 * MiB;
>+    ppcmas_tlb_t *tlb = booke206_get_tlbm(env, 1, 0, 1);
> 
>     cpu_synchronize_state(cs);
>     stl_p(&curspin->pir, env->spr[SPR_BOOKE_PIR]);
>@@ -107,7 +90,12 @@ static void spin_kick(CPUState *cs, run_on_cpu_data data)
>     env->gpr[9] = 0;
> 
>     map_start = ldq_p(&curspin->addr) & ~(map_size - 1);
>-    mmubooke_create_initial_mapping(env, 0, map_start, map_size);
>+    /* create initial mapping */
>+    booke206_set_tlb(tlb, 0, map_start, map_size);
>+    tlb->mas2 |= MAS2_M;
>+#ifdef CONFIG_KVM
>+    env->tlb_dirty = true;
>+#endif
> 
>     cs->halted = 0;
>     cs->exception_index = -1;
>diff --git a/include/hw/ppc/ppc.h b/include/hw/ppc/ppc.h
>index d5d119ea7f..070524b02e 100644
>--- a/include/hw/ppc/ppc.h
>+++ b/include/hw/ppc/ppc.h
>@@ -116,6 +116,11 @@ enum {
> 
> #define PPC_SERIAL_MM_BAUDBASE 399193
> 
>+#ifndef CONFIG_USER_ONLY
>+void booke206_set_tlb(ppcmas_tlb_t *tlb, target_ulong va, hwaddr pa,
>+                      hwaddr len);
>+#endif
>+
> /* ppc_booke.c */
> void ppc_booke_timers_init(PowerPCCPU *cpu, uint32_t freq, uint32_t flags);
> #endif
diff mbox series

Patch

diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
index 3bd12b54ab..8682bc7838 100644
--- a/hw/ppc/e500.c
+++ b/hw/ppc/e500.c
@@ -721,11 +721,21 @@  static int ppce500_prep_device_tree(PPCE500MachineState *machine,
                                     kernel_base, kernel_size, true);
 }
 
-hwaddr booke206_page_size_to_tlb(uint64_t size)
+static hwaddr booke206_page_size_to_tlb(uint64_t size)
 {
     return 63 - clz64(size / KiB);
 }
 
+void booke206_set_tlb(ppcmas_tlb_t *tlb, target_ulong va, hwaddr pa,
+                      hwaddr len)
+{
+    tlb->mas1 = booke206_page_size_to_tlb(len) << MAS1_TSIZE_SHIFT;
+    tlb->mas1 |= MAS1_VALID;
+    tlb->mas2 = va & TARGET_PAGE_MASK;
+    tlb->mas7_3 = pa & TARGET_PAGE_MASK;
+    tlb->mas7_3 |= MAS3_UR | MAS3_UW | MAS3_UX | MAS3_SR | MAS3_SW | MAS3_SX;
+}
+
 static int booke206_initial_map_tsize(CPUPPCState *env)
 {
     struct boot_info *bi = env->load_info;
@@ -751,25 +761,6 @@  static uint64_t mmubooke_initial_mapsize(CPUPPCState *env)
     return (1ULL << 10 << tsize);
 }
 
-/* Create -kernel TLB entries for BookE. */
-static void mmubooke_create_initial_mapping(CPUPPCState *env)
-{
-    ppcmas_tlb_t *tlb = booke206_get_tlbm(env, 1, 0, 0);
-    hwaddr size;
-    int ps;
-
-    ps = booke206_initial_map_tsize(env);
-    size = (ps << MAS1_TSIZE_SHIFT);
-    tlb->mas1 = MAS1_VALID | size;
-    tlb->mas2 = 0;
-    tlb->mas7_3 = 0;
-    tlb->mas7_3 |= MAS3_UR | MAS3_UW | MAS3_UX | MAS3_SR | MAS3_SW | MAS3_SX;
-
-#ifdef CONFIG_KVM
-    env->tlb_dirty = true;
-#endif
-}
-
 static void ppce500_cpu_reset_sec(void *opaque)
 {
     PowerPCCPU *cpu = opaque;
@@ -786,6 +777,8 @@  static void ppce500_cpu_reset(void *opaque)
     CPUState *cs = CPU(cpu);
     CPUPPCState *env = &cpu->env;
     struct boot_info *bi = env->load_info;
+    uint64_t map_size = mmubooke_initial_mapsize(env);
+    ppcmas_tlb_t *tlb = booke206_get_tlbm(env, 1, 0, 0);
 
     cpu_reset(cs);
 
@@ -796,11 +789,15 @@  static void ppce500_cpu_reset(void *opaque)
     env->gpr[4] = 0;
     env->gpr[5] = 0;
     env->gpr[6] = EPAPR_MAGIC;
-    env->gpr[7] = mmubooke_initial_mapsize(env);
+    env->gpr[7] = map_size;
     env->gpr[8] = 0;
     env->gpr[9] = 0;
     env->nip = bi->entry;
-    mmubooke_create_initial_mapping(env);
+    /* create initial mapping */
+    booke206_set_tlb(tlb, 0, 0, map_size);
+#ifdef CONFIG_KVM
+    env->tlb_dirty = true;
+#endif
 }
 
 static DeviceState *ppce500_init_mpic_qemu(PPCE500MachineState *pms,
diff --git a/hw/ppc/e500.h b/hw/ppc/e500.h
index 8c09ef92e4..01db102625 100644
--- a/hw/ppc/e500.h
+++ b/hw/ppc/e500.h
@@ -41,8 +41,6 @@  struct PPCE500MachineClass {
 
 void ppce500_init(MachineState *machine);
 
-hwaddr booke206_page_size_to_tlb(uint64_t size);
-
 #define TYPE_PPCE500_MACHINE      "ppce500-base-machine"
 OBJECT_DECLARE_TYPE(PPCE500MachineState, PPCE500MachineClass, PPCE500_MACHINE)
 
diff --git a/hw/ppc/ppce500_spin.c b/hw/ppc/ppce500_spin.c
index dfbe759481..208d87569a 100644
--- a/hw/ppc/ppce500_spin.c
+++ b/hw/ppc/ppce500_spin.c
@@ -33,6 +33,7 @@ 
 #include "hw/hw.h"
 #include "hw/sysbus.h"
 #include "sysemu/hw_accel.h"
+#include "hw/ppc/ppc.h"
 #include "e500.h"
 #include "qom/object.h"
 
@@ -70,30 +71,12 @@  static void spin_reset(DeviceState *dev)
     }
 }
 
-static void mmubooke_create_initial_mapping(CPUPPCState *env,
-                                     target_ulong va,
-                                     hwaddr pa,
-                                     hwaddr len)
-{
-    ppcmas_tlb_t *tlb = booke206_get_tlbm(env, 1, 0, 1);
-    hwaddr size;
-
-    size = (booke206_page_size_to_tlb(len) << MAS1_TSIZE_SHIFT);
-    tlb->mas1 = MAS1_VALID | size;
-    tlb->mas2 = (va & TARGET_PAGE_MASK) | MAS2_M;
-    tlb->mas7_3 = pa & TARGET_PAGE_MASK;
-    tlb->mas7_3 |= MAS3_UR | MAS3_UW | MAS3_UX | MAS3_SR | MAS3_SW | MAS3_SX;
-#ifdef CONFIG_KVM
-    env->tlb_dirty = true;
-#endif
-}
-
 static void spin_kick(CPUState *cs, run_on_cpu_data data)
 {
     CPUPPCState *env = cpu_env(cs);
     SpinInfo *curspin = data.host_ptr;
-    hwaddr map_size = 64 * MiB;
-    hwaddr map_start;
+    hwaddr map_start, map_size = 64 * MiB;
+    ppcmas_tlb_t *tlb = booke206_get_tlbm(env, 1, 0, 1);
 
     cpu_synchronize_state(cs);
     stl_p(&curspin->pir, env->spr[SPR_BOOKE_PIR]);
@@ -107,7 +90,12 @@  static void spin_kick(CPUState *cs, run_on_cpu_data data)
     env->gpr[9] = 0;
 
     map_start = ldq_p(&curspin->addr) & ~(map_size - 1);
-    mmubooke_create_initial_mapping(env, 0, map_start, map_size);
+    /* create initial mapping */
+    booke206_set_tlb(tlb, 0, map_start, map_size);
+    tlb->mas2 |= MAS2_M;
+#ifdef CONFIG_KVM
+    env->tlb_dirty = true;
+#endif
 
     cs->halted = 0;
     cs->exception_index = -1;
diff --git a/include/hw/ppc/ppc.h b/include/hw/ppc/ppc.h
index d5d119ea7f..070524b02e 100644
--- a/include/hw/ppc/ppc.h
+++ b/include/hw/ppc/ppc.h
@@ -116,6 +116,11 @@  enum {
 
 #define PPC_SERIAL_MM_BAUDBASE 399193
 
+#ifndef CONFIG_USER_ONLY
+void booke206_set_tlb(ppcmas_tlb_t *tlb, target_ulong va, hwaddr pa,
+                      hwaddr len);
+#endif
+
 /* ppc_booke.c */
 void ppc_booke_timers_init(PowerPCCPU *cpu, uint32_t freq, uint32_t flags);
 #endif