From nobody Sat Apr 27 13:15:33 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1500326835823228.296270963059; Mon, 17 Jul 2017 14:27:15 -0700 (PDT) Received: from localhost ([::1]:52642 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dXDXu-0000mV-Ip for importer@patchew.org; Mon, 17 Jul 2017 17:27:14 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33450) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dXDWE-00086r-U4 for qemu-devel@nongnu.org; Mon, 17 Jul 2017 17:25:32 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dXDWD-0003QT-4Z for qemu-devel@nongnu.org; Mon, 17 Jul 2017 17:25:30 -0400 Received: from mail-qk0-x241.google.com ([2607:f8b0:400d:c09::241]:36256) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dXDWD-0003QD-0P for qemu-devel@nongnu.org; Mon, 17 Jul 2017 17:25:29 -0400 Received: by mail-qk0-x241.google.com with SMTP id d136so241167qkg.3 for ; Mon, 17 Jul 2017 14:25:28 -0700 (PDT) Received: from bigtime.com ([101.165.234.197]) by smtp.gmail.com with ESMTPSA id o20sm282034qtc.23.2017.07.17.14.25.25 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 17 Jul 2017 14:25:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=O3zxmYy8HXs5YG/Qa8rdiFRDG5830YaIEMpQnTXPcLU=; b=BJgpqCyucUeq2RplewaACN28Qo96CnWu43ftOO4PBt3fqtWkNFlMuiMVZj5E4k1Kfj B90r3SIwgrG0ZFJ8M/CgAoRoLgSvuUGuzW01zeM0ybuGJ5m333EXn7nYn1tBlD9oaftD gdP2lFTfADQcy/AjJZLW3LyRhqYNUNoz+cbw/JwQrAaRomWIaO+d6uuvTuhQNdfL1eJ4 ALPTEQuw7ZCBJxDDz8FMGds+gbGfpwv6InkEhThAVcxo0PaaHuDt2Lt42zzNCfWV3BBG EMCRz479wUy1k0LP++Mw8i2eeySKBy89EeVr9W0ewF1ZiTRrJbvjGX/cj+k/qGtvsSos zFPQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=O3zxmYy8HXs5YG/Qa8rdiFRDG5830YaIEMpQnTXPcLU=; b=DOoKgnIhzec7GRe+hiK0lWoDZwvssB01NPiPI9+WTZ1ZIuhZJw44auHDg+TuXqp0gw 02RGZRR7E5dY+m94BiR1HcFVdq4NmRpbu9h0k8bBIsBOy3h2zvt9Ft9d/QP+r1owvLQ+ 2VJK51kxGg26jgGXjZAHDNKTZ12Mbe/A+V9909ENZW3RZxKPRIbbVjq/XKLf7Pd6FXQY vshlPASC0FMcX5zmQ2AQInLHxHOnZUGhpoBAlUBUdcnBXT28dy9mwqpc7ZT+hcSXfVBH 3YtWzaJun/GyH+nOAbR4q7371h/6N5o/Dree08p9pH27h94KoJMZlzzwmkCDAe3cnFXd 9EHQ== X-Gm-Message-State: AIVw113okShFQx+KFDY+lv1djPdcdxxgY2Ryzuj8sxoH77K4jtRHSEfk 3oET0izBply6I1ehiPk= X-Received: by 10.55.163.3 with SMTP id m3mr27563782qke.118.1500326727955; Mon, 17 Jul 2017 14:25:27 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Mon, 17 Jul 2017 11:24:39 -1000 Message-Id: <20170717212446.15268-2-rth@twiddle.net> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20170717212446.15268-1-rth@twiddle.net> References: <20170717212446.15268-1-rth@twiddle.net> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400d:c09::241 Subject: [Qemu-devel] [PULL v2 1/8] target/s390x: Implement CSST X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: peter.maydell@linaro.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Reviewed-by: Aurelien Jarno Signed-off-by: Richard Henderson --- target/s390x/helper.h | 1 + target/s390x/cpu_models.c | 2 + target/s390x/mem_helper.c | 189 +++++++++++++++++++++++++++++++++++++++++= ++++ target/s390x/translate.c | 13 +++- target/s390x/insn-data.def | 2 + 5 files changed, 206 insertions(+), 1 deletion(-) diff --git a/target/s390x/helper.h b/target/s390x/helper.h index 964097b..23e8d1d 100644 --- a/target/s390x/helper.h +++ b/target/s390x/helper.h @@ -33,6 +33,7 @@ DEF_HELPER_3(celgb, i64, env, i64, i32) DEF_HELPER_3(cdlgb, i64, env, i64, i32) DEF_HELPER_3(cxlgb, i64, env, i64, i32) DEF_HELPER_4(cdsg, void, env, i64, i32, i32) +DEF_HELPER_4(csst, i32, env, i32, i64, i64) DEF_HELPER_FLAGS_3(aeb, TCG_CALL_NO_WG, i64, env, i64, i64) DEF_HELPER_FLAGS_3(adb, TCG_CALL_NO_WG, i64, env, i64, i64) DEF_HELPER_FLAGS_5(axb, TCG_CALL_NO_WG, i64, env, i64, i64, i64, i64) diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c index c654279..8433010 100644 --- a/target/s390x/cpu_models.c +++ b/target/s390x/cpu_models.c @@ -787,6 +787,8 @@ static void add_qemu_cpu_model_features(S390FeatBitmap = fbm) S390_FEAT_ETF2_ENH, S390_FEAT_STORE_CLOCK_FAST, S390_FEAT_MOVE_WITH_OPTIONAL_SPEC, + S390_FEAT_COMPARE_AND_SWAP_AND_STORE, + S390_FEAT_COMPARE_AND_SWAP_AND_STORE_2, S390_FEAT_GENERAL_INSTRUCTIONS_EXT, S390_FEAT_EXECUTE_EXT, S390_FEAT_FLOATING_POINT_SUPPPORT_ENH, diff --git a/target/s390x/mem_helper.c b/target/s390x/mem_helper.c index ede8471..7424f7f 100644 --- a/target/s390x/mem_helper.c +++ b/target/s390x/mem_helper.c @@ -1353,6 +1353,195 @@ void HELPER(cdsg)(CPUS390XState *env, uint64_t addr, env->regs[r1 + 1] =3D int128_getlo(oldv); } =20 +uint32_t HELPER(csst)(CPUS390XState *env, uint32_t r3, uint64_t a1, uint64= _t a2) +{ +#if !defined(CONFIG_USER_ONLY) || defined(CONFIG_ATOMIC128) + uint32_t mem_idx =3D cpu_mmu_index(env, false); +#endif + uintptr_t ra =3D GETPC(); + uint32_t fc =3D extract32(env->regs[0], 0, 8); + uint32_t sc =3D extract32(env->regs[0], 8, 8); + uint64_t pl =3D get_address(env, 1) & -16; + uint64_t svh, svl; + uint32_t cc; + + /* Sanity check the function code and storage characteristic. */ + if (fc > 1 || sc > 3) { + if (!s390_has_feat(S390_FEAT_COMPARE_AND_SWAP_AND_STORE_2)) { + goto spec_exception; + } + if (fc > 2 || sc > 4 || (fc =3D=3D 2 && (r3 & 1))) { + goto spec_exception; + } + } + + /* Sanity check the alignments. */ + if (extract32(a1, 0, 4 << fc) || extract32(a2, 0, 1 << sc)) { + goto spec_exception; + } + + /* Sanity check writability of the store address. */ +#ifndef CONFIG_USER_ONLY + probe_write(env, a2, mem_idx, ra); +#endif + + /* Note that the compare-and-swap is atomic, and the store is atomic, = but + the complete operation is not. Therefore we do not need to assert = serial + context in order to implement this. That said, restart early if we= can't + support either operation that is supposed to be atomic. */ + if (parallel_cpus) { + int mask =3D 0; +#if !defined(CONFIG_ATOMIC64) + mask =3D -8; +#elif !defined(CONFIG_ATOMIC128) + mask =3D -16; +#endif + if (((4 << fc) | (1 << sc)) & mask) { + cpu_loop_exit_atomic(ENV_GET_CPU(env), ra); + } + } + + /* All loads happen before all stores. For simplicity, load the entire + store value area from the parameter list. */ + svh =3D cpu_ldq_data_ra(env, pl + 16, ra); + svl =3D cpu_ldq_data_ra(env, pl + 24, ra); + + switch (fc) { + case 0: + { + uint32_t nv =3D cpu_ldl_data_ra(env, pl, ra); + uint32_t cv =3D env->regs[r3]; + uint32_t ov; + + if (parallel_cpus) { +#ifdef CONFIG_USER_ONLY + uint32_t *haddr =3D g2h(a1); + ov =3D atomic_cmpxchg__nocheck(haddr, cv, nv); +#else + TCGMemOpIdx oi =3D make_memop_idx(MO_TEUL | MO_ALIGN, mem_= idx); + ov =3D helper_atomic_cmpxchgl_be_mmu(env, a1, cv, nv, oi, = ra); +#endif + } else { + ov =3D cpu_ldl_data_ra(env, a1, ra); + cpu_stl_data_ra(env, a1, (ov =3D=3D cv ? nv : ov), ra); + } + cc =3D (ov !=3D cv); + env->regs[r3] =3D deposit64(env->regs[r3], 32, 32, ov); + } + break; + + case 1: + { + uint64_t nv =3D cpu_ldq_data_ra(env, pl, ra); + uint64_t cv =3D env->regs[r3]; + uint64_t ov; + + if (parallel_cpus) { +#ifdef CONFIG_ATOMIC64 +# ifdef CONFIG_USER_ONLY + uint64_t *haddr =3D g2h(a1); + ov =3D atomic_cmpxchg__nocheck(haddr, cv, nv); +# else + TCGMemOpIdx oi =3D make_memop_idx(MO_TEQ | MO_ALIGN, mem_i= dx); + ov =3D helper_atomic_cmpxchgq_be_mmu(env, a1, cv, nv, oi, = ra); +# endif +#else + /* Note that we asserted !parallel_cpus above. */ + g_assert_not_reached(); +#endif + } else { + ov =3D cpu_ldq_data_ra(env, a1, ra); + cpu_stq_data_ra(env, a1, (ov =3D=3D cv ? nv : ov), ra); + } + cc =3D (ov !=3D cv); + env->regs[r3] =3D ov; + } + break; + + case 2: + { + uint64_t nvh =3D cpu_ldq_data_ra(env, pl, ra); + uint64_t nvl =3D cpu_ldq_data_ra(env, pl + 8, ra); + Int128 nv =3D int128_make128(nvl, nvh); + Int128 cv =3D int128_make128(env->regs[r3 + 1], env->regs[r3]); + Int128 ov; + + if (parallel_cpus) { +#ifdef CONFIG_ATOMIC128 + TCGMemOpIdx oi =3D make_memop_idx(MO_TEQ | MO_ALIGN_16, me= m_idx); + ov =3D helper_atomic_cmpxchgo_be_mmu(env, a1, cv, nv, oi, = ra); + cc =3D !int128_eq(ov, cv); +#else + /* Note that we asserted !parallel_cpus above. */ + g_assert_not_reached(); +#endif + } else { + uint64_t oh =3D cpu_ldq_data_ra(env, a1 + 0, ra); + uint64_t ol =3D cpu_ldq_data_ra(env, a1 + 8, ra); + + ov =3D int128_make128(ol, oh); + cc =3D !int128_eq(ov, cv); + if (cc) { + nv =3D ov; + } + + cpu_stq_data_ra(env, a1 + 0, int128_gethi(nv), ra); + cpu_stq_data_ra(env, a1 + 8, int128_getlo(nv), ra); + } + + env->regs[r3 + 0] =3D int128_gethi(ov); + env->regs[r3 + 1] =3D int128_getlo(ov); + } + break; + + default: + g_assert_not_reached(); + } + + /* Store only if the comparison succeeded. Note that above we use a p= air + of 64-bit big-endian loads, so for sc < 3 we must extract the value + from the most-significant bits of svh. */ + if (cc =3D=3D 0) { + switch (sc) { + case 0: + cpu_stb_data_ra(env, a2, svh >> 56, ra); + break; + case 1: + cpu_stw_data_ra(env, a2, svh >> 48, ra); + break; + case 2: + cpu_stl_data_ra(env, a2, svh >> 32, ra); + break; + case 3: + cpu_stq_data_ra(env, a2, svh, ra); + break; + case 4: + if (parallel_cpus) { +#ifdef CONFIG_ATOMIC128 + TCGMemOpIdx oi =3D make_memop_idx(MO_TEQ | MO_ALIGN_16, me= m_idx); + Int128 sv =3D int128_make128(svl, svh); + helper_atomic_sto_be_mmu(env, a2, sv, oi, ra); +#else + /* Note that we asserted !parallel_cpus above. */ + g_assert_not_reached(); +#endif + } else { + cpu_stq_data_ra(env, a2 + 0, svh, ra); + cpu_stq_data_ra(env, a2 + 8, svl, ra); + } + default: + g_assert_not_reached(); + } + } + + return cc; + + spec_exception: + cpu_restore_state(ENV_GET_CPU(env), ra); + program_interrupt(env, PGM_SPECIFICATION, 6); + g_assert_not_reached(); +} + #if !defined(CONFIG_USER_ONLY) void HELPER(lctlg)(CPUS390XState *env, uint32_t r1, uint64_t a2, uint32_t = r3) { diff --git a/target/s390x/translate.c b/target/s390x/translate.c index 592d6b0..e739525 100644 --- a/target/s390x/translate.c +++ b/target/s390x/translate.c @@ -2033,6 +2033,18 @@ static ExitStatus op_cdsg(DisasContext *s, DisasOps = *o) return NO_EXIT; } =20 +static ExitStatus op_csst(DisasContext *s, DisasOps *o) +{ + int r3 =3D get_field(s->fields, r3); + TCGv_i32 t_r3 =3D tcg_const_i32(r3); + + gen_helper_csst(cc_op, cpu_env, t_r3, o->in1, o->in2); + tcg_temp_free_i32(t_r3); + + set_cc_static(s); + return NO_EXIT; +} + #ifndef CONFIG_USER_ONLY static ExitStatus op_csp(DisasContext *s, DisasOps *o) { @@ -5437,7 +5449,6 @@ enum DisasInsnEnum { /* Give smaller names to the various facilities. */ #define FAC_Z S390_FEAT_ZARCH #define FAC_CASS S390_FEAT_COMPARE_AND_SWAP_AND_STORE -#define FAC_CASS2 S390_FEAT_COMPARE_AND_SWAP_AND_STORE_2 #define FAC_DFP S390_FEAT_DFP #define FAC_DFPR S390_FEAT_FLOATING_POINT_SUPPPORT_ENH /* DFP-round= ing */ #define FAC_DO S390_FEAT_STFLE_45 /* distinct-operands */ diff --git a/target/s390x/insn-data.def b/target/s390x/insn-data.def index d3bb851..6ac12b8 100644 --- a/target/s390x/insn-data.def +++ b/target/s390x/insn-data.def @@ -265,6 +265,8 @@ D(0xbb00, CDS, RS_a, Z, r3_D32, r1_D32, new, r1_D32, cs, 0, MO_= TEQ) D(0xeb31, CDSY, RSY_a, LD, r3_D32, r1_D32, new, r1_D32, cs, 0, MO_= TEQ) C(0xeb3e, CDSG, RSY_a, Z, 0, 0, 0, 0, cdsg, 0) +/* COMPARE AND SWAP AND STORE */ + C(0xc802, CSST, SSF, CASS, la1, a2, 0, 0, csst, 0) =20 /* COMPARE AND TRAP */ D(0xb972, CRT, RRF_c, GIE, r1_32s, r2_32s, 0, 0, ct, 0, 0) --=20 2.9.4 From nobody Sat Apr 27 13:15:33 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1500326843882443.3243219261125; Mon, 17 Jul 2017 14:27:23 -0700 (PDT) Received: from localhost ([::1]:52643 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dXDY2-0000ti-EP for importer@patchew.org; Mon, 17 Jul 2017 17:27:22 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33480) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dXDWH-00087v-O0 for qemu-devel@nongnu.org; Mon, 17 Jul 2017 17:25:35 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dXDWF-0003Ru-UO for qemu-devel@nongnu.org; Mon, 17 Jul 2017 17:25:33 -0400 Received: from mail-qt0-x229.google.com ([2607:f8b0:400d:c0d::229]:35223) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dXDWF-0003Rg-OV for qemu-devel@nongnu.org; Mon, 17 Jul 2017 17:25:31 -0400 Received: by mail-qt0-x229.google.com with SMTP id b40so1712956qtb.2 for ; Mon, 17 Jul 2017 14:25:31 -0700 (PDT) Received: from bigtime.com ([101.165.234.197]) by smtp.gmail.com with ESMTPSA id o20sm282034qtc.23.2017.07.17.14.25.28 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 17 Jul 2017 14:25:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=O9cEoQUmey884K3gAXnzstiUS3pyx3v0IIec2VVGaSQ=; b=UiTHgS50OmsUCD9mshAHhuJCof3sAu5uB+4EXs9j+e2UVVcNUIy/kErDuEFTO9Djfv +1uf8XKD921vWLiWFVwZVMsTgkBTFvEV6Kga0GtfQYUDMqcaCl9H7bHDqCuj4Q8PJylS eRNlJ67p2WMf+0BAw13oKMrt6amyoNrgL3cvBy77VKZPTBnjWYYEgXtkDx0+hKETaLPj XqlJOmmfFJPUqukq2COO7QatdMPGMkVlxD34CT5aaVUtuoiziX1t1M0YyAWRhlO9ZrbN IDYp1KwgVwdNjv63UlsQDVYOx0qz/2qlVRdhbZCfIv2m5mpIDy0p8PVsKFuJvG1Q74+m eDVQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=O9cEoQUmey884K3gAXnzstiUS3pyx3v0IIec2VVGaSQ=; b=PmUVBfwHPpdSfokD5LKWP6p+oLghmt2uOJ9SvSGN8YauD/twgwERgN7eIdYRw6cgWH v4pW2hwVhfwGgUVzpbu2YC40Ni3KJRoyhBX9uX0o3WVF+ID3cP1PEcDfVz7X+ZFWYBJh HwiKEa0HblaH78gJS/cGd9wAWLTtVj1AerMpKLEnll4jHahWeiVzOb7JkmwubiAOifKl dPv7Er8naZipqnifMd2nbncDa128jB1uM7vAavoqJiEHUn0J6kpJspjXkfnruOu8zBx+ zrUlr+dIHMi6UHpbtFAeB5Ra+VEafAxvWTTKZUdLIS40z2NIaCJpnujGQEQGEPG6WEl7 knfg== X-Gm-Message-State: AIVw113Er1H+DyhZUMdEWiEOjRLSTLLXwCLkEh3ePrf5lxunlsQWhJ/5 uwvq9gN1BYrOLn6J9zw= X-Received: by 10.200.38.70 with SMTP id v6mr28463719qtv.157.1500326730752; Mon, 17 Jul 2017 14:25:30 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Mon, 17 Jul 2017 11:24:40 -1000 Message-Id: <20170717212446.15268-3-rth@twiddle.net> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20170717212446.15268-1-rth@twiddle.net> References: <20170717212446.15268-1-rth@twiddle.net> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400d:c0d::229 Subject: [Qemu-devel] [PULL v2 2/8] target/s390x: Implement CONVERT UNICODE insns X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: peter.maydell@linaro.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Reviewed-by: Aurelien Jarno Reviewed-by: Thomas Huth Signed-off-by: Richard Henderson --- target/s390x/helper.h | 6 + target/s390x/mem_helper.c | 310 +++++++++++++++++++++++++++++++++++++++++= ++++ target/s390x/translate.c | 51 ++++++++ target/s390x/insn-data.def | 13 ++ 4 files changed, 380 insertions(+) diff --git a/target/s390x/helper.h b/target/s390x/helper.h index 23e8d1d..2793cf3 100644 --- a/target/s390x/helper.h +++ b/target/s390x/helper.h @@ -107,6 +107,12 @@ DEF_HELPER_2(stfle, i32, env, i64) DEF_HELPER_FLAGS_2(lpq, TCG_CALL_NO_WG, i64, env, i64) DEF_HELPER_FLAGS_4(stpq, TCG_CALL_NO_WG, void, env, i64, i64, i64) DEF_HELPER_4(mvcos, i32, env, i64, i64, i64) +DEF_HELPER_4(cu12, i32, env, i32, i32, i32) +DEF_HELPER_4(cu14, i32, env, i32, i32, i32) +DEF_HELPER_4(cu21, i32, env, i32, i32, i32) +DEF_HELPER_4(cu24, i32, env, i32, i32, i32) +DEF_HELPER_4(cu41, i32, env, i32, i32, i32) +DEF_HELPER_4(cu42, i32, env, i32, i32, i32) =20 #ifndef CONFIG_USER_ONLY DEF_HELPER_3(servc, i32, env, i64, i64) diff --git a/target/s390x/mem_helper.c b/target/s390x/mem_helper.c index 7424f7f..33e2694 100644 --- a/target/s390x/mem_helper.c +++ b/target/s390x/mem_helper.c @@ -2196,3 +2196,313 @@ uint32_t HELPER(mvcos)(CPUS390XState *env, uint64_t= dest, uint64_t src, =20 return cc; } + +/* Decode a Unicode character. A return value < 0 indicates success, stor= ing + the UTF-32 result into OCHAR and the input length into OLEN. A return + value >=3D 0 indicates failure, and the CC value to be returned. */ +typedef int (*decode_unicode_fn)(CPUS390XState *env, uint64_t addr, + uint64_t ilen, bool enh_check, uintptr_t = ra, + uint32_t *ochar, uint32_t *olen); + +/* Encode a Unicode character. A return value < 0 indicates success, stor= ing + the bytes into ADDR and the output length into OLEN. A return value >= =3D 0 + indicates failure, and the CC value to be returned. */ +typedef int (*encode_unicode_fn)(CPUS390XState *env, uint64_t addr, + uint64_t ilen, uintptr_t ra, uint32_t c, + uint32_t *olen); + +static int decode_utf8(CPUS390XState *env, uint64_t addr, uint64_t ilen, + bool enh_check, uintptr_t ra, + uint32_t *ochar, uint32_t *olen) +{ + uint8_t s0, s1, s2, s3; + uint32_t c, l; + + if (ilen < 1) { + return 0; + } + s0 =3D cpu_ldub_data_ra(env, addr, ra); + if (s0 <=3D 0x7f) { + /* one byte character */ + l =3D 1; + c =3D s0; + } else if (s0 <=3D (enh_check ? 0xc1 : 0xbf)) { + /* invalid character */ + return 2; + } else if (s0 <=3D 0xdf) { + /* two byte character */ + l =3D 2; + if (ilen < 2) { + return 0; + } + s1 =3D cpu_ldub_data_ra(env, addr + 1, ra); + c =3D s0 & 0x1f; + c =3D (c << 6) | (s1 & 0x3f); + if (enh_check && (s1 & 0xc0) !=3D 0x80) { + return 2; + } + } else if (s0 <=3D 0xef) { + /* three byte character */ + l =3D 3; + if (ilen < 3) { + return 0; + } + s1 =3D cpu_ldub_data_ra(env, addr + 1, ra); + s2 =3D cpu_ldub_data_ra(env, addr + 2, ra); + c =3D s0 & 0x0f; + c =3D (c << 6) | (s1 & 0x3f); + c =3D (c << 6) | (s2 & 0x3f); + /* Fold the byte-by-byte range descriptions in the PoO into + tests against the complete value. It disallows encodings + that could be smaller, and the UTF-16 surrogates. */ + if (enh_check + && ((s1 & 0xc0) !=3D 0x80 + || (s2 & 0xc0) !=3D 0x80 + || c < 0x1000 + || (c >=3D 0xd800 && c <=3D 0xdfff))) { + return 2; + } + } else if (s0 <=3D (enh_check ? 0xf4 : 0xf7)) { + /* four byte character */ + l =3D 4; + if (ilen < 4) { + return 0; + } + s1 =3D cpu_ldub_data_ra(env, addr + 1, ra); + s2 =3D cpu_ldub_data_ra(env, addr + 2, ra); + s3 =3D cpu_ldub_data_ra(env, addr + 3, ra); + c =3D s0 & 0x07; + c =3D (c << 6) | (s1 & 0x3f); + c =3D (c << 6) | (s2 & 0x3f); + c =3D (c << 6) | (s3 & 0x3f); + /* See above. */ + if (enh_check + && ((s1 & 0xc0) !=3D 0x80 + || (s2 & 0xc0) !=3D 0x80 + || (s3 & 0xc0) !=3D 0x80 + || c < 0x010000 + || c > 0x10ffff)) { + return 2; + } + } else { + /* invalid character */ + return 2; + } + + *ochar =3D c; + *olen =3D l; + return -1; +} + +static int decode_utf16(CPUS390XState *env, uint64_t addr, uint64_t ilen, + bool enh_check, uintptr_t ra, + uint32_t *ochar, uint32_t *olen) +{ + uint16_t s0, s1; + uint32_t c, l; + + if (ilen < 2) { + return 0; + } + s0 =3D cpu_lduw_data_ra(env, addr, ra); + if ((s0 & 0xfc00) !=3D 0xd800) { + /* one word character */ + l =3D 2; + c =3D s0; + } else { + /* two word character */ + l =3D 4; + if (ilen < 4) { + return 0; + } + s1 =3D cpu_lduw_data_ra(env, addr + 2, ra); + c =3D extract32(s0, 6, 4) + 1; + c =3D (c << 6) | (s0 & 0x3f); + c =3D (c << 10) | (s1 & 0x3ff); + if (enh_check && (s1 & 0xfc00) !=3D 0xdc00) { + /* invalid surrogate character */ + return 2; + } + } + + *ochar =3D c; + *olen =3D l; + return -1; +} + +static int decode_utf32(CPUS390XState *env, uint64_t addr, uint64_t ilen, + bool enh_check, uintptr_t ra, + uint32_t *ochar, uint32_t *olen) +{ + uint32_t c; + + if (ilen < 4) { + return 0; + } + c =3D cpu_ldl_data_ra(env, addr, ra); + if ((c >=3D 0xd800 && c <=3D 0xdbff) || c > 0x10ffff) { + /* invalid unicode character */ + return 2; + } + + *ochar =3D c; + *olen =3D 4; + return -1; +} + +static int encode_utf8(CPUS390XState *env, uint64_t addr, uint64_t ilen, + uintptr_t ra, uint32_t c, uint32_t *olen) +{ + uint8_t d[4]; + uint32_t l, i; + + if (c <=3D 0x7f) { + /* one byte character */ + l =3D 1; + d[0] =3D c; + } else if (c <=3D 0x7ff) { + /* two byte character */ + l =3D 2; + d[1] =3D 0x80 | extract32(c, 0, 6); + d[0] =3D 0xc0 | extract32(c, 6, 5); + } else if (c <=3D 0xffff) { + /* three byte character */ + l =3D 3; + d[2] =3D 0x80 | extract32(c, 0, 6); + d[1] =3D 0x80 | extract32(c, 6, 6); + d[0] =3D 0xe0 | extract32(c, 12, 4); + } else { + /* four byte character */ + l =3D 4; + d[3] =3D 0x80 | extract32(c, 0, 6); + d[2] =3D 0x80 | extract32(c, 6, 6); + d[1] =3D 0x80 | extract32(c, 12, 6); + d[0] =3D 0xf0 | extract32(c, 18, 3); + } + + if (ilen < l) { + return 1; + } + for (i =3D 0; i < l; ++i) { + cpu_stb_data_ra(env, addr + i, d[i], ra); + } + + *olen =3D l; + return -1; +} + +static int encode_utf16(CPUS390XState *env, uint64_t addr, uint64_t ilen, + uintptr_t ra, uint32_t c, uint32_t *olen) +{ + uint16_t d0, d1; + + if (c <=3D 0xffff) { + /* one word character */ + if (ilen < 2) { + return 1; + } + cpu_stw_data_ra(env, addr, c, ra); + *olen =3D 2; + } else { + /* two word character */ + if (ilen < 4) { + return 1; + } + d1 =3D 0xdc00 | extract32(c, 0, 10); + d0 =3D 0xd800 | extract32(c, 10, 6); + d0 =3D deposit32(d0, 6, 4, extract32(c, 16, 5) - 1); + cpu_stw_data_ra(env, addr + 0, d0, ra); + cpu_stw_data_ra(env, addr + 2, d1, ra); + *olen =3D 4; + } + + return -1; +} + +static int encode_utf32(CPUS390XState *env, uint64_t addr, uint64_t ilen, + uintptr_t ra, uint32_t c, uint32_t *olen) +{ + if (ilen < 4) { + return 1; + } + cpu_stl_data_ra(env, addr, c, ra); + *olen =3D 4; + return -1; +} + +static inline uint32_t convert_unicode(CPUS390XState *env, uint32_t r1, + uint32_t r2, uint32_t m3, uintptr_t= ra, + decode_unicode_fn decode, + encode_unicode_fn encode) +{ + uint64_t dst =3D get_address(env, r1); + uint64_t dlen =3D get_length(env, r1 + 1); + uint64_t src =3D get_address(env, r2); + uint64_t slen =3D get_length(env, r2 + 1); + bool enh_check =3D m3 & 1; + int cc, i; + + /* Lest we fail to service interrupts in a timely manner, limit the + amount of work we're willing to do. For now, let's cap at 256. */ + for (i =3D 0; i < 256; ++i) { + uint32_t c, ilen, olen; + + cc =3D decode(env, src, slen, enh_check, ra, &c, &ilen); + if (unlikely(cc >=3D 0)) { + break; + } + cc =3D encode(env, dst, dlen, ra, c, &olen); + if (unlikely(cc >=3D 0)) { + break; + } + + src +=3D ilen; + slen -=3D ilen; + dst +=3D olen; + dlen -=3D olen; + cc =3D 3; + } + + set_address(env, r1, dst); + set_length(env, r1 + 1, dlen); + set_address(env, r2, src); + set_length(env, r2 + 1, slen); + + return cc; +} + +uint32_t HELPER(cu12)(CPUS390XState *env, uint32_t r1, uint32_t r2, uint32= _t m3) +{ + return convert_unicode(env, r1, r2, m3, GETPC(), + decode_utf8, encode_utf16); +} + +uint32_t HELPER(cu14)(CPUS390XState *env, uint32_t r1, uint32_t r2, uint32= _t m3) +{ + return convert_unicode(env, r1, r2, m3, GETPC(), + decode_utf8, encode_utf32); +} + +uint32_t HELPER(cu21)(CPUS390XState *env, uint32_t r1, uint32_t r2, uint32= _t m3) +{ + return convert_unicode(env, r1, r2, m3, GETPC(), + decode_utf16, encode_utf8); +} + +uint32_t HELPER(cu24)(CPUS390XState *env, uint32_t r1, uint32_t r2, uint32= _t m3) +{ + return convert_unicode(env, r1, r2, m3, GETPC(), + decode_utf16, encode_utf32); +} + +uint32_t HELPER(cu41)(CPUS390XState *env, uint32_t r1, uint32_t r2, uint32= _t m3) +{ + return convert_unicode(env, r1, r2, m3, GETPC(), + decode_utf32, encode_utf8); +} + +uint32_t HELPER(cu42)(CPUS390XState *env, uint32_t r1, uint32_t r2, uint32= _t m3) +{ + return convert_unicode(env, r1, r2, m3, GETPC(), + decode_utf32, encode_utf16); +} diff --git a/target/s390x/translate.c b/target/s390x/translate.c index e739525..edfdaf40 100644 --- a/target/s390x/translate.c +++ b/target/s390x/translate.c @@ -2122,6 +2122,56 @@ static ExitStatus op_ct(DisasContext *s, DisasOps *o) return NO_EXIT; } =20 +static ExitStatus op_cuXX(DisasContext *s, DisasOps *o) +{ + int m3 =3D get_field(s->fields, m3); + int r1 =3D get_field(s->fields, r1); + int r2 =3D get_field(s->fields, r2); + TCGv_i32 tr1, tr2, chk; + + /* R1 and R2 must both be even. */ + if ((r1 | r2) & 1) { + gen_program_exception(s, PGM_SPECIFICATION); + return EXIT_NORETURN; + } + if (!s390_has_feat(S390_FEAT_ETF3_ENH)) { + m3 =3D 0; + } + + tr1 =3D tcg_const_i32(r1); + tr2 =3D tcg_const_i32(r2); + chk =3D tcg_const_i32(m3); + + switch (s->insn->data) { + case 12: + gen_helper_cu12(cc_op, cpu_env, tr1, tr2, chk); + break; + case 14: + gen_helper_cu14(cc_op, cpu_env, tr1, tr2, chk); + break; + case 21: + gen_helper_cu21(cc_op, cpu_env, tr1, tr2, chk); + break; + case 24: + gen_helper_cu24(cc_op, cpu_env, tr1, tr2, chk); + break; + case 41: + gen_helper_cu41(cc_op, cpu_env, tr1, tr2, chk); + break; + case 42: + gen_helper_cu42(cc_op, cpu_env, tr1, tr2, chk); + break; + default: + g_assert_not_reached(); + } + + tcg_temp_free_i32(tr1); + tcg_temp_free_i32(tr2); + tcg_temp_free_i32(chk); + set_cc_static(s); + return NO_EXIT; +} + #ifndef CONFIG_USER_ONLY static ExitStatus op_diag(DisasContext *s, DisasOps *o) { @@ -5477,6 +5527,7 @@ enum DisasInsnEnum { #define FAC_EH S390_FEAT_STFLE_49 /* execution-hint */ #define FAC_PPA S390_FEAT_STFLE_49 /* processor-assist */ #define FAC_LZRB S390_FEAT_STFLE_53 /* load-and-zero-rightmost-byte= */ +#define FAC_ETF3 S390_FEAT_EXTENDED_TRANSLATION_3 =20 static const DisasInsn insn_info[] =3D { #include "insn-data.def" diff --git a/target/s390x/insn-data.def b/target/s390x/insn-data.def index 6ac12b8..323a301 100644 --- a/target/s390x/insn-data.def +++ b/target/s390x/insn-data.def @@ -313,6 +313,19 @@ C(0xb3a1, CDLGBR, RRF_e, FPE, 0, r2_o, f1, 0, cdlgb, 0) C(0xb3a2, CXLGBR, RRF_e, FPE, 0, r2_o, x1, 0, cxlgb, 0) =20 +/* CONVERT UTF-8 TO UTF-16 */ + D(0xb2a7, CU12, RRF_c, Z, 0, 0, 0, 0, cuXX, 0, 12) +/* CONVERT UTF-8 TO UTF-32 */ + D(0xb9b0, CU14, RRF_c, ETF3, 0, 0, 0, 0, cuXX, 0, 14) +/* CONVERT UTF-16 to UTF-8 */ + D(0xb2a6, CU21, RRF_c, Z, 0, 0, 0, 0, cuXX, 0, 21) +/* CONVERT UTF-16 to UTF-32 */ + D(0xb9b1, CU24, RRF_c, ETF3, 0, 0, 0, 0, cuXX, 0, 24) +/* CONVERT UTF-32 to UTF-8 */ + D(0xb9b2, CU41, RRF_c, ETF3, 0, 0, 0, 0, cuXX, 0, 41) +/* CONVERT UTF-32 to UTF-16 */ + D(0xb9b3, CU42, RRF_c, ETF3, 0, 0, 0, 0, cuXX, 0, 42) + /* DIVIDE */ C(0x1d00, DR, RR_a, Z, r1_D32, r2_32s, new_P, r1_P32, divs32, = 0) C(0x5d00, D, RX_a, Z, r1_D32, m2_32s, new_P, r1_P32, divs32, = 0) --=20 2.9.4 From nobody Sat Apr 27 13:15:33 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 150032696799349.20369970533898; Mon, 17 Jul 2017 14:29:27 -0700 (PDT) Received: from localhost ([::1]:52650 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dXDa2-00035B-Pj for importer@patchew.org; Mon, 17 Jul 2017 17:29:26 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33530) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dXDWL-0008Aa-7g for qemu-devel@nongnu.org; Mon, 17 Jul 2017 17:25:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dXDWI-0003T3-1W for qemu-devel@nongnu.org; Mon, 17 Jul 2017 17:25:37 -0400 Received: from mail-qt0-x243.google.com ([2607:f8b0:400d:c0d::243]:35966) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dXDWH-0003Se-Ti for qemu-devel@nongnu.org; Mon, 17 Jul 2017 17:25:33 -0400 Received: by mail-qt0-x243.google.com with SMTP id l55so274745qtl.3 for ; Mon, 17 Jul 2017 14:25:33 -0700 (PDT) Received: from bigtime.com ([101.165.234.197]) by smtp.gmail.com with ESMTPSA id o20sm282034qtc.23.2017.07.17.14.25.31 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 17 Jul 2017 14:25:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=Rza6t7ZA7A1+V98MVgJqBTUYi7QEQpjwWgQ9BHGhmWQ=; b=VE8efyzaHDh6jjxy5w6BPovQTkI9sJfzarB52gyLltso9nC9vVkm8C2IEts804BtJD fW8LS//9Bd7rDbzVeKRFb+lYgxGezIDXH4UqRP+u50ieoMhbTBYsPN1+54tJaWYlauRC gh9xuXdO4Z1+0OKyTJqw7MN88Wxlds4f3wNKZ/23WraQjjojh+gPaPIzTbqRUzBqeI0i 9LEl5kv87lkNx8zpunf0cjmNDtiyBtCcwPKavUhnhQui8IdXbVoUwzjqksv8WkNGvjJT jLeoB+ENvgn9t0zlmM7NUgkm/YaiV4zqUGcaXdENuJMWfONpaWtOYLAbKJ1wjckGxd5G 28sg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=Rza6t7ZA7A1+V98MVgJqBTUYi7QEQpjwWgQ9BHGhmWQ=; b=r6RxFwu3iTAKWROdu+Z8LK2ds5g+Pb1BCIOhVPfLL89TPykj/Vyz/GL07XEean8HxY HL7gjgPXoTTqjqTncAF3UOa2DRI/rgWeC4hMidt0GDB5etHVpaZpvXLVp9XkJISQV6/Q nLXgd3cCe7DS4dmHLCjJ96vGddISn/wFMn0HWWBFc+baAwtzvnBagMB2KDCVwzsQokEJ dVxVtCeY7QeocAzU++J0fd4zAxg7gwLQ4Dk5IqxBy1XOpRkfX0WehnkoCIrakMxFOwtM 2cK+09YPkp4MLNN/B0TxQH6P9aA9reaJs5wv9r2LDl7vDRKsKM45ZK32lnut7Mcv4hKD XXyA== X-Gm-Message-State: AIVw111LJ65VG2o69PKlFsN7jKZ8x4wPTY+rE0D0bqKfCt2EONosFEkL 3VtzeBCkL2J5GgpHpVw= X-Received: by 10.200.8.20 with SMTP id u20mr6767378qth.4.1500326733107; Mon, 17 Jul 2017 14:25:33 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Mon, 17 Jul 2017 11:24:41 -1000 Message-Id: <20170717212446.15268-4-rth@twiddle.net> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20170717212446.15268-1-rth@twiddle.net> References: <20170717212446.15268-1-rth@twiddle.net> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400d:c0d::243 Subject: [Qemu-devel] [PULL v2 3/8] target/s390x: Tidy SRST X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: peter.maydell@linaro.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Since we require all registers saved on input, read R0 from ENV instead of passing it manually. Recognize the specification exception when R0 contains incorrect data. Keep high bits of result registers unmodified when in 31 or 24-bit mode. Reviewed-by: Aurelien Jarno Signed-off-by: Richard Henderson --- target/s390x/helper.h | 2 +- target/s390x/mem_helper.c | 25 ++++++++++++++----------- target/s390x/translate.c | 9 +++++++-- target/s390x/insn-data.def | 2 +- 4 files changed, 23 insertions(+), 15 deletions(-) diff --git a/target/s390x/helper.h b/target/s390x/helper.h index 2793cf3..a2e5b9b 100644 --- a/target/s390x/helper.h +++ b/target/s390x/helper.h @@ -12,7 +12,7 @@ DEF_HELPER_FLAGS_3(divs32, TCG_CALL_NO_WG, s64, env, s64,= s64) DEF_HELPER_FLAGS_3(divu32, TCG_CALL_NO_WG, i64, env, i64, i64) DEF_HELPER_FLAGS_3(divs64, TCG_CALL_NO_WG, s64, env, s64, s64) DEF_HELPER_FLAGS_4(divu64, TCG_CALL_NO_WG, i64, env, i64, i64, i64) -DEF_HELPER_4(srst, i64, env, i64, i64, i64) +DEF_HELPER_3(srst, void, env, i32, i32) DEF_HELPER_4(clst, i64, env, i64, i64, i64) DEF_HELPER_FLAGS_4(mvn, TCG_CALL_NO_WG, void, env, i32, i64, i64) DEF_HELPER_FLAGS_4(mvo, TCG_CALL_NO_WG, void, env, i32, i64, i64) diff --git a/target/s390x/mem_helper.c b/target/s390x/mem_helper.c index 33e2694..2e3941f 100644 --- a/target/s390x/mem_helper.c +++ b/target/s390x/mem_helper.c @@ -538,18 +538,21 @@ static inline void set_length(CPUS390XState *env, int= reg, uint64_t length) } =20 /* search string (c is byte to search, r2 is string, r1 end of string) */ -uint64_t HELPER(srst)(CPUS390XState *env, uint64_t r0, uint64_t end, - uint64_t str) +void HELPER(srst)(CPUS390XState *env, uint32_t r1, uint32_t r2) { uintptr_t ra =3D GETPC(); + uint64_t end, str; uint32_t len; - uint8_t v, c =3D r0; + uint8_t v, c =3D env->regs[0]; =20 - str =3D wrap_address(env, str); - end =3D wrap_address(env, end); + /* Bits 32-55 must contain all 0. */ + if (env->regs[0] & 0xffffff00u) { + cpu_restore_state(ENV_GET_CPU(env), ra); + program_interrupt(env, PGM_SPECIFICATION, 6); + } =20 - /* Assume for now that R2 is unmodified. */ - env->retxl =3D str; + str =3D get_address(env, r2); + end =3D get_address(env, r1); =20 /* Lest we fail to service interrupts in a timely manner, limit the amount of work we're willing to do. For now, let's cap at 8k. */ @@ -557,20 +560,20 @@ uint64_t HELPER(srst)(CPUS390XState *env, uint64_t r0= , uint64_t end, if (str + len =3D=3D end) { /* Character not found. R1 & R2 are unmodified. */ env->cc_op =3D 2; - return end; + return; } v =3D cpu_ldub_data_ra(env, str + len, ra); if (v =3D=3D c) { /* Character found. Set R1 to the location; R2 is unmodified.= */ env->cc_op =3D 1; - return str + len; + set_address(env, r1, str + len); + return; } } =20 /* CPU-determined bytes processed. Advance R2 to next byte to process= . */ - env->retxl =3D str + len; env->cc_op =3D 3; - return end; + set_address(env, r2, str + len); } =20 /* unsigned string compare (c is string terminator) */ diff --git a/target/s390x/translate.c b/target/s390x/translate.c index edfdaf40..e37a56f 100644 --- a/target/s390x/translate.c +++ b/target/s390x/translate.c @@ -4287,9 +4287,14 @@ static ExitStatus op_stpq(DisasContext *s, DisasOps = *o) =20 static ExitStatus op_srst(DisasContext *s, DisasOps *o) { - gen_helper_srst(o->in1, cpu_env, regs[0], o->in1, o->in2); + TCGv_i32 r1 =3D tcg_const_i32(get_field(s->fields, r1)); + TCGv_i32 r2 =3D tcg_const_i32(get_field(s->fields, r2)); + + gen_helper_srst(cpu_env, r1, r2); + + tcg_temp_free_i32(r1); + tcg_temp_free_i32(r2); set_cc_static(s); - return_low128(o->in2); return NO_EXIT; } =20 diff --git a/target/s390x/insn-data.def b/target/s390x/insn-data.def index 323a301..bc6ff01 100644 --- a/target/s390x/insn-data.def +++ b/target/s390x/insn-data.def @@ -736,7 +736,7 @@ C(0xec57, RXSBG, RIE_f, GIE, 0, r2, r1, 0, rosbg, 0) =20 /* SEARCH STRING */ - C(0xb25e, SRST, RRE, Z, r1_o, r2_o, 0, 0, srst, 0) + C(0xb25e, SRST, RRE, Z, 0, 0, 0, 0, srst, 0) =20 /* SET ACCESS */ C(0xb24e, SAR, RRE, Z, 0, r2_o, 0, 0, sar, 0) --=20 2.9.4 From nobody Sat Apr 27 13:15:33 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1500326845286238.92830414957655; Mon, 17 Jul 2017 14:27:25 -0700 (PDT) Received: from localhost ([::1]:52644 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dXDY4-0000v8-27 for importer@patchew.org; Mon, 17 Jul 2017 17:27:24 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33536) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dXDWL-0008B7-Pg for qemu-devel@nongnu.org; Mon, 17 Jul 2017 17:25:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dXDWK-0003Ue-Ho for qemu-devel@nongnu.org; Mon, 17 Jul 2017 17:25:37 -0400 Received: from mail-qt0-x243.google.com ([2607:f8b0:400d:c0d::243]:35970) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dXDWK-0003UM-AO for qemu-devel@nongnu.org; Mon, 17 Jul 2017 17:25:36 -0400 Received: by mail-qt0-x243.google.com with SMTP id l55so274829qtl.3 for ; Mon, 17 Jul 2017 14:25:36 -0700 (PDT) Received: from bigtime.com ([101.165.234.197]) by smtp.gmail.com with ESMTPSA id o20sm282034qtc.23.2017.07.17.14.25.33 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 17 Jul 2017 14:25:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=Xs3erKRUARLP8nXXgOUitfjXi8EqX554RZUlfpEo0Wg=; b=BAhvPKd3BzouAudfFV0F0NZkCWQCyXap8VVumku2SoQKfsAZoSq2d4g7DptgOJ7G0k SqtvWrMB/Z1fdU17t8hsJecPkHKeYgWmPHxZNUNuFSNkvR6470iRB6LVxii9xStnRqqs yHU1JvzjD+Hpslks+yXz/IknOymxqgTPLZVhm8jUG8Z3/RNXEDpesknTSOSQJB8cBEZR elNvjleAbx3i8H81HRnlpp1UHKY9Ak82ksaGESBNLBthc6p8njbmX2NHN5Cz6I5U218w vLF+wMmTdau8yfqjEuy/PDZH4PI3EhtGbzOFxDPilsg7ljCVnacwrpnhkpPntrWhfT0q V32g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=Xs3erKRUARLP8nXXgOUitfjXi8EqX554RZUlfpEo0Wg=; b=kx9qDSEQJFSI881RH1NGCuDJMHAJK+VoYSB9cOu/MXOUngeDznjnT7Bvp3d0HRJGaj lykEifeprsaRENyrEFs4QDBnJ+hVpyD2DGQ2vMLs3E7u3FYaNMiGFQVl9sQFVX4ROj9X 2kEucX51L/nwo3tTffk2fcu+GmiduT0QlcpHlvuWTT5HC1CfgWefMPAPfhzzdbA4s55i 21FNkrXX4gapBf28L2M8esgHMeX05y9UcWhbPkjGzp8E8TWXAyRhF/LTslvHn6lsGbMK z2Z2ZaUvQ+voNSVS/fO1/KHjIxoXxfnzcItCfw1C2sD2E3SQAFYQYsZB+mcATwM7kxi2 nnyQ== X-Gm-Message-State: AIVw113djiNr+zeuGdZ6My20zL4/44PLBKGBxinvkQwNkoLXs7/1q6+t UnSVS+5nprgi2iUP2K8= X-Received: by 10.237.61.146 with SMTP id i18mr11139925qtf.239.1500326735593; Mon, 17 Jul 2017 14:25:35 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Mon, 17 Jul 2017 11:24:42 -1000 Message-Id: <20170717212446.15268-5-rth@twiddle.net> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20170717212446.15268-1-rth@twiddle.net> References: <20170717212446.15268-1-rth@twiddle.net> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400d:c0d::243 Subject: [Qemu-devel] [PULL v2 4/8] target/s390x: Implement SRSTU X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: peter.maydell@linaro.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Reviewed-by: Aurelien Jarno Signed-off-by: Richard Henderson --- target/s390x/helper.h | 1 + target/s390x/mem_helper.c | 41 +++++++++++++++++++++++++++++++++++++++++ target/s390x/translate.c | 13 +++++++++++++ target/s390x/insn-data.def | 2 ++ 4 files changed, 57 insertions(+) diff --git a/target/s390x/helper.h b/target/s390x/helper.h index a2e5b9b..32314e0 100644 --- a/target/s390x/helper.h +++ b/target/s390x/helper.h @@ -13,6 +13,7 @@ DEF_HELPER_FLAGS_3(divu32, TCG_CALL_NO_WG, i64, env, i64,= i64) DEF_HELPER_FLAGS_3(divs64, TCG_CALL_NO_WG, s64, env, s64, s64) DEF_HELPER_FLAGS_4(divu64, TCG_CALL_NO_WG, i64, env, i64, i64, i64) DEF_HELPER_3(srst, void, env, i32, i32) +DEF_HELPER_3(srstu, void, env, i32, i32) DEF_HELPER_4(clst, i64, env, i64, i64, i64) DEF_HELPER_FLAGS_4(mvn, TCG_CALL_NO_WG, void, env, i32, i64, i64) DEF_HELPER_FLAGS_4(mvo, TCG_CALL_NO_WG, void, env, i32, i64, i64) diff --git a/target/s390x/mem_helper.c b/target/s390x/mem_helper.c index 2e3941f..1926db7 100644 --- a/target/s390x/mem_helper.c +++ b/target/s390x/mem_helper.c @@ -576,6 +576,47 @@ void HELPER(srst)(CPUS390XState *env, uint32_t r1, uin= t32_t r2) set_address(env, r2, str + len); } =20 +void HELPER(srstu)(CPUS390XState *env, uint32_t r1, uint32_t r2) +{ + uintptr_t ra =3D GETPC(); + uint32_t len; + uint16_t v, c =3D env->regs[0]; + uint64_t end, str, adj_end; + + /* Bits 32-47 of R0 must be zero. */ + if (env->regs[0] & 0xffff0000u) { + cpu_restore_state(ENV_GET_CPU(env), ra); + program_interrupt(env, PGM_SPECIFICATION, 6); + } + + str =3D get_address(env, r2); + end =3D get_address(env, r1); + + /* If the LSB of the two addresses differ, use one extra byte. */ + adj_end =3D end + ((str ^ end) & 1); + + /* Lest we fail to service interrupts in a timely manner, limit the + amount of work we're willing to do. For now, let's cap at 8k. */ + for (len =3D 0; len < 0x2000; len +=3D 2) { + if (str + len =3D=3D adj_end) { + /* End of input found. */ + env->cc_op =3D 2; + return; + } + v =3D cpu_lduw_data_ra(env, str + len, ra); + if (v =3D=3D c) { + /* Character found. Set R1 to the location; R2 is unmodified.= */ + env->cc_op =3D 1; + set_address(env, r1, str + len); + return; + } + } + + /* CPU-determined bytes processed. Advance R2 to next byte to process= . */ + env->cc_op =3D 3; + set_address(env, r2, str + len); +} + /* unsigned string compare (c is string terminator) */ uint64_t HELPER(clst)(CPUS390XState *env, uint64_t c, uint64_t s1, uint64_= t s2) { diff --git a/target/s390x/translate.c b/target/s390x/translate.c index e37a56f..d83f2b9 100644 --- a/target/s390x/translate.c +++ b/target/s390x/translate.c @@ -4298,6 +4298,19 @@ static ExitStatus op_srst(DisasContext *s, DisasOps = *o) return NO_EXIT; } =20 +static ExitStatus op_srstu(DisasContext *s, DisasOps *o) +{ + TCGv_i32 r1 =3D tcg_const_i32(get_field(s->fields, r1)); + TCGv_i32 r2 =3D tcg_const_i32(get_field(s->fields, r2)); + + gen_helper_srstu(cpu_env, r1, r2); + + tcg_temp_free_i32(r1); + tcg_temp_free_i32(r2); + set_cc_static(s); + return NO_EXIT; +} + static ExitStatus op_sub(DisasContext *s, DisasOps *o) { tcg_gen_sub_i64(o->out, o->in1, o->in2); diff --git a/target/s390x/insn-data.def b/target/s390x/insn-data.def index bc6ff01..1d34df03 100644 --- a/target/s390x/insn-data.def +++ b/target/s390x/insn-data.def @@ -737,6 +737,8 @@ =20 /* SEARCH STRING */ C(0xb25e, SRST, RRE, Z, 0, 0, 0, 0, srst, 0) +/* SEARCH STRING UNICODE */ + C(0xb9be, SRSTU, RRE, ETF3, 0, 0, 0, 0, srstu, 0) =20 /* SET ACCESS */ C(0xb24e, SAR, RRE, Z, 0, r2_o, 0, 0, sar, 0) --=20 2.9.4 From nobody Sat Apr 27 13:15:33 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1500326962624270.4052695148671; Mon, 17 Jul 2017 14:29:22 -0700 (PDT) Received: from localhost ([::1]:52649 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dXDZx-00030o-36 for importer@patchew.org; Mon, 17 Jul 2017 17:29:21 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33558) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dXDWO-0008D7-AA for qemu-devel@nongnu.org; Mon, 17 Jul 2017 17:25:41 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dXDWN-0003WI-6q for qemu-devel@nongnu.org; Mon, 17 Jul 2017 17:25:40 -0400 Received: from mail-qk0-x243.google.com ([2607:f8b0:400d:c09::243]:36274) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dXDWM-0003W3-TR for qemu-devel@nongnu.org; Mon, 17 Jul 2017 17:25:39 -0400 Received: by mail-qk0-x243.google.com with SMTP id d136so241783qkg.3 for ; Mon, 17 Jul 2017 14:25:38 -0700 (PDT) Received: from bigtime.com ([101.165.234.197]) by smtp.gmail.com with ESMTPSA id o20sm282034qtc.23.2017.07.17.14.25.35 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 17 Jul 2017 14:25:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=u5lydVI+HJP71bYyz+LvB59pjBWxLzlTLdpOEK/X5Rg=; b=GNltgY7tO5Ihz7oWNcpBYZ8krYWh+DRcH8Xb7Yn2berlKbNFT4oXt/cU9jZHLS2AVB OeQZcjcOg2MPD2+AMk2Xoy/KBbbKhnxzgvllIdMaLBdBfu/3hIhin677HAQYi9YbH8vc KOtwrqq8xixp0jdvZA4Mo+KExAMBnu7cf7ZBUmAAYDty7kHoWg0CMJLP+TZYiAmy3hmD mjL0XEvXq6w+YdZMaO12pIekbRtiKGBzgj6YAhQBzloDPnqULN0HS63E1fsx3o4OMSwI z4VKJMi7f64f9yuFFn8QpPG15M740bN3zum3hREybgJTYKD6Hwfw0Lgr+a6/BnPCToGm /7dw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=u5lydVI+HJP71bYyz+LvB59pjBWxLzlTLdpOEK/X5Rg=; b=hVF2z+p/K6oGFvF15sfy9aFbS59jquMV+HAqQgzMY+nKxU/CMexUse/SIuH0UBQ/4V 67h2WaMAh8uwjCS6Ia5+Z2PGXkE+KW+SHrnWYa23g/n/UHnUaTGk+Tg1D6bbQoutX/sa 8JvgxE8jMTZypb8OEYhH7lApLP12gsIPGT/l0FAayQ5zkLMO1vKTN7/OM2svVHMD2tWg g9yXgOwPGuCiWxfD8XUrGG5n0MNVh/k8ytysFwLR4E3eDkrIoX15NGEtUaUpMe5ctgF4 UTmJoyOOJ2qz9gJ4eFL8T9u9XR+pWwYEp5cJchjjSuVaWfvUWfJlZTyZ2jeEABZpD1D9 +gnA== X-Gm-Message-State: AIVw11389hfWKFoofj7oAVrb13DFoHCyRy7fOO03/io0prlytvpMoWRw csyynm9RmEXdnMUBm5s= X-Received: by 10.55.103.23 with SMTP id b23mr27905399qkc.55.1500326738126; Mon, 17 Jul 2017 14:25:38 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Mon, 17 Jul 2017 11:24:43 -1000 Message-Id: <20170717212446.15268-6-rth@twiddle.net> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20170717212446.15268-1-rth@twiddle.net> References: <20170717212446.15268-1-rth@twiddle.net> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400d:c09::243 Subject: [Qemu-devel] [PULL v2 5/8] target/s390x: Implement TRTR X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: peter.maydell@linaro.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Drop TRT from the set of insns handled internally by EXECUTE. It's more important to adjust the existing helper to handle both TRT and TRTR. Reviewed-by: Aurelien Jarno Signed-off-by: Richard Henderson --- target/s390x/helper.h | 1 + target/s390x/mem_helper.c | 20 +++++++++++++------- target/s390x/translate.c | 9 +++++++++ target/s390x/insn-data.def | 2 ++ 4 files changed, 25 insertions(+), 7 deletions(-) diff --git a/target/s390x/helper.h b/target/s390x/helper.h index 32314e0..4b02907 100644 --- a/target/s390x/helper.h +++ b/target/s390x/helper.h @@ -97,6 +97,7 @@ DEF_HELPER_FLAGS_3(tp, TCG_CALL_NO_WG, i32, env, i64, i32) DEF_HELPER_FLAGS_4(tr, TCG_CALL_NO_WG, void, env, i32, i64, i64) DEF_HELPER_4(tre, i64, env, i64, i64, i64) DEF_HELPER_4(trt, i32, env, i32, i64, i64) +DEF_HELPER_4(trtr, i32, env, i32, i64, i64) DEF_HELPER_5(trXX, i32, env, i32, i32, i32, i32) DEF_HELPER_4(cksm, i64, env, i64, i64, i64) DEF_HELPER_FLAGS_5(calc_cc, TCG_CALL_NO_RWG_SE, i32, env, i32, i64, i64, i= 64) diff --git a/target/s390x/mem_helper.c b/target/s390x/mem_helper.c index 1926db7..cdc78aa 100644 --- a/target/s390x/mem_helper.c +++ b/target/s390x/mem_helper.c @@ -1277,17 +1277,18 @@ uint64_t HELPER(tre)(CPUS390XState *env, uint64_t a= rray, return array + i; } =20 -static uint32_t do_helper_trt(CPUS390XState *env, uint32_t len, uint64_t a= rray, - uint64_t trans, uintptr_t ra) +static inline uint32_t do_helper_trt(CPUS390XState *env, int len, + uint64_t array, uint64_t trans, + int inc, uintptr_t ra) { - uint32_t i; + int i; =20 for (i =3D 0; i <=3D len; i++) { - uint8_t byte =3D cpu_ldub_data_ra(env, array + i, ra); + uint8_t byte =3D cpu_ldub_data_ra(env, array + i * inc, ra); uint8_t sbyte =3D cpu_ldub_data_ra(env, trans + byte, ra); =20 if (sbyte !=3D 0) { - set_address(env, 1, array + i); + set_address(env, 1, array + i * inc); env->regs[2] =3D deposit64(env->regs[2], 0, 8, sbyte); return (i =3D=3D len) ? 2 : 1; } @@ -1299,7 +1300,13 @@ static uint32_t do_helper_trt(CPUS390XState *env, ui= nt32_t len, uint64_t array, uint32_t HELPER(trt)(CPUS390XState *env, uint32_t len, uint64_t array, uint64_t trans) { - return do_helper_trt(env, len, array, trans, GETPC()); + return do_helper_trt(env, len, array, trans, 1, GETPC()); +} + +uint32_t HELPER(trtr)(CPUS390XState *env, uint32_t len, uint64_t array, + uint64_t trans) +{ + return do_helper_trt(env, len, array, trans, -1, GETPC()); } =20 /* Translate one/two to one/two */ @@ -2119,7 +2126,6 @@ void HELPER(ex)(CPUS390XState *env, uint32_t ilen, ui= nt64_t r1, uint64_t addr) [0x6] =3D do_helper_oc, [0x7] =3D do_helper_xc, [0xc] =3D do_helper_tr, - [0xd] =3D do_helper_trt, }; dx_helper helper =3D dx[opc & 0xf]; =20 diff --git a/target/s390x/translate.c b/target/s390x/translate.c index d83f2b9..b46f4c8 100644 --- a/target/s390x/translate.c +++ b/target/s390x/translate.c @@ -4447,6 +4447,15 @@ static ExitStatus op_trt(DisasContext *s, DisasOps *= o) return NO_EXIT; } =20 +static ExitStatus op_trtr(DisasContext *s, DisasOps *o) +{ + TCGv_i32 l =3D tcg_const_i32(get_field(s->fields, l1)); + gen_helper_trtr(cc_op, cpu_env, l, o->addr1, o->in2); + tcg_temp_free_i32(l); + set_cc_static(s); + return NO_EXIT; +} + static ExitStatus op_trXX(DisasContext *s, DisasOps *o) { TCGv_i32 r1 =3D tcg_const_i32(get_field(s->fields, r1)); diff --git a/target/s390x/insn-data.def b/target/s390x/insn-data.def index 1d34df03..ad84c74 100644 --- a/target/s390x/insn-data.def +++ b/target/s390x/insn-data.def @@ -916,6 +916,8 @@ C(0xdc00, TR, SS_a, Z, la1, a2, 0, 0, tr, 0) /* TRANSLATE AND TEST */ C(0xdd00, TRT, SS_a, Z, la1, a2, 0, 0, trt, 0) +/* TRANSLATE AND TEST REVERSE */ + C(0xd000, TRTR, SS_a, ETF3, la1, a2, 0, 0, trtr, 0) /* TRANSLATE EXTENDED */ C(0xb2a5, TRE, RRE, Z, 0, r2, r1_P, 0, tre, 0) =20 --=20 2.9.4 From nobody Sat Apr 27 13:15:33 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1500327053855501.7395449224299; Mon, 17 Jul 2017 14:30:53 -0700 (PDT) Received: from localhost ([::1]:52659 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dXDbP-0004Ki-Ox for importer@patchew.org; Mon, 17 Jul 2017 17:30:51 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33582) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dXDWQ-0008FL-DE for qemu-devel@nongnu.org; Mon, 17 Jul 2017 17:25:45 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dXDWP-0003XM-Bt for qemu-devel@nongnu.org; Mon, 17 Jul 2017 17:25:42 -0400 Received: from mail-qt0-x243.google.com ([2607:f8b0:400d:c0d::243]:33278) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dXDWP-0003X9-7R for qemu-devel@nongnu.org; Mon, 17 Jul 2017 17:25:41 -0400 Received: by mail-qt0-x243.google.com with SMTP id j25so300761qtf.0 for ; Mon, 17 Jul 2017 14:25:41 -0700 (PDT) Received: from bigtime.com ([101.165.234.197]) by smtp.gmail.com with ESMTPSA id o20sm282034qtc.23.2017.07.17.14.25.38 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 17 Jul 2017 14:25:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=vC/UeYdyHJMu8qIkOwxjGI0sJ5bGiUh2A340BKPG8P8=; b=SeBNLUm0sUmZM3tNTCQdLUYMVDpX9BDlZ0Q23m24JWdqOC1JkVoQA7Km4V8tXl4P5Q AgfQdR0wuDtUzGn4O8GsUbx5gId3HzapfsFsiJLgiKpcv/e/4U3ENKhnlmCUiD5Uhz2E oxXXnNbazCs6IqwWy6dM9AKSI0QUrCw1N1SFyhsr7P/Sjp4Yjqy6uQdDxknHQruM9ixm Q5xkrZLT+eAaofYf3LRyZlXTRTIk/CFNr4vEMMEiySdLHD6Rayq+i8ZAy4h1Xw1WWANy T94pSCut+uv7MMMI6rDjuAzBZX9DuegbTAuUHKIoVgWCDkJO/ynFXLDmHpLQn/piaYv3 Mn6Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=vC/UeYdyHJMu8qIkOwxjGI0sJ5bGiUh2A340BKPG8P8=; b=du+xIrRM0lcnUtWXlEyWiGK6/S1BbZFSZ5dar/n+aWVIdynrW+ukMlIIOyyjO9IQwJ i2nSmdhBU3NScxHvVSBrQNnNe28xlrFNg7MH0PYvhvjWJe3cXBQDv4k89Du9vqmSUntG bzoXuY03E1x186H1CbM0nvSaCZJEypk+DJzWfOyRDdzzMzcxTEqNXrAr/onQyH0jrEmr FErzw1SiUiBT1tufZhKguLXAt9YI5KFL6ElBY2qqeBpWiIBs6+DEygHOc6neOpe13Ow1 79np/o2pD0y6foKe8lC/rGOfTA29xO98FD5Ks/50QfWfcvl3M+Avzfyo+UZiGIBypmyW c+nA== X-Gm-Message-State: AIVw1119trm7V0qVtmhzR0wRgMJTtD9079PBy24d5sCBzaPCajblofS2 xp2ezURADZGZAysUc8Q= X-Received: by 10.200.3.132 with SMTP id t4mr31068516qtg.232.1500326740554; Mon, 17 Jul 2017 14:25:40 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Mon, 17 Jul 2017 11:24:44 -1000 Message-Id: <20170717212446.15268-7-rth@twiddle.net> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20170717212446.15268-1-rth@twiddle.net> References: <20170717212446.15268-1-rth@twiddle.net> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400d:c0d::243 Subject: [Qemu-devel] [PULL v2 6/8] target/s390x: Mark ETF3 and ETF3_ENH facilities as available X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: peter.maydell@linaro.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Reviewed-by: Aurelien Jarno Signed-off-by: Richard Henderson --- target/s390x/cpu_models.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c index 8433010..9e9e649 100644 --- a/target/s390x/cpu_models.c +++ b/target/s390x/cpu_models.c @@ -782,11 +782,13 @@ static void add_qemu_cpu_model_features(S390FeatBitma= p fbm) S390_FEAT_STFLE, S390_FEAT_EXTENDED_IMMEDIATE, S390_FEAT_EXTENDED_TRANSLATION_2, + S390_FEAT_EXTENDED_TRANSLATION_3, S390_FEAT_LONG_DISPLACEMENT, S390_FEAT_LONG_DISPLACEMENT_FAST, S390_FEAT_ETF2_ENH, S390_FEAT_STORE_CLOCK_FAST, S390_FEAT_MOVE_WITH_OPTIONAL_SPEC, + S390_FEAT_ETF3_ENH, S390_FEAT_COMPARE_AND_SWAP_AND_STORE, S390_FEAT_COMPARE_AND_SWAP_AND_STORE_2, S390_FEAT_GENERAL_INSTRUCTIONS_EXT, --=20 2.9.4 From nobody Sat Apr 27 13:15:33 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1500327117736133.88661718261267; Mon, 17 Jul 2017 14:31:57 -0700 (PDT) Received: from localhost ([::1]:52662 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dXDcS-0004tO-9Q for importer@patchew.org; Mon, 17 Jul 2017 17:31:56 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33608) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dXDWT-0008IF-KU for qemu-devel@nongnu.org; Mon, 17 Jul 2017 17:25:46 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dXDWS-0003Yo-Fm for qemu-devel@nongnu.org; Mon, 17 Jul 2017 17:25:45 -0400 Received: from mail-qk0-x244.google.com ([2607:f8b0:400d:c09::244]:35330) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dXDWS-0003YS-5k for qemu-devel@nongnu.org; Mon, 17 Jul 2017 17:25:44 -0400 Received: by mail-qk0-x244.google.com with SMTP id z22so278532qka.2 for ; Mon, 17 Jul 2017 14:25:44 -0700 (PDT) Received: from bigtime.com ([101.165.234.197]) by smtp.gmail.com with ESMTPSA id o20sm282034qtc.23.2017.07.17.14.25.40 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 17 Jul 2017 14:25:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=bKjeI1vGMJ7UqsWgj8SMjKGm2Dk59QRuhpUojVZvOuA=; b=gY/e2ptI2Io8l1u4JyyRf4bJCE/8mfDFuEKeJCi9CO0URh0CcHNkZaj62dzyZj3Un4 M9CDRh97TTGfD3EebHNAnqyZ0VgUTK+qZR/LiY0q3t9iN2r4StjiSs0yMboHf0AbF4vE scJp4ctOV2oBdzME2dsCDCWNI7uDgNsg08EHe9KUzCb+i+f/8k9LpBI5XAIGbwkcmbgZ 0Gzi5B9kcplSwTTbAcbbUClWVRCMWR0fH5+MILg+JfX7JiypFoxADU90FwUNLsL8rWe3 V7mPDd60spQnr+Z6mbusuZMWzT0nVypWAfHls4Awbic0sCNQUYYnsrLM9XS1BvKQdqHi P4LQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=bKjeI1vGMJ7UqsWgj8SMjKGm2Dk59QRuhpUojVZvOuA=; b=GUn3yPhDETnA4C58iEQeSFY11BwRg4QLwMNWZt2zasFB4x59A99rHGdYTWT9i3ANiy Iw3JwdBOxyRNggMPARUwQUytJSiswmqAuR+tZJDrcgVAFiXj47RQohwXfd4Aaleqswct vhnIOZKZNwsoBkkIW94mfM9G9oCDDIcHXxZWI/xU51SzbX/mqSynx4faiDA2iuLLk/uf H+xyyObdEAoukfkqi1jXPK8boRpFoc9dMm8M5CcaobhUFdW+hRn9TB2Q/CurAnI6oE3G VpH31AkHeIWKoKJAP30otnjC1EJpjNdGZpbZd745jvwLKo6XnEIjeo5Pu0SnxMLamgYi 1UCg== X-Gm-Message-State: AIVw110Lq8+jS/jBQ//TxPZO0V90nD/uRUjlBzfe69CAvk9q9vkqo2ow s+j/JnskmkyX6Ft0Vqk= X-Received: by 10.55.158.78 with SMTP id h75mr7362460qke.70.1500326743345; Mon, 17 Jul 2017 14:25:43 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Mon, 17 Jul 2017 11:24:45 -1000 Message-Id: <20170717212446.15268-8-rth@twiddle.net> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20170717212446.15268-1-rth@twiddle.net> References: <20170717212446.15268-1-rth@twiddle.net> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400d:c09::244 Subject: [Qemu-devel] [PULL v2 7/8] target/s390x: Allow to enable "idtes" feature for TCG X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: peter.maydell@linaro.org, David Hildenbrand Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: David Hildenbrand STFL bit 4 and 5 are just indications to the guest, which TLB entries an IDTE call will clear. These are performance indicators for the guest. STFL bit 4: INVALIDATE DAT TABLE ENTRY (IDTE) performs the invalidation-and-clearing operation by selectively clearing TLB segment-table entries when a segment-table entry or entries are invalidated. IDTE also performs the clearing-by- ASCE operation. Unless bit 4 is one, IDTE simply purges all TLBs. Bit 3 is one if bit 4 is one. We can simply set STFL bit 4 ("idtes") and still purge the complete TLB. Purging more than advertised is never bad. E.g. Linux doesn't even care about this bit. We can optimized this later. This is helpful, as the z9 base model contains this facility. STFL bit 5 (clearing TLB region-table-entries) was never implemented on real HW, therefore we can simply ignore it for now. Signed-off-by: David Hildenbrand Message-Id: <20170627161032.5014-1-david@redhat.com> Signed-off-by: Richard Henderson --- target/s390x/cpu_models.c | 1 + 1 file changed, 1 insertion(+) diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c index 9e9e649..f4f73b8 100644 --- a/target/s390x/cpu_models.c +++ b/target/s390x/cpu_models.c @@ -779,6 +779,7 @@ static void add_qemu_cpu_model_features(S390FeatBitmap = fbm) { static const int feats[] =3D { S390_FEAT_DAT_ENH, + S390_FEAT_IDTE_SEGMENT, S390_FEAT_STFLE, S390_FEAT_EXTENDED_IMMEDIATE, S390_FEAT_EXTENDED_TRANSLATION_2, --=20 2.9.4 From nobody Sat Apr 27 13:15:33 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1500326974249430.41057580725123; Mon, 17 Jul 2017 14:29:34 -0700 (PDT) Received: from localhost ([::1]:52651 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dXDa9-0003GD-1D for importer@patchew.org; Mon, 17 Jul 2017 17:29:33 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33638) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dXDWV-0008Js-CK for qemu-devel@nongnu.org; Mon, 17 Jul 2017 17:25:48 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dXDWU-0003Zo-I4 for qemu-devel@nongnu.org; Mon, 17 Jul 2017 17:25:47 -0400 Received: from mail-qk0-x241.google.com ([2607:f8b0:400d:c09::241]:34503) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dXDWU-0003Zb-E2 for qemu-devel@nongnu.org; Mon, 17 Jul 2017 17:25:46 -0400 Received: by mail-qk0-x241.google.com with SMTP id q66so284674qki.1 for ; Mon, 17 Jul 2017 14:25:46 -0700 (PDT) Received: from bigtime.com ([101.165.234.197]) by smtp.gmail.com with ESMTPSA id o20sm282034qtc.23.2017.07.17.14.25.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 17 Jul 2017 14:25:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=cm6qv+J5qtUAtr/6e9moYaYNL4ayYT2KD4kLx+i2oWk=; b=mPArP7VP2ThxHBPp8TYlS0LMxRdkxarcY8JBc8+26uog9Qy3pGkeBvY9PKrTWGOmzx y+lwa4q6mCHpvapZcmwimDrLnJ9BtG82oe9aUUUtSRcUZVf967HVz1KGE8AusfEf/QOr nh2rBlO8Tuw2INJ55Ba1DpntH/Pys/S6FdmwYKG7JuICHZ3F7SafqTbD3kCIv8FjGRaw 6CwrusfnJzFgcml2pNmA7Ng8ferzh4x5X88AdFZEg9SrjaWQk/2ofhF1mhnDYWEv6bQS xieDZVqUQSeYoRPJ6aElEYneuICjBF/31UhBR0dnOaQD9BkiEjssGQOEFmpT1Hkm2dKl bwMg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=cm6qv+J5qtUAtr/6e9moYaYNL4ayYT2KD4kLx+i2oWk=; b=isfFBOv/ueY0UfUXqCq5u2UejgbuTNaJNnZDCP4+HACyBRvhMuDs/ikFrVlU6eOfqf BtHozqWY+gygqAlIY3AmoG6UT6c9fN1MyNAp67dDZsyYLzxYlfBCYTyHW9xST8AUS6wO Nv6l7V6gcvh1Q3ZeoXnijIvASqYAgGhUXWw92pkjjwen6V4yWwVI/q4nmUUIVynkrgRo 2JJ/sVwabFF5sx4cysDxbjTgUOIH9pJH/kjwSnmHtYDiNsZZbOTLcBjXUJP4M7o9+vzh bdhqmnkDkJ/68/VqR3AX8fSX6LIcXyPv8P5LUbo9j1eeK72s1zrByweujxlCSbUg2fy3 e7Gg== X-Gm-Message-State: AIVw110dfxHBoRs9yzvXiZ92t4YJquS8f0eNjKwFPjLh0aLVB7UqiA1R Gv3GEoAMzDP0NIUgigo= X-Received: by 10.55.163.69 with SMTP id m66mr30092832qke.139.1500326745710; Mon, 17 Jul 2017 14:25:45 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Mon, 17 Jul 2017 11:24:46 -1000 Message-Id: <20170717212446.15268-9-rth@twiddle.net> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20170717212446.15268-1-rth@twiddle.net> References: <20170717212446.15268-1-rth@twiddle.net> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400d:c09::241 Subject: [Qemu-devel] [PULL v2 8/8] target/s390x: Fix risbg handling X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: peter.maydell@linaro.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" The rotation is to the left, but extract shifts to the right. The computation of the extract parameters needs adjusting. For the entry condition, simplify 64 - rot + len <=3D 64 -rot + len <=3D 0 len <=3D rot Reviewed-by: Aurelien Jarno Reported-by: David Hildenbrand Suggested-by: Aurelien Jarno Signed-off-by: Richard Henderson --- target/s390x/translate.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/target/s390x/translate.c b/target/s390x/translate.c index b46f4c8..1dffcee 100644 --- a/target/s390x/translate.c +++ b/target/s390x/translate.c @@ -3479,8 +3479,8 @@ static ExitStatus op_risbg(DisasContext *s, DisasOps = *o) } =20 /* In some cases we can implement this with extract. */ - if (imask =3D=3D 0 && pos =3D=3D 0 && len > 0 && rot + len <=3D 64) { - tcg_gen_extract_i64(o->out, o->in2, rot, len); + if (imask =3D=3D 0 && pos =3D=3D 0 && len > 0 && len <=3D rot) { + tcg_gen_extract_i64(o->out, o->in2, 64 - rot, len); return NO_EXIT; } =20 --=20 2.9.4