From nobody Sat May 4 23:02:23 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; 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 1488422645581375.8416224175304; Wed, 1 Mar 2017 18:44:05 -0800 (PST) Received: from localhost ([::1]:49876 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjGiq-0008IR-8Q for importer@patchew.org; Wed, 01 Mar 2017 21:44:04 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50777) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjGgV-0006wK-GD for qemu-devel@nongnu.org; Wed, 01 Mar 2017 21:41:40 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cjGgT-0006ej-2q for qemu-devel@nongnu.org; Wed, 01 Mar 2017 21:41:39 -0500 Received: from mail-qk0-x241.google.com ([2607:f8b0:400d:c09::241]:34137) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1cjGgS-0006eS-UR for qemu-devel@nongnu.org; Wed, 01 Mar 2017 21:41:36 -0500 Received: by mail-qk0-x241.google.com with SMTP id s186so15732026qkb.1 for ; Wed, 01 Mar 2017 18:41:36 -0800 (PST) Received: from bigtime.twiddle.net.com (mail.taphouse.com.au. [180.214.90.195]) by smtp.gmail.com with ESMTPSA id s3sm4459321qte.57.2017.03.01.18.41.33 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 01 Mar 2017 18:41:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:subject:date:message-id:in-reply-to:references; bh=40JwHl7iXMWmcME5vJTXpxag07kqkRjfdoIewgvr1mg=; b=C2vLWTXIlYZDRrbJyRDlcX1VZc19+S2sXeArwpwvlWQ2W4XtKCI9m0YfR+Siq25e+K Mr8R2dkOcDbgeEDlZPLWeRsKPCXS0WCcJwVYMWYgkFRsCEMgs5UmZWH+ACfyD/uU036O Ti0qvcVjNY1UFRh1o70ADYNY0FGNk7G2q3Y3pr3dE9LcVEXKyUna5laga1LmSQHek4ov Gk0i6noHfKigHKmIxH8/athJNPl5aBHYRk2De5+iMnB9brpvwky/SU8iGgMBIH53Tm5S zpxBb8QXeASahsPveVe6ZaT+cE8YxJ85yAm1bd/FTQD41o8Q7j9A3MmbjrJXahYQ8Zek j2Zw== 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:subject:date:message-id :in-reply-to:references; bh=40JwHl7iXMWmcME5vJTXpxag07kqkRjfdoIewgvr1mg=; b=TArVuvgS+Vry+YfMtHPFIRWtrHw6NKeb4kRcHDVvhA6stch49G7Ztn3MF9wQbnOE6Y WTP8Lt39v9AAjDmt/OAOZJGA+J1RUnC4Fox5+ct+c7Y4AS8h/PGDKKyCQSli9M3Hc2eZ hG3eJshH5JH/MJzyy3IfqKfdGkwgnmWzRlESK/I74XkC7d5/XMOr6IPdPXEbe15dWNrL 5j1mFVqYiW0FsSucBizt/TAduHQrsNGj5MsgKMCo12vqQvCiuHrtMtqSB13/vveJ4DNH fZwGhEOVoeN0xwbBlPFeHLvxt9y2w4OSgkFV5lDGogTRyArFqhPG0/3KYCqirW4qXSIJ 6zow== X-Gm-Message-State: AMke39lkdYcazBCmZ5MiaXwW0Jl9b0pFOwo7+R2mywOozZxL4RT37NO3YOkpQvWxmEoCOw== X-Received: by 10.200.45.112 with SMTP id o45mr15546138qta.92.1488422496051; Wed, 01 Mar 2017 18:41:36 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Thu, 2 Mar 2017 13:41:05 +1100 Message-Id: <20170302024110.3978-2-rth@twiddle.net> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20170302024110.3978-1-rth@twiddle.net> References: <20170302024110.3978-1-rth@twiddle.net> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2607:f8b0:400d:c09::241 Subject: [Qemu-devel] [PATCH 1/6] target/s390x: Implement STORE FACILITIES LIST EXTENDED 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: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" At the same time, improve STORE FACILITIES LIST so that we don't hard-code the list for all cpus. Signed-off-by: Richard Henderson --- target/s390x/helper.h | 2 ++ target/s390x/insn-data.def | 2 ++ target/s390x/misc_helper.c | 41 +++++++++++++++++++++++++++++++++++++++++ target/s390x/translate.c | 17 +++++++++-------- 4 files changed, 54 insertions(+), 8 deletions(-) diff --git a/target/s390x/helper.h b/target/s390x/helper.h index 9102071..01adb50 100644 --- a/target/s390x/helper.h +++ b/target/s390x/helper.h @@ -83,6 +83,8 @@ DEF_HELPER_FLAGS_5(calc_cc, TCG_CALL_NO_RWG_SE, i32, env,= i32, i64, i64, i64) DEF_HELPER_FLAGS_2(sfpc, TCG_CALL_NO_RWG, void, env, i64) DEF_HELPER_FLAGS_2(sfas, TCG_CALL_NO_WG, void, env, i64) DEF_HELPER_FLAGS_1(popcnt, TCG_CALL_NO_RWG_SE, i64, i64) +DEF_HELPER_FLAGS_1(stfl, TCG_CALL_NO_RWG, void, env) +DEF_HELPER_2(stfle, i32, env, i64) =20 #ifndef CONFIG_USER_ONLY DEF_HELPER_3(servc, i32, env, i64, i64) diff --git a/target/s390x/insn-data.def b/target/s390x/insn-data.def index 075ff59..b6702da 100644 --- a/target/s390x/insn-data.def +++ b/target/s390x/insn-data.def @@ -747,6 +747,8 @@ C(0xe33e, STRV, RXY_a, Z, la2, r1_32u, new, m1_32, rev32, 0) C(0xe32f, STRVG, RXY_a, Z, la2, r1_o, new, m1_64, rev64, 0) =20 +/* STORE FACILITY LIST EXTENDED */ + C(0xb2b0, STFLE, S, SFLE, 0, a2, 0, 0, stfle, 0) /* STORE FPC */ C(0xb29c, STFPC, S, Z, 0, a2, new, m2_32, efpc, 0) =20 diff --git a/target/s390x/misc_helper.c b/target/s390x/misc_helper.c index 3cb942e..fa51b29 100644 --- a/target/s390x/misc_helper.c +++ b/target/s390x/misc_helper.c @@ -654,3 +654,44 @@ void HELPER(per_ifetch)(CPUS390XState *env, uint64_t a= ddr) } } #endif + +void HELPER(stfl)(CPUS390XState *env) +{ + S390CPU *cpu =3D s390_env_get_cpu(env); + S390FeatInit buf =3D { }; + uint32_t feat32; + + s390_fill_feat_block(cpu->model->features, S390_FEAT_TYPE_STFL, + (uint8_t *) &buf); + feat32 =3D be64_to_cpu(buf[0]) >> 32; + + cpu_stl_data(env, 200, feat32); +} + +uint32_t HELPER(stfle)(CPUS390XState *env, uint64_t addr) +{ + S390CPU *cpu =3D s390_env_get_cpu(env); + S390FeatInit buf =3D { }; + int count_m1 =3D env->regs[0] & 0xff; + int max_m1, i; + + s390_fill_feat_block(cpu->model->features, S390_FEAT_TYPE_STFL, + (uint8_t *) &buf); + + /* Find out how many 64-bit quantities are non-zero. */ + for (max_m1 =3D ARRAY_SIZE (buf) - 1; max_m1 > 0; --max_m1) { + if (buf[max_m1] !=3D 0) { + break; + } + } + + /* Note that s390_fill_feat_block already filled in big-endian. + But since cpu_stq_data will swap from host, we need to convert + back to host-endian first. */ + for (i =3D 0; i <=3D count_m1; ++i) { + cpu_stq_data(env, addr + 8 * i, be64_to_cpu(buf[i])); + } + + env->regs[0] =3D deposit64(env->regs[0], 0, 8, max_m1); + return (count_m1 >=3D max_m1 ? 0 : 3); +} diff --git a/target/s390x/translate.c b/target/s390x/translate.c index 01c6217..69940e3 100644 --- a/target/s390x/translate.c +++ b/target/s390x/translate.c @@ -3628,15 +3628,8 @@ static ExitStatus op_spt(DisasContext *s, DisasOps *= o) =20 static ExitStatus op_stfl(DisasContext *s, DisasOps *o) { - TCGv_i64 f, a; - /* We really ought to have more complete indication of facilities - that we implement. Address this when STFLE is implemented. */ check_privileged(s); - f =3D tcg_const_i64(0xc0000000); - a =3D tcg_const_i64(200); - tcg_gen_qemu_st32(f, a, get_mem_index(s)); - tcg_temp_free_i64(f); - tcg_temp_free_i64(a); + gen_helper_stfl(cpu_env); return NO_EXIT; } =20 @@ -3802,6 +3795,14 @@ static ExitStatus op_sturg(DisasContext *s, DisasOps= *o) } #endif =20 +static ExitStatus op_stfle(DisasContext *s, DisasOps *o) +{ + potential_page_fault(s); + gen_helper_stfle(cc_op, cpu_env, o->in2); + set_cc_static(s); + return NO_EXIT; +} + static ExitStatus op_st8(DisasContext *s, DisasOps *o) { tcg_gen_qemu_st8(o->in1, o->in2, get_mem_index(s)); --=20 2.9.3 From nobody Sat May 4 23:02:23 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; 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 1488422549802102.46072982332441; Wed, 1 Mar 2017 18:42:29 -0800 (PST) Received: from localhost ([::1]:49871 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjGhI-0006yH-F5 for importer@patchew.org; Wed, 01 Mar 2017 21:42:28 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50807) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjGgW-0006wT-PZ for qemu-devel@nongnu.org; Wed, 01 Mar 2017 21:41:41 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cjGgV-0006g7-LE for qemu-devel@nongnu.org; Wed, 01 Mar 2017 21:41:40 -0500 Received: from mail-qk0-x243.google.com ([2607:f8b0:400d:c09::243]:35095) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1cjGgV-0006fn-I2 for qemu-devel@nongnu.org; Wed, 01 Mar 2017 21:41:39 -0500 Received: by mail-qk0-x243.google.com with SMTP id n127so15684287qkf.2 for ; Wed, 01 Mar 2017 18:41:39 -0800 (PST) Received: from bigtime.twiddle.net.com (mail.taphouse.com.au. [180.214.90.195]) by smtp.gmail.com with ESMTPSA id s3sm4459321qte.57.2017.03.01.18.41.36 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 01 Mar 2017 18:41:38 -0800 (PST) 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=GGhb/OisTfAapcLafYbA0iQMWrSW1Pu/57G96eYmhbA=; b=iUbVlIBkhKFQeT9Nc/n3U1+jOvtpzPs0yZM/XL9rIwr8L3NFRwxEusRFzaYkAbwP4e N8czrINji0/mpA8tVuFDM5Q/R2E28yAe/Y7RQ/rv/LbJDDhsiNLQJXIOH1Pjzso0LToq gt2PnI2bzl5e8V9LeulO89zYS2QPJkY39v4UtSvSZ5CaRO7bILZ/P0tOYxuNf2kbZ4Iw Ah2l0XljyCjPM7NXrd60a1llkcNYP1XYfmCcXrJS5ZbrCDcNkTRrZOxrn/OXKmC1qcuh FUv0KIjMZEi05KEgiofi6RqpbcnRKb4yB0ISUW50QJplZ0VQ0viXwlmAWf/M/FsNS6tC mIZA== 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=GGhb/OisTfAapcLafYbA0iQMWrSW1Pu/57G96eYmhbA=; b=MDtNqxoQ+BUiOYX6jiya/T7Ome7jyhyrhblYIaJwwaZWsqr+sxnJBOWLpSdLqdiCs0 +6GvgLJycRK/dYONK9lhAoNjl/ewpzvB4knTkNWLQsDNk9NJ83M8AEjBShsXoIleByij SxCXpHu4kKcdFt23sTVwggOU7M/b38c/NE5KCsuqJYxldls18J9gdJFNuIXh020Cpdzc hcnLoJJDb72HTS5//81fA831fuXUApIgJbPvUpRwirh/hc3YaToEeh/mUbeBGrCmWkf5 +ku4jEoUoNwYG2JnMp5fByyAi6ZVzBbPsK9gx/0pmewT64ghoxuJc+MbZZrSFzLteCL5 PS4g== X-Gm-Message-State: AMke39l3OIPudajBvnRfc/HyBsODwPK4J8xTbA1M8DielqfeCopg3MjjqKOI2YUCwsDbzw== X-Received: by 10.55.105.66 with SMTP id e63mr14050207qkc.0.1488422498625; Wed, 01 Mar 2017 18:41:38 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Thu, 2 Mar 2017 13:41:06 +1100 Message-Id: <20170302024110.3978-3-rth@twiddle.net> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20170302024110.3978-1-rth@twiddle.net> References: <20170302024110.3978-1-rth@twiddle.net> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2607:f8b0:400d:c09::243 Subject: [Qemu-devel] [PATCH 2/6] target/s390x: Implement LOAD PROGRAM PARAMETER 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: Miroslav Benes Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Miroslav Benes Linux arch/s390/kernel/head(64).S uses LPP instruction if it is available in facilities list provided by stfl/stfle instruction. This is the case of newer z/System generations and their qemu definition. The description of LPP is at http://www-01.ibm.com/support/docview.wss?uid=3Disg26fcd1cc32246f4c8852574c= e0044734a Signed-off-by: Miroslav Benes Message-Id: <20170227085353.20787-1-mbenes@suse.cz> Signed-off-by: Richard Henderson --- target/s390x/insn-data.def | 2 ++ target/s390x/translate.c | 9 +++++++++ 2 files changed, 11 insertions(+) diff --git a/target/s390x/insn-data.def b/target/s390x/insn-data.def index b6702da..43c5707 100644 --- a/target/s390x/insn-data.def +++ b/target/s390x/insn-data.def @@ -845,6 +845,8 @@ /* LOAD CONTROL */ C(0xb700, LCTL, RS_a, Z, 0, a2, 0, 0, lctl, 0) C(0xeb2f, LCTLG, RSY_a, Z, 0, a2, 0, 0, lctlg, 0) +/* LOAD PROGRAM PARAMETER */ + C(0xb280, LPP, S, LPP, 0, m2_64, 0, 0, lpp, 0) /* LOAD PSW */ C(0x8200, LPSW, S, Z, 0, a2, 0, 0, lpsw, 0) /* LOAD PSW EXTENDED */ diff --git a/target/s390x/translate.c b/target/s390x/translate.c index 69940e3..2b66a4e 100644 --- a/target/s390x/translate.c +++ b/target/s390x/translate.c @@ -1194,6 +1194,7 @@ typedef enum DisasFacility { FAC_SCF, /* store clock fast */ FAC_SFLE, /* store facility list extended */ FAC_ILA, /* interlocked access facility 1 */ + FAC_LPP, /* load-program-parameter */ } DisasFacility; =20 struct DisasInsn { @@ -2567,6 +2568,14 @@ static ExitStatus op_lra(DisasContext *s, DisasOps *= o) return NO_EXIT; } =20 +static ExitStatus op_lpp(DisasContext *s, DisasOps *o) +{ + check_privileged(s); + + tcg_gen_st_i64(o->in2, cpu_env, offsetof(CPUS390XState, pp)); + return NO_EXIT; +} + static ExitStatus op_lpsw(DisasContext *s, DisasOps *o) { TCGv_i64 t1, t2; --=20 2.9.3 From nobody Sat May 4 23:02:23 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; 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 14884227200401007.2996992222295; Wed, 1 Mar 2017 18:45:20 -0800 (PST) Received: from localhost ([::1]:49882 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjGk2-0001KU-Un for importer@patchew.org; Wed, 01 Mar 2017 21:45:18 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50826) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjGgZ-0006y0-3v for qemu-devel@nongnu.org; Wed, 01 Mar 2017 21:41:44 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cjGgY-0006i6-4Q for qemu-devel@nongnu.org; Wed, 01 Mar 2017 21:41:43 -0500 Received: from mail-qk0-x241.google.com ([2607:f8b0:400d:c09::241]:36766) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1cjGgX-0006i2-WB for qemu-devel@nongnu.org; Wed, 01 Mar 2017 21:41:42 -0500 Received: by mail-qk0-x241.google.com with SMTP id u188so15709130qkc.3 for ; Wed, 01 Mar 2017 18:41:41 -0800 (PST) Received: from bigtime.twiddle.net.com (mail.taphouse.com.au. [180.214.90.195]) by smtp.gmail.com with ESMTPSA id s3sm4459321qte.57.2017.03.01.18.41.38 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 01 Mar 2017 18:41:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:subject:date:message-id:in-reply-to:references; bh=C5tipqk3N641rB+ePkDb8IskEOEU9agwRqcUVfz55UE=; b=g5rI59vTNkNejncLojNMie2LY9TtJaDS/oRholqMWHj3sLvijIXRNytVwI5qNa7hAZ 8dO98w8QSWtBwmaQfaWR6aXsaU2y6PWarEDeT79yxCKF2MR5v7QqIcYmsy8MnBWoBXIj lR7wXZ+ErGuHkZOV5yHBMiltGQSaAoeH8eRoqiuFCXWX/BsEfaHpNCP53BzDzSDvEdkU t9erFBtRHCwmWwVmFjdFeg/BEwHgG6GBQLMwguepw2KDc1axf0IHKTKi3B7MfLQgBFio ebGWlXmHuoy7gkjZtSZaegiRWFDGPwtqZMrKicEFWvtnY2bAstoaUUwWmmxuUaQgAYg4 aLmQ== 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:subject:date:message-id :in-reply-to:references; bh=C5tipqk3N641rB+ePkDb8IskEOEU9agwRqcUVfz55UE=; b=SuMI2mQ0Lnvh0s9SgyHZTIjgbJBOD8/0YgGwsR83W37ubspw33AAesotVbs9hb6gdj qTwvkdjMnUsIEOahLItTldy1MHmH1fcQbdoqVwlv4sSJ31U2oOAQf7El+HpfQc3oRt5d 8YiSUhrFGzTGSLpHiK62lFGRDq7FI850CquPB89SvNAHq/ZTlop3VE9QaoMRe0zmpcI2 r8whu5AOAM1V1iEmVrR6TV9An4/IEFSLkNrLPQSkWOtHv9Efs3pTECxNBK9HbbM16vjD lqrk5auXsYtYpohEmDCJYQBzxTDpX2uRAUNzVxbR00ln0z/Zyn7YrqYnXkLPjUbVX7vo 6/TQ== X-Gm-Message-State: AMke39kuwBUpxtZ2o4XXcmo6F067LiK9BKP4EK8zh6BWzmFUVLpnJLDW2m56GUxO0YvjXQ== X-Received: by 10.55.6.150 with SMTP id 144mr13539556qkg.46.1488422501284; Wed, 01 Mar 2017 18:41:41 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Thu, 2 Mar 2017 13:41:07 +1100 Message-Id: <20170302024110.3978-4-rth@twiddle.net> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20170302024110.3978-1-rth@twiddle.net> References: <20170302024110.3978-1-rth@twiddle.net> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2607:f8b0:400d:c09::241 Subject: [Qemu-devel] [PATCH 3/6] target/s390x: Diagnose specification exception for atomics 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: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" All of the interlocked access facility instructions raise a specification exception for unaligned accesses. Do this by using the (previously unused) unaligned_access hook. Signed-off-by: Richard Henderson --- target/s390x/cpu.c | 1 + target/s390x/cpu.h | 3 +++ target/s390x/helper.c | 16 ++++++++++++++++ 3 files changed, 20 insertions(+) diff --git a/target/s390x/cpu.c b/target/s390x/cpu.c index 066dcd1..a1bf2ba 100644 --- a/target/s390x/cpu.c +++ b/target/s390x/cpu.c @@ -430,6 +430,7 @@ static void s390_cpu_class_init(ObjectClass *oc, void *= data) cc->write_elf64_note =3D s390_cpu_write_elf64_note; cc->cpu_exec_interrupt =3D s390_cpu_exec_interrupt; cc->debug_excp_handler =3D s390x_cpu_debug_excp_handler; + cc->do_unaligned_access =3D s390x_cpu_do_unaligned_access; #endif cc->disas_set_info =3D s390_cpu_disas_set_info; =20 diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h index 058ddad..bbed320 100644 --- a/target/s390x/cpu.h +++ b/target/s390x/cpu.h @@ -480,6 +480,9 @@ int s390_cpu_handle_mmu_fault(CPUState *cpu, vaddr addr= ess, int rw, =20 #ifndef CONFIG_USER_ONLY void do_restart_interrupt(CPUS390XState *env); +void s390x_cpu_do_unaligned_access(CPUState *cs, vaddr addr, + MMUAccessType access_type, + int mmu_idx, uintptr_t retaddr); =20 static inline hwaddr decode_basedisp_s(CPUS390XState *env, uint32_t ipb, uint8_t *ar) diff --git a/target/s390x/helper.c b/target/s390x/helper.c index 68bd2f9..9978490 100644 --- a/target/s390x/helper.c +++ b/target/s390x/helper.c @@ -718,4 +718,20 @@ void s390x_cpu_debug_excp_handler(CPUState *cs) cpu_loop_exit_noexc(cs); } } + +/* Unaligned accesses are only diagnosed with MO_ALIGN. At the moment, + this is only for the atomic operations, for which we want to raise a + specification exception. */ +void s390x_cpu_do_unaligned_access(CPUState *cs, vaddr addr, + MMUAccessType access_type, + int mmu_idx, uintptr_t retaddr) +{ + S390CPU *cpu =3D S390_CPU(cs); + CPUS390XState *env =3D &cpu->env; + + if (retaddr) { + cpu_restore_state(cs, retaddr); + } + program_interrupt(env, PGM_SPECIFICATION, ILEN_LATER); +} #endif /* CONFIG_USER_ONLY */ --=20 2.9.3 From nobody Sat May 4 23:02:23 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; 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 1488422650220290.4774326486271; Wed, 1 Mar 2017 18:44:10 -0800 (PST) Received: from localhost ([::1]:49877 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjGiv-0008Mz-20 for importer@patchew.org; Wed, 01 Mar 2017 21:44:09 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50881) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjGgf-00072l-H4 for qemu-devel@nongnu.org; Wed, 01 Mar 2017 21:41:50 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cjGgb-0006lo-6o for qemu-devel@nongnu.org; Wed, 01 Mar 2017 21:41:49 -0500 Received: from mail-qk0-x242.google.com ([2607:f8b0:400d:c09::242]:34148) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1cjGgb-0006lc-2Q for qemu-devel@nongnu.org; Wed, 01 Mar 2017 21:41:45 -0500 Received: by mail-qk0-x242.google.com with SMTP id s186so15732612qkb.1 for ; Wed, 01 Mar 2017 18:41:44 -0800 (PST) Received: from bigtime.twiddle.net.com (mail.taphouse.com.au. [180.214.90.195]) by smtp.gmail.com with ESMTPSA id s3sm4459321qte.57.2017.03.01.18.41.41 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 01 Mar 2017 18:41:43 -0800 (PST) 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=Y1DsJiDQ4Q3vllvMcro6WzuUuwqJIVerukDSYELM6oQ=; b=FJDZjZpITdEFw0492N8eGqhg/IPvNU+4XnSAZx1h6Cip9fqKgeVCO65nd4PqXUkrof f0QiB4z7Fsw5r9PRW6cw/ZaUMdjCUb7zJR1OZ/YQ4amqO+hl7qpzhoXfm9Heb9t3I3xM W0Z6APX/2vGqdJp8l1t3kE2SZe0Tv0jtrCxCAbnrgooXpgIdDETLRcvOCjKKb/hEeXKU SAYn0+mjC8Z/3SLir2+bjsA/M4fwtWyhPdVzJ6wvmRcPTC+pe6M7vWfsTBDf8Y7hqkNn EBoeMEtB8bYKs06LoU9l0BM26YHck6wI2mqcWwxoUD4Au1yTEK8FrLEmy9yhZxdyP7BH sMPg== 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=Y1DsJiDQ4Q3vllvMcro6WzuUuwqJIVerukDSYELM6oQ=; b=CLpbk2wdODo5wqniGYxn1cgGB9FxOlKVcnfNQVwSXVzRhAQuojIvXw85rEYpqZiV5O lATwi0lGQBydihGRlYTmNauzrbaxLT+2RwXasxoxl3iLGmE/AksrWYf9P/JMbXFE+Mqt FycMJ4i7pt0oUyAqXCJku6SUOjPXHvBVAokq3O6cuIV5QtdOJLDxzr3UqHHdvb2ecU3O fWMOFZ1XAXtB6Jmi/p8ZORrpzrKzZUX1XdB+cHv1W9e0kpU+pQyAiqkNLnQhIWI+QyMH 3f6yJeIGPWfeYrM4PREMdN4G2JuvVCMngif62pvpl6OuQvhbjvOISQGBXMYK7biP7OR/ e2QQ== X-Gm-Message-State: AMke39mDVavlg3ZaUIXVmtJWVFtwavgvJTOqP9SZmJYr93gGC7pev4rzTSgiJXZ9CnQH7Q== X-Received: by 10.55.99.69 with SMTP id x66mr13001215qkb.317.1488422504224; Wed, 01 Mar 2017 18:41:44 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Thu, 2 Mar 2017 13:41:08 +1100 Message-Id: <20170302024110.3978-5-rth@twiddle.net> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20170302024110.3978-1-rth@twiddle.net> References: <20170302024110.3978-1-rth@twiddle.net> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2607:f8b0:400d:c09::242 Subject: [Qemu-devel] [PATCH 4/6] target/s390x: Implement LOAD PAIR DISJOINT 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: Eric Bischoff Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Eric Bischoff Signed-off-by: Eric Bischoff Message-Id: <20170228120134.7921-1-ebischoff@suse.com> [rth: Combine the two via insn->data; free the address temps.] Signed-off-by: Richard Henderson --- target/s390x/insn-data.def | 4 +++- target/s390x/translate.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/target/s390x/insn-data.def b/target/s390x/insn-data.def index 43c5707..0909060 100644 --- a/target/s390x/insn-data.def +++ b/target/s390x/insn-data.def @@ -504,7 +504,9 @@ C(0xb9e2, LOCGR, RRF_c, LOC, r1, r2, r1, 0, loc, 0) C(0xebf2, LOC, RSY_b, LOC, r1, m2_32u, new, r1_32, loc, 0) C(0xebe2, LOCG, RSY_b, LOC, r1, m2_64, r1, 0, loc, 0) -/* LOAD PAIR DISJOINT TODO */ +/* LOAD PAIR DISJOINT */ + D(0xc804, LPD, SSF, ILA, 0, 0, new_P, r3_P32, lpd, 0, MO_TEUL) + D(0xc805, LPDG, SSF, ILA, 0, 0, new_P, r3_P64, lpd, 0, MO_TEQ) /* LOAD POSITIVE */ C(0x1000, LPR, RR_a, Z, 0, r2_32s, new, r1_32, abs, abs32) C(0xb900, LPGR, RRE, Z, 0, r2, r1, 0, abs, abs64) diff --git a/target/s390x/translate.c b/target/s390x/translate.c index 2b66a4e..8de0177 100644 --- a/target/s390x/translate.c +++ b/target/s390x/translate.c @@ -2559,6 +2559,7 @@ static ExitStatus op_lctlg(DisasContext *s, DisasOps = *o) tcg_temp_free_i32(r3); return NO_EXIT; } + static ExitStatus op_lra(DisasContext *s, DisasOps *o) { check_privileged(s); @@ -2759,6 +2760,31 @@ static ExitStatus op_lm64(DisasContext *s, DisasOps = *o) return NO_EXIT; } =20 +static ExitStatus op_lpd(DisasContext *s, DisasOps *o) +{ + TCGv_i64 a1, a2; + TCGMemOp mop =3D s->insn->data; + + /* In a parallel context, stop the world and single step. */ + if (parallel_cpus) { + potential_page_fault(s); + gen_helper_exit_atomic(cpu_env); + return EXIT_NORETURN; + } + + /* In a serial context, perform the two loads ... */ + a1 =3D get_address(s, 0, get_field(s->fields, b1), get_field(s->fields= , d1)); + a2 =3D get_address(s, 0, get_field(s->fields, b2), get_field(s->fields= , d2)); + tcg_gen_qemu_ld_i64(o->out, a1, get_mem_index(s), mop | MO_ALIGN); + tcg_gen_qemu_ld_i64(o->out2, a2, get_mem_index(s), mop | MO_ALIGN); + tcg_temp_free_i64(a1); + tcg_temp_free_i64(a2); + + /* ... and indicate that we performed them while interlocked. */ + gen_op_movi_cc(s, 0); + return NO_EXIT; +} + #ifndef CONFIG_USER_ONLY static ExitStatus op_lura(DisasContext *s, DisasOps *o) { @@ -4430,6 +4456,22 @@ static void wout_r1_D32(DisasContext *s, DisasFields= *f, DisasOps *o) } #define SPEC_wout_r1_D32 SPEC_r1_even =20 +static void wout_r3_P32(DisasContext *s, DisasFields *f, DisasOps *o) +{ + int r3 =3D get_field(f, r3); + store_reg32_i64(r3, o->out); + store_reg32_i64(r3 + 1, o->out2); +} +#define SPEC_wout_r3_P32 SPEC_r3_even + +static void wout_r3_P64(DisasContext *s, DisasFields *f, DisasOps *o) +{ + int r3 =3D get_field(f, r3); + store_reg(r3, o->out); + store_reg(r3 + 1, o->out2); +} +#define SPEC_wout_r3_P64 SPEC_r3_even + static void wout_e1(DisasContext *s, DisasFields *f, DisasOps *o) { store_freg32_i64(get_field(f, r1), o->out); --=20 2.9.3 From nobody Sat May 4 23:02:23 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; 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 1488422779617102.21437096713487; Wed, 1 Mar 2017 18:46:19 -0800 (PST) Received: from localhost ([::1]:49889 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjGl0-00021C-2p for importer@patchew.org; Wed, 01 Mar 2017 21:46:18 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50889) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjGgg-00073E-72 for qemu-devel@nongnu.org; Wed, 01 Mar 2017 21:41:51 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cjGgd-0006pY-QH for qemu-devel@nongnu.org; Wed, 01 Mar 2017 21:41:50 -0500 Received: from mail-qk0-x243.google.com ([2607:f8b0:400d:c09::243]:33575) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1cjGgd-0006pK-M5 for qemu-devel@nongnu.org; Wed, 01 Mar 2017 21:41:47 -0500 Received: by mail-qk0-x243.google.com with SMTP id n186so15629464qkb.0 for ; Wed, 01 Mar 2017 18:41:47 -0800 (PST) Received: from bigtime.twiddle.net.com (mail.taphouse.com.au. [180.214.90.195]) by smtp.gmail.com with ESMTPSA id s3sm4459321qte.57.2017.03.01.18.41.44 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 01 Mar 2017 18:41:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:subject:date:message-id:in-reply-to:references; bh=QOOoVpTRMq8WNqFgNLy0Ghu40KrPD/Dd9+ijP5A6HaE=; b=otEtn88zL/sDbw5Bb7KXq52fMYGwIxTXtM6QS5S3Q3oGJOHfb7UQvZ3ZuAnTr5NBId GikLHL0gbvwliQ2Bxm6NGjVGtfp0F/c4+n5n7rPUA1OYcsQSglX1Ou4rp8+J6CVx/YEf f+Gsnp9/Q24yk4pK2rwiR32t87n2yuK26c1rhd1wg4BjrKfz8zTDMn7jEYizN44aDwzK JDKgJq6knFelZJhrxCWGM8scMMGCD8/hUrBtm5fTIyfD1A2j4aGqJDoxkwPdgMJhfGIe dmXFIeyHjp2J2V5HqPlbzz/PuJEsJ4sa2QszL1cwzDDSu7NBEWj5k8lO5uJFrlBzpjKu yYiQ== 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:subject:date:message-id :in-reply-to:references; bh=QOOoVpTRMq8WNqFgNLy0Ghu40KrPD/Dd9+ijP5A6HaE=; b=LCB86XlBVzLEbRfNxjBkjAE9xEQlwQ82k/LgYMwRIdjZyK7nILCoi6Zx4x+zLR97fB YwrFpihL+ciN8G2NBYrbUr4dwkp47w4JySII5tNTx2H4frQVvQCIO37Q61hLP+/9i4LZ PKraeY0PMMi/n1Rep9Dqof1IylUsyrBP3BowIXmLVrmweAGcm8QzJsikL/mALi6EIEtS T1kZRbAnx9X07SvueTH/ba3TerK9QM8qK1RKtJ4M71zoVsEI3nK+Q8vcxStrWUAJeqde Y53k8hVtaq+olP7nCrrn4n8FnSebcKkVGshzt7zVnajwsN9MaItnZhbqicdM4F0IDijM cgzg== X-Gm-Message-State: AMke39nieFB+WXiaG2X8uJkZkWmaNTuq0CSFYqWtWszMDOXEQ/TY4z5LcqFzlG0hKH01Cw== X-Received: by 10.55.25.36 with SMTP id k36mr8559822qkh.248.1488422506836; Wed, 01 Mar 2017 18:41:46 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Thu, 2 Mar 2017 13:41:09 +1100 Message-Id: <20170302024110.3978-6-rth@twiddle.net> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20170302024110.3978-1-rth@twiddle.net> References: <20170302024110.3978-1-rth@twiddle.net> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2607:f8b0:400d:c09::243 Subject: [Qemu-devel] [PATCH 5/6] target/s390x: Use atomic operations for COMPARE SWAP 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: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: 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/mem_helper.c | 39 ++++++++++++++++++++++ target/s390x/translate.c | 83 +++++++++----------------------------------= ---- 3 files changed, 55 insertions(+), 68 deletions(-) diff --git a/target/s390x/helper.h b/target/s390x/helper.h index 01adb50..0b70770 100644 --- a/target/s390x/helper.h +++ b/target/s390x/helper.h @@ -25,6 +25,7 @@ DEF_HELPER_3(cxgb, i64, env, s64, i32) 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_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/mem_helper.c b/target/s390x/mem_helper.c index 675aba2..c74ded3 100644 --- a/target/s390x/mem_helper.c +++ b/target/s390x/mem_helper.c @@ -844,6 +844,45 @@ uint32_t HELPER(trt)(CPUS390XState *env, uint32_t len,= uint64_t array, return cc; } =20 +void HELPER(cdsg)(CPUS390XState *env, uint64_t addr, + uint32_t r1, uint32_t r3) +{ + uintptr_t ra =3D GETPC(); + Int128 cmpv =3D int128_make128(env->regs[r1 + 1], env->regs[r1]); + Int128 newv =3D int128_make128(env->regs[r3 + 1], env->regs[r3]); + int mem_idx =3D cpu_mmu_index(env, false); + Int128 oldv; + bool fail; + + if (parallel_cpus) { +#ifndef CONFIG_ATOMIC128 + cpu_loop_exit_atomic(ENV_GET_CPU(env), ra); +#else + TCGMemOpIdx oi =3D make_memop_idx(MO_TEQ | MO_ALIGN_16, mem_idx); + oldv =3D helper_atomic_cmpxchgo_be_mmu(env, addr, cmpv, newv, oi, = ra); + fail =3D !int128_eq(oldv, cmpv); +#endif + } else { + uint64_t oldh, oldl; + + oldh =3D cpu_ldq_data_ra(env, addr + 0, ra); + oldl =3D cpu_ldq_data_ra(env, addr + 8, ra); + + oldv =3D int128_make128(oldl, oldh); + fail =3D !int128_eq(oldv, cmpv); + if (fail) { + newv =3D oldv; + } + + cpu_stq_data_ra(env, addr + 0, int128_gethi(newv), ra); + cpu_stq_data_ra(env, addr + 8, int128_getlo(newv), ra); + } + + env->cc_op =3D fail; + env->regs[r1] =3D int128_gethi(oldv); + env->regs[r1 + 1] =3D int128_getlo(oldv); +} + #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 8de0177..414378c 100644 --- a/target/s390x/translate.c +++ b/target/s390x/translate.c @@ -1943,102 +1943,49 @@ static ExitStatus op_cps(DisasContext *s, DisasOps= *o) =20 static ExitStatus op_cs(DisasContext *s, DisasOps *o) { - /* FIXME: needs an atomic solution for CONFIG_USER_ONLY. */ int d2 =3D get_field(s->fields, d2); int b2 =3D get_field(s->fields, b2); int is_64 =3D s->insn->data; - TCGv_i64 addr, mem, cc, z; + TCGv_i64 addr, cc; =20 /* Note that in1 =3D R3 (new value) and in2 =3D (zero-extended) R1 (expected value). */ =20 - /* Load the memory into the (temporary) output. While the PoO only ta= lks - about moving the memory to R1 on inequality, if we include equality= it - means that R1 is equal to the memory in all conditions. */ addr =3D get_address(s, 0, b2, d2); - if (is_64) { - tcg_gen_qemu_ld64(o->out, addr, get_mem_index(s)); - } else { - tcg_gen_qemu_ld32u(o->out, addr, get_mem_index(s)); - } + tcg_gen_atomic_cmpxchg_i64(o->out, addr, o->in2, o->in1, + get_mem_index(s), + (is_64 ? MO_TEQ : MO_TEUL) | MO_ALIGN); + tcg_temp_free_i64(addr); =20 /* Are the memory and expected values (un)equal? Note that this setco= nd produces the output CC value, thus the NE sense of the test. */ cc =3D tcg_temp_new_i64(); tcg_gen_setcond_i64(TCG_COND_NE, cc, o->in2, o->out); - - /* If the memory and expected values are equal (CC=3D=3D0), copy R3 to= MEM. - Recall that we are allowed to unconditionally issue the store (and - thus any possible write trap), so (re-)store the original contents - of MEM in case of inequality. */ - z =3D tcg_const_i64(0); - mem =3D tcg_temp_new_i64(); - tcg_gen_movcond_i64(TCG_COND_EQ, mem, cc, z, o->in1, o->out); - if (is_64) { - tcg_gen_qemu_st64(mem, addr, get_mem_index(s)); - } else { - tcg_gen_qemu_st32(mem, addr, get_mem_index(s)); - } - tcg_temp_free_i64(z); - tcg_temp_free_i64(mem); - tcg_temp_free_i64(addr); - - /* Store CC back to cc_op. Wait until after the store so that any - exception gets the old cc_op value. */ tcg_gen_extrl_i64_i32(cc_op, cc); tcg_temp_free_i64(cc); set_cc_static(s); + return NO_EXIT; } =20 static ExitStatus op_cdsg(DisasContext *s, DisasOps *o) { - /* FIXME: needs an atomic solution for CONFIG_USER_ONLY. */ int r1 =3D get_field(s->fields, r1); int r3 =3D get_field(s->fields, r3); int d2 =3D get_field(s->fields, d2); int b2 =3D get_field(s->fields, b2); - TCGv_i64 addrh, addrl, memh, meml, outh, outl, cc, z; + TCGv_i64 addr; + TCGv_i32 t_r1, t_r3; =20 /* Note that R1:R1+1 =3D expected value and R3:R3+1 =3D new value. */ + addr =3D get_address(s, 0, b2, d2); + t_r1 =3D tcg_const_i32(r1); + t_r3 =3D tcg_const_i32(r3); + gen_helper_cdsg(cpu_env, addr, t_r1, t_r3); + tcg_temp_free_i64(addr); + tcg_temp_free_i32(t_r1); + tcg_temp_free_i32(t_r3); =20 - addrh =3D get_address(s, 0, b2, d2); - addrl =3D get_address(s, 0, b2, d2 + 8); - outh =3D tcg_temp_new_i64(); - outl =3D tcg_temp_new_i64(); - - tcg_gen_qemu_ld64(outh, addrh, get_mem_index(s)); - tcg_gen_qemu_ld64(outl, addrl, get_mem_index(s)); - - /* Fold the double-word compare with arithmetic. */ - cc =3D tcg_temp_new_i64(); - z =3D tcg_temp_new_i64(); - tcg_gen_xor_i64(cc, outh, regs[r1]); - tcg_gen_xor_i64(z, outl, regs[r1 + 1]); - tcg_gen_or_i64(cc, cc, z); - tcg_gen_movi_i64(z, 0); - tcg_gen_setcond_i64(TCG_COND_NE, cc, cc, z); - - memh =3D tcg_temp_new_i64(); - meml =3D tcg_temp_new_i64(); - tcg_gen_movcond_i64(TCG_COND_EQ, memh, cc, z, regs[r3], outh); - tcg_gen_movcond_i64(TCG_COND_EQ, meml, cc, z, regs[r3 + 1], outl); - tcg_temp_free_i64(z); - - tcg_gen_qemu_st64(memh, addrh, get_mem_index(s)); - tcg_gen_qemu_st64(meml, addrl, get_mem_index(s)); - tcg_temp_free_i64(memh); - tcg_temp_free_i64(meml); - tcg_temp_free_i64(addrh); - tcg_temp_free_i64(addrl); - - /* Save back state now that we've passed all exceptions. */ - tcg_gen_mov_i64(regs[r1], outh); - tcg_gen_mov_i64(regs[r1 + 1], outl); - tcg_gen_extrl_i64_i32(cc_op, cc); - tcg_temp_free_i64(outh); - tcg_temp_free_i64(outl); - tcg_temp_free_i64(cc); set_cc_static(s); return NO_EXIT; } --=20 2.9.3 From nobody Sat May 4 23:02:23 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; 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 1488422562897230.7332988552896; Wed, 1 Mar 2017 18:42:42 -0800 (PST) Received: from localhost ([::1]:49872 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjGhV-00076l-Kk for importer@patchew.org; Wed, 01 Mar 2017 21:42:41 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50915) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cjGgh-000746-EL for qemu-devel@nongnu.org; Wed, 01 Mar 2017 21:41:52 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cjGgg-0006qk-3g for qemu-devel@nongnu.org; Wed, 01 Mar 2017 21:41:51 -0500 Received: from mail-qk0-x243.google.com ([2607:f8b0:400d:c09::243]:33581) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1cjGgf-0006qV-VM for qemu-devel@nongnu.org; Wed, 01 Mar 2017 21:41:50 -0500 Received: by mail-qk0-x243.google.com with SMTP id n186so15629611qkb.0 for ; Wed, 01 Mar 2017 18:41:49 -0800 (PST) Received: from bigtime.twiddle.net.com (mail.taphouse.com.au. [180.214.90.195]) by smtp.gmail.com with ESMTPSA id s3sm4459321qte.57.2017.03.01.18.41.47 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 01 Mar 2017 18:41:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:subject:date:message-id:in-reply-to:references; bh=oY4EJ+OwVKurjlQRv38l7Bi6aGdBpRhqziqr5xDtNV4=; b=iJHTZg5y6h8Gb/PLZ2BHiPR8uazpDemyQzPiR3RHZ/0zp72NrhaIFUXmTLuzYseErt Rd75qxhURWRInqQf3fa6702lTVco88Q/NDmGiThJOKjMufoB/0cfDXrYsmaqHm0qcOyx 9ahht3cLBWRI5Gyc0wpuyUvsqDPnmjG9mEBDPoVgyXOeH1XxCrOGyxkk1KYigpvmFEs6 NCdm/n+Y2tHOjtW5gvHNuZppkX2AEglXeSxSxZG+KZGpM7kQxNADzL6rgt0bXafcesM1 Mp45kxfz4WmhK2gkqdbm1UK7buZ3UkUYiuLw/bRLcCbmmSQ3JlTcm6VdlqEEBdEHQr79 7tXA== 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:subject:date:message-id :in-reply-to:references; bh=oY4EJ+OwVKurjlQRv38l7Bi6aGdBpRhqziqr5xDtNV4=; b=PKyS9KJ5CSQnf6KsGdejsQ8wUOzNLR0Oh2SN7K6uGI+3hlaTuJNTW96ObXynM/vxjL ercF0DzMonGctP7w/bwJId9Ha5R0OUc7q6L6wN5nN22H096UBpwypKmN8Ht74CvWSsey 3JjiO9TnZMaAxv61y3eOfGh/OkWxElWBC8yuZlLtQmUwyO0HzNZTCjdTEkJxIE8YQyBd eVfxetaIL6E8BhBEqUe8w61jNoQEsOXyuMNPQ92l5lhSa57IQrOlXSqjYoOIKQBrY/FC FS6cfdyHUTlP+IYdHEmp4lHCXgBzQB+5wHfIxUsE2NR+rN0A9bbUqXrvBSo+qY0rr2xg OqOA== X-Gm-Message-State: AMke39mZbTOmafrgG2fILrUamrzJFs3CMfen0idpSj3UhQ7pUzPAmp4j8w44i4a0aPA1NQ== X-Received: by 10.55.42.211 with SMTP id q80mr2542697qkq.186.1488422509141; Wed, 01 Mar 2017 18:41:49 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Thu, 2 Mar 2017 13:41:10 +1100 Message-Id: <20170302024110.3978-7-rth@twiddle.net> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20170302024110.3978-1-rth@twiddle.net> References: <20170302024110.3978-1-rth@twiddle.net> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2607:f8b0:400d:c09::243 Subject: [Qemu-devel] [PATCH 6/6] target/s390x: Use atomic operations for LOAD AND OP 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: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: 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/insn-data.def | 20 ++++++------ target/s390x/translate.c | 78 +++++++++++++++++++++++++++++-------------= ---- 2 files changed, 60 insertions(+), 38 deletions(-) diff --git a/target/s390x/insn-data.def b/target/s390x/insn-data.def index 0909060..09cfb41 100644 --- a/target/s390x/insn-data.def +++ b/target/s390x/insn-data.def @@ -390,20 +390,20 @@ /* LOAD ADDRESS RELATIVE LONG */ C(0xc000, LARL, RIL_b, Z, 0, ri2, 0, r1, mov2, 0) /* LOAD AND ADD */ - C(0xebf8, LAA, RSY_a, ILA, r3_32s, m2_32s_atomic, new, m2_32_r1_at= omic, add, adds32) - C(0xebe8, LAAG, RSY_a, ILA, r3, m2_64_atomic, new, m2_64_r1_atomic,= add, adds64) + D(0xebf8, LAA, RSY_a, ILA, r3_32s, a2, new, in2_r1_32, laa, adds32= , MO_TESL) + D(0xebe8, LAAG, RSY_a, ILA, r3, a2, new, in2_r1, laa, adds64, MO_TE= Q) /* LOAD AND ADD LOGICAL */ - C(0xebfa, LAAL, RSY_a, ILA, r3_32s, m2_32s_atomic, new, m2_32_r1_at= omic, add, addu32) - C(0xebea, LAALG, RSY_a, ILA, r3, m2_64_atomic, new, m2_64_r1_atomic,= add, addu64) + D(0xebfa, LAAL, RSY_a, ILA, r3_32u, a2, new, in2_r1_32, laa, addu32= , MO_TEUL) + D(0xebea, LAALG, RSY_a, ILA, r3, a2, new, in2_r1, laa, addu64, MO_TE= Q) /* LOAD AND AND */ - C(0xebf4, LAN, RSY_a, ILA, r3_32s, m2_32s_atomic, new, m2_32_r1_at= omic, and, nz32) - C(0xebe4, LANG, RSY_a, ILA, r3, m2_64_atomic, new, m2_64_r1_atomic,= and, nz64) + D(0xebf4, LAN, RSY_a, ILA, r3_32s, a2, new, in2_r1_32, lan, nz32, = MO_TESL) + D(0xebe4, LANG, RSY_a, ILA, r3, a2, new, in2_r1, lan, nz64, MO_TEQ) /* LOAD AND EXCLUSIVE OR */ - C(0xebf7, LAX, RSY_a, ILA, r3_32s, m2_32s_atomic, new, m2_32_r1_at= omic, xor, nz32) - C(0xebe7, LAXG, RSY_a, ILA, r3, m2_64_atomic, new, m2_64_r1_atomic,= xor, nz64) + D(0xebf7, LAX, RSY_a, ILA, r3_32s, a2, new, in2_r1_32, lax, nz32, = MO_TESL) + D(0xebe7, LAXG, RSY_a, ILA, r3, a2, new, in2_r1, lax, nz64, MO_TEQ) /* LOAD AND OR */ - C(0xebf6, LAO, RSY_a, ILA, r3_32s, m2_32s_atomic, new, m2_32_r1_at= omic, or, nz32) - C(0xebe6, LAOG, RSY_a, ILA, r3, m2_64_atomic, new, m2_64_r1_atomic,= or, nz64) + D(0xebf6, LAO, RSY_a, ILA, r3_32s, a2, new, in2_r1_32, lao, nz32, = MO_TESL) + D(0xebe6, LAOG, RSY_a, ILA, r3, a2, new, in2_r1, lao, nz64, MO_TEQ) /* LOAD AND TEST */ C(0x1200, LTR, RR_a, Z, 0, r2_o, 0, cond_r1r2_32, mov2, s32) C(0xb902, LTGR, RRE, Z, 0, r2_o, 0, r1, mov2, s64) diff --git a/target/s390x/translate.c b/target/s390x/translate.c index 414378c..53c01e0 100644 --- a/target/s390x/translate.c +++ b/target/s390x/translate.c @@ -2311,6 +2311,50 @@ static ExitStatus op_iske(DisasContext *s, DisasOps = *o) } #endif =20 +static ExitStatus op_laa(DisasContext *s, DisasOps *o) +{ + /* The real output is indeed the original value in memory; + recompute the addition for the computation of CC. */ + tcg_gen_atomic_fetch_add_i64(o->in2, o->in2, o->in1, get_mem_index(s), + s->insn->data | MO_ALIGN); + /* However, we need to recompute the addition for setting CC. */ + tcg_gen_add_i64(o->out, o->in1, o->in2); + return NO_EXIT; +} + +static ExitStatus op_lan(DisasContext *s, DisasOps *o) +{ + /* The real output is indeed the original value in memory; + recompute the addition for the computation of CC. */ + tcg_gen_atomic_fetch_and_i64(o->in2, o->in2, o->in1, get_mem_index(s), + s->insn->data | MO_ALIGN); + /* However, we need to recompute the addition for setting CC. */ + tcg_gen_and_i64(o->out, o->in1, o->in2); + return NO_EXIT; +} + +static ExitStatus op_lao(DisasContext *s, DisasOps *o) +{ + /* The real output is indeed the original value in memory; + recompute the addition for the computation of CC. */ + tcg_gen_atomic_fetch_or_i64(o->in2, o->in2, o->in1, get_mem_index(s), + s->insn->data | MO_ALIGN); + /* However, we need to recompute the addition for setting CC. */ + tcg_gen_or_i64(o->out, o->in1, o->in2); + return NO_EXIT; +} + +static ExitStatus op_lax(DisasContext *s, DisasOps *o) +{ + /* The real output is indeed the original value in memory; + recompute the addition for the computation of CC. */ + tcg_gen_atomic_fetch_xor_i64(o->in2, o->in2, o->in1, get_mem_index(s), + s->insn->data | MO_ALIGN); + /* However, we need to recompute the addition for setting CC. */ + tcg_gen_xor_i64(o->out, o->in1, o->in2); + return NO_EXIT; +} + static ExitStatus op_ldeb(DisasContext *s, DisasOps *o) { gen_helper_ldeb(o->out, cpu_env, o->in2); @@ -4485,21 +4529,17 @@ static void wout_m2_32(DisasContext *s, DisasFields= *f, DisasOps *o) } #define SPEC_wout_m2_32 0 =20 -static void wout_m2_32_r1_atomic(DisasContext *s, DisasFields *f, DisasOps= *o) +static void wout_in2_r1(DisasContext *s, DisasFields *f, DisasOps *o) { - /* XXX release reservation */ - tcg_gen_qemu_st32(o->out, o->addr1, get_mem_index(s)); - store_reg32_i64(get_field(f, r1), o->in2); + store_reg(get_field(f, r1), o->in2); } -#define SPEC_wout_m2_32_r1_atomic 0 +#define SPEC_wout_in2_r1 0 =20 -static void wout_m2_64_r1_atomic(DisasContext *s, DisasFields *f, DisasOps= *o) +static void wout_in2_r1_32(DisasContext *s, DisasFields *f, DisasOps *o) { - /* XXX release reservation */ - tcg_gen_qemu_st64(o->out, o->addr1, get_mem_index(s)); - store_reg(get_field(f, r1), o->in2); + store_reg32_i64(get_field(f, r1), o->in2); } -#define SPEC_wout_m2_64_r1_atomic 0 +#define SPEC_wout_in2_r1_32 0 =20 /* =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D */ /* The "INput 1" generators. These load the first operand to an insn. */ @@ -4943,24 +4983,6 @@ static void in2_mri2_64(DisasContext *s, DisasFields= *f, DisasOps *o) } #define SPEC_in2_mri2_64 0 =20 -static void in2_m2_32s_atomic(DisasContext *s, DisasFields *f, DisasOps *o) -{ - /* XXX should reserve the address */ - in1_la2(s, f, o); - o->in2 =3D tcg_temp_new_i64(); - tcg_gen_qemu_ld32s(o->in2, o->addr1, get_mem_index(s)); -} -#define SPEC_in2_m2_32s_atomic 0 - -static void in2_m2_64_atomic(DisasContext *s, DisasFields *f, DisasOps *o) -{ - /* XXX should reserve the address */ - in1_la2(s, f, o); - o->in2 =3D tcg_temp_new_i64(); - tcg_gen_qemu_ld64(o->in2, o->addr1, get_mem_index(s)); -} -#define SPEC_in2_m2_64_atomic 0 - static void in2_i2(DisasContext *s, DisasFields *f, DisasOps *o) { o->in2 =3D tcg_const_i64(get_field(f, i2)); --=20 2.9.3