From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1KJSyr-0000Ci-33 for qemu-devel@nongnu.org; Thu, 17 Jul 2008 08:53:09 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1KJSyq-0000Br-Ci for qemu-devel@nongnu.org; Thu, 17 Jul 2008 08:53:08 -0400 Received: from [199.232.76.173] (port=44934 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KJSyq-0000Bo-8p for qemu-devel@nongnu.org; Thu, 17 Jul 2008 08:53:08 -0400 Received: from savannah.gnu.org ([199.232.41.3]:41656 helo=sv.gnu.org) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1KJSyp-0002OC-Lv for qemu-devel@nongnu.org; Thu, 17 Jul 2008 08:53:07 -0400 Received: from cvs.savannah.gnu.org ([199.232.41.69]) by sv.gnu.org with esmtp (Exim 4.63) (envelope-from ) id 1KJSyo-0003K4-S3 for qemu-devel@nongnu.org; Thu, 17 Jul 2008 12:53:06 +0000 Received: from blueswir1 by cvs.savannah.gnu.org with local (Exim 4.63) (envelope-from ) id 1KJSyo-0003Jt-B9 for qemu-devel@nongnu.org; Thu, 17 Jul 2008 12:53:06 +0000 MIME-Version: 1.0 Errors-To: blueswir1 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From: Blue Swirl Message-Id: Date: Thu, 17 Jul 2008 12:53:06 +0000 Subject: [Qemu-devel] [4882] Support for address masking Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Revision: 4882 http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=4882 Author: blueswir1 Date: 2008-07-17 12:53:05 +0000 (Thu, 17 Jul 2008) Log Message: ----------- Support for address masking Modified Paths: -------------- trunk/cpu-exec.c trunk/target-sparc/op_helper.c trunk/target-sparc/translate.c Modified: trunk/cpu-exec.c =================================================================== --- trunk/cpu-exec.c 2008-07-16 16:58:49 UTC (rev 4881) +++ trunk/cpu-exec.c 2008-07-17 12:53:05 UTC (rev 4882) @@ -184,8 +184,9 @@ pc = env->regs[15]; #elif defined(TARGET_SPARC) #ifdef TARGET_SPARC64 - // Combined FPU enable bits . PRIV . DMMU enabled . IMMU enabled - flags = (((env->pstate & PS_PEF) >> 1) | ((env->fprs & FPRS_FEF) << 2)) + // AM . Combined FPU enable bits . PRIV . DMMU enabled . IMMU enabled + flags = ((env->pstate & PS_AM) << 2) + | (((env->pstate & PS_PEF) >> 1) | ((env->fprs & FPRS_FEF) << 2)) | (env->pstate & PS_PRIV) | ((env->lsu & (DMMU_E | IMMU_E)) >> 2); #else // FPU enable . Supervisor Modified: trunk/target-sparc/op_helper.c =================================================================== --- trunk/target-sparc/op_helper.c 2008-07-16 16:58:49 UTC (rev 4881) +++ trunk/target-sparc/op_helper.c 2008-07-17 12:53:05 UTC (rev 4882) @@ -32,12 +32,22 @@ #define DPRINTF_ASI(fmt, args...) do {} while (0) #endif -#ifdef TARGET_ABI32 -#define ABI32_MASK(addr) do { (addr) &= 0xffffffffULL; } while (0) +#ifdef TARGET_SPARC64 +#ifndef TARGET_ABI32 +#define AM_CHECK(env1) ((env1)->pstate & PS_AM) #else -#define ABI32_MASK(addr) do {} while (0) +#define AM_CHECK(env1) (1) #endif +#endif +static inline void address_mask(CPUState *env1, target_ulong *addr) +{ +#ifdef TARGET_SPARC64 + if (AM_CHECK(env1)) + *addr &= 0xffffffffULL; +#endif +} + void raise_exception(int tt) { env->exception_index = tt; @@ -1381,7 +1391,7 @@ raise_exception(TT_PRIV_ACT); helper_check_align(addr, size - 1); - ABI32_MASK(addr); + address_mask(env, &addr); switch (asi) { case 0x80: // Primary @@ -1470,7 +1480,7 @@ raise_exception(TT_PRIV_ACT); helper_check_align(addr, size - 1); - ABI32_MASK(addr); + address_mask(env, &addr); /* Convert to little endian */ switch (asi) { @@ -2330,7 +2340,7 @@ break; } #else - ABI32_MASK(addr); + address_mask(env, &addr); stfq_raw(addr, DT0); #endif } @@ -2355,7 +2365,7 @@ break; } #else - ABI32_MASK(addr); + address_mask(env, &addr); DT0 = ldfq_raw(addr); #endif } @@ -2389,7 +2399,7 @@ break; } #else - ABI32_MASK(addr); + address_mask(env, &addr); u.ll.upper = ldq_raw(addr); u.ll.lower = ldq_raw((addr + 8) & 0xffffffffULL); QT0 = u.q; @@ -2426,7 +2436,7 @@ } #else u.q = QT0; - ABI32_MASK(addr); + address_mask(env, &addr); stq_raw(addr, u.ll.upper); stq_raw((addr + 8) & 0xffffffffULL, u.ll.lower); #endif Modified: trunk/target-sparc/translate.c =================================================================== --- trunk/target-sparc/translate.c 2008-07-16 16:58:49 UTC (rev 4881) +++ trunk/target-sparc/translate.c 2008-07-17 12:53:05 UTC (rev 4882) @@ -57,6 +57,7 @@ int is_br; int mem_idx; int fpu_enabled; + int address_mask_32bit; struct TranslationBlock *tb; uint32_t features; } DisasContext; @@ -201,12 +202,22 @@ #endif #endif -#ifdef TARGET_ABI32 -#define ABI32_MASK(addr) tcg_gen_andi_tl(addr, addr, 0xffffffffULL); +#ifdef TARGET_SPARC64 +#ifndef TARGET_ABI32 +#define AM_CHECK(dc) ((dc)->address_mask_32bit) #else -#define ABI32_MASK(addr) +#define AM_CHECK(dc) (1) #endif +#endif +static inline void gen_address_mask(DisasContext *dc, TCGv addr) +{ +#ifdef TARGET_SPARC64 + if (AM_CHECK(dc)) + tcg_gen_andi_tl(addr, addr, 0xffffffffULL); +#endif +} + static inline void gen_movl_reg_TN(int reg, TCGv tn) { if (reg == 0) @@ -4199,15 +4210,15 @@ (xop > 0x2c && xop <= 0x33) || xop == 0x1f || xop == 0x3d) { switch (xop) { case 0x0: /* load unsigned word */ - ABI32_MASK(cpu_addr); + gen_address_mask(dc, cpu_addr); tcg_gen_qemu_ld32u(cpu_val, cpu_addr, dc->mem_idx); break; case 0x1: /* load unsigned byte */ - ABI32_MASK(cpu_addr); + gen_address_mask(dc, cpu_addr); tcg_gen_qemu_ld8u(cpu_val, cpu_addr, dc->mem_idx); break; case 0x2: /* load unsigned halfword */ - ABI32_MASK(cpu_addr); + gen_address_mask(dc, cpu_addr); tcg_gen_qemu_ld16u(cpu_val, cpu_addr, dc->mem_idx); break; case 0x3: /* load double word */ @@ -4221,7 +4232,7 @@ tcg_gen_helper_0_2(helper_check_align, cpu_addr, r_const); // XXX remove tcg_temp_free(r_const); - ABI32_MASK(cpu_addr); + gen_address_mask(dc, cpu_addr); tcg_gen_qemu_ld64(cpu_tmp64, cpu_addr, dc->mem_idx); tcg_gen_trunc_i64_tl(cpu_tmp0, cpu_tmp64); tcg_gen_andi_tl(cpu_tmp0, cpu_tmp0, 0xffffffffULL); @@ -4232,18 +4243,18 @@ } break; case 0x9: /* load signed byte */ - ABI32_MASK(cpu_addr); + gen_address_mask(dc, cpu_addr); tcg_gen_qemu_ld8s(cpu_val, cpu_addr, dc->mem_idx); break; case 0xa: /* load signed halfword */ - ABI32_MASK(cpu_addr); + gen_address_mask(dc, cpu_addr); tcg_gen_qemu_ld16s(cpu_val, cpu_addr, dc->mem_idx); break; case 0xd: /* ldstub -- XXX: should be atomically */ { TCGv r_const; - ABI32_MASK(cpu_addr); + gen_address_mask(dc, cpu_addr); tcg_gen_qemu_ld8s(cpu_val, cpu_addr, dc->mem_idx); r_const = tcg_const_tl(0xff); tcg_gen_qemu_st8(r_const, cpu_addr, dc->mem_idx); @@ -4254,7 +4265,7 @@ atomically */ CHECK_IU_FEATURE(dc, SWAP); gen_movl_reg_TN(rd, cpu_val); - ABI32_MASK(cpu_addr); + gen_address_mask(dc, cpu_addr); tcg_gen_qemu_ld32u(cpu_tmp32, cpu_addr, dc->mem_idx); tcg_gen_qemu_st32(cpu_val, cpu_addr, dc->mem_idx); tcg_gen_extu_i32_tl(cpu_val, cpu_tmp32); @@ -4356,11 +4367,11 @@ #endif #ifdef TARGET_SPARC64 case 0x08: /* V9 ldsw */ - ABI32_MASK(cpu_addr); + gen_address_mask(dc, cpu_addr); tcg_gen_qemu_ld32s(cpu_val, cpu_addr, dc->mem_idx); break; case 0x0b: /* V9 ldx */ - ABI32_MASK(cpu_addr); + gen_address_mask(dc, cpu_addr); tcg_gen_qemu_ld64(cpu_val, cpu_addr, dc->mem_idx); break; case 0x18: /* V9 ldswa */ @@ -4402,13 +4413,13 @@ save_state(dc, cpu_cond); switch (xop) { case 0x20: /* load fpreg */ - ABI32_MASK(cpu_addr); + gen_address_mask(dc, cpu_addr); tcg_gen_qemu_ld32u(cpu_tmp32, cpu_addr, dc->mem_idx); tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUState, fpr[rd])); break; case 0x21: /* load fsr */ - ABI32_MASK(cpu_addr); + gen_address_mask(dc, cpu_addr); tcg_gen_qemu_ld32u(cpu_tmp32, cpu_addr, dc->mem_idx); tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUState, ft0)); @@ -4443,15 +4454,15 @@ gen_movl_reg_TN(rd, cpu_val); switch (xop) { case 0x4: /* store word */ - ABI32_MASK(cpu_addr); + gen_address_mask(dc, cpu_addr); tcg_gen_qemu_st32(cpu_val, cpu_addr, dc->mem_idx); break; case 0x5: /* store byte */ - ABI32_MASK(cpu_addr); + gen_address_mask(dc, cpu_addr); tcg_gen_qemu_st8(cpu_val, cpu_addr, dc->mem_idx); break; case 0x6: /* store halfword */ - ABI32_MASK(cpu_addr); + gen_address_mask(dc, cpu_addr); tcg_gen_qemu_st16(cpu_val, cpu_addr, dc->mem_idx); break; case 0x7: /* store double word */ @@ -4461,7 +4472,7 @@ TCGv r_low, r_const; save_state(dc, cpu_cond); - ABI32_MASK(cpu_addr); + gen_address_mask(dc, cpu_addr); r_const = tcg_const_i32(7); tcg_gen_helper_0_2(helper_check_align, cpu_addr, r_const); // XXX remove @@ -4522,7 +4533,7 @@ #endif #ifdef TARGET_SPARC64 case 0x0e: /* V9 stx */ - ABI32_MASK(cpu_addr); + gen_address_mask(dc, cpu_addr); tcg_gen_qemu_st64(cpu_val, cpu_addr, dc->mem_idx); break; case 0x1e: /* V9 stxa */ @@ -4539,13 +4550,13 @@ save_state(dc, cpu_cond); switch (xop) { case 0x24: /* store fpreg */ - ABI32_MASK(cpu_addr); + gen_address_mask(dc, cpu_addr); tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUState, fpr[rd])); tcg_gen_qemu_st32(cpu_tmp32, cpu_addr, dc->mem_idx); break; case 0x25: /* stfsr, V9 stxfsr */ - ABI32_MASK(cpu_addr); + gen_address_mask(dc, cpu_addr); tcg_gen_helper_0_0(helper_stfsr); tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUState, ft0)); @@ -4739,6 +4750,9 @@ #endif } else dc->fpu_enabled = 0; +#ifdef TARGET_SPARC64 + dc->address_mask_32bit = env->pstate & PS_AM; +#endif gen_opc_end = gen_opc_buf + OPC_MAX_SIZE; cpu_tmp0 = tcg_temp_new(TCG_TYPE_TL);