From nobody Fri May 3 01:46:37 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.zoho.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 1498940895143125.83635294766157; Sat, 1 Jul 2017 13:28:15 -0700 (PDT) Received: from localhost ([::1]:55789 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dRP01-0002Xv-DZ for importer@patchew.org; Sat, 01 Jul 2017 16:28:13 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53860) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dROyG-0001ez-3b for qemu-devel@nongnu.org; Sat, 01 Jul 2017 16:26:25 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dROyD-0006lu-5h for qemu-devel@nongnu.org; Sat, 01 Jul 2017 16:26:24 -0400 Received: from mail-qt0-x242.google.com ([2607:f8b0:400d:c0d::242]:35355) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dROyD-0006li-03 for qemu-devel@nongnu.org; Sat, 01 Jul 2017 16:26:21 -0400 Received: by mail-qt0-x242.google.com with SMTP id w12so19176531qta.2 for ; Sat, 01 Jul 2017 13:26:20 -0700 (PDT) Received: from bigtime.twiddle.net.com (97-113-165-157.tukw.qwest.net. [97.113.165.157]) by smtp.gmail.com with ESMTPSA id f128sm8559985qkc.13.2017.07.01.13.26.18 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 01 Jul 2017 13:26:19 -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=/UHqBgSTC/9+L51wRaPfxe0jA8tXWAekEjxwqjVoDDU=; b=SaxaybLc13ZBaq9KNTds1hl+o6X/GocOXyQQ/SOeCAC7AexN9FcHw2Wr/ZF7sAqHC+ BNDFME/2ueA7Z+mBGJaVACBgF52CEmtP4t9AIFAfvcdhSjv72Fo+KFhaqB6ggfQ4sfG4 I7jg25MNX+Ne1U3FbszoLbOZX3cyRQosY+SYGM8V3sg8VpuXZ3hhO5wWULSjwsm+BW7X t8ly6zlDWQctLTCrJk6oJA+iiz/55Mm/EvEjEYV0U2NJY5y/cD/0sM6ZhEtEHU1/EEQa YuyRaMJYPf89BqZ+UWNOT25DEck8o7bwMf2CCpTPV++15hh8SHgShJea8eagGXT7ugK1 K6zA== 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=/UHqBgSTC/9+L51wRaPfxe0jA8tXWAekEjxwqjVoDDU=; b=j8GtvJHMJQW/RIkA4HykLSb0pbkEC8OquMe3hDkKJiN1a54H4nLfxZ+gtvfnVjxD8F AtDh82INMaMH4ugjR7rH/dlcHEuksjqjdFgdSzBhC0L2hP4SOem5w2OymI4CelQRSb4o M4y2l6Wh7t/BdDsEJ0IaHiMJq2SHhOELqENqiSSJaOikmpXVNlc7i5NiME8hbnDge7lM N6v+c3fcJ+q8YXgRqoI8xMjvMkY6BfJYRJAqbM+xLNnMAHByQsl/YFHnRaY6VhRtb4yT YGcDvcMPp02hAxGgUTefKOmH6AE7/jtpc5nfgislLv9pklMjVkTNoyZftomz72/e4fmk 0J/g== X-Gm-Message-State: AKS2vOyIbXyBvidaFW833vVXPXsCUpGakapMDNtFZM2obe8ea9hS3P+Q AoAbOZzvR7oLS0dNwnk= X-Received: by 10.237.49.133 with SMTP id 5mr35267009qth.53.1498940779984; Sat, 01 Jul 2017 13:26:19 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sat, 1 Jul 2017 13:25:53 -0700 Message-Id: <20170701202600.14057-2-rth@twiddle.net> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20170701202600.14057-1-rth@twiddle.net> References: <20170701202600.14057-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::242 Subject: [Qemu-devel] [PATCH 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: aurelien@aurel32.net, david@redhat.com 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" 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 63903c2..08290ce 100644 --- a/target/s390x/cpu_models.c +++ b/target/s390x/cpu_models.c @@ -684,6 +684,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:46:37 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.zoho.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 149894108747557.140220291766354; Sat, 1 Jul 2017 13:31:27 -0700 (PDT) Received: from localhost ([::1]:55804 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dRP38-0005Hf-7d for importer@patchew.org; Sat, 01 Jul 2017 16:31:26 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53871) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dROyG-0001f1-JR for qemu-devel@nongnu.org; Sat, 01 Jul 2017 16:26:26 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dROyE-0006mC-KX for qemu-devel@nongnu.org; Sat, 01 Jul 2017 16:26:24 -0400 Received: from mail-qt0-x243.google.com ([2607:f8b0:400d:c0d::243]:36792) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dROyE-0006m5-F3 for qemu-devel@nongnu.org; Sat, 01 Jul 2017 16:26:22 -0400 Received: by mail-qt0-x243.google.com with SMTP id v31so19209234qtb.3 for ; Sat, 01 Jul 2017 13:26:22 -0700 (PDT) Received: from bigtime.twiddle.net.com (97-113-165-157.tukw.qwest.net. [97.113.165.157]) by smtp.gmail.com with ESMTPSA id f128sm8559985qkc.13.2017.07.01.13.26.20 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 01 Jul 2017 13:26:20 -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=tNeUxaqrPMqDyx5NZRS1B61SuCvFR07RckmPcfNknEo=; b=BQA9Rs4xLEV/3M6YwAd3wyNnGK5Y4ixhz25eBtd32P14AA/CFnM/yOTk9oW3oG82+2 G747Xy6EeK3gLs/6vAUfiPRgqtAedQyLmu1MWIh4n5Ma4G5YQ14h6Il3ijifSyak4Okj keQ77eLGrj2eMiDpTMtiAI2x9RxB4anFict7XeBeeFj+PscsD/OTBjAgt0lvOsqEKa+h nPvzOksXI89rpBXMhNUrmsRSxv7FxVamxBMU2Y1AVqjEpNHDrzCKIqQqb1qhszadXc+1 KhwVXH35irVuYYT0Sw0rrERZpQEc9EYTO2BJQKejR0+GWhYMjgoCbPgtILeBAeOaAoL0 9unQ== 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=tNeUxaqrPMqDyx5NZRS1B61SuCvFR07RckmPcfNknEo=; b=UNNscffmg9qW4qCO3age/b2j//Nh+aUX2NE0BRKVvHFssrHzL94OPhcZ8TEDyTaeWY MzYQJ1qvYBAVJOtvCBz6iLhOAxKxLIs6neg+JqRe5Gfz99UTpT9yuYpthyUY1UBE8i6N 6XjTz/eDF6I52SqP7flLohlb42kwJEGYxUFiyyvqPIMtru8ffYL3LzX3sdut8uYbAZkN LZPUnKYBzsC9d9AYFHzMd5EtpggWbqOxad79w+LGNB++IC7kfdVvBngXVkLOKv29VzRO PQIvuRmFBEK/SV/cxtpARUx2NaHtoBU2O7QCIuoY8AeZs5e/lPqtbhY25qmx5vfcuIDp Q6+A== X-Gm-Message-State: AIVw1108TRay1jzoliBwxbnWNacNmPbTbSo3fpOTcwoNTnn0nTmS16f0 YaCVHpqP6mA1L5AHOZY= X-Received: by 10.200.8.68 with SMTP id x4mr4297777qth.195.1498940781430; Sat, 01 Jul 2017 13:26:21 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sat, 1 Jul 2017 13:25:54 -0700 Message-Id: <20170701202600.14057-3-rth@twiddle.net> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20170701202600.14057-1-rth@twiddle.net> References: <20170701202600.14057-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] [PATCH 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: aurelien@aurel32.net, david@redhat.com 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" Signed-off-by: Richard Henderson --- target/s390x/helper.h | 6 + target/s390x/mem_helper.c | 310 +++++++++++++++++++++++++++++++++++++++++= ++++ target/s390x/translate.c | 44 +++++++ target/s390x/insn-data.def | 13 ++ 4 files changed, 373 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..0b18560 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 & 0x0f; + 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..9301daa 100644 --- a/target/s390x/translate.c +++ b/target/s390x/translate.c @@ -2122,6 +2122,49 @@ 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); + TCGv_i32 r1 =3D tcg_const_i32(get_field(s->fields, r1)); + TCGv_i32 r2 =3D tcg_const_i32(get_field(s->fields, r2)); + TCGv_i32 chk; + + if (!s390_has_feat(s->insn->fac =3D=3D S390_FEAT_EXTENDED_TRANSLATION_3 + ? S390_FEAT_ETF3_ENH : S390_FEAT_ETF2_ENH)) { + m3 =3D 0; + } + chk =3D tcg_const_i32(m3); + + switch (s->insn->data) { + case 12: + gen_helper_cu12(cc_op, cpu_env, r1, r2, chk); + break; + case 14: + gen_helper_cu14(cc_op, cpu_env, r1, r2, chk); + break; + case 21: + gen_helper_cu21(cc_op, cpu_env, r1, r2, chk); + break; + case 24: + gen_helper_cu24(cc_op, cpu_env, r1, r2, chk); + break; + case 41: + gen_helper_cu41(cc_op, cpu_env, r1, r2, chk); + break; + case 42: + gen_helper_cu42(cc_op, cpu_env, r1, r2, chk); + break; + default: + g_assert_not_reached(); + } + + tcg_temp_free_i32(r1); + tcg_temp_free_i32(r2); + 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 +5520,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:46:37 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.zoho.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 1498941084346982.7095017060428; Sat, 1 Jul 2017 13:31:24 -0700 (PDT) Received: from localhost ([::1]:55803 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dRP35-0005EN-1r for importer@patchew.org; Sat, 01 Jul 2017 16:31:23 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53878) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dROyH-0001f6-7Z for qemu-devel@nongnu.org; Sat, 01 Jul 2017 16:26:26 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dROyF-0006mS-T3 for qemu-devel@nongnu.org; Sat, 01 Jul 2017 16:26:25 -0400 Received: from mail-qk0-x242.google.com ([2607:f8b0:400d:c09::242]:36261) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dROyF-0006mI-Or for qemu-devel@nongnu.org; Sat, 01 Jul 2017 16:26:23 -0400 Received: by mail-qk0-x242.google.com with SMTP id v143so6825677qkb.3 for ; Sat, 01 Jul 2017 13:26:23 -0700 (PDT) Received: from bigtime.twiddle.net.com (97-113-165-157.tukw.qwest.net. [97.113.165.157]) by smtp.gmail.com with ESMTPSA id f128sm8559985qkc.13.2017.07.01.13.26.21 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 01 Jul 2017 13:26:22 -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=JJoDQkjO7K+nQNesHYLrN93hhpEYga9hftYRSPAOAlM=; b=VHZB1pQ2sE+K96gjp2V7pMvE03AaJYsgyJka0XsCUtjoFGULYLGUGd/+THh4PkfkXQ JxKpet3x15UEoXUGxh64e50JjcZsB8Xtt6esB15eyRzx4s5jaXgsLw18AOkjUovfixVz tFH330rR2zOU7z+23H0Aq4xDBhWWrYqzrij8Dr04ONBKlayUrwZQLVmNQ5Rrb6dTJnD4 UDxIhiaO1SijwI2vL1A0IaVxNpQyFhRUuvyFJ0cRHQn06w1Vf9+JJcbORcc3QhmwymQ5 g1r0KPVZH2y+XMWG17ZYPOEAi7sNSWce2fjQHnxErQxU6ejqAYLejIIqhCZbL8eOZ1Gv 0atw== 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=JJoDQkjO7K+nQNesHYLrN93hhpEYga9hftYRSPAOAlM=; b=fd/pmDth5zFFS8d/Cg5nJkfALw9TPCxk14+mRgB/GYBQWZNiRbTTY7lBFQNRAus7gH cQnaIQhreb3wKY8pXiIR75zBlfQsvqHnvVWOZiK+6MQUlozEbrW/VW5GbYf+6Ywi2c4c t36aSFTcyIjvFnpyd5n+ac5LJa4nS/Jl8x0kXoIRmaEDiHANtuU0jok6qi6/ezbCVLaT RmUYKQ/Leng4MeyAe8XeJPrT8bF/IWSz5ybrn/jQ5zRqRH95MbXr/ORmu8IAJrEFA0U9 2MH/P7Jl3qSD/9UnrHLY7PBT8ZLzxBwoc7he3RSekfuGSBqRGHMFjlW+sbXP94iTSJG9 ZxpQ== X-Gm-Message-State: AKS2vOywE7zqzCUw3i2RTHDhJ69M1v9+6AAA9Q5SW+rA1J67FIXTtVjh 0/xZGmR7T5ZfkwS62B8= X-Received: by 10.55.77.13 with SMTP id a13mr36684841qkb.194.1498940782955; Sat, 01 Jul 2017 13:26:22 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sat, 1 Jul 2017 13:25:55 -0700 Message-Id: <20170701202600.14057-4-rth@twiddle.net> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20170701202600.14057-1-rth@twiddle.net> References: <20170701202600.14057-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::242 Subject: [Qemu-devel] [PATCH 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: aurelien@aurel32.net, david@redhat.com 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. Signed-off-by: Richard Henderson Reviewed-by: Aurelien Jarno --- 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 0b18560..74b48aa 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 9301daa..b887843 100644 --- a/target/s390x/translate.c +++ b/target/s390x/translate.c @@ -4280,9 +4280,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:46:37 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.zoho.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 1498940894879511.75992387223596; Sat, 1 Jul 2017 13:28:14 -0700 (PDT) Received: from localhost ([::1]:55790 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dRP01-0002Y2-7H for importer@patchew.org; Sat, 01 Jul 2017 16:28:13 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53896) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dROyI-0001fH-DO for qemu-devel@nongnu.org; Sat, 01 Jul 2017 16:26:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dROyH-0006my-9A for qemu-devel@nongnu.org; Sat, 01 Jul 2017 16:26:26 -0400 Received: from mail-qk0-x241.google.com ([2607:f8b0:400d:c09::241]:36262) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dROyH-0006mq-4B for qemu-devel@nongnu.org; Sat, 01 Jul 2017 16:26:25 -0400 Received: by mail-qk0-x241.google.com with SMTP id v143so6825723qkb.3 for ; Sat, 01 Jul 2017 13:26:25 -0700 (PDT) Received: from bigtime.twiddle.net.com (97-113-165-157.tukw.qwest.net. [97.113.165.157]) by smtp.gmail.com with ESMTPSA id f128sm8559985qkc.13.2017.07.01.13.26.23 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 01 Jul 2017 13:26:23 -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=H/+RFalamWctHXNr6WGUUFSK/8yfAlf20t+J06+nEb4=; b=I/Cx3VisB6zoe4+X+U9apjd6tm83trrzJiymygzG6hqQ6uIKXlV6YMxgvnzqXJ88Xz lCGRVGArNUNpvb5hj5+oIg/ypG6j1VE/kx8moLdU+v1XeTsqIS9pPTlRj1nZAiFR0di+ +/valnxllhyjBlav0EJ7Dz/XZGsYVvRzRyszKIwo+qunCo0MiGLAqu0nf+XmwA3J0tsT Rql7wKE7Oqwn7O+UpR6zobALUKuBZga3VqsjGSr30kFa9ndNoej2yHbdq4Li9c0pGDmP AhVMeEfHHezb+vKtGGW9hxxfWzFzShNsC2w0LCCebRvnuTj/VY104V29j+EuTGTBP4+B 3eMQ== 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=H/+RFalamWctHXNr6WGUUFSK/8yfAlf20t+J06+nEb4=; b=Pd1k679s656iurM8hHwOzb+5RJp191fietPWcfDpp+F/RDQ+u4bRRkPkkYKpamhhSy VdHDaDi/dDI2rgh+WXRcMNDSS75/pTt7c5Y7VTz8X/HmvKXHGPIK+iEypvb9Rk13H29R VSPgoeDJ8BsTVws6vbaZik2/NAhEHkWAz7dkj3qpeSBOzcY2A5ynS7qEPDlDkTfc6EQi awSeT1yO4S9rTiQsRN+OryUopYpWnOmNgRcB6ZDixiv+o8X3r9BwRr3Two4IIC54VFNV FJKUgdKaScNg5sPvlHTLdwgVYjq7N114ZGAB54YJLuKZsE/oHaNJCGP1beUfhfSHRvWY dJlw== X-Gm-Message-State: AKS2vOwJ9TAXwTTGdOydxbAOw133gln5+CHZ0oJgr+IkD4XF+Z8bAUpE CkSErq5D7rIH/yfINbU= X-Received: by 10.55.116.70 with SMTP id p67mr25360647qkc.250.1498940784275; Sat, 01 Jul 2017 13:26:24 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sat, 1 Jul 2017 13:25:56 -0700 Message-Id: <20170701202600.14057-5-rth@twiddle.net> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20170701202600.14057-1-rth@twiddle.net> References: <20170701202600.14057-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] [PATCH 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: aurelien@aurel32.net, david@redhat.com 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" Signed-off-by: Richard Henderson Reviewed-by: Aurelien Jarno --- 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 74b48aa..e3db68d 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 b887843..09b77ea 100644 --- a/target/s390x/translate.c +++ b/target/s390x/translate.c @@ -4291,6 +4291,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:46:37 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.zoho.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 1498941225317668.2470438241355; Sat, 1 Jul 2017 13:33:45 -0700 (PDT) Received: from localhost ([::1]:55808 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dRP5K-0006YT-8F for importer@patchew.org; Sat, 01 Jul 2017 16:33:42 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53906) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dROyJ-0001g6-I4 for qemu-devel@nongnu.org; Sat, 01 Jul 2017 16:26:31 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dROyI-0006nQ-Gl for qemu-devel@nongnu.org; Sat, 01 Jul 2017 16:26:27 -0400 Received: from mail-qk0-x243.google.com ([2607:f8b0:400d:c09::243]:34990) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dROyI-0006nG-CF for qemu-devel@nongnu.org; Sat, 01 Jul 2017 16:26:26 -0400 Received: by mail-qk0-x243.google.com with SMTP id 16so19614434qkg.2 for ; Sat, 01 Jul 2017 13:26:26 -0700 (PDT) Received: from bigtime.twiddle.net.com (97-113-165-157.tukw.qwest.net. [97.113.165.157]) by smtp.gmail.com with ESMTPSA id f128sm8559985qkc.13.2017.07.01.13.26.24 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 01 Jul 2017 13:26:24 -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=nGzADC/tPKT0FndtlQivEWBcwB/mWYW7dpg28+cjLm0=; b=GZo3WSWJ0MrmKG+qxjq6uWfY1V68W/FTda6GCcOUigHJORsjTuu5nPgx/zOmtLZj6p cb/7I5mP2CkegM91EnC0/L0MyNahxXMCawizA2xHD15MjArPgJF5Lq+lqQA4YTt1A1GZ FqtpKy/OqSbkEVC05Y/jHHijC7HZa2wbGR8DCyY8O1PMM+92t43q59aqT2SGwVyDxQBt qGe4DZBFdGmgKRvAZ93SLHM1RChhzEgiKGw58CJDDhnYvmlmeq/gauWNUiPVu4TCWR92 rCC6R//R8fEUX1bBmwmMrQu9hwwIsAulG4YfwezVuO5bYDA1+b0tuC1pLMp//aYUj1gF l9WA== 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=nGzADC/tPKT0FndtlQivEWBcwB/mWYW7dpg28+cjLm0=; b=H8V6qjn3DL5raX/kyvo/nH7ye5Jj9WB2jExQ3uBy5t2hT25PVKDqYo7GwqUCjkNZVm w71QbaU3SHFPZHGTIIgnyKGV8OEq85LvrGA0pmVlv7g4szbh8zAlvD1c/LmqeMG8TFt0 YLJb/WifKFnEBxF48j1TlsyyTeTeEHNuiKvEzmErd1Lsu9v8TD4e9+prM14bSmLZBphx WniNAXAwBTnqCR+O+YgAZc5ex0tdAvlnUY8Z2cvEeqq7GC2+BJymTmfkXI4JUppIIT7k YfM126nRxrxvw3KxP/CPRqgHhQI5GOrDqo78EhJV6x/taSYAMQk6KPDW+NowXHgv90NT IRkw== X-Gm-Message-State: AKS2vOwSHXCB87hwfBAM8TdVvNblRUQ+vHMv5/3XSzDCF7NMu8NcP9DE FaXSdVUBJcu6Z4NEin4= X-Received: by 10.55.46.2 with SMTP id u2mr35489367qkh.23.1498940785528; Sat, 01 Jul 2017 13:26:25 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sat, 1 Jul 2017 13:25:57 -0700 Message-Id: <20170701202600.14057-6-rth@twiddle.net> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20170701202600.14057-1-rth@twiddle.net> References: <20170701202600.14057-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] [PATCH 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: aurelien@aurel32.net, david@redhat.com 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 e3db68d..b9d0477 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 09b77ea..1f0c401 100644 --- a/target/s390x/translate.c +++ b/target/s390x/translate.c @@ -4440,6 +4440,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:46:37 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.zoho.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 149894122823924.313397641102483; Sat, 1 Jul 2017 13:33:48 -0700 (PDT) Received: from localhost ([::1]:55809 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dRP5O-0006c7-T9 for importer@patchew.org; Sat, 01 Jul 2017 16:33:47 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53917) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dROyK-0001gl-Ag for qemu-devel@nongnu.org; Sat, 01 Jul 2017 16:26:31 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dROyJ-0006nl-Lh for qemu-devel@nongnu.org; Sat, 01 Jul 2017 16:26:28 -0400 Received: from mail-qt0-x241.google.com ([2607:f8b0:400d:c0d::241]:32795) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dROyJ-0006nb-HO for qemu-devel@nongnu.org; Sat, 01 Jul 2017 16:26:27 -0400 Received: by mail-qt0-x241.google.com with SMTP id c20so19168959qte.0 for ; Sat, 01 Jul 2017 13:26:27 -0700 (PDT) Received: from bigtime.twiddle.net.com (97-113-165-157.tukw.qwest.net. [97.113.165.157]) by smtp.gmail.com with ESMTPSA id f128sm8559985qkc.13.2017.07.01.13.26.25 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 01 Jul 2017 13:26:26 -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=5vDx+AwRaH7+Ey4QvH73Ta5ikTYajfh9ba/2DHptC9U=; b=Ngdp1Qn5WhdnbBMIAfZD3/NB+mN20lxz8R0/vn0oU29CItHvEL3ZAnFGeGMps7gYZ9 ylmCon+idl4Dxvf5K57JY3kIvxBI8h/UUrCCuEVHKwSvYMs9EhXmZ6eykS+suebzSeLs wO7rmCpls5YKME+6DYftfQPlfolUeJ79lFMbCsWjD3mse4kuJPGSjQbcjf+0kBH0Yct4 ZF2YjJqu4EH0T5qmcspysCYwV991Ag8PXqPRH1ppW/ZpJECMdAFiEL/k1yyhvj0OhrbV a3cyBgxnd3+jQ2yHupn8MXcJprNKZxoNdT7fFTL/BsFAk2viybR4XYCWKF2c2HMdpXJa BTkQ== 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=5vDx+AwRaH7+Ey4QvH73Ta5ikTYajfh9ba/2DHptC9U=; b=WZAk93YalUFVQgSz7A8RVxS6TjRGQwyQOaeqyznvsCU0gZGerbw2RGdtKBoUe5ZUQw BrmNhvhjnf2rND+7PFa+MzoJl30yrnx/H0qJOa3Fd7W1yHoYuSjRtD0oemteUnFZsi/g vTxR8dOweMzYvE7DTq5aor3KUzNLh4KQ4FN2bEBfT1jq6RIdcGlxVAqm6/LHds2Eo+9F gmsvlLurUaSBjGAjMNsnZqmAifATzRyWJIhyDXtjrXDJzZSY2jaXm2zwsjzvEuVY3Z/D NbNNMfeIcyhgCaGQtCIOF4Bk2dSZCoDMI1YFHG4kZLhymQWBjQZn4an03ctHPglK1/BX i0cg== X-Gm-Message-State: AKS2vOwNJCDdsfISXCoIQlVAL6raI91LSQMUZi0aLpIvXbBUyeH7PBnT RTjaUjOw2dUaOTRIdjw= X-Received: by 10.200.57.162 with SMTP id v31mr35956931qte.57.1498940786751; Sat, 01 Jul 2017 13:26:26 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sat, 1 Jul 2017 13:25:58 -0700 Message-Id: <20170701202600.14057-7-rth@twiddle.net> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20170701202600.14057-1-rth@twiddle.net> References: <20170701202600.14057-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::241 Subject: [Qemu-devel] [PATCH 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: aurelien@aurel32.net, david@redhat.com 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 08290ce..91ef8eb 100644 --- a/target/s390x/cpu_models.c +++ b/target/s390x/cpu_models.c @@ -679,11 +679,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:46:37 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.zoho.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 1498941081025786.9027101987683; Sat, 1 Jul 2017 13:31:21 -0700 (PDT) Received: from localhost ([::1]:55802 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dRP31-0005BE-Qq for importer@patchew.org; Sat, 01 Jul 2017 16:31:19 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53928) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dROyL-0001gx-Gu for qemu-devel@nongnu.org; Sat, 01 Jul 2017 16:26:31 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dROyK-0006o9-RM for qemu-devel@nongnu.org; Sat, 01 Jul 2017 16:26:29 -0400 Received: from mail-qt0-x242.google.com ([2607:f8b0:400d:c0d::242]:34098) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dROyK-0006o1-Ms for qemu-devel@nongnu.org; Sat, 01 Jul 2017 16:26:28 -0400 Received: by mail-qt0-x242.google.com with SMTP id m54so16673818qtb.1 for ; Sat, 01 Jul 2017 13:26:28 -0700 (PDT) Received: from bigtime.twiddle.net.com (97-113-165-157.tukw.qwest.net. [97.113.165.157]) by smtp.gmail.com with ESMTPSA id f128sm8559985qkc.13.2017.07.01.13.26.26 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 01 Jul 2017 13:26: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=yULRTX/EaRC7+QjpgWfZKBlP4MO3lDwcIXvehTH0rg8=; b=kfAbLp8EpvV0Nc0iWFwT991luNMqrnbuhSlBdu8hvl+fdhYnTPCo1w8YPf9RJsjJ8g zMilSa8JQK8aydbpFRycJOOc6+ySHBTMBDHYnxDq13BpCmylvd00SLYRt7zwop26irk+ xAU/KtrZL7qITgsTONnzhVA/v/NZZa34TEawIfMbg5VMUH6Gv3qiaMAC0+Ka9jw/9LTi j+TPCLARK/D9iFb9hAw/AAt8l6E6a7t9ade05iqJudcDzI6WD+5z2xJeZbMGeH/dXyQB JNYlV4AeJwpi6CGuKCFprAcrUGK2KcuCXgo7pEcJAiSx2pJi7wi/9XLRzwTdXybI8CI6 KxBg== 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=yULRTX/EaRC7+QjpgWfZKBlP4MO3lDwcIXvehTH0rg8=; b=fnc144yKZdsdcTqPLe5+ETx54PaWQHuOWsmmGI4Ud8T0NDCCYtiyQ+b5NA6n8nfZ7O GVr3lWaiUZcxOq83EM5LlJcB6kmHssd5rAsQgquCnNnXowMZRMLPngw/WBLcX6s7+V1H plwrOTnz2qHPxGvrZVafSUMUwFUEt6EgtWMTqQldcW5aHmRBC1xj7bebjzY8NPTS3WPO GgKbHagoMohzsHFfUf1QRhc394e0aYTIJj3Dl1TH/1iVGnXCDnntJ3cHyAUHczHrIfsb /hNfU14sDBiFqY9aTwCx5pbMQlWV5havpHtY1Ddv2ghufJ5XAhFnzgWMU5EP/bUYXtUH Jm2A== X-Gm-Message-State: AKS2vOwE6IyIc6n6zqamfLLq3vOMgipBOMkJk9yvLsIWNnCZiy8LlYqw rfd8GY5kMc5Wk6XbpiQ= X-Received: by 10.200.42.27 with SMTP id k27mr36173741qtk.40.1498940788045; Sat, 01 Jul 2017 13:26:28 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sat, 1 Jul 2017 13:25:59 -0700 Message-Id: <20170701202600.14057-8-rth@twiddle.net> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20170701202600.14057-1-rth@twiddle.net> References: <20170701202600.14057-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::242 Subject: [Qemu-devel] [PATCH 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: aurelien@aurel32.net, david@redhat.com 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 91ef8eb..ca9168d 100644 --- a/target/s390x/cpu_models.c +++ b/target/s390x/cpu_models.c @@ -676,6 +676,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:46:37 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.zoho.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 1498941313543192.40888552349418; Sat, 1 Jul 2017 13:35:13 -0700 (PDT) Received: from localhost ([::1]:55811 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dRP6m-0008UP-26 for importer@patchew.org; Sat, 01 Jul 2017 16:35:12 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53940) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dROyQ-0001hs-Uw for qemu-devel@nongnu.org; Sat, 01 Jul 2017 16:26:35 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dROyM-0006oT-7e for qemu-devel@nongnu.org; Sat, 01 Jul 2017 16:26:33 -0400 Received: from mail-qk0-x244.google.com ([2607:f8b0:400d:c09::244]:36263) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dROyM-0006oN-2b for qemu-devel@nongnu.org; Sat, 01 Jul 2017 16:26:30 -0400 Received: by mail-qk0-x244.google.com with SMTP id v143so6825867qkb.3 for ; Sat, 01 Jul 2017 13:26:30 -0700 (PDT) Received: from bigtime.twiddle.net.com (97-113-165-157.tukw.qwest.net. [97.113.165.157]) by smtp.gmail.com with ESMTPSA id f128sm8559985qkc.13.2017.07.01.13.26.28 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 01 Jul 2017 13:26:28 -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=sF4PnPta6pozwwdnk+Waz7Q3LHeBy59cH8d0ustGynw=; b=fMk9YKVHTryLMG5AYtV6WvN4HtgP9RHA1VKeY/W+tFhFyhMb54x/8Khr54oyFqoHPS tXYKZsKYfyiufNd9RRH6hVp/ICgpVCP4+B0/0KaMRFJd1TZNwfEDIY/BSF6jYw1g8sd6 yDgr81hP5c3BZUT436AJILre5WX7xV12f4h8fSia9spNNbyWSstwZt37Oltey1i4hDCU bvJvpDtQNCp5HPfDyzAbHV6EjW05AR9t97iqQg3lzLJoHZC9wJvZ/YFopvSfeeCVAECu kqWgwtELnOkbp7g9PDFYRCEnAvBENMvmgokoeXsHnZ18DBXHBSiyw7qhbQQAboqKjy4I 0Trw== 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=sF4PnPta6pozwwdnk+Waz7Q3LHeBy59cH8d0ustGynw=; b=REKGQbI5ZzrLzYZC9ijU+MvdR5ZeIKwDxSkBfQdWNkcuKeFyxfGjWthGOmjmLEUKkF vQV5UjLuIwujP1HQCVewVqU3h+Hg6BEQxD2yZ7DxeHHJ/p+CuUTkNq6/gYddzAcmIAwd GxvsHYoRKtaCiO9qzqoZ1gCV4RDv9n1IhBbj9ivY4eKjCheHFiw7scpUP1q7kDsBdwu2 QixLigMSJUAbTHAKZJXb/WphbOKO66rzOjGZFh2tQo9rNfiIGvzfBX3hLGetL8fBqKaK 5JxkU1dnuGfKiTXO0GOjx9G7AEDmJdA/4w/NEhjKQOUE7sFS5gphfeIvt0HLEBszJvKB mXQA== X-Gm-Message-State: AKS2vOwt8XKxj/ngJSZP/WMbCawlA3gQE0S3hiDBpYwoGWSCqyQlirmy aAy22w278U2SJuT7jGM= X-Received: by 10.55.156.193 with SMTP id f184mr32863496qke.102.1498940789310; Sat, 01 Jul 2017 13:26:29 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sat, 1 Jul 2017 13:26:00 -0700 Message-Id: <20170701202600.14057-9-rth@twiddle.net> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20170701202600.14057-1-rth@twiddle.net> References: <20170701202600.14057-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] [PATCH 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: aurelien@aurel32.net, david@redhat.com 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 Reported-by: David Hildenbrand Suggested-by: Aurelien Jarno Signed-off-by: Richard Henderson Reviewed-by: Aurelien Jarno --- 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 1f0c401..89b2ea5 100644 --- a/target/s390x/translate.c +++ b/target/s390x/translate.c @@ -3472,8 +3472,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