From nobody Fri May 3 01:14:30 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 1500139985692213.56120711866583; Sat, 15 Jul 2017 10:33:05 -0700 (PDT) Received: from localhost ([::1]:42797 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dWQwB-0007Y8-0w for importer@patchew.org; Sat, 15 Jul 2017 13:33:03 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50085) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dWQuE-0006Q6-Av for qemu-devel@nongnu.org; Sat, 15 Jul 2017 13:31:03 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dWQuB-0000nJ-5Y for qemu-devel@nongnu.org; Sat, 15 Jul 2017 13:31:02 -0400 Received: from mail-pg0-x241.google.com ([2607:f8b0:400e:c05::241]:35256) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dWQuA-0000mG-TA for qemu-devel@nongnu.org; Sat, 15 Jul 2017 13:30:59 -0400 Received: by mail-pg0-x241.google.com with SMTP id d193so14295586pgc.2 for ; Sat, 15 Jul 2017 10:30:58 -0700 (PDT) Received: from bigtime.twiddle.net (rrcs-173-197-98-123.west.biz.rr.com. [173.197.98.123]) by smtp.gmail.com with ESMTPSA id w66sm27366075pfi.63.2017.07.15.10.30.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 15 Jul 2017 10:30:56 -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=xpR65Hr+R1NXSP/10kPJD7y4FpYL20qxmLdeA3J1WMk=; b=J3uhkgdSSvCmhIQhKL0qMk/TFu43azQDkkuJ+nonVLsaVXTUQWevK9QlfBaqxErto1 FJyL5VLeTqTERWEViI0qzsJjD8CQZJK3AXc2xeFNkw0bPksVuL7BNMI0kHsnCZ9KWpuz q15Z8I1wdbeZkb9FLs4Xh41aHJjikhpmXBepI+IDr+5t8lO393qdPTBFBGfH9ElJ0WfW 1ecemKFPFR3dpaF0ryERv90c0guPTptbdounQ9rURIasDlnPG3kRLUawzFP+ZNNpvuSK Rq0OkbgdxjwBhbChqds9VOpSX06gqAzwiTJ93ibOVDbeb7vULo6JBvXmcSgILkpJkECQ KkSQ== 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=xpR65Hr+R1NXSP/10kPJD7y4FpYL20qxmLdeA3J1WMk=; b=iO1zkVelWd6Jvqdln1lD5JN9qXMItVTlMe5zVf1hwVj+z6hGm5tY0WmleVH60WpV7m 7QESpNJxXPFqP+bzBVAaam9F4g8zHH4ltLs68l1otnVk3TBgH8SlZBwjsdUyKr7WQHot R7nskd51Lc7i9yjgZACvaPuUIs1UugsD1LBd30az2thUVkAbVdw32vqgQaIum6ZATVgb 9qApuVVLa9/TkbXnn1EiKdEEu0JS+olnI+C0UZzBNr94USa7iOl1M/2ND9fsgkvp3xyg 8SAOstq54RRSlXATga6W4lTDxSdxl7CC/pnBJbTjtmx1asyjGZD6/fWTO54TNxLvBwz8 SMzQ== X-Gm-Message-State: AIVw111CH0+BPTEFSQeJ+lqfXlmjQb5QKGAv2dhpFajuQKDs8seNMJEV oD2f733RfAned/wCnQw= X-Received: by 10.84.164.193 with SMTP id l1mr22432499plg.106.1500139857638; Sat, 15 Jul 2017 10:30:57 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sat, 15 Jul 2017 07:30:43 -1000 Message-Id: <20170715173050.31018-2-rth@twiddle.net> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20170715173050.31018-1-rth@twiddle.net> References: <20170715173050.31018-1-rth@twiddle.net> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400e:c05::241 Subject: [Qemu-devel] [PULL 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..513b402 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_USER_ONLY +# ifdef CONFIG_ATOMIC64 + uint64_t *haddr =3D g2h(a1); + ov =3D atomic_cmpxchg__nocheck(haddr, cv, nv); +# else + /* Note that we asserted !parallel_cpus above. */ + g_assert_not_reached(); +# endif +#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 { + 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 Fri May 3 01:14:30 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 1500139990436196.4705807912053; Sat, 15 Jul 2017 10:33:10 -0700 (PDT) Received: from localhost ([::1]:42798 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dWQwG-0007bV-Qf for importer@patchew.org; Sat, 15 Jul 2017 13:33:08 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50102) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dWQuF-0006QB-EP for qemu-devel@nongnu.org; Sat, 15 Jul 2017 13:31:05 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dWQuD-0000oF-87 for qemu-devel@nongnu.org; Sat, 15 Jul 2017 13:31:03 -0400 Received: from mail-pg0-x241.google.com ([2607:f8b0:400e:c05::241]:36380) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dWQuD-0000no-0C for qemu-devel@nongnu.org; Sat, 15 Jul 2017 13:31:01 -0400 Received: by mail-pg0-x241.google.com with SMTP id y129so14323290pgy.3 for ; Sat, 15 Jul 2017 10:31:00 -0700 (PDT) Received: from bigtime.twiddle.net (rrcs-173-197-98-123.west.biz.rr.com. [173.197.98.123]) by smtp.gmail.com with ESMTPSA id w66sm27366075pfi.63.2017.07.15.10.30.57 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 15 Jul 2017 10:30:59 -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=YwIidJcXCikYpn/wVW57tzI/iHR8t0BGhEy0h+qQEXk=; b=YLEM/7f7b+5sfVXOYVIHggAzJzEdgGEiHbtHa1vfXHIIKjfxyrxV51D1MR4zsQwGw1 SAa6afyRLH2RGxmW7wMvqJoK35cJZg8g1qJ7IyL5fwmgrTolwnlXYx5Yf19pSURKcHri rnOCL3rzeInMahtvjEaZpIVKu1tHySaHlIOqnDXQGIlu/qbBEuWnbljrrqAvipPeEkc1 S90q2FUixI4ZR0b7kp8EMzOCEtVtuhN5+kZen7YQP1AR8DGKHkYzQ6kYUdP+arJp+eG7 6OokZ56J6B1hJdxhpAktFm14iN9BtWV5lmpbVE9NKUkCvb5SzbkqAFwhAwaLda0ctnf1 7m0w== 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=YwIidJcXCikYpn/wVW57tzI/iHR8t0BGhEy0h+qQEXk=; b=ESZIraCz9xhGOO6DJEhJCUmicJt4ij2MPeFYkPktrrWs/LB6vz4HAeWmHz09jYLbJk FamWY+zdOXRVA5qk+0uF7r6a5IOFhrhv8ZO1PgdcdF0fTg/L/lgaY3RHrjQiwdZG62/B Az1OOQn7Wj7qydPQQtUAL0Nb9PUJt5VD5PSURp8zQs4u+BXqpBlhVPVratPlrekoojnR z1qyhxQCMjjIPR+I8Dayl49vyDo5ldwpjSgdZOpGiNFiPZiJaczMYA849TkXMgT29v97 3/BTjG+owOSy+3Dx+zjtpA3n1x9PQNZv5fuI8s+c6HfG3JUMsXvcxfrx+bW/VTfHXcIn Bl1Q== X-Gm-Message-State: AIVw111NsLoQV/LoL+6LzBf5gHSbQ0nJSE1rGPHwAImbgCOwvcbg61CW 9neBD1MDJ+HlRHugwfo= X-Received: by 10.84.232.207 with SMTP id x15mr22080685plm.173.1500139859690; Sat, 15 Jul 2017 10:30:59 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sat, 15 Jul 2017 07:30:44 -1000 Message-Id: <20170715173050.31018-3-rth@twiddle.net> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20170715173050.31018-1-rth@twiddle.net> References: <20170715173050.31018-1-rth@twiddle.net> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400e:c05::241 Subject: [Qemu-devel] [PULL 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 513b402..b9c7391 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 Fri May 3 01:14:30 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 150014014744592.003836028661; Sat, 15 Jul 2017 10:35:47 -0700 (PDT) Received: from localhost ([::1]:42812 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dWQyo-0001p0-53 for importer@patchew.org; Sat, 15 Jul 2017 13:35:46 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50106) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dWQuF-0006QC-SN for qemu-devel@nongnu.org; Sat, 15 Jul 2017 13:31:05 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dWQuE-0000ow-Rg for qemu-devel@nongnu.org; Sat, 15 Jul 2017 13:31:03 -0400 Received: from mail-pf0-x242.google.com ([2607:f8b0:400e:c00::242]:33385) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dWQuE-0000oa-LR for qemu-devel@nongnu.org; Sat, 15 Jul 2017 13:31:02 -0400 Received: by mail-pf0-x242.google.com with SMTP id e199so14641046pfh.0 for ; Sat, 15 Jul 2017 10:31:02 -0700 (PDT) Received: from bigtime.twiddle.net (rrcs-173-197-98-123.west.biz.rr.com. [173.197.98.123]) by smtp.gmail.com with ESMTPSA id w66sm27366075pfi.63.2017.07.15.10.30.59 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 15 Jul 2017 10:31:00 -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=R6Ka2NWcSF6hwbWAEC/WD4vNcDfuRj6vA5Ja4rYsBcw=; b=QsDi7DccM3IMHzObRQLjd9n/FlcrFfueIt9x+voFaGpKubjwjVTyR0Ca91gRIT/nCF nlHdCKVIlcN8gDBWvEZPy8EZrkaUm+btnq2A+kHY1lkxK/q+axFxHMEMA0QxZfq4a7mY jHLvnQ/hOUHJisDnhkAYZTDzBZ5n8UjKnqwJEfDIIgZqsmObq4WrvgYntYJmMEALhvKT PiOfCxiBzib113DZ/XydxSYwNq4os/JEvjRHIqDYpWR6uQWvXgXeQ57lOXUO7tgnTUH5 SlfT4PXftpZ70rHuw8mRXPcgfq/xZ2CPbQpcoMbxU8wmYZsVKXqbXdkVO5hTpsVCLi2p blrQ== 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=R6Ka2NWcSF6hwbWAEC/WD4vNcDfuRj6vA5Ja4rYsBcw=; b=VtkfizYplCMRCyRGtGdMnUQeqT+r/SdkBssJvTpkg+UQAu44S+TXZiqzgU24lnp/pH FMavf2+ZLnnu41wo/plI9Lqo1hg/n2E/oz6FXj044bpcrQ2ISk2WUwbPs7Yst2zt66yI gXQ7zCGzb/v64fvYi9QtcPhrsnWBMjEEwpY4v4by28HDgB4haOIcL3kQyOeb1R+Zc/cj 77pMFeCSsR6NSZF1xdL1NrLzVpN95pUFEU/LLwvSZKPT8eEHs5RuAVBGivjy0cqagrcB V7B4qCKeB4iNkWZdh1AmMzxzrdlqKoKtlVM4A6nNjgC6cv3sf+3BGUfQ8cWlT8VLblhV w3RQ== X-Gm-Message-State: AIVw111h5CDR8lHSJosZZ7Xghkyztj314iTCXdWyZrbFuDGD02Td2Ih2 wdXHfZdMm4YDGhLGKmQ= X-Received: by 10.99.125.28 with SMTP id y28mr3605944pgc.142.1500139861406; Sat, 15 Jul 2017 10:31:01 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sat, 15 Jul 2017 07:30:45 -1000 Message-Id: <20170715173050.31018-4-rth@twiddle.net> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20170715173050.31018-1-rth@twiddle.net> References: <20170715173050.31018-1-rth@twiddle.net> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400e:c00::242 Subject: [Qemu-devel] [PULL 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 b9c7391..8ab3f42 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 Fri May 3 01:14:30 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 1500139989136761.736166755233; Sat, 15 Jul 2017 10:33:09 -0700 (PDT) Received: from localhost ([::1]:42799 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dWQwF-0007bm-W3 for importer@patchew.org; Sat, 15 Jul 2017 13:33:08 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50125) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dWQuI-0006RH-3Y for qemu-devel@nongnu.org; Sat, 15 Jul 2017 13:31:08 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dWQuG-0000q8-VI for qemu-devel@nongnu.org; Sat, 15 Jul 2017 13:31:06 -0400 Received: from mail-pg0-x242.google.com ([2607:f8b0:400e:c05::242]:34214) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dWQuG-0000pr-PR for qemu-devel@nongnu.org; Sat, 15 Jul 2017 13:31:04 -0400 Received: by mail-pg0-x242.google.com with SMTP id v190so527663pgv.1 for ; Sat, 15 Jul 2017 10:31:04 -0700 (PDT) Received: from bigtime.twiddle.net (rrcs-173-197-98-123.west.biz.rr.com. [173.197.98.123]) by smtp.gmail.com with ESMTPSA id w66sm27366075pfi.63.2017.07.15.10.31.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 15 Jul 2017 10:31:03 -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=cQzDB3KqB/asCE3WVpD70EVepX442z810PxaCxGLUa8=; b=PFrCU0eLVca5CeUuvDU3vbQbNDz2cPJbbHZOYxHPxZYxROUbS93qtHI3quXn4iWyXN YFW32H8A2lSvq0CDpm+1ukPc+7bkEI19wOs24/v1XtJJEBToZRQYK/hMwfFrOp955I6b +xTT2qnaAanrvTk1PpOKvJC7Wk+JvHhVvKuZS3UewxySpqTnQW6Y/hoYhlgRGfn9mf+/ 2aovFIOtVIE/bbOvTvMQ2Do81GJ8B0s8Mjdk/qjec4FCryjGykEQCzljg7iQDmjCkxkL 97C4fS/kQO85TD4GvRrpYXbaddNyCu29PuChvBbgpB2AeGwGgAlj4uB45F1NgimZYgiz JVbQ== 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=cQzDB3KqB/asCE3WVpD70EVepX442z810PxaCxGLUa8=; b=r6GebQ2sY6hTNmfQU6hFttd5Rzi9km46UTPJfSObVCNOOYqD2DkXD36FnUlxLmsCHf L8nfYOlpOVJu7+MD58m435Ru2NQGhayfDjc49USG3rjkdyIz34SHM5z5NVXHshb2HQRV uh7EmXenu5gup1Eo+dlwr+n5C2uk3xM21hb2EYWJuSqsk0tTVUoCwyMsqK2JwTXxfOz1 SAtnYU6j5sP1lmt99u8vUMqIIJdBQ9bHlhFeM82Mcj4d+Tk9zZcn5UCjlLaMDKhleznw wbl6XcAecOngEnXE/soxziK4Pj93EQXPyc0ElfstbyltjsaIxY2TiNBEcs7AHR0okCzz m9DA== X-Gm-Message-State: AIVw112C2qLtdeJdRPxwNWqnEjQifEmHJtbb7GdQnwJ1dI12Ez7heufA qMW11ixszFB0hB2R3M4= X-Received: by 10.99.113.19 with SMTP id m19mr3769512pgc.122.1500139863605; Sat, 15 Jul 2017 10:31:03 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sat, 15 Jul 2017 07:30:46 -1000 Message-Id: <20170715173050.31018-5-rth@twiddle.net> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20170715173050.31018-1-rth@twiddle.net> References: <20170715173050.31018-1-rth@twiddle.net> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400e:c05::242 Subject: [Qemu-devel] [PULL 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 8ab3f42..f6ca288 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 Fri May 3 01:14:30 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 1500140143914759.1288888839526; Sat, 15 Jul 2017 10:35:43 -0700 (PDT) Received: from localhost ([::1]:42811 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dWQyi-0001kG-Vg for importer@patchew.org; Sat, 15 Jul 2017 13:35:41 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50138) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dWQuK-0006Rl-EN for qemu-devel@nongnu.org; Sat, 15 Jul 2017 13:31:13 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dWQuJ-0000sL-CC for qemu-devel@nongnu.org; Sat, 15 Jul 2017 13:31:08 -0400 Received: from mail-pf0-x243.google.com ([2607:f8b0:400e:c00::243]:33390) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dWQuJ-0000rj-6e for qemu-devel@nongnu.org; Sat, 15 Jul 2017 13:31:07 -0400 Received: by mail-pf0-x243.google.com with SMTP id e199so14641181pfh.0 for ; Sat, 15 Jul 2017 10:31:07 -0700 (PDT) Received: from bigtime.twiddle.net (rrcs-173-197-98-123.west.biz.rr.com. [173.197.98.123]) by smtp.gmail.com with ESMTPSA id w66sm27366075pfi.63.2017.07.15.10.31.03 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 15 Jul 2017 10:31:05 -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=HEAkEdl1nL80pRvZanTh4RzmpNVVeOgetQgVv+el6LI=; b=Lb/ijYTKLrfecgmTmj4CsjEB5JH/wK9i5dheD/7KvtRDnWTs6Mi+NCQqb/sFr6lxa4 khKcCa9oBM61w7m7WrbBhaTQ3yVc1u7vauiIwOpC+gmFmOslqWfheljomWmjhYdmNnAZ Gic9lK0zTWezkmaXybQ7ZVLPj6kdYImQ1ZL9QVbsMAhGeIAXEY6yZLQG1C+4Zg9Oo5zc 0DB+vspfFnGDOwJYtIixFkx7GLQZZfwYqjuFVUv9y0x4+1FTLGIfF/zHI4fL4TYx9yah AY7kb4BTWt1u33mSdhStXJyLttiv7/yCzUfDpEk7iGVQr57UioUv70fdj8VHvCmEnBhd 3YpQ== 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=HEAkEdl1nL80pRvZanTh4RzmpNVVeOgetQgVv+el6LI=; b=SDXdioxR9NKD7tOuYEiEpvlvvkb4gRylWgPmq8htO7objujR8PWnxnLPi4YjFrMtB7 6yUnjYHLCVE0KrDNZQ6tjNcbna/G6OJNJheR4DpdYjB7wCPx7unS7k0rt7nA50GV0Ra2 ArRHueSehcAJbLoIUWTDb4iLHkaYwUhlAHxH31RISa2A+TzNkN8wVLE2yCCduWYTSMVk TCQOMHHbuJWiKxAv6fxKkQF8aXV1XIZvjqbYbBEKEfQlKxj6Zibg+aqo9LB7XcIeQlGo 9G3RwiODVehUR0LrJ18sTHyFQyngNXdy8wlpJL+mH37X+Re6JgZ1hZnrDj5X/eOry3kd EMfw== X-Gm-Message-State: AIVw112tXOW+mUUsCtDl/df8bUJ3WtvySRswiVEN4MqvrQtdlkfLmAtH x1KVlRIo9R1NCkq4Gyo= X-Received: by 10.99.240.69 with SMTP id s5mr20925510pgj.23.1500139866014; Sat, 15 Jul 2017 10:31:06 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sat, 15 Jul 2017 07:30:47 -1000 Message-Id: <20170715173050.31018-6-rth@twiddle.net> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20170715173050.31018-1-rth@twiddle.net> References: <20170715173050.31018-1-rth@twiddle.net> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400e:c00::243 Subject: [Qemu-devel] [PULL 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 f6ca288..ab27e14 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 Fri May 3 01:14:30 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 1500140283210219.08909030769496; Sat, 15 Jul 2017 10:38:03 -0700 (PDT) Received: from localhost ([::1]:42833 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dWR0z-0003hp-LZ for importer@patchew.org; Sat, 15 Jul 2017 13:38:01 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50159) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dWQuP-0006WD-BK for qemu-devel@nongnu.org; Sat, 15 Jul 2017 13:31:14 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dWQuK-0000uL-LJ for qemu-devel@nongnu.org; Sat, 15 Jul 2017 13:31:13 -0400 Received: from mail-pf0-x242.google.com ([2607:f8b0:400e:c00::242]:36580) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dWQuK-0000u6-Fa for qemu-devel@nongnu.org; Sat, 15 Jul 2017 13:31:08 -0400 Received: by mail-pf0-x242.google.com with SMTP id k24so866102pfj.3 for ; Sat, 15 Jul 2017 10:31:08 -0700 (PDT) Received: from bigtime.twiddle.net (rrcs-173-197-98-123.west.biz.rr.com. [173.197.98.123]) by smtp.gmail.com with ESMTPSA id w66sm27366075pfi.63.2017.07.15.10.31.06 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 15 Jul 2017 10:31:06 -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=iETRVLQ3Mo4QYHtENby0Sk13HqPZ3zX4rt43vwsuSVvKmX93hof6mQ/syoNq7zf35h SOeE7wGpFXSM1mCTbLqeymbhx7pq+taOcqchhHIp2waffnY9KZLHtEYwRwlEHMzzA9wQ aGqzqCOMdCuhZSzDFDHaK+H7YrfzBw4c9/YmDUcJlvHNDB/MyolV6WpaUTSYfUmmSgJX Udv5UZM0ziwj6rxAynwySELzFjmxan3mi80Jn4fzHxtEzVHlOgycUCpEMGHQTmF3u387 oI/9+sCI9pMCDqGUzfbA672RRqWIaSnrVBVQuNezEPTZcieIqivVNE/fbtI1JBHAVBCK XAjg== 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=tRT4uxUZiTnhbvn4CHqam1eP4RBDfCg9uqmq0K7jgeu1xcnWpJe6e1cQcCmD1bQ5x1 6UWwif6FTEgmQVcn1o5F/FqulhnhW2kyR3PXaFab0kd0fy7w7p0beIws+NfAURqRmEfv yF9emWsI34TbfzgCbQvm2rPDAeWCSYO2APf6hWxxrwQvAWuK90NCHV6NdEEwBLQqZzCl J+RgEQzzNCYDfhVrk8gGij/X/V5PS6g+7dAQjpSQMCjsVz3MukeQ9rIJk5lYrVU4T79c 2qNGLlqMRRnhOKKjpEL8dCqQ3DwYceDo2TDyWi8y6rYiNXT+FtnYeGdoipBWB1A+202D w34Q== X-Gm-Message-State: AIVw1114/fOHMJW5a2EN/fay9Ik7DfkoFVXcASLRNXd64jJLj+k5aLTj ovyq3CHTPhCbGsjndec= X-Received: by 10.99.98.193 with SMTP id w184mr21240291pgb.155.1500139867476; Sat, 15 Jul 2017 10:31:07 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sat, 15 Jul 2017 07:30:48 -1000 Message-Id: <20170715173050.31018-7-rth@twiddle.net> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20170715173050.31018-1-rth@twiddle.net> References: <20170715173050.31018-1-rth@twiddle.net> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400e:c00::242 Subject: [Qemu-devel] [PULL 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 Fri May 3 01:14:30 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 150014015388033.13504631413173; Sat, 15 Jul 2017 10:35:53 -0700 (PDT) Received: from localhost ([::1]:42813 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dWQyu-0001r6-N6 for importer@patchew.org; Sat, 15 Jul 2017 13:35:52 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50161) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dWQuP-0006WK-Ep for qemu-devel@nongnu.org; Sat, 15 Jul 2017 13:31:14 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dWQuM-0000uq-C1 for qemu-devel@nongnu.org; Sat, 15 Jul 2017 13:31:13 -0400 Received: from mail-pf0-x244.google.com ([2607:f8b0:400e:c00::244]:34851) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dWQuM-0000ug-5y for qemu-devel@nongnu.org; Sat, 15 Jul 2017 13:31:10 -0400 Received: by mail-pf0-x244.google.com with SMTP id q85so14630098pfq.2 for ; Sat, 15 Jul 2017 10:31:10 -0700 (PDT) Received: from bigtime.twiddle.net (rrcs-173-197-98-123.west.biz.rr.com. [173.197.98.123]) by smtp.gmail.com with ESMTPSA id w66sm27366075pfi.63.2017.07.15.10.31.07 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 15 Jul 2017 10:31:08 -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=BSuPeF9onwc395xeFFPkI5EWfdMHzcZd3pwfXQ1AmGaXNyYo2FdTlIT4ISfGnmhNvw RuRmnlMoM/x8nbpoW401v8pnr7A3ZR1aPQUtn3pAx3txFKL51h4TTlWJXmeub7uo0S45 0u7X/0GG8oNkVn5BBu9B+KPGpKN2SYJMN2I88QNZpLGx3KV2EowydwGXqfpQagnINvV1 VNGnamFqjX1KtNc92/zsDfaeiWpUJf6YEJ6iHOS/XVCVNQI1iBOrryuQOkTmGkahCTF3 2UplEvmZuKq/AZEcvBQ190L5HsJny2mUoDIV8P8dzzZUq7nZyabzh0gUrw9fGqUwbDTr VKaQ== 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=SiJ6LmUX1YQSiF1HV3SI2SGKIR60jGnFjUPOe3fSy1mAkYbZ1A5iB9QmUIwD5TvahD yNMPYAf7aHyqoHhkdjO0LkEsGdfu+oJ6aNeFKYEUd4/vYmy8iSDXfcpfBCYhZOeMRd6M caqX0be/58toZEaUDcTl/Rb2E6J1zrHCATFvaVB8+q8zQtK9zUIXbMsDrEiVZCXUBTjD a33rcn6Zfs4/W6hYLpZPtHFljsGYbhePrEAmB5RYbInSmtqJJWc1REc2p195pJQ/jUvq WqGeoH4hKdRdnwfntJU7HIQht1htLyGDMdK3EN515ztcI+WlPoPw1NDbETvjkJKam7bg FEXw== X-Gm-Message-State: AIVw1109WxDSqJOAy8ubIvWbRlhrUUypHfSNpKm7eV+6kGs8A2NE4MtU kaz6vVnycwZ4XjgnHbo= X-Received: by 10.99.188.18 with SMTP id q18mr262560pge.274.1500139869017; Sat, 15 Jul 2017 10:31:09 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sat, 15 Jul 2017 07:30:49 -1000 Message-Id: <20170715173050.31018-8-rth@twiddle.net> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20170715173050.31018-1-rth@twiddle.net> References: <20170715173050.31018-1-rth@twiddle.net> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400e:c00::244 Subject: [Qemu-devel] [PULL 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 Fri May 3 01:14:30 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 150014015665784.42086966128124; Sat, 15 Jul 2017 10:35:56 -0700 (PDT) Received: from localhost ([::1]:42814 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dWQyx-0001tL-Dm for importer@patchew.org; Sat, 15 Jul 2017 13:35:55 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50162) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dWQuP-0006WL-Ev for qemu-devel@nongnu.org; Sat, 15 Jul 2017 13:31:14 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dWQuN-0000v9-L0 for qemu-devel@nongnu.org; Sat, 15 Jul 2017 13:31:13 -0400 Received: from mail-pf0-x244.google.com ([2607:f8b0:400e:c00::244]:36582) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dWQuN-0000uy-F4 for qemu-devel@nongnu.org; Sat, 15 Jul 2017 13:31:11 -0400 Received: by mail-pf0-x244.google.com with SMTP id k24so866159pfj.3 for ; Sat, 15 Jul 2017 10:31:11 -0700 (PDT) Received: from bigtime.twiddle.net (rrcs-173-197-98-123.west.biz.rr.com. [173.197.98.123]) by smtp.gmail.com with ESMTPSA id w66sm27366075pfi.63.2017.07.15.10.31.09 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 15 Jul 2017 10:31:09 -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=ZR+K8jdenRA4T0vil6cDJnkX2pclwXLYKK3KNjCbODximcGRTc8A8cUXUs8uyonQ5K lHSK2UgtXRXDu4hDDFNfsfk1P5yKwDmKfzyGeO8J6CyQduoMwmQ/aw/ajeB9GfXS0f7u ZsnXT2ktmHK2IVK7poijb+kTCeAe8tbAptlS53cDEeiRFgYnvNidaZy4jW54XmnuQ0VL 9Zry/D/ErU2C+2zUdt83/Fio7wGDpTI1u0Oi9CNw8VsDbGhCrZjQZZm5QBYRmZY/hJNr rK3gq2qD/yCw1x3k1OYU7Vl/TMs3OlTPSUpk01pzblTC1UCbzNCsuC3FVEfCDNA77WnZ R2fQ== 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=IJQgH6HYKcWZno3M36bnIS727nnJbIqierYUOhNn3fphh45gNY6hPfErGUmIA7XwNR GucjhG2NTayWzc4rBV1qh47V2D6a8nPi61E2PEUSTIVac1IE9vIKnueOBxqy5w5iYfXq XH+GEMfquuVsuo9L3QYyp1ZNw2ovLrVH6P99Mgv2aqan6H3SVftnv2tF6DlhOUkrUYul qippj7eZ3oMWXedwvv5/DBWqAfSvCESwpd9NSfSiOG/QOwz4nJBJpW++7PZkPIG/74Lg oerIYnCnEK0KQ7Ct6B1ey1HyjdAVFCs1Tvdmwt0isKNxRrkfc81Ya8GwFIwnO50V1jEA z/4g== X-Gm-Message-State: AIVw1100QYOdUWBQ093jry+vSYSZur4VeMyxvOJ/Bj8SlUbgcgf/JCSi yVGS2r9JjtXDtLybN6M= X-Received: by 10.99.163.26 with SMTP id s26mr20991129pge.232.1500139870403; Sat, 15 Jul 2017 10:31:10 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sat, 15 Jul 2017 07:30:50 -1000 Message-Id: <20170715173050.31018-9-rth@twiddle.net> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20170715173050.31018-1-rth@twiddle.net> References: <20170715173050.31018-1-rth@twiddle.net> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400e:c00::244 Subject: [Qemu-devel] [PULL 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