From nobody Sat Feb 7 06:35:13 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1568642506; cv=none; d=zoho.com; s=zohoarc; b=c9VpsOpk9CJDO3/Zdi6nBSp92Coalk6Ei9ajRijhiaNgkPYGpKXg1POgyBbuB7qXsgbY477DGOfO+lZOdB+YfWlhElTKyRYY3bKAtiVb0IjS3t4DPuDRmQKM6eIPIFfSSXvbyBcm28atY2W70eEBkQyKhG1QFgjh9uo9nbh8Jpc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1568642506; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=52hw0Zaxm0hMQIxhiZgz8NbI9lYA1ayp3ExDqV/4f/Q=; b=hkjT7noslHjDrs9MNoYa/SK4N04K3r/BFmVMwuWSJ7AwWYRrcI4lL1KeCW7IUMcEzJqiMZ8Uo9jDES/R48i+39HwIEEoIHQm8JL2cRYKR4wJrZj+usOYYA9yQAf/pe1uMsxRqw4KTf2lYIF4k//JpbsxVhNQ+e4zCUhiiWlh8Js= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1568642506181765.6350905770852; Mon, 16 Sep 2019 07:01:46 -0700 (PDT) Received: from localhost ([::1]:34528 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i9rZY-0004nI-Lu for importer@patchew.org; Mon, 16 Sep 2019 10:01:44 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45867) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i9rWc-0002pD-TF for qemu-devel@nongnu.org; Mon, 16 Sep 2019 09:58:45 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1i9rWb-0000Bf-4X for qemu-devel@nongnu.org; Mon, 16 Sep 2019 09:58:42 -0400 Received: from mx1.redhat.com ([209.132.183.28]:55746) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1i9rWa-0000BV-Se; Mon, 16 Sep 2019 09:58:41 -0400 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 2268A30832E1; Mon, 16 Sep 2019 13:58:40 +0000 (UTC) Received: from t460s.redhat.com (ovpn-117-103.ams2.redhat.com [10.36.117.103]) by smtp.corp.redhat.com (Postfix) with ESMTP id 26EB110013A1; Mon, 16 Sep 2019 13:58:38 +0000 (UTC) From: David Hildenbrand To: qemu-devel@nongnu.org Date: Mon, 16 Sep 2019 15:57:41 +0200 Message-Id: <20190916135806.1269-5-david@redhat.com> In-Reply-To: <20190916135806.1269-1-david@redhat.com> References: <20190916135806.1269-1-david@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.44]); Mon, 16 Sep 2019 13:58:40 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v3 04/29] s390x/tcg: MVCL: Process max 4k bytes at a time X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Florian Weimer , Thomas Huth , David Hildenbrand , =?UTF-8?q?Dan=20Hor=C3=A1k?= , Cornelia Huck , Stefano Brivio , qemu-s390x@nongnu.org, Cole Robinson , Richard Henderson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Process max 4k bytes at a time, writing back registers between the accesses. The instruction is interruptible. "For operands longer than 2K bytes, access exceptions are not recognized for locations more than 2K bytes beyond the current location being processed." Note that on z/Architecture, 2k vs. 4k access cannot get differentiated as long as pages are not crossed. This seems to be a leftover from ESA/390. Simply stay within single pages. MVCL handling is quite different than MVCLE/MVCLU handling, so split up the handlers. Defer interrupt handling, as that will require more thought, add a TODO for that. Signed-off-by: David Hildenbrand Reviewed-by: Richard Henderson --- target/s390x/mem_helper.c | 44 +++++++++++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/target/s390x/mem_helper.c b/target/s390x/mem_helper.c index 223312a4b1..58ab2e48e3 100644 --- a/target/s390x/mem_helper.c +++ b/target/s390x/mem_helper.c @@ -798,19 +798,51 @@ uint32_t HELPER(mvcl)(CPUS390XState *env, uint32_t r1= , uint32_t r2) uint64_t srclen =3D env->regs[r2 + 1] & 0xffffff; uint64_t src =3D get_address(env, r2); uint8_t pad =3D env->regs[r2 + 1] >> 24; - uint32_t cc; + uint32_t cc, cur_len; =20 if (is_destructive_overlap(env, dest, src, MIN(srclen, destlen))) { cc =3D 3; + } else if (srclen =3D=3D destlen) { + cc =3D 0; + } else if (destlen < srclen) { + cc =3D 1; } else { - cc =3D do_mvcl(env, &dest, &destlen, &src, &srclen, pad, 1, ra); + cc =3D 2; } =20 - env->regs[r1 + 1] =3D deposit64(env->regs[r1 + 1], 0, 24, destlen); - env->regs[r2 + 1] =3D deposit64(env->regs[r2 + 1], 0, 24, srclen); - set_address_zero(env, r1, dest); - set_address_zero(env, r2, src); + /* We might have to zero-out some bits even if there was no action. */ + if (unlikely(!destlen || cc =3D=3D 3)) { + set_address_zero(env, r2, src); + set_address_zero(env, r1, dest); + return cc; + } else if (!srclen) { + set_address_zero(env, r2, src); + } =20 + /* + * Only perform one type of type of operation (move/pad) in one step. + * Stay within single pages. + */ + while (destlen) { + cur_len =3D MIN(destlen, -(dest | TARGET_PAGE_MASK)); + if (!srclen) { + fast_memset(env, dest, pad, cur_len, ra); + } else { + cur_len =3D MIN(MIN(srclen, -(src | TARGET_PAGE_MASK)), cur_le= n); + + fast_memmove(env, dest, src, cur_len, ra); + src =3D wrap_address(env, src + cur_len); + srclen -=3D cur_len; + env->regs[r2 + 1] =3D deposit64(env->regs[r2 + 1], 0, 24, srcl= en); + set_address_zero(env, r2, src); + } + dest =3D wrap_address(env, dest + cur_len); + destlen -=3D cur_len; + env->regs[r1 + 1] =3D deposit64(env->regs[r1 + 1], 0, 24, destlen); + set_address_zero(env, r1, dest); + + /* TODO: Deliver interrupts. */ + } return cc; } =20 --=20 2.21.0