From nobody Sat Feb 7 06:59:52 2026 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 1496600394954867.1776562507712; Sun, 4 Jun 2017 11:19:54 -0700 (PDT) Received: from localhost ([::1]:58025 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dHa81-0006m8-Gz for importer@patchew.org; Sun, 04 Jun 2017 14:19:53 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50749) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dHZS3-0008CI-IX for qemu-devel@nongnu.org; Sun, 04 Jun 2017 13:36:32 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dHZS2-0003w8-E1 for qemu-devel@nongnu.org; Sun, 04 Jun 2017 13:36:31 -0400 Received: from mail-pg0-x243.google.com ([2607:f8b0:400e:c05::243]:33460) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dHZS2-0003vI-8p for qemu-devel@nongnu.org; Sun, 04 Jun 2017 13:36:30 -0400 Received: by mail-pg0-x243.google.com with SMTP id s62so7257417pgc.0 for ; Sun, 04 Jun 2017 10:36:30 -0700 (PDT) Received: from bigtime.ASUS (cpe-98-155-27-246.hawaii.res.rr.com. [98.155.27.246]) by smtp.gmail.com with ESMTPSA id j191sm52854419pgc.53.2017.06.04.10.36.27 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 04 Jun 2017 10:36: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=aeYDUeOMXf3uHYayrgcitKZLCYG8VBwDZHuVDkoNgIE=; b=KjTvrISZjtDhVdz2RFgktc2RQI927lHiLNCJC7KF8pSPiYk4YxWFCTOismqplfECZu UHcrHNmKmzgJFKkSdN8qqcaG4uvl6r6Hu06ntRLDD3QlPzR+29z5TlD4fkasXyJ0bbOS gTN6ryyNeZSZNmf0vKHQX8nV/ngwN9/IBxr8oE08EHRCFnT5wXk80UKhTSOAgU9gaZ6V xwLRuzS/QZrJfQV1mUdaG8c2noJAZI2JSb+1D3a/aY2E5YD1pWuo/BZf3ZueugnnWtFM XPpOUtdH1/OF22VBtjdgsAJ114HAOD6xa2U8upRZ2OCbmeJ+h20L+oNurwUAF1wU+IBw ni3g== 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=aeYDUeOMXf3uHYayrgcitKZLCYG8VBwDZHuVDkoNgIE=; b=jNQwbEje/p2vvAXKto3aHawOq2OQlBbrlBZ6h5wFZtr1432upLAM4I/pJmsTrHAzcd Xp0yi7ydG6Srjfp61C7jm2SO+1Bj6afrwzH0xheJO2/SX85xNXVdy7rccnSIzkKx9POL /3sa9Nq4PwaZuPsAIXNtMRFlOU22u6fFvohFt0gK5WhTv/hy6zSftNnKfmQgjpGk57ZJ Ekw6MbFeCYj++cNv9RxSNyd9L2IcsvZLzAbxarWC3YZbM5esWAwq1XgrR6V53aIGkjEc gAZx/g4lbeW6sv31xEX0nY2l5ymjFaLrM5qxydvm9AYiNPZC8jzitkwK4hay1fga5m7Y 6pSw== X-Gm-Message-State: AODbwcC6WGEVASqJxCBnCttJhAtpu58X7oin9Y0yIxuVJPqRttm4A+up aqnqQhkdRXv47KDoq6s= X-Received: by 10.99.218.69 with SMTP id l5mr17437550pgj.88.1496597789170; Sun, 04 Jun 2017 10:36:29 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 4 Jun 2017 10:34:56 -0700 Message-Id: <20170604173509.29684-57-rth@twiddle.net> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20170604173509.29684-1-rth@twiddle.net> References: <20170604173509.29684-1-rth@twiddle.net> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400e:c05::243 Subject: [Qemu-devel] [PULL 56/69] target/s390x: fix COMPARE LOGICAL LONG 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: , Cc: peter.maydell@linaro.org, aurelien@aurel32.net 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: Aurelien Jarno There are multiple issues with the COMPARE LOGICAL LONG EXTENDED instruction: - The test between the two operands is inverted, leading to an inversion of the cc values 1 and 2. - The address and length of an operand continue to be decreased after reaching the end of this operand. These values are then wrong write back to the registers. - We should limit the amount of bytes to process, so that interrupts can be served correctly. At the same time rename dest into src1 and src into src3 to match the operand names and make the code less confusing. Reviewed-by: Richard Henderson Signed-off-by: Aurelien Jarno Message-Id: <20170531220129.27724-18-aurelien@aurel32.net> Signed-off-by: Richard Henderson --- target/s390x/mem_helper.c | 54 ++++++++++++++++++++++++++++++++-----------= ---- target/s390x/translate.c | 20 +++++++++++++----- 2 files changed, 52 insertions(+), 22 deletions(-) diff --git a/target/s390x/mem_helper.c b/target/s390x/mem_helper.c index 98a7aa2..e992fd9 100644 --- a/target/s390x/mem_helper.c +++ b/target/s390x/mem_helper.c @@ -666,35 +666,55 @@ uint32_t HELPER(clcle)(CPUS390XState *env, uint32_t r= 1, uint64_t a2, uint32_t r3) { uintptr_t ra =3D GETPC(); - uint64_t destlen =3D get_length(env, r1 + 1); - uint64_t dest =3D get_address(env, r1); - uint64_t srclen =3D get_length(env, r3 + 1); - uint64_t src =3D get_address(env, r3); + uint64_t src1len =3D get_length(env, r1 + 1); + uint64_t src1 =3D get_address(env, r1); + uint64_t src3len =3D get_length(env, r3 + 1); + uint64_t src3 =3D get_address(env, r3); uint8_t pad =3D a2 & 0xff; + uint64_t len =3D MAX(src1len, src3len); uint32_t cc =3D 0; =20 - if (!(destlen || srclen)) { + if (!len) { return cc; } =20 - if (srclen > destlen) { - srclen =3D destlen; + /* 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. */ + if (len > 0x2000) { + len =3D 0x2000; + cc =3D 3; } =20 - for (; destlen || srclen; src++, dest++, destlen--, srclen--) { - uint8_t v1 =3D srclen ? cpu_ldub_data_ra(env, src, ra) : pad; - uint8_t v2 =3D destlen ? cpu_ldub_data_ra(env, dest, ra) : pad; - if (v1 !=3D v2) { - cc =3D (v1 < v2) ? 1 : 2; + for (; len; len--) { + uint8_t v1 =3D pad; + uint8_t v3 =3D pad; + + if (src1len) { + v1 =3D cpu_ldub_data_ra(env, src1, ra); + } + if (src3len) { + v3 =3D cpu_ldub_data_ra(env, src3, ra); + } + + if (v1 !=3D v3) { + cc =3D (v1 < v3) ? 1 : 2; break; } + + if (src1len) { + src1++; + src1len--; + } + if (src3len) { + src3++; + src3len--; + } } =20 - set_length(env, r1 + 1, destlen); - /* can't use srclen here, we trunc'ed it */ - set_length(env, r3 + 1, env->regs[r3 + 1] - src - env->regs[r3]); - set_address(env, r1, dest); - set_address(env, r3, src); + set_length(env, r1 + 1, src1len); + set_length(env, r3 + 1, src3len); + set_address(env, r1, src1); + set_address(env, r3, src3); =20 return cc; } diff --git a/target/s390x/translate.c b/target/s390x/translate.c index 95ca53c..9309e58 100644 --- a/target/s390x/translate.c +++ b/target/s390x/translate.c @@ -1917,11 +1917,21 @@ static ExitStatus op_clc(DisasContext *s, DisasOps = *o) =20 static ExitStatus op_clcle(DisasContext *s, DisasOps *o) { - TCGv_i32 r1 =3D tcg_const_i32(get_field(s->fields, r1)); - TCGv_i32 r3 =3D tcg_const_i32(get_field(s->fields, r3)); - gen_helper_clcle(cc_op, cpu_env, r1, o->in2, r3); - tcg_temp_free_i32(r1); - tcg_temp_free_i32(r3); + int r1 =3D get_field(s->fields, r1); + int r3 =3D get_field(s->fields, r3); + TCGv_i32 t1, t3; + + /* r1 and r3 must be even. */ + if (r1 & 1 || r3 & 1) { + gen_program_exception(s, PGM_SPECIFICATION); + return EXIT_NORETURN; + } + + t1 =3D tcg_const_i32(r1); + t3 =3D tcg_const_i32(r3); + gen_helper_clcle(cc_op, cpu_env, t1, o->in2, t3); + tcg_temp_free_i32(t1); + tcg_temp_free_i32(t3); set_cc_static(s); return NO_EXIT; } --=20 2.9.4