qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 20/20] ppc: move load and store helpers, switch


From: Alexander Graf
Subject: Re: [Qemu-devel] [PATCH 20/20] ppc: move load and store helpers, switch to AREG0 free mode
Date: Mon, 16 Apr 2012 18:52:07 +0200

On 31.03.2012, at 18:32, Blue Swirl wrote:

> Add an explicit CPUPPCState parameter instead of relying on AREG0
> and rename op_helper.c (which only contains load and store helpers)
> to mem_helper.c. Remove AREG0 swapping in
> tlb_fill().
> 
> Switch to AREG0 free mode. Use cpu_ld{l,uw}_code in translation
> and interrupt handling.
> 
> Signed-off-by: Blue Swirl <address@hidden>
> ---
> Makefile.target                          |    6 +-
> configure                                |    2 +-
> target-ppc/excp_helper.c                 |    3 +-
> target-ppc/helper.h                      |   30 ++++----
> target-ppc/{op_helper.c => mem_helper.c} |  117 ++++++++++++++++--------------
> target-ppc/translate.c                   |   30 ++++----
> 6 files changed, 100 insertions(+), 88 deletions(-)
> rename target-ppc/{op_helper.c => mem_helper.c} (66%)
> 
> diff --git a/Makefile.target b/Makefile.target
> index 96b4c05..b45b773 100644
> --- a/Makefile.target
> +++ b/Makefile.target
> @@ -82,10 +82,12 @@ libobj-y += tcg/tcg.o tcg/optimize.o
> libobj-$(CONFIG_TCG_INTERPRETER) += tci.o
> libobj-y += fpu/softfloat.o
> ifneq ($(TARGET_BASE_ARCH), sparc)
> +ifneq ($(TARGET_BASE_ARCH), ppc)
> ifneq ($(TARGET_BASE_ARCH), alpha)
> libobj-y += op_helper.o
> endif
> endif
> +endif
> libobj-y += helper.o
> ifeq ($(TARGET_BASE_ARCH), i386)
> libobj-y += cpuid.o
> @@ -104,7 +106,7 @@ libobj-$(TARGET_UNICORE32) += cpu.o
> libobj-$(TARGET_ALPHA) += int_helper.o fpu_helper.o sys_helper.o mem_helper.o
> ifeq ($(TARGET_BASE_ARCH), ppc)
> libobj-y += fpu_helper.o int_helper.o mmu_helper.o
> -libobj-y += mmu_helper.o excp_helper.o timebase_helper.o misc_helper.o
> +libobj-y += mmu_helper.o excp_helper.o timebase_helper.o
> misc_helper.o mem_helper.o
> endif
> 
> libobj-y += disas.o
> @@ -116,7 +118,7 @@ $(libobj-y): $(GENERATED_HEADERS)
> 
> # HELPER_CFLAGS is used for all the legacy code compiled with static register
> # variables
> -ifneq ($(TARGET_BASE_ARCH), sparc)
> +ifndef CONFIG_TCG_PASS_AREG0
> op_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS)
> endif
> user-exec.o: QEMU_CFLAGS += $(HELPER_CFLAGS)
> diff --git a/configure b/configure
> index b51a749..de19ca4 100755
> --- a/configure
> +++ b/configure
> @@ -3616,7 +3616,7 @@ case "$target_arch2" in
> esac
> 
> case "$target_arch2" in
> -  alpha | sparc*)
> +  alpha | ppc* | sparc*)
>     echo "CONFIG_TCG_PASS_AREG0=y" >> $config_target_mak
>   ;;
> esac
> diff --git a/target-ppc/excp_helper.c b/target-ppc/excp_helper.c
> index 945cd66..0f2ad4e 100644
> --- a/target-ppc/excp_helper.c
> +++ b/target-ppc/excp_helper.c
> @@ -179,7 +179,8 @@ static inline void powerpc_excp(CPUPPCState *env,
> int excp_model, int excp)
>         }
>         /* XXX: this is false */
>         /* Get rS/rD and rA from faulting opcode */
> -        env->spr[SPR_DSISR] |= (ldl_code((env->nip - 4)) & 0x03FF0000) >> 16;
> +        env->spr[SPR_DSISR] |= (cpu_ldl_code(env, (env->nip - 4))
> +                                & 0x03FF0000) >> 16;

Mind to explain why we need the change from ldl to cpu_ldl?

>         goto store_current;
>     case POWERPC_EXCP_PROGRAM:   /* Program exception                        
> */
>         switch (env->error_code & ~0xF) {
> diff --git a/target-ppc/helper.h b/target-ppc/helper.h
> index 1939c66..a4f033b 100644
> --- a/target-ppc/helper.h
> +++ b/target-ppc/helper.h
> @@ -20,15 +20,15 @@ DEF_HELPER_1(hrfid, void, env)
> #endif
> #endif
> 
> -DEF_HELPER_2(lmw, void, tl, i32)
> -DEF_HELPER_2(stmw, void, tl, i32)
> -DEF_HELPER_3(lsw, void, tl, i32, i32)
> -DEF_HELPER_4(lswx, void, tl, i32, i32, i32)
> -DEF_HELPER_3(stsw, void, tl, i32, i32)
> -DEF_HELPER_1(dcbz, void, tl)
> -DEF_HELPER_1(dcbz_970, void, tl)
> -DEF_HELPER_1(icbi, void, tl)
> -DEF_HELPER_4(lscbx, tl, tl, i32, i32, i32)
> +DEF_HELPER_3(lmw, void, env, tl, i32)
> +DEF_HELPER_3(stmw, void, env, tl, i32)
> +DEF_HELPER_4(lsw, void, env, tl, i32, i32)
> +DEF_HELPER_5(lswx, void, env, tl, i32, i32, i32)
> +DEF_HELPER_4(stsw, void, env, tl, i32, i32)
> +DEF_HELPER_2(dcbz, void, env, tl)
> +DEF_HELPER_2(dcbz_970, void, env, tl)
> +DEF_HELPER_2(icbi, void, env, tl)
> +DEF_HELPER_5(lscbx, tl, env, tl, i32, i32, i32)
> 
> #if defined(TARGET_PPC64)
> DEF_HELPER_FLAGS_2(mulhd, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
> @@ -226,12 +226,12 @@ DEF_HELPER_5(vmsumshm, void, env, avr, avr, avr, avr)
> DEF_HELPER_5(vmsumshs, void, env, avr, avr, avr, avr)
> DEF_HELPER_4(vmladduhm, void, avr, avr, avr, avr)
> DEF_HELPER_2(mtvscr, void, env, avr);
> -DEF_HELPER_2(lvebx, void, avr, tl)
> -DEF_HELPER_2(lvehx, void, avr, tl)
> -DEF_HELPER_2(lvewx, void, avr, tl)
> -DEF_HELPER_2(stvebx, void, avr, tl)
> -DEF_HELPER_2(stvehx, void, avr, tl)
> -DEF_HELPER_2(stvewx, void, avr, tl)
> +DEF_HELPER_3(lvebx, void, env, avr, tl)
> +DEF_HELPER_3(lvehx, void, env, avr, tl)
> +DEF_HELPER_3(lvewx, void, env, avr, tl)
> +DEF_HELPER_3(stvebx, void, env, avr, tl)
> +DEF_HELPER_3(stvehx, void, env, avr, tl)
> +DEF_HELPER_3(stvewx, void, env, avr, tl)
> DEF_HELPER_4(vsumsws, void, env, avr, avr, avr)
> DEF_HELPER_4(vsum2sws, void, env, avr, avr, avr)
> DEF_HELPER_4(vsum4sbs, void, env, avr, avr, avr)
> diff --git a/target-ppc/op_helper.c b/target-ppc/mem_helper.c
> similarity index 66%
> rename from target-ppc/op_helper.c
> rename to target-ppc/mem_helper.c
> index dcdbf5f..11eca68 100644
> --- a/target-ppc/op_helper.c
> +++ b/target-ppc/mem_helper.c
> @@ -1,5 +1,5 @@
> /*
> - *  PowerPC emulation helpers for QEMU.
> + *  PowerPC memory access emulation helpers for QEMU.
>  *
>  *  Copyright (c) 2003-2007 Jocelyn Mayer
>  *
> @@ -16,9 +16,7 @@
>  * You should have received a copy of the GNU Lesser General Public
>  * License along with this library; if not, see 
> <http://www.gnu.org/licenses/>.
>  */
> -#include <string.h>
> #include "cpu.h"
> -#include "dyngen-exec.h"
> #include "host-utils.h"
> #include "helper.h"
> 
> @@ -26,12 +24,21 @@
> 
> #if !defined(CONFIG_USER_ONLY)
> #include "softmmu_exec.h"
> +#else
> +/* ??? Put these somewhere else? */
> +#define cpu_ldub_data(env, addr) ldub_raw(addr)
> +#define cpu_lduw_data(env, addr) lduw_raw(addr)
> +#define cpu_ldl_data(env, addr) ldl_raw(addr)
> +#define cpu_stb_data(env, addr, data) stb_raw(addr, data)
> +#define cpu_stw_data(env, addr, data) stw_raw(addr, data)
> +#define cpu_stl_data(env, addr, data) stl_raw(addr, data)

Please avoid double negation - just use

  #ifdef CONFIG_USER_ONLY
  #else
  #endif

which makes the code more readable.

Also, why not use ldl and friends here?


Alex




reply via email to

[Prev in Thread] Current Thread [Next in Thread]