Message ID | 485a90bca642c894d94c8dbcadac58448c0bfa71.1721131193.git.balaton@eik.bme.hu |
---|---|
State | New |
Headers | show |
Series | Consolidate embedded PPC initial mappung functions | expand |
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
Am 15. August 2024 19:01:47 UTC schrieb Bernhard Beschow <shentey@gmail.com>: > > >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. Ping > >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
On Tue, 1 Oct 2024, Bernhard Beschow wrote: > Am 15. August 2024 19:01:47 UTC schrieb Bernhard Beschow <shentey@gmail.com>: >> 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> >>> --- [...] >>> - 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. > > Ping Did not forget but had no time to look at it yet. I'll come back to it when I'll have time. Regards, BALATON Zoltan >> >> Best regards, >> Bernhard
On Thu, 15 Aug 2024, Bernhard Beschow wrote: > 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. No because tlb_dirty is in env and booke206_set_tlb only operates on the tlb entry. I don't want to pass the env just for this as this way it separates operations on tlb and on env and is also more consistent with the ppc440 case. Regards, BALATON Zoltan > 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 --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
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(-)