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: Blue Swirl
Subject: Re: [Qemu-devel] [PATCH 20/20] ppc: move load and store helpers, switch to AREG0 free mode
Date: Mon, 16 Apr 2012 19:02:19 +0000

On Mon, Apr 16, 2012 at 16:52, Alexander Graf <address@hidden> wrote:
>
> 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?

Function signatures are different, ldl_code() does not take any
CPUState *env argument but uses AREG0 directly.

>>         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.

OK.

>
> Also, why not use ldl and friends here?

This is for user emulation case. In softmmu_exec.h, ldl() is defined
as ldl_data(). Some other similar defines are in cpu-all.h. Actually I
think that would be a better place than here.

>
>
> Alex
>



reply via email to

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