From nobody Sat May 4 15:52:17 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1630684642736254.49877287132813; Fri, 3 Sep 2021 08:57:22 -0700 (PDT) Received: from localhost ([::1]:58240 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mMBZB-0003OU-B2 for importer@patchew.org; Fri, 03 Sep 2021 11:57:21 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:57688) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mMBXP-0000UB-AM for qemu-devel@nongnu.org; Fri, 03 Sep 2021 11:55:32 -0400 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:51786) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mMBXL-0000AN-Ec for qemu-devel@nongnu.org; Fri, 03 Sep 2021 11:55:31 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-517-n5MmcQS3OUSSjJCutmeDog-1; Fri, 03 Sep 2021 11:55:25 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 5541180198A; Fri, 3 Sep 2021 15:55:24 +0000 (UTC) Received: from t480s.redhat.com (unknown [10.39.193.142]) by smtp.corp.redhat.com (Postfix) with ESMTP id 9F70560861; Fri, 3 Sep 2021 15:55:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1630684526; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=+mS3O4POYnN7uAyASYwN1m7JdQo0LFcFpwPNpjhd3cs=; b=W5woOOzIeEF7eX2PPUcXohE1Cbf/eOaYMU3029iWA814n4Is9wEiHON/lGx1EyMSB7NSl4 nRefCTD9VXV25mJ/2mvpik1sLqYsha2tKCABrHY8hl4i63Qqm7LP8gjQhdVS91Ti797pfh l9GYuaGlsZf1qtPuOk82WxSykSTEdGQ= X-MC-Unique: n5MmcQS3OUSSjJCutmeDog-1 From: David Hildenbrand To: qemu-devel@nongnu.org Subject: [PATCH v3 01/13] s390x/tcg: wrap address for RRBE Date: Fri, 3 Sep 2021 17:55:02 +0200 Message-Id: <20210903155514.44772-2-david@redhat.com> In-Reply-To: <20210903155514.44772-1-david@redhat.com> References: <20210903155514.44772-1-david@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=david@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=216.205.24.124; envelope-from=david@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -12 X-Spam_score: -1.3 X-Spam_bar: - X-Spam_report: (-1.3 / 5.0 requ) DKIMWL_WL_HIGH=-0.392, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: "Jason J . Herne" , Thomas Huth , Janosch Frank , David Hildenbrand , Cornelia Huck , Richard Henderson , Halil Pasic , Christian Borntraeger , qemu-s390x@nongnu.org, Claudio Imbrenda Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1630684644354100002 Content-Type: text/plain; charset="utf-8" Let's wrap the address just like for SSKE and ISKE. Reviewed-by: Thomas Huth Signed-off-by: David Hildenbrand --- target/s390x/tcg/mem_helper.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/target/s390x/tcg/mem_helper.c b/target/s390x/tcg/mem_helper.c index 21a4de4067..e0befd0f03 100644 --- a/target/s390x/tcg/mem_helper.c +++ b/target/s390x/tcg/mem_helper.c @@ -2223,11 +2223,12 @@ void HELPER(sske)(CPUS390XState *env, uint64_t r1, = uint64_t r2) uint32_t HELPER(rrbe)(CPUS390XState *env, uint64_t r2) { MachineState *ms =3D MACHINE(qdev_get_machine()); + uint64_t addr =3D wrap_address(env, r2); static S390SKeysState *ss; static S390SKeysClass *skeyclass; uint8_t re, key; =20 - if (r2 > ms->ram_size) { + if (addr > ms->ram_size) { return 0; } =20 @@ -2236,14 +2237,14 @@ uint32_t HELPER(rrbe)(CPUS390XState *env, uint64_t = r2) skeyclass =3D S390_SKEYS_GET_CLASS(ss); } =20 - if (skeyclass->get_skeys(ss, r2 / TARGET_PAGE_SIZE, 1, &key)) { + if (skeyclass->get_skeys(ss, addr / TARGET_PAGE_SIZE, 1, &key)) { return 0; } =20 re =3D key & (SK_R | SK_C); key &=3D ~SK_R; =20 - if (skeyclass->set_skeys(ss, r2 / TARGET_PAGE_SIZE, 1, &key)) { + if (skeyclass->set_skeys(ss, addr / TARGET_PAGE_SIZE, 1, &key)) { return 0; } /* --=20 2.31.1 From nobody Sat May 4 15:52:17 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1630684642325592.3689476640781; Fri, 3 Sep 2021 08:57:22 -0700 (PDT) Received: from localhost ([::1]:58272 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mMBZB-0003Pq-AM for importer@patchew.org; Fri, 03 Sep 2021 11:57:21 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:57720) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mMBXR-0000UL-2P for qemu-devel@nongnu.org; Fri, 03 Sep 2021 11:55:34 -0400 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:44789) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mMBXN-0000D4-TU for qemu-devel@nongnu.org; Fri, 03 Sep 2021 11:55:32 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-595-wHkV_z5qO8-H-XS338-LRQ-1; Fri, 03 Sep 2021 11:55:28 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 1984D80198A; Fri, 3 Sep 2021 15:55:27 +0000 (UTC) Received: from t480s.redhat.com (unknown [10.39.193.142]) by smtp.corp.redhat.com (Postfix) with ESMTP id B37B660861; Fri, 3 Sep 2021 15:55:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1630684529; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=zVmrBQcqY5jBbgaTEsCI13ymxgm1ptrCnTA6JG4uFYg=; b=YmWK/XThUZyYpc1FZmLN/HKiy+9cmZTq9mn3DybxB7vw9nhTuNwS1pTOFR9Soc9+ktacjx CHkuEWZjEMujusly2SYu9KFk2z3HKsyliaiDtdd7v3IAjy41OWzaSVLQ1L71gTAzyEcenD rAJ5ytLWh3GJwPB15e5c+omyYmUDFTA= X-MC-Unique: wHkV_z5qO8-H-XS338-LRQ-1 From: David Hildenbrand To: qemu-devel@nongnu.org Subject: [PATCH v3 02/13] s390x/tcg: fix ignoring bit 63 when setting the storage key in SSKE Date: Fri, 3 Sep 2021 17:55:03 +0200 Message-Id: <20210903155514.44772-3-david@redhat.com> In-Reply-To: <20210903155514.44772-1-david@redhat.com> References: <20210903155514.44772-1-david@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=david@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=216.205.24.124; envelope-from=david@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -12 X-Spam_score: -1.3 X-Spam_bar: - X-Spam_report: (-1.3 / 5.0 requ) DKIMWL_WL_HIGH=-0.392, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: "Jason J . Herne" , Thomas Huth , Janosch Frank , David Hildenbrand , Cornelia Huck , Richard Henderson , Halil Pasic , Christian Borntraeger , qemu-s390x@nongnu.org, Claudio Imbrenda Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1630685546908100001 Content-Type: text/plain; charset="utf-8" Right now we could set an 8-bit storage key via SSKE and retrieve it again via ISKE, which is against the architecture description: SSKE: " The new seven-bit storage-key value, or selected bits thereof, is obtained from bit positions 56-62 of gen- eral register R 1 . The contents of bit positions 0-55 and 63 of the register are ignored. " ISKE: " The seven-bit storage key is inserted in bit positions 56-62 of general register R 1 , and bit 63 is set to zero. " Let's properly ignore bit 63 to create the correct seven-bit storage key. Signed-off-by: David Hildenbrand Reviewed-by: Thomas Huth --- target/s390x/tcg/mem_helper.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/target/s390x/tcg/mem_helper.c b/target/s390x/tcg/mem_helper.c index e0befd0f03..3c0820dd74 100644 --- a/target/s390x/tcg/mem_helper.c +++ b/target/s390x/tcg/mem_helper.c @@ -2210,7 +2210,7 @@ void HELPER(sske)(CPUS390XState *env, uint64_t r1, ui= nt64_t r2) skeyclass =3D S390_SKEYS_GET_CLASS(ss); } =20 - key =3D (uint8_t) r1; + key =3D r1 & 0xfe; skeyclass->set_skeys(ss, addr / TARGET_PAGE_SIZE, 1, &key); /* * As we can only flush by virtual address and not all the entries --=20 2.31.1 From nobody Sat May 4 15:52:17 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1630684774016961.9523151823561; Fri, 3 Sep 2021 08:59:34 -0700 (PDT) Received: from localhost ([::1]:38532 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mMBbI-0000Yj-Ht for importer@patchew.org; Fri, 03 Sep 2021 11:59:32 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:57734) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mMBXT-0000V5-4l for qemu-devel@nongnu.org; Fri, 03 Sep 2021 11:55:36 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:56021) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mMBXQ-0000G5-Vp for qemu-devel@nongnu.org; Fri, 03 Sep 2021 11:55:34 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-542-31oOGkt9OzOIZa6myEX5cA-1; Fri, 03 Sep 2021 11:55:31 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 2CE0784A5E0; Fri, 3 Sep 2021 15:55:30 +0000 (UTC) Received: from t480s.redhat.com (unknown [10.39.193.142]) by smtp.corp.redhat.com (Postfix) with ESMTP id 79B6760861; Fri, 3 Sep 2021 15:55:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1630684532; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=YlLcEK4sJhfTE3pXmaG2DvF6Zr1wwk/2u/lE+zkLEJ8=; b=P6CdKyERxyu/tZtvzbr7x0tOHBTbT/FT4hNNkR9qFkhIA+kEz15GnEEvuSjcfrAETFOx/h sa7osNqIXpLvdF1jYZUYJFT1mrAQEcDf3nOgMOEV+e8IlNLGZA3dwH9NVn8e0GlkcSRWxh 73AjHnCfpSWSAcfZkcVS/ptX3ixJ2I8= X-MC-Unique: 31oOGkt9OzOIZa6myEX5cA-1 From: David Hildenbrand To: qemu-devel@nongnu.org Subject: [PATCH v3 03/13] s390x/tcg: convert real to absolute address for RRBE, SSKE and ISKE Date: Fri, 3 Sep 2021 17:55:04 +0200 Message-Id: <20210903155514.44772-4-david@redhat.com> In-Reply-To: <20210903155514.44772-1-david@redhat.com> References: <20210903155514.44772-1-david@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=david@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=170.10.133.124; envelope-from=david@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -31 X-Spam_score: -3.2 X-Spam_bar: --- X-Spam_report: (-3.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.392, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: "Jason J . Herne" , Thomas Huth , Janosch Frank , David Hildenbrand , Cornelia Huck , Richard Henderson , Halil Pasic , Christian Borntraeger , qemu-s390x@nongnu.org, Claudio Imbrenda Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1630684774345100001 Content-Type: text/plain; charset="utf-8" For RRBE, SSKE, and ISKE, we're dealing with real addresses, so we have to convert to an absolute address first. In the future, when adding EDAT1 support, we'll have to pay attention to SSKE handling, as we'll be dealing with absolute addresses when the multiple-block control is one. Signed-off-by: David Hildenbrand Reviewed-by: Thomas Huth --- target/s390x/tcg/mem_helper.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/target/s390x/tcg/mem_helper.c b/target/s390x/tcg/mem_helper.c index 3c0820dd74..dd506d8d17 100644 --- a/target/s390x/tcg/mem_helper.c +++ b/target/s390x/tcg/mem_helper.c @@ -2177,6 +2177,7 @@ uint64_t HELPER(iske)(CPUS390XState *env, uint64_t r2) uint64_t addr =3D wrap_address(env, r2); uint8_t key; =20 + addr =3D mmu_real2abs(env, addr); if (addr > ms->ram_size) { return 0; } @@ -2201,6 +2202,7 @@ void HELPER(sske)(CPUS390XState *env, uint64_t r1, ui= nt64_t r2) uint64_t addr =3D wrap_address(env, r2); uint8_t key; =20 + addr =3D mmu_real2abs(env, addr); if (addr > ms->ram_size) { return; } @@ -2228,6 +2230,7 @@ uint32_t HELPER(rrbe)(CPUS390XState *env, uint64_t r2) static S390SKeysClass *skeyclass; uint8_t re, key; =20 + addr =3D mmu_real2abs(env, addr); if (addr > ms->ram_size) { return 0; } --=20 2.31.1 From nobody Sat May 4 15:52:17 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1630684778087403.4175161791143; Fri, 3 Sep 2021 08:59:38 -0700 (PDT) Received: from localhost ([::1]:38928 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mMBbM-0000qo-Vw for importer@patchew.org; Fri, 03 Sep 2021 11:59:37 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:57770) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mMBXX-0000Wg-NZ for qemu-devel@nongnu.org; Fri, 03 Sep 2021 11:55:40 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:25427) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mMBXV-0000Iu-Qp for qemu-devel@nongnu.org; Fri, 03 Sep 2021 11:55:39 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-564-dui9xDT8OH6JOCzVKFzaFA-1; Fri, 03 Sep 2021 11:55:34 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 0CB9284A5E0; Fri, 3 Sep 2021 15:55:33 +0000 (UTC) Received: from t480s.redhat.com (unknown [10.39.193.142]) by smtp.corp.redhat.com (Postfix) with ESMTP id 8B58860861; Fri, 3 Sep 2021 15:55:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1630684537; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=EKSvfu48NUed71hO7DcQnPxAfzEbQhk70Fn+7GGHcYY=; b=O95meegak9/ecFCr1o2ILyf+Rl6MpAqdWIaFLVtJAdE99jPoL8nfF4yUz1RQBV5p5BbpWt wQXUS2WZl16CM5Sahu80Nob44yNTyfzSoAMamn74O6KdrPPrw/bU81wQLp7d+hFcIyy5YS NEJ7kGap37p6z8hfw3mNO4OTigi3FUI= X-MC-Unique: dui9xDT8OH6JOCzVKFzaFA-1 From: David Hildenbrand To: qemu-devel@nongnu.org Subject: [PATCH v3 04/13] s390x/tcg: check for addressing exceptions for RRBE, SSKE and ISKE Date: Fri, 3 Sep 2021 17:55:05 +0200 Message-Id: <20210903155514.44772-5-david@redhat.com> In-Reply-To: <20210903155514.44772-1-david@redhat.com> References: <20210903155514.44772-1-david@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=david@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=170.10.133.124; envelope-from=david@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -31 X-Spam_score: -3.2 X-Spam_bar: --- X-Spam_report: (-3.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.392, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: "Jason J . Herne" , Thomas Huth , Janosch Frank , David Hildenbrand , Cornelia Huck , Richard Henderson , Halil Pasic , Christian Borntraeger , qemu-s390x@nongnu.org, Claudio Imbrenda Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1630684778894100001 Content-Type: text/plain; charset="utf-8" Let's replace the ram_size check by a proper physical address space check (for example, to prepare for memory hotplug), trigger addressing exceptions and trace the return value of the storage key getter/setter. Provide an helper mmu_absolute_addr_valid() to be used in other context soon. Always test for "read" instead of "write" as we are not actually modifying the page itself. Signed-off-by: David Hildenbrand Acked-by: Thomas Huth --- target/s390x/helper.h | 6 +++--- target/s390x/mmu_helper.c | 8 ++++++++ target/s390x/s390x-internal.h | 1 + target/s390x/tcg/mem_helper.c | 36 ++++++++++++++++++++++------------- 4 files changed, 35 insertions(+), 16 deletions(-) diff --git a/target/s390x/helper.h b/target/s390x/helper.h index 6215ca00bc..271b081e8c 100644 --- a/target/s390x/helper.h +++ b/target/s390x/helper.h @@ -336,9 +336,9 @@ DEF_HELPER_FLAGS_4(stctl, TCG_CALL_NO_WG, void, env, i3= 2, i64, i32) DEF_HELPER_FLAGS_4(stctg, TCG_CALL_NO_WG, void, env, i32, i64, i32) DEF_HELPER_FLAGS_2(testblock, TCG_CALL_NO_WG, i32, env, i64) DEF_HELPER_FLAGS_3(tprot, TCG_CALL_NO_WG, i32, env, i64, i64) -DEF_HELPER_FLAGS_2(iske, TCG_CALL_NO_RWG_SE, i64, env, i64) -DEF_HELPER_FLAGS_3(sske, TCG_CALL_NO_RWG, void, env, i64, i64) -DEF_HELPER_FLAGS_2(rrbe, TCG_CALL_NO_RWG, i32, env, i64) +DEF_HELPER_2(iske, i64, env, i64) +DEF_HELPER_3(sske, void, env, i64, i64) +DEF_HELPER_2(rrbe, i32, env, i64) DEF_HELPER_4(mvcs, i32, env, i64, i64, i64) DEF_HELPER_4(mvcp, i32, env, i64, i64, i64) DEF_HELPER_4(sigp, i32, env, i64, i32, i32) diff --git a/target/s390x/mmu_helper.c b/target/s390x/mmu_helper.c index d779a9fc51..0620b1803e 100644 --- a/target/s390x/mmu_helper.c +++ b/target/s390x/mmu_helper.c @@ -94,6 +94,14 @@ target_ulong mmu_real2abs(CPUS390XState *env, target_ulo= ng raddr) return raddr; } =20 +bool mmu_absolute_addr_valid(target_ulong addr, bool is_write) +{ + return address_space_access_valid(&address_space_memory, + addr & TARGET_PAGE_MASK, + TARGET_PAGE_SIZE, is_write, + MEMTXATTRS_UNSPECIFIED); +} + static inline bool read_table_entry(CPUS390XState *env, hwaddr gaddr, uint64_t *entry) { diff --git a/target/s390x/s390x-internal.h b/target/s390x/s390x-internal.h index 5506f185e8..d246d26b04 100644 --- a/target/s390x/s390x-internal.h +++ b/target/s390x/s390x-internal.h @@ -373,6 +373,7 @@ void probe_write_access(CPUS390XState *env, uint64_t ad= dr, uint64_t len, =20 =20 /* mmu_helper.c */ +bool mmu_absolute_addr_valid(target_ulong addr, bool is_write); int mmu_translate(CPUS390XState *env, target_ulong vaddr, int rw, uint64_t= asc, target_ulong *raddr, int *flags, uint64_t *tec); int mmu_translate_real(CPUS390XState *env, target_ulong raddr, int rw, diff --git a/target/s390x/tcg/mem_helper.c b/target/s390x/tcg/mem_helper.c index dd506d8d17..a44a107374 100644 --- a/target/s390x/tcg/mem_helper.c +++ b/target/s390x/tcg/mem_helper.c @@ -28,6 +28,7 @@ #include "qemu/int128.h" #include "qemu/atomic128.h" #include "tcg/tcg.h" +#include "trace.h" =20 #if !defined(CONFIG_USER_ONLY) #include "hw/s390x/storage-keys.h" @@ -2171,15 +2172,15 @@ uint32_t HELPER(tprot)(CPUS390XState *env, uint64_t= a1, uint64_t a2) /* insert storage key extended */ uint64_t HELPER(iske)(CPUS390XState *env, uint64_t r2) { - MachineState *ms =3D MACHINE(qdev_get_machine()); static S390SKeysState *ss; static S390SKeysClass *skeyclass; uint64_t addr =3D wrap_address(env, r2); uint8_t key; + int rc; =20 addr =3D mmu_real2abs(env, addr); - if (addr > ms->ram_size) { - return 0; + if (!mmu_absolute_addr_valid(addr, false)) { + tcg_s390_program_interrupt(env, PGM_ADDRESSING, GETPC()); } =20 if (unlikely(!ss)) { @@ -2187,7 +2188,9 @@ uint64_t HELPER(iske)(CPUS390XState *env, uint64_t r2) skeyclass =3D S390_SKEYS_GET_CLASS(ss); } =20 - if (skeyclass->get_skeys(ss, addr / TARGET_PAGE_SIZE, 1, &key)) { + rc =3D skeyclass->get_skeys(ss, addr / TARGET_PAGE_SIZE, 1, &key); + if (rc) { + trace_get_skeys_nonzero(rc); return 0; } return key; @@ -2196,15 +2199,15 @@ uint64_t HELPER(iske)(CPUS390XState *env, uint64_t = r2) /* set storage key extended */ void HELPER(sske)(CPUS390XState *env, uint64_t r1, uint64_t r2) { - MachineState *ms =3D MACHINE(qdev_get_machine()); static S390SKeysState *ss; static S390SKeysClass *skeyclass; uint64_t addr =3D wrap_address(env, r2); uint8_t key; + int rc; =20 addr =3D mmu_real2abs(env, addr); - if (addr > ms->ram_size) { - return; + if (!mmu_absolute_addr_valid(addr, false)) { + tcg_s390_program_interrupt(env, PGM_ADDRESSING, GETPC()); } =20 if (unlikely(!ss)) { @@ -2213,7 +2216,10 @@ void HELPER(sske)(CPUS390XState *env, uint64_t r1, u= int64_t r2) } =20 key =3D r1 & 0xfe; - skeyclass->set_skeys(ss, addr / TARGET_PAGE_SIZE, 1, &key); + rc =3D skeyclass->set_skeys(ss, addr / TARGET_PAGE_SIZE, 1, &key); + if (rc) { + trace_set_skeys_nonzero(rc); + } /* * As we can only flush by virtual address and not all the entries * that point to a physical address we have to flush the whole TLB. @@ -2224,15 +2230,15 @@ void HELPER(sske)(CPUS390XState *env, uint64_t r1, = uint64_t r2) /* reset reference bit extended */ uint32_t HELPER(rrbe)(CPUS390XState *env, uint64_t r2) { - MachineState *ms =3D MACHINE(qdev_get_machine()); uint64_t addr =3D wrap_address(env, r2); static S390SKeysState *ss; static S390SKeysClass *skeyclass; uint8_t re, key; + int rc; =20 addr =3D mmu_real2abs(env, addr); - if (addr > ms->ram_size) { - return 0; + if (!mmu_absolute_addr_valid(addr, false)) { + tcg_s390_program_interrupt(env, PGM_ADDRESSING, GETPC()); } =20 if (unlikely(!ss)) { @@ -2240,14 +2246,18 @@ uint32_t HELPER(rrbe)(CPUS390XState *env, uint64_t = r2) skeyclass =3D S390_SKEYS_GET_CLASS(ss); } =20 - if (skeyclass->get_skeys(ss, addr / TARGET_PAGE_SIZE, 1, &key)) { + rc =3D skeyclass->get_skeys(ss, addr / TARGET_PAGE_SIZE, 1, &key); + if (rc) { + trace_get_skeys_nonzero(rc); return 0; } =20 re =3D key & (SK_R | SK_C); key &=3D ~SK_R; =20 - if (skeyclass->set_skeys(ss, addr / TARGET_PAGE_SIZE, 1, &key)) { + rc =3D skeyclass->set_skeys(ss, addr / TARGET_PAGE_SIZE, 1, &key); + if (rc) { + trace_set_skeys_nonzero(rc); return 0; } /* --=20 2.31.1 From nobody Sat May 4 15:52:17 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1630684648508800.8208202070535; Fri, 3 Sep 2021 08:57:28 -0700 (PDT) Received: from localhost ([::1]:58822 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mMBZH-0003kr-DV for importer@patchew.org; Fri, 03 Sep 2021 11:57:27 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:57908) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mMBXh-0000t3-Kr for qemu-devel@nongnu.org; Fri, 03 Sep 2021 11:55:49 -0400 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:46717) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mMBXg-0000Ub-3P for qemu-devel@nongnu.org; Fri, 03 Sep 2021 11:55:49 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-231-vNcFJahNMGG2JGK2u83XpQ-1; Fri, 03 Sep 2021 11:55:44 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id EFC7F6D4E0; Fri, 3 Sep 2021 15:55:42 +0000 (UTC) Received: from t480s.redhat.com (unknown [10.39.193.142]) by smtp.corp.redhat.com (Postfix) with ESMTP id 57B0660861; Fri, 3 Sep 2021 15:55:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1630684547; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=hjNWqno5cH2/vA9rO21bPb9HAnn1vYcvSEX3uK7XI20=; b=IAYuub+NietijGjhRX0ve6s6rw6sw3pms0UD7pF8/SpyR/vVbtimensD17Q9UPnADKbPK8 c9DSE0Q80q6RZZ2FVCAp4AxdbLnJw5KT/Aks5LPTGqgn3vuSuypZrH2rYOgV9Jx4SDq1Cm YlKLLQTNSOxopP3v7IacOkUtkiqSJlU= X-MC-Unique: vNcFJahNMGG2JGK2u83XpQ-1 From: David Hildenbrand To: qemu-devel@nongnu.org Subject: [PATCH v3 05/13] s390x/mmu_helper: no need to pass access type to mmu_translate_asce() Date: Fri, 3 Sep 2021 17:55:06 +0200 Message-Id: <20210903155514.44772-6-david@redhat.com> In-Reply-To: <20210903155514.44772-1-david@redhat.com> References: <20210903155514.44772-1-david@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=david@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=216.205.24.124; envelope-from=david@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -31 X-Spam_score: -3.2 X-Spam_bar: --- X-Spam_report: (-3.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.392, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action 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: "Jason J . Herne" , Thomas Huth , Janosch Frank , David Hildenbrand , Cornelia Huck , Richard Henderson , Halil Pasic , Christian Borntraeger , qemu-s390x@nongnu.org, Claudio Imbrenda Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1630684648943100003 Content-Type: text/plain; charset="utf-8" The access type is unused since commit 81d7e3bc45 ("s390x/mmu: Inject DAT exceptions from a single place"). Reviewed-by: Thomas Huth Signed-off-by: David Hildenbrand --- target/s390x/mmu_helper.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/target/s390x/mmu_helper.c b/target/s390x/mmu_helper.c index 0620b1803e..167f1b1455 100644 --- a/target/s390x/mmu_helper.c +++ b/target/s390x/mmu_helper.c @@ -125,7 +125,7 @@ static inline bool read_table_entry(CPUS390XState *env,= hwaddr gaddr, =20 static int mmu_translate_asce(CPUS390XState *env, target_ulong vaddr, uint64_t asc, uint64_t asce, target_ulong *r= addr, - int *flags, int rw) + int *flags) { const bool edat1 =3D (env->cregs[0] & CR0_EDAT) && s390_has_feat(S390_FEAT_EDAT); @@ -428,7 +428,7 @@ int mmu_translate(CPUS390XState *env, target_ulong vadd= r, int rw, uint64_t asc, } =20 /* perform the DAT translation */ - r =3D mmu_translate_asce(env, vaddr, asc, asce, raddr, flags, rw); + r =3D mmu_translate_asce(env, vaddr, asc, asce, raddr, flags); if (unlikely(r)) { return r; } --=20 2.31.1 From nobody Sat May 4 15:52:17 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1630684775282212.35624688261862; Fri, 3 Sep 2021 08:59:35 -0700 (PDT) Received: from localhost ([::1]:38688 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mMBbK-0000g5-60 for importer@patchew.org; Fri, 03 Sep 2021 11:59:34 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:57994) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mMBXk-00014M-JM for qemu-devel@nongnu.org; Fri, 03 Sep 2021 11:55:52 -0400 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:26750) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mMBXi-0000Yn-Su for qemu-devel@nongnu.org; Fri, 03 Sep 2021 11:55:52 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-121-oftW6oCOMYyR8pIrsJ1vKw-1; Fri, 03 Sep 2021 11:55:47 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id E57CC188E3C9; Fri, 3 Sep 2021 15:55:45 +0000 (UTC) Received: from t480s.redhat.com (unknown [10.39.193.142]) by smtp.corp.redhat.com (Postfix) with ESMTP id 5A9B860861; Fri, 3 Sep 2021 15:55:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1630684550; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=wiY5CmPNZqXMtJWZ/fgLd7xkq85LpX5IToi2MNmjMHg=; b=KzeUChuNu46vXeoQRUFfljbVC4njTFApC314nt6S+6GgNgy2OhFvnBPIN6X+PpN0igEyNX It5VAjFwLUk1VrRpC5tehV789I0deyzv4mZDu7HOtwXjcoYh0DIxBVyIQtGdT45MpGvkMY 6rgdpQ+EGLODfIuJoqNtmcrR0EhvKKg= X-MC-Unique: oftW6oCOMYyR8pIrsJ1vKw-1 From: David Hildenbrand To: qemu-devel@nongnu.org Subject: [PATCH v3 06/13] s390x/mmu_helper: fixup mmu_translate() documentation Date: Fri, 3 Sep 2021 17:55:07 +0200 Message-Id: <20210903155514.44772-7-david@redhat.com> In-Reply-To: <20210903155514.44772-1-david@redhat.com> References: <20210903155514.44772-1-david@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=david@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=216.205.24.124; envelope-from=david@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -31 X-Spam_score: -3.2 X-Spam_bar: --- X-Spam_report: (-3.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.392, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action 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: "Jason J . Herne" , Thomas Huth , Janosch Frank , David Hildenbrand , Cornelia Huck , Richard Henderson , Halil Pasic , Christian Borntraeger , qemu-s390x@nongnu.org, Claudio Imbrenda Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1630684776444100001 Content-Type: text/plain; charset="utf-8" Looks like we forgot to adjust documentation of one parameter. Reviewed-by: Thomas Huth Signed-off-by: David Hildenbrand --- target/s390x/mmu_helper.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/target/s390x/mmu_helper.c b/target/s390x/mmu_helper.c index 167f1b1455..ca25dadb5b 100644 --- a/target/s390x/mmu_helper.c +++ b/target/s390x/mmu_helper.c @@ -374,7 +374,8 @@ static void mmu_handle_skey(target_ulong addr, int rw, = int *flags) * @param asc address space control (one of the PSW_ASC_* modes) * @param raddr the translated address is stored to this pointer * @param flags the PAGE_READ/WRITE/EXEC flags are stored to this pointer - * @param exc true =3D inject a program check if a fault occurred + * @param tec the translation exception code if stored to this pointer = if + * there is an exception to raise * @return 0 =3D success, !=3D 0, the exception to raise */ int mmu_translate(CPUS390XState *env, target_ulong vaddr, int rw, uint64_t= asc, --=20 2.31.1 From nobody Sat May 4 15:52:17 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1630685029993533.6375874849516; Fri, 3 Sep 2021 09:03:49 -0700 (PDT) Received: from localhost ([::1]:47382 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mMBfQ-0006sf-Sh for importer@patchew.org; Fri, 03 Sep 2021 12:03:48 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58034) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mMBXn-0001Em-FQ for qemu-devel@nongnu.org; Fri, 03 Sep 2021 11:55:55 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:43716) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mMBXl-0000bh-Ic for qemu-devel@nongnu.org; Fri, 03 Sep 2021 11:55:55 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-590-Zz0SSBeOPRWSaCMq9qlftQ-1; Fri, 03 Sep 2021 11:55:50 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id A5E70188E3C1; Fri, 3 Sep 2021 15:55:48 +0000 (UTC) Received: from t480s.redhat.com (unknown [10.39.193.142]) by smtp.corp.redhat.com (Postfix) with ESMTP id 541D760861; Fri, 3 Sep 2021 15:55:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1630684552; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=sJRre9HqBe5jVQoBJN5DZZs8BrPrBSiUxOtaejPnI/k=; b=QvMRGDlvVWkg9fGiMQNg4Ed0OUYw9SGvw7ZJJEcMJTeqMezLv8QwHEdn7DiIG80qZXRNX/ wS6Rlyhkk9Su9xjlw8VQcaeHQKcYKNNsz/D59V5JSsTxbbfh1KMT38FGz/9C4Ar48MDEw1 i9UJPjVECb25s+y/WWl2xc1jmS5O/Kc= X-MC-Unique: Zz0SSBeOPRWSaCMq9qlftQ-1 From: David Hildenbrand To: qemu-devel@nongnu.org Subject: [PATCH v3 07/13] s390x/mmu_helper: move address validation into mmu_translate*() Date: Fri, 3 Sep 2021 17:55:08 +0200 Message-Id: <20210903155514.44772-8-david@redhat.com> In-Reply-To: <20210903155514.44772-1-david@redhat.com> References: <20210903155514.44772-1-david@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=david@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=170.10.133.124; envelope-from=david@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -31 X-Spam_score: -3.2 X-Spam_bar: --- X-Spam_report: (-3.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.392, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action 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: "Jason J . Herne" , Thomas Huth , Janosch Frank , David Hildenbrand , Cornelia Huck , Richard Henderson , Halil Pasic , Christian Borntraeger , qemu-s390x@nongnu.org, Claudio Imbrenda Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1630685033016100001 Content-Type: text/plain; charset="utf-8" Let's move address validation into mmu_translate() and mmu_translate_real(). This allows for checking whether an absolute address is valid before looking up the storage key. We can now get rid of the ram_size check. Interestingly, we're already handling LOAD REAL ADDRESS wrong, because a) We're not supposed to touch storage keys b) We're not supposed to convert to an absolute address Let's use a fake, negative MMUAccessType to teach mmu_translate() to fix that handling and to not perform address validation. Reviewed-by: Thomas Huth Signed-off-by: David Hildenbrand --- target/s390x/mmu_helper.c | 36 ++++++++++++++++++++-------------- target/s390x/s390x-internal.h | 2 ++ target/s390x/tcg/excp_helper.c | 13 ------------ target/s390x/tcg/mem_helper.c | 2 +- 4 files changed, 24 insertions(+), 29 deletions(-) diff --git a/target/s390x/mmu_helper.c b/target/s390x/mmu_helper.c index ca25dadb5b..de6df928d2 100644 --- a/target/s390x/mmu_helper.c +++ b/target/s390x/mmu_helper.c @@ -301,14 +301,13 @@ static void mmu_handle_skey(target_ulong addr, int rw= , int *flags) { static S390SKeysClass *skeyclass; static S390SKeysState *ss; - MachineState *ms =3D MACHINE(qdev_get_machine()); uint8_t key; int rc; =20 - if (unlikely(addr >=3D ms->ram_size)) { - return; - } - + /* + * We expect to be called with an absolute address that has already be= en + * validated, such that we can reliably use it to lookup the storage k= ey. + */ if (unlikely(!ss)) { ss =3D s390_get_skeys_device(); skeyclass =3D S390_SKEYS_GET_CLASS(ss); @@ -370,7 +369,7 @@ static void mmu_handle_skey(target_ulong addr, int rw, = int *flags) /** * Translate a virtual (logical) address into a physical (absolute) addres= s. * @param vaddr the virtual address - * @param rw 0 =3D read, 1 =3D write, 2 =3D code fetch + * @param rw 0 =3D read, 1 =3D write, 2 =3D code fetch, < 0 =3D load r= eal address * @param asc address space control (one of the PSW_ASC_* modes) * @param raddr the translated address is stored to this pointer * @param flags the PAGE_READ/WRITE/EXEC flags are stored to this pointer @@ -449,10 +448,17 @@ int mmu_translate(CPUS390XState *env, target_ulong va= ddr, int rw, uint64_t asc, } =20 nodat: - /* Convert real address -> absolute address */ - *raddr =3D mmu_real2abs(env, *raddr); + if (rw >=3D 0) { + /* Convert real address -> absolute address */ + *raddr =3D mmu_real2abs(env, *raddr); =20 - mmu_handle_skey(*raddr, rw, flags); + if (!mmu_absolute_addr_valid(*raddr, rw =3D=3D MMU_DATA_STORE)) { + *tec =3D 0; /* unused */ + return PGM_ADDRESSING; + } + + mmu_handle_skey(*raddr, rw, flags); + } return 0; } =20 @@ -473,12 +479,6 @@ static int translate_pages(S390CPU *cpu, vaddr addr, i= nt nr_pages, if (ret) { return ret; } - if (!address_space_access_valid(&address_space_memory, pages[i], - TARGET_PAGE_SIZE, is_write, - MEMTXATTRS_UNSPECIFIED)) { - *tec =3D 0; /* unused */ - return PGM_ADDRESSING; - } addr +=3D TARGET_PAGE_SIZE; } =20 @@ -588,6 +588,12 @@ int mmu_translate_real(CPUS390XState *env, target_ulon= g raddr, int rw, =20 *addr =3D mmu_real2abs(env, raddr & TARGET_PAGE_MASK); =20 + if (!mmu_absolute_addr_valid(*addr, rw =3D=3D MMU_DATA_STORE)) { + /* unused */ + *tec =3D 0; + return PGM_ADDRESSING; + } + mmu_handle_skey(*addr, rw, flags); return 0; } diff --git a/target/s390x/s390x-internal.h b/target/s390x/s390x-internal.h index d246d26b04..7a6aa4dacc 100644 --- a/target/s390x/s390x-internal.h +++ b/target/s390x/s390x-internal.h @@ -374,6 +374,8 @@ void probe_write_access(CPUS390XState *env, uint64_t ad= dr, uint64_t len, =20 /* mmu_helper.c */ bool mmu_absolute_addr_valid(target_ulong addr, bool is_write); +/* Special access mode only valid for mmu_translate() */ +#define MMU_S390_LRA -1 int mmu_translate(CPUS390XState *env, target_ulong vaddr, int rw, uint64_t= asc, target_ulong *raddr, int *flags, uint64_t *tec); int mmu_translate_real(CPUS390XState *env, target_ulong raddr, int rw, diff --git a/target/s390x/tcg/excp_helper.c b/target/s390x/tcg/excp_helper.c index a61917d04f..3d6662a53c 100644 --- a/target/s390x/tcg/excp_helper.c +++ b/target/s390x/tcg/excp_helper.c @@ -150,19 +150,6 @@ bool s390_cpu_tlb_fill(CPUState *cs, vaddr address, in= t size, g_assert_not_reached(); } =20 - /* check out of RAM access */ - if (!excp && - !address_space_access_valid(&address_space_memory, raddr, - TARGET_PAGE_SIZE, access_type, - MEMTXATTRS_UNSPECIFIED)) { - MachineState *ms =3D MACHINE(qdev_get_machine()); - qemu_log_mask(CPU_LOG_MMU, - "%s: raddr %" PRIx64 " > ram_size %" PRIx64 "\n", - __func__, (uint64_t)raddr, (uint64_t)ms->ram_size); - excp =3D PGM_ADDRESSING; - tec =3D 0; /* unused */ - } - env->tlb_fill_exc =3D excp; env->tlb_fill_tec =3D tec; =20 diff --git a/target/s390x/tcg/mem_helper.c b/target/s390x/tcg/mem_helper.c index a44a107374..4f9f3e1f63 100644 --- a/target/s390x/tcg/mem_helper.c +++ b/target/s390x/tcg/mem_helper.c @@ -2455,7 +2455,7 @@ uint64_t HELPER(lra)(CPUS390XState *env, uint64_t add= r) tcg_s390_program_interrupt(env, PGM_SPECIAL_OP, GETPC()); } =20 - exc =3D mmu_translate(env, addr, 0, asc, &ret, &flags, &tec); + exc =3D mmu_translate(env, addr, MMU_S390_LRA, asc, &ret, &flags, &tec= ); if (exc) { cc =3D 3; ret =3D exc | 0x80000000; --=20 2.31.1 From nobody Sat May 4 15:52:17 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1630685018288880.1673744533788; Fri, 3 Sep 2021 09:03:38 -0700 (PDT) Received: from localhost ([::1]:46828 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mMBfD-0006U6-Dt for importer@patchew.org; Fri, 03 Sep 2021 12:03:35 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58054) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mMBXp-0001LG-BI for qemu-devel@nongnu.org; Fri, 03 Sep 2021 11:55:57 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:24763) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mMBXn-0000eG-Sq for qemu-devel@nongnu.org; Fri, 03 Sep 2021 11:55:57 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-360-J5AVjRvhPdmcYGqR2jHVbQ-1; Fri, 03 Sep 2021 11:55:52 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 1A599107ACC7; Fri, 3 Sep 2021 15:55:51 +0000 (UTC) Received: from t480s.redhat.com (unknown [10.39.193.142]) by smtp.corp.redhat.com (Postfix) with ESMTP id F244C60916; Fri, 3 Sep 2021 15:55:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1630684555; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=koATax0ENfqN19XtTaC7VpmNCcm6q32Nu4FPP5NnrNA=; b=K2C54jXpZJMQBeQicu495zja8KoiAOMnhGaRMGsfdaFGWs9nr/4nPcbGmYVZEyLpSQSKmb 85C+hOdXcsJWIlli2dm+gBVxTtdbcSSKqsjjxrAiQWIAZaPwEylG2tnMhm9jjGn7m5yM28 Ry7IJUJybft8zm/iIdH/h0lhnKGQ8vM= X-MC-Unique: J5AVjRvhPdmcYGqR2jHVbQ-1 From: David Hildenbrand To: qemu-devel@nongnu.org Subject: [PATCH v3 08/13] s390x/mmu_helper: avoid setting the storage key if nothing changed Date: Fri, 3 Sep 2021 17:55:09 +0200 Message-Id: <20210903155514.44772-9-david@redhat.com> In-Reply-To: <20210903155514.44772-1-david@redhat.com> References: <20210903155514.44772-1-david@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=david@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=170.10.133.124; envelope-from=david@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -31 X-Spam_score: -3.2 X-Spam_bar: --- X-Spam_report: (-3.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.392, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: "Jason J . Herne" , Thomas Huth , Janosch Frank , David Hildenbrand , Cornelia Huck , Richard Henderson , Halil Pasic , Christian Borntraeger , qemu-s390x@nongnu.org, Claudio Imbrenda Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1630685019619100001 Content-Type: text/plain; charset="utf-8" Avoid setting the key if nothing changed. Reviewed-by: Thomas Huth Signed-off-by: David Hildenbrand --- target/s390x/mmu_helper.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/target/s390x/mmu_helper.c b/target/s390x/mmu_helper.c index de6df928d2..e2b372efd9 100644 --- a/target/s390x/mmu_helper.c +++ b/target/s390x/mmu_helper.c @@ -301,7 +301,7 @@ static void mmu_handle_skey(target_ulong addr, int rw, = int *flags) { static S390SKeysClass *skeyclass; static S390SKeysState *ss; - uint8_t key; + uint8_t key, old_key; int rc; =20 /* @@ -337,6 +337,7 @@ static void mmu_handle_skey(target_ulong addr, int rw, = int *flags) trace_get_skeys_nonzero(rc); return; } + old_key =3D key; =20 switch (rw) { case MMU_DATA_LOAD: @@ -360,9 +361,11 @@ static void mmu_handle_skey(target_ulong addr, int rw,= int *flags) /* Any store/fetch sets the reference bit */ key |=3D SK_R; =20 - rc =3D skeyclass->set_skeys(ss, addr / TARGET_PAGE_SIZE, 1, &key); - if (rc) { - trace_set_skeys_nonzero(rc); + if (key !=3D old_key) { + rc =3D skeyclass->set_skeys(ss, addr / TARGET_PAGE_SIZE, 1, &key); + if (rc) { + trace_set_skeys_nonzero(rc); + } } } =20 --=20 2.31.1 From nobody Sat May 4 15:52:17 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1630685025743620.2731885059379; Fri, 3 Sep 2021 09:03:45 -0700 (PDT) Received: from localhost ([::1]:47090 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mMBfM-0006h5-Ff for importer@patchew.org; Fri, 03 Sep 2021 12:03:44 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58068) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mMBXq-0001P6-DD for qemu-devel@nongnu.org; Fri, 03 Sep 2021 11:55:58 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:27468) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mMBXo-0000eP-GX for qemu-devel@nongnu.org; Fri, 03 Sep 2021 11:55:58 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-238-P1ti5JsqNYGwbGgT7PwtyA-1; Fri, 03 Sep 2021 11:55:54 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 8BB49107ACC7; Fri, 3 Sep 2021 15:55:53 +0000 (UTC) Received: from t480s.redhat.com (unknown [10.39.193.142]) by smtp.corp.redhat.com (Postfix) with ESMTP id 67C1C60916; Fri, 3 Sep 2021 15:55:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1630684555; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ch4WEy/V4uQyl1wtK/EuX1zIoN7+7TlM+yYOWkAUt4Q=; b=giCh4ykqANZeXi8BTD/URjBdJJJv8tOl1LWb63YWdt7zBJ1YLNrODXhmuxQQXMPLj18XDV L0JYPFerP2fZt4GSl8C9nuPhRvnaDbtKKKwaN/Bx97//yhdv73flMOL85nnxdkh2ruu12F SrPhMWiEB0rNLNhPw1Q1AOusv/FFDas= X-MC-Unique: P1ti5JsqNYGwbGgT7PwtyA-1 From: David Hildenbrand To: qemu-devel@nongnu.org Subject: [PATCH v3 09/13] hw/s390x/s390-skeys: use memory mapping to detect which storage keys to migrate Date: Fri, 3 Sep 2021 17:55:10 +0200 Message-Id: <20210903155514.44772-10-david@redhat.com> In-Reply-To: <20210903155514.44772-1-david@redhat.com> References: <20210903155514.44772-1-david@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=david@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=170.10.133.124; envelope-from=david@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -31 X-Spam_score: -3.2 X-Spam_bar: --- X-Spam_report: (-3.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.392, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: "Jason J . Herne" , Thomas Huth , Janosch Frank , David Hildenbrand , Cornelia Huck , Richard Henderson , Halil Pasic , Christian Borntraeger , qemu-s390x@nongnu.org, Claudio Imbrenda Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1630685028707100001 Content-Type: text/plain; charset="utf-8" Let's use the guest_phys_blocks API to get physical memory regions that are well defined inside our physical address space and migrate the storage keys of these. This is a preparation for having memory besides initial ram defined in the guest physical address space, for example, via memory devices. We get rid of the ms->ram_size dependency. Please note that we will usually have very little (--> 1) physical ranges. With virtio-mem might have significantly more ranges in the future. If that turns out to be a problem (e.g., total memory footprint of the list), we could look into a memory mapping API that avoids creation of a list and instead triggers a callback for each range. Reviewed-by: Thomas Huth Signed-off-by: David Hildenbrand --- hw/s390x/s390-skeys.c | 70 ++++++++++++++++++++++++++----------------- 1 file changed, 43 insertions(+), 27 deletions(-) diff --git a/hw/s390x/s390-skeys.c b/hw/s390x/s390-skeys.c index 9a8d60d1d9..250685a95a 100644 --- a/hw/s390x/s390-skeys.c +++ b/hw/s390x/s390-skeys.c @@ -17,6 +17,7 @@ #include "qapi/qapi-commands-misc-target.h" #include "qapi/qmp/qdict.h" #include "qemu/error-report.h" +#include "sysemu/memory_mapping.h" #include "sysemu/kvm.h" #include "migration/qemu-file-types.h" #include "migration/register.h" @@ -257,10 +258,9 @@ static void s390_storage_keys_save(QEMUFile *f, void *= opaque) { S390SKeysState *ss =3D S390_SKEYS(opaque); S390SKeysClass *skeyclass =3D S390_SKEYS_GET_CLASS(ss); - MachineState *ms =3D MACHINE(qdev_get_machine()); - uint64_t pages_left =3D ms->ram_size / TARGET_PAGE_SIZE; - uint64_t read_count, eos =3D S390_SKEYS_SAVE_FLAG_EOS; - vaddr cur_gfn =3D 0; + GuestPhysBlockList guest_phys_blocks; + GuestPhysBlock *block; + uint64_t pages, gfn; int error =3D 0; uint8_t *buf; =20 @@ -274,36 +274,52 @@ static void s390_storage_keys_save(QEMUFile *f, void = *opaque) goto end_stream; } =20 - /* We only support initial memory. Standby memory is not handled yet. = */ - qemu_put_be64(f, (cur_gfn * TARGET_PAGE_SIZE) | S390_SKEYS_SAVE_FLAG_S= KEYS); - qemu_put_be64(f, pages_left); - - while (pages_left) { - read_count =3D MIN(pages_left, S390_SKEYS_BUFFER_SIZE); - - if (!error) { - error =3D skeyclass->get_skeys(ss, cur_gfn, read_count, buf); - if (error) { - /* - * If error: we want to fill the stream with valid data in= stead - * of stopping early so we pad the stream with 0x00 values= and - * use S390_SKEYS_SAVE_FLAG_ERROR to indicate failure to t= he - * reading side. - */ - error_report("S390_GET_KEYS error %d", error); - memset(buf, 0, S390_SKEYS_BUFFER_SIZE); - eos =3D S390_SKEYS_SAVE_FLAG_ERROR; + guest_phys_blocks_init(&guest_phys_blocks); + guest_phys_blocks_append(&guest_phys_blocks); + + /* Send each contiguous physical memory range separately. */ + QTAILQ_FOREACH(block, &guest_phys_blocks.head, next) { + assert(QEMU_IS_ALIGNED(block->target_start, TARGET_PAGE_SIZE)); + assert(QEMU_IS_ALIGNED(block->target_end, TARGET_PAGE_SIZE)); + + gfn =3D block->target_start / TARGET_PAGE_SIZE; + pages =3D (block->target_end - block->target_start) / TARGET_PAGE_= SIZE; + qemu_put_be64(f, block->target_start | S390_SKEYS_SAVE_FLAG_SKEYS); + qemu_put_be64(f, pages); + + while (pages) { + const uint64_t cur_pages =3D MIN(pages, S390_SKEYS_BUFFER_SIZE= ); + + if (!error) { + error =3D skeyclass->get_skeys(ss, gfn, cur_pages, buf); + if (error) { + /* + * Create a valid stream with all 0x00 and indicate + * S390_SKEYS_SAVE_FLAG_ERROR to the destination. + */ + error_report("S390_GET_KEYS error %d", error); + memset(buf, 0, S390_SKEYS_BUFFER_SIZE); + } } + + qemu_put_buffer(f, buf, cur_pages); + gfn +=3D cur_pages; + pages -=3D cur_pages; } =20 - qemu_put_buffer(f, buf, read_count); - cur_gfn +=3D read_count; - pages_left -=3D read_count; + if (error) { + break; + } } =20 + guest_phys_blocks_free(&guest_phys_blocks); g_free(buf); end_stream: - qemu_put_be64(f, eos); + if (error) { + qemu_put_be64(f, S390_SKEYS_SAVE_FLAG_ERROR); + } else { + qemu_put_be64(f, S390_SKEYS_SAVE_FLAG_EOS); + } } =20 static int s390_storage_keys_load(QEMUFile *f, void *opaque, int version_i= d) --=20 2.31.1 From nobody Sat May 4 15:52:17 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1630685243354654.6431599450765; Fri, 3 Sep 2021 09:07:23 -0700 (PDT) Received: from localhost ([::1]:55856 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mMBis-0004hX-74 for importer@patchew.org; Fri, 03 Sep 2021 12:07:22 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58096) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mMBXw-0001kH-IN for qemu-devel@nongnu.org; Fri, 03 Sep 2021 11:56:04 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:48649) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mMBXu-0000jX-Qs for qemu-devel@nongnu.org; Fri, 03 Sep 2021 11:56:04 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-132-R18D_EbFMwCs_3RK1YmW8A-1; Fri, 03 Sep 2021 11:55:58 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 00D598015C7; Fri, 3 Sep 2021 15:55:56 +0000 (UTC) Received: from t480s.redhat.com (unknown [10.39.193.142]) by smtp.corp.redhat.com (Postfix) with ESMTP id D673C60916; Fri, 3 Sep 2021 15:55:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1630684562; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=kziqgMymkMLtY5poKAOZZqOtzjY64iw5zYUWpNorWmw=; b=Mpv2wDRrNCermvkv8AbVWJD81xynIqr0DKDRSu8HSiLqMfQvve1VqyoCrmb+aNbxgfXJPq nrUNZ0CKdlzjCS5zDdhs0vcBzFdR+HplIxzWV7Eum+qoEIaTG1DoTUsoj+7Qymsqq8duY8 GeI43VfCw7oAJFZNk8T6ExF513bgz+8= X-MC-Unique: R18D_EbFMwCs_3RK1YmW8A-1 From: David Hildenbrand To: qemu-devel@nongnu.org Subject: [PATCH v3 10/13] hw/s390x/s390-skeys: use memory mapping to detect which storage keys to dump Date: Fri, 3 Sep 2021 17:55:11 +0200 Message-Id: <20210903155514.44772-11-david@redhat.com> In-Reply-To: <20210903155514.44772-1-david@redhat.com> References: <20210903155514.44772-1-david@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=david@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=170.10.133.124; envelope-from=david@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -31 X-Spam_score: -3.2 X-Spam_bar: --- X-Spam_report: (-3.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.392, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: "Jason J . Herne" , Thomas Huth , Janosch Frank , David Hildenbrand , Cornelia Huck , Richard Henderson , Halil Pasic , Christian Borntraeger , qemu-s390x@nongnu.org, Claudio Imbrenda Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1630685244877100001 Content-Type: text/plain; charset="utf-8" Handle it similar to migration. Assert that we're holding the BQL, to make sure we don't see concurrent modifications. Reviewed-by: Thomas Huth Signed-off-by: David Hildenbrand --- hw/s390x/s390-skeys.c | 50 ++++++++++++++++++++++++++----------------- 1 file changed, 30 insertions(+), 20 deletions(-) diff --git a/hw/s390x/s390-skeys.c b/hw/s390x/s390-skeys.c index 250685a95a..56a47fe180 100644 --- a/hw/s390x/s390-skeys.c +++ b/hw/s390x/s390-skeys.c @@ -110,11 +110,10 @@ void qmp_dump_skeys(const char *filename, Error **err= p) { S390SKeysState *ss =3D s390_get_skeys_device(); S390SKeysClass *skeyclass =3D S390_SKEYS_GET_CLASS(ss); - MachineState *ms =3D MACHINE(qdev_get_machine()); - const uint64_t total_count =3D ms->ram_size / TARGET_PAGE_SIZE; - uint64_t handled_count =3D 0, cur_count; + GuestPhysBlockList guest_phys_blocks; + GuestPhysBlock *block; + uint64_t pages, gfn; Error *lerr =3D NULL; - vaddr cur_gfn =3D 0; uint8_t *buf; int ret; int fd; @@ -145,28 +144,39 @@ void qmp_dump_skeys(const char *filename, Error **err= p) goto out; } =20 - /* we'll only dump initial memory for now */ - while (handled_count < total_count) { - /* Calculate how many keys to ask for & handle overflow case */ - cur_count =3D MIN(total_count - handled_count, S390_SKEYS_BUFFER_S= IZE); + assert(qemu_mutex_iothread_locked()); + guest_phys_blocks_init(&guest_phys_blocks); + guest_phys_blocks_append(&guest_phys_blocks); =20 - ret =3D skeyclass->get_skeys(ss, cur_gfn, cur_count, buf); - if (ret < 0) { - error_setg(errp, "get_keys error %d", ret); - goto out_free; - } + QTAILQ_FOREACH(block, &guest_phys_blocks.head, next) { + assert(QEMU_IS_ALIGNED(block->target_start, TARGET_PAGE_SIZE)); + assert(QEMU_IS_ALIGNED(block->target_end, TARGET_PAGE_SIZE)); =20 - /* write keys to stream */ - write_keys(f, buf, cur_gfn, cur_count, &lerr); - if (lerr) { - goto out_free; - } + gfn =3D block->target_start / TARGET_PAGE_SIZE; + pages =3D (block->target_end - block->target_start) / TARGET_PAGE_= SIZE; =20 - cur_gfn +=3D cur_count; - handled_count +=3D cur_count; + while (pages) { + const uint64_t cur_pages =3D MIN(pages, S390_SKEYS_BUFFER_SIZE= ); + + ret =3D skeyclass->get_skeys(ss, gfn, cur_pages, buf); + if (ret < 0) { + error_setg_errno(errp, -ret, "get_keys error"); + goto out_free; + } + + /* write keys to stream */ + write_keys(f, buf, gfn, cur_pages, &lerr); + if (lerr) { + goto out_free; + } + + gfn +=3D cur_pages; + pages -=3D cur_pages; + } } =20 out_free: + guest_phys_blocks_free(&guest_phys_blocks); error_propagate(errp, lerr); g_free(buf); out: --=20 2.31.1 From nobody Sat May 4 15:52:17 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 16306852392918.171287836114402; Fri, 3 Sep 2021 09:07:19 -0700 (PDT) Received: from localhost ([::1]:55660 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mMBio-0004ZY-4A for importer@patchew.org; Fri, 03 Sep 2021 12:07:18 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58124) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mMBY0-0001vw-6q for qemu-devel@nongnu.org; Fri, 03 Sep 2021 11:56:08 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:36074) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mMBXx-0000lc-Ai for qemu-devel@nongnu.org; Fri, 03 Sep 2021 11:56:07 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-350-t75P-Ij6OVGJhqvYr_fPrw-1; Fri, 03 Sep 2021 11:56:03 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 005076D4E0; Fri, 3 Sep 2021 15:56:02 +0000 (UTC) Received: from t480s.redhat.com (unknown [10.39.193.142]) by smtp.corp.redhat.com (Postfix) with ESMTP id 4AC4E6608B; Fri, 3 Sep 2021 15:55:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1630684564; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=hvXtWV7uKYaC3yADNUWplnYXFVfQJU9iG6ABZ6uLVG4=; b=ZgcXSBjGQsRFosVdWUDRn0YLHqhbcFNd3Vm53+LWeV4oKs97bA5FXl2XOEVV/FEA+LhREx fnXoCgFcSROCLUNcGfZ185X0/bvI5xCpBM04UaH3tCCR6NFbYizZIar8jDtYE1oPIb1m4/ cvIuMASx9goStSbZ+Ua0fwxAKSDLJBo= X-MC-Unique: t75P-Ij6OVGJhqvYr_fPrw-1 From: David Hildenbrand To: qemu-devel@nongnu.org Subject: [PATCH v3 11/13] hw/s390x/s390-skeys: check if an address is valid before dumping the key Date: Fri, 3 Sep 2021 17:55:12 +0200 Message-Id: <20210903155514.44772-12-david@redhat.com> In-Reply-To: <20210903155514.44772-1-david@redhat.com> References: <20210903155514.44772-1-david@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=david@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=170.10.133.124; envelope-from=david@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -31 X-Spam_score: -3.2 X-Spam_bar: --- X-Spam_report: (-3.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.392, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: "Jason J . Herne" , Thomas Huth , Janosch Frank , David Hildenbrand , Cornelia Huck , Richard Henderson , Halil Pasic , Christian Borntraeger , qemu-s390x@nongnu.org, Claudio Imbrenda Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1630685240116100001 Content-Type: text/plain; charset="utf-8" Let's validate the given address and report a proper error in case it's not. All call paths now properly check the validity of the given GFN. Remove the TODO. The errors inside the getter and setter should only trigger if something really goes wrong now, for example, with a broken migration stream. Or when we forget to update the storage key allocation with memory hotplug. Signed-off-by: David Hildenbrand Acked-by: Thomas Huth --- hw/s390x/s390-skeys.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/hw/s390x/s390-skeys.c b/hw/s390x/s390-skeys.c index 56a47fe180..db73e9091d 100644 --- a/hw/s390x/s390-skeys.c +++ b/hw/s390x/s390-skeys.c @@ -18,6 +18,7 @@ #include "qapi/qmp/qdict.h" #include "qemu/error-report.h" #include "sysemu/memory_mapping.h" +#include "exec/address-spaces.h" #include "sysemu/kvm.h" #include "migration/qemu-file-types.h" #include "migration/register.h" @@ -86,6 +87,13 @@ void hmp_info_skeys(Monitor *mon, const QDict *qdict) return; } =20 + if (!address_space_access_valid(&address_space_memory, + addr & TARGET_PAGE_MASK, TARGET_PAGE_S= IZE, + false, MEMTXATTRS_UNSPECIFIED)) { + monitor_printf(mon, "Error: The given address is not valid\n"); + return; + } + r =3D skeyclass->get_skeys(ss, addr / TARGET_PAGE_SIZE, 1, &key); if (r < 0) { monitor_printf(mon, "Error: %s\n", strerror(-r)); @@ -197,11 +205,6 @@ static int qemu_s390_skeys_enabled(S390SKeysState *ss) return 1; } =20 -/* - * TODO: for memory hotplug support qemu_s390_skeys_set and qemu_s390_skey= s_get - * will have to make sure that the given gfn belongs to a memory region an= d not - * a memory hole. - */ static int qemu_s390_skeys_set(S390SKeysState *ss, uint64_t start_gfn, uint64_t count, uint8_t *keys) { --=20 2.31.1 From nobody Sat May 4 15:52:17 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1630685241040559.0074479710006; Fri, 3 Sep 2021 09:07:21 -0700 (PDT) Received: from localhost ([::1]:55720 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mMBip-0004bh-Rl for importer@patchew.org; Fri, 03 Sep 2021 12:07:19 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58140) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mMBY1-00020q-FW for qemu-devel@nongnu.org; Fri, 03 Sep 2021 11:56:09 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:49539) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mMBXz-0000n3-I2 for qemu-devel@nongnu.org; Fri, 03 Sep 2021 11:56:09 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-558-EzL-5tLCN3KmvB-RCQirLw-1; Fri, 03 Sep 2021 11:56:05 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 67EF010054F6; Fri, 3 Sep 2021 15:56:04 +0000 (UTC) Received: from t480s.redhat.com (unknown [10.39.193.142]) by smtp.corp.redhat.com (Postfix) with ESMTP id 4A93060916; Fri, 3 Sep 2021 15:56:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1630684566; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=lTI1+D+SnN9eJYRwGvcqKaY5n2BrWD0pbmIa58pib0Q=; b=WVaiKTwWPIDwulQruLZxy1FW8WIt8h2Ft1zAQTR6ey4NZx2Z8gXx9zVFOl0u1GR9po5yxm cJ6fUKT0mJbnGonN3bmP83bk0vaT5cuF9912jXfyAZqT1XSkHLnvohfJIdzItTDAdvQTik j2jO20ppmdFX4MdbFw8xqbfcFolLrFo= X-MC-Unique: EzL-5tLCN3KmvB-RCQirLw-1 From: David Hildenbrand To: qemu-devel@nongnu.org Subject: [PATCH v3 12/13] hw/s390x/s390-skeys: rename skeys_enabled to skeys_are_enabled Date: Fri, 3 Sep 2021 17:55:13 +0200 Message-Id: <20210903155514.44772-13-david@redhat.com> In-Reply-To: <20210903155514.44772-1-david@redhat.com> References: <20210903155514.44772-1-david@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=david@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=170.10.133.124; envelope-from=david@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -31 X-Spam_score: -3.2 X-Spam_bar: --- X-Spam_report: (-3.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.392, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: "Jason J . Herne" , Thomas Huth , Janosch Frank , David Hildenbrand , Cornelia Huck , Richard Henderson , Halil Pasic , Christian Borntraeger , qemu-s390x@nongnu.org, Claudio Imbrenda Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1630685242293100001 Content-Type: text/plain; charset="utf-8" ... and make it return a bool instead. Signed-off-by: David Hildenbrand Reviewed-by: Thomas Huth --- hw/s390x/s390-skeys-kvm.c | 4 ++-- hw/s390x/s390-skeys.c | 12 ++++++------ include/hw/s390x/storage-keys.h | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/hw/s390x/s390-skeys-kvm.c b/hw/s390x/s390-skeys-kvm.c index 1c4d805ad8..3ff9d94b80 100644 --- a/hw/s390x/s390-skeys-kvm.c +++ b/hw/s390x/s390-skeys-kvm.c @@ -15,7 +15,7 @@ #include "qemu/error-report.h" #include "qemu/module.h" =20 -static int kvm_s390_skeys_enabled(S390SKeysState *ss) +static bool kvm_s390_skeys_are_enabled(S390SKeysState *ss) { S390SKeysClass *skeyclass =3D S390_SKEYS_GET_CLASS(ss); uint8_t single_key; @@ -57,7 +57,7 @@ static void kvm_s390_skeys_class_init(ObjectClass *oc, vo= id *data) S390SKeysClass *skeyclass =3D S390_SKEYS_CLASS(oc); DeviceClass *dc =3D DEVICE_CLASS(oc); =20 - skeyclass->skeys_enabled =3D kvm_s390_skeys_enabled; + skeyclass->skeys_are_enabled =3D kvm_s390_skeys_are_enabled; skeyclass->get_skeys =3D kvm_s390_skeys_get; skeyclass->set_skeys =3D kvm_s390_skeys_set; =20 diff --git a/hw/s390x/s390-skeys.c b/hw/s390x/s390-skeys.c index db73e9091d..9e994a5582 100644 --- a/hw/s390x/s390-skeys.c +++ b/hw/s390x/s390-skeys.c @@ -82,7 +82,7 @@ void hmp_info_skeys(Monitor *mon, const QDict *qdict) int r; =20 /* Quick check to see if guest is using storage keys*/ - if (!skeyclass->skeys_enabled(ss)) { + if (!skeyclass->skeys_are_enabled(ss)) { monitor_printf(mon, "Error: This guest is not using storage keys\n= "); return; } @@ -128,7 +128,7 @@ void qmp_dump_skeys(const char *filename, Error **errp) FILE *f; =20 /* Quick check to see if guest is using storage keys*/ - if (!skeyclass->skeys_enabled(ss)) { + if (!skeyclass->skeys_are_enabled(ss)) { error_setg(errp, "This guest is not using storage keys - " "nothing to dump"); return; @@ -200,9 +200,9 @@ static void qemu_s390_skeys_init(Object *obj) skeys->keydata =3D g_malloc0(skeys->key_count); } =20 -static int qemu_s390_skeys_enabled(S390SKeysState *ss) +static bool qemu_s390_skeys_are_enabled(S390SKeysState *ss) { - return 1; + return true; } =20 static int qemu_s390_skeys_set(S390SKeysState *ss, uint64_t start_gfn, @@ -250,7 +250,7 @@ static void qemu_s390_skeys_class_init(ObjectClass *oc,= void *data) S390SKeysClass *skeyclass =3D S390_SKEYS_CLASS(oc); DeviceClass *dc =3D DEVICE_CLASS(oc); =20 - skeyclass->skeys_enabled =3D qemu_s390_skeys_enabled; + skeyclass->skeys_are_enabled =3D qemu_s390_skeys_are_enabled; skeyclass->get_skeys =3D qemu_s390_skeys_get; skeyclass->set_skeys =3D qemu_s390_skeys_set; =20 @@ -277,7 +277,7 @@ static void s390_storage_keys_save(QEMUFile *f, void *o= paque) int error =3D 0; uint8_t *buf; =20 - if (!skeyclass->skeys_enabled(ss)) { + if (!skeyclass->skeys_are_enabled(ss)) { goto end_stream; } =20 diff --git a/include/hw/s390x/storage-keys.h b/include/hw/s390x/storage-key= s.h index 2888d42d0b..eb091842c8 100644 --- a/include/hw/s390x/storage-keys.h +++ b/include/hw/s390x/storage-keys.h @@ -28,7 +28,7 @@ struct S390SKeysState { =20 struct S390SKeysClass { DeviceClass parent_class; - int (*skeys_enabled)(S390SKeysState *ks); + bool (*skeys_are_enabled)(S390SKeysState *ks); int (*get_skeys)(S390SKeysState *ks, uint64_t start_gfn, uint64_t coun= t, uint8_t *keys); int (*set_skeys)(S390SKeysState *ks, uint64_t start_gfn, uint64_t coun= t, --=20 2.31.1 From nobody Sat May 4 15:52:17 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1630684787110335.03682548389554; Fri, 3 Sep 2021 08:59:47 -0700 (PDT) Received: from localhost ([::1]:39768 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mMBbW-0001P2-1i for importer@patchew.org; Fri, 03 Sep 2021 11:59:46 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58194) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mMBY6-0002Fd-0A for qemu-devel@nongnu.org; Fri, 03 Sep 2021 11:56:14 -0400 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:23958) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mMBY2-0000pE-SR for qemu-devel@nongnu.org; Fri, 03 Sep 2021 11:56:13 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-403-8d1BLc3VO9StlWgffEr5TQ-1; Fri, 03 Sep 2021 11:56:08 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id D03156D4E0; Fri, 3 Sep 2021 15:56:06 +0000 (UTC) Received: from t480s.redhat.com (unknown [10.39.193.142]) by smtp.corp.redhat.com (Postfix) with ESMTP id B2F791B42C; Fri, 3 Sep 2021 15:56:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1630684569; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=+h4ftnUtGQz+g6VkOrGUTUGMechF5A5IGRiTry9Z1mU=; b=JKUSZl9eRA9looLJytlj7dVvAWkZy8KYNzhUZI627V1HP+bK9Ea+taRxeEBSjXCGW/4V+8 vBCUElW74ifJh29PBILYCQC/FO4LYExWJ+rDRz0/casd6U1ulKMlHd2G0a3+FrOilfujPg yd9n0hU0FToA3pSPoUjqatrCpJXtnn8= X-MC-Unique: 8d1BLc3VO9StlWgffEr5TQ-1 From: David Hildenbrand To: qemu-devel@nongnu.org Subject: [PATCH v3 13/13] hw/s390x/s390-skeys: lazy storage key enablement under TCG Date: Fri, 3 Sep 2021 17:55:14 +0200 Message-Id: <20210903155514.44772-14-david@redhat.com> In-Reply-To: <20210903155514.44772-1-david@redhat.com> References: <20210903155514.44772-1-david@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=david@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=216.205.24.124; envelope-from=david@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -31 X-Spam_score: -3.2 X-Spam_bar: --- X-Spam_report: (-3.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.392, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: "Jason J . Herne" , Thomas Huth , Janosch Frank , David Hildenbrand , Cornelia Huck , Richard Henderson , Halil Pasic , Christian Borntraeger , qemu-s390x@nongnu.org, Claudio Imbrenda Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1630684787794100005 Content-Type: text/plain; charset="utf-8" Let's enable storage keys lazily under TCG, just as we do under KVM. Only fairly old Linux versions actually make use of storage keys, so it can be kind of wasteful to allocate quite some memory and track changes and references if nobody cares. We have to make sure to flush the TLB when enabling storage keys after the VM was already running: otherwise it might happen that we don't catch references or modifications afterwards. Add proper documentation to all callbacks. The kvm-unit-tests skey tests keeps on working with this change. Signed-off-by: David Hildenbrand Reviewed-by: Thomas Huth --- hw/s390x/s390-skeys.c | 65 ++++++++++++++++++++++++++------- include/hw/s390x/storage-keys.h | 63 ++++++++++++++++++++++++++++++++ target/s390x/mmu_helper.c | 8 ++++ target/s390x/tcg/mem_helper.c | 9 +++++ 4 files changed, 131 insertions(+), 14 deletions(-) diff --git a/hw/s390x/s390-skeys.c b/hw/s390x/s390-skeys.c index 9e994a5582..5024faf411 100644 --- a/hw/s390x/s390-skeys.c +++ b/hw/s390x/s390-skeys.c @@ -191,18 +191,45 @@ out: fclose(f); } =20 -static void qemu_s390_skeys_init(Object *obj) +static bool qemu_s390_skeys_are_enabled(S390SKeysState *ss) { - QEMUS390SKeysState *skeys =3D QEMU_S390_SKEYS(obj); - MachineState *machine =3D MACHINE(qdev_get_machine()); + QEMUS390SKeysState *skeys =3D QEMU_S390_SKEYS(ss); =20 - skeys->key_count =3D machine->ram_size / TARGET_PAGE_SIZE; - skeys->keydata =3D g_malloc0(skeys->key_count); + /* Lockless check is sufficient. */ + return !!skeys->keydata; } =20 -static bool qemu_s390_skeys_are_enabled(S390SKeysState *ss) +static bool qemu_s390_enable_skeys(S390SKeysState *ss) { - return true; + QEMUS390SKeysState *skeys =3D QEMU_S390_SKEYS(ss); + static gsize initialized; + + if (likely(skeys->keydata)) { + return true; + } + + /* + * TODO: Modern Linux doesn't use storage keys unless running KVM gues= ts + * that use storage keys. Therefore, we keep it simple for now. + * + * 1) We should initialize to "referenced+changed" for an initial + * over-indication. Let's avoid touching megabytes of data for now = and + * assume that any sane user will issue a storage key instruction b= efore + * actually relying on this data. + * 2) Relying on ram_size and allocating a big array is ugly. We should + * allocate and manage storage key data per RAMBlock or optimally u= sing + * some sparse data structure. + * 3) We only ever have a single S390SKeysState, so relying on + * g_once_init_enter() is good enough. + */ + if (g_once_init_enter(&initialized)) { + MachineState *machine =3D MACHINE(qdev_get_machine()); + + skeys->key_count =3D machine->ram_size / TARGET_PAGE_SIZE; + skeys->keydata =3D g_malloc0(skeys->key_count); + g_once_init_leave(&initialized, 1); + } + return false; } =20 static int qemu_s390_skeys_set(S390SKeysState *ss, uint64_t start_gfn, @@ -212,9 +239,10 @@ static int qemu_s390_skeys_set(S390SKeysState *ss, uin= t64_t start_gfn, int i; =20 /* Check for uint64 overflow and access beyond end of key data */ - if (start_gfn + count > skeydev->key_count || start_gfn + count < coun= t) { - error_report("Error: Setting storage keys for page beyond the end " - "of memory: gfn=3D%" PRIx64 " count=3D%" PRId64, + if (unlikely(!skeydev->keydata || start_gfn + count > skeydev->key_cou= nt || + start_gfn + count < count)) { + error_report("Error: Setting storage keys for pages with unallocat= ed " + "storage key memory: gfn=3D%" PRIx64 " count=3D%" PRI= d64, start_gfn, count); return -EINVAL; } @@ -232,9 +260,10 @@ static int qemu_s390_skeys_get(S390SKeysState *ss, uin= t64_t start_gfn, int i; =20 /* Check for uint64 overflow and access beyond end of key data */ - if (start_gfn + count > skeydev->key_count || start_gfn + count < coun= t) { - error_report("Error: Getting storage keys for page beyond the end " - "of memory: gfn=3D%" PRIx64 " count=3D%" PRId64, + if (unlikely(!skeydev->keydata || start_gfn + count > skeydev->key_cou= nt || + start_gfn + count < count)) { + error_report("Error: Getting storage keys for pages with unallocat= ed " + "storage key memory: gfn=3D%" PRIx64 " count=3D%" PRI= d64, start_gfn, count); return -EINVAL; } @@ -251,6 +280,7 @@ static void qemu_s390_skeys_class_init(ObjectClass *oc,= void *data) DeviceClass *dc =3D DEVICE_CLASS(oc); =20 skeyclass->skeys_are_enabled =3D qemu_s390_skeys_are_enabled; + skeyclass->enable_skeys =3D qemu_s390_enable_skeys; skeyclass->get_skeys =3D qemu_s390_skeys_get; skeyclass->set_skeys =3D qemu_s390_skeys_set; =20 @@ -261,7 +291,6 @@ static void qemu_s390_skeys_class_init(ObjectClass *oc,= void *data) static const TypeInfo qemu_s390_skeys_info =3D { .name =3D TYPE_QEMU_S390_SKEYS, .parent =3D TYPE_S390_SKEYS, - .instance_init =3D qemu_s390_skeys_init, .instance_size =3D sizeof(QEMUS390SKeysState), .class_init =3D qemu_s390_skeys_class_init, .class_size =3D sizeof(S390SKeysClass), @@ -341,6 +370,14 @@ static int s390_storage_keys_load(QEMUFile *f, void *o= paque, int version_id) S390SKeysClass *skeyclass =3D S390_SKEYS_GET_CLASS(ss); int ret =3D 0; =20 + /* + * Make sure to lazy-enable if required to be done explicitly. No need= to + * flush any TLB as the VM is not running yet. + */ + if (skeyclass->enable_skeys) { + skeyclass->enable_skeys(ss); + } + while (!ret) { ram_addr_t addr; int flags; diff --git a/include/hw/s390x/storage-keys.h b/include/hw/s390x/storage-key= s.h index eb091842c8..aa2ec2aae5 100644 --- a/include/hw/s390x/storage-keys.h +++ b/include/hw/s390x/storage-keys.h @@ -28,9 +28,72 @@ struct S390SKeysState { =20 struct S390SKeysClass { DeviceClass parent_class; + + /** + * @skeys_are_enabled: + * + * Check whether storage keys are enabled. If not enabled, they were n= ot + * enabled lazily either by the guest via a storage key instruction or + * by the host during migration. + * + * If disabled, everything not explicitly triggered by the guest, + * such as outgoing migration or dirty/change tracking, should not tou= ch + * storage keys and should not lazily enable it. + * + * @ks: the #S390SKeysState + * + * Returns false if not enabled and true if enabled. + */ bool (*skeys_are_enabled)(S390SKeysState *ks); + + /** + * @enable_skeys: + * + * Lazily enable storage keys. If this function is not implemented, + * setting a storage key will lazily enable storage keys implicitly + * instead. TCG guests have to make sure to flush the TLB of all CPUs + * if storage keys were not enabled before this call. + * + * @ks: the #S390SKeysState + * + * Returns false if not enabled before this call, and true if already + * enabled. + */ + bool (*enable_skeys)(S390SKeysState *ks); + + /** + * @get_skeys: + * + * Get storage keys for the given PFN range. This call will fail if + * storage keys have not been lazily enabled yet. + * + * Callers have to validate that a GFN is valid before this call. + * + * @ks: the #S390SKeysState + * @start_gfn: the start GFN to get storage keys for + * @count: the number of storage keys to get + * @keys: the byte array where storage keys will be stored to + * + * Returns 0 on success, returns an error if getting a storage key fai= led. + */ int (*get_skeys)(S390SKeysState *ks, uint64_t start_gfn, uint64_t coun= t, uint8_t *keys); + /** + * @set_skeys: + * + * Set storage keys for the given PFN range. This call will fail if + * storage keys have not been lazily enabled yet and implicit + * enablement is not supported. + * + * Callers have to validate that a GFN is valid before this call. + * + * @ks: the #S390SKeysState + * @start_gfn: the start GFN to set storage keys for + * @count: the number of storage keys to set + * @keys: the byte array where storage keys will be read from + * + * Returns 0 on success, returns an error if setting a storage key fai= led. + */ int (*set_skeys)(S390SKeysState *ks, uint64_t start_gfn, uint64_t coun= t, uint8_t *keys); }; diff --git a/target/s390x/mmu_helper.c b/target/s390x/mmu_helper.c index e2b372efd9..b04b57c235 100644 --- a/target/s390x/mmu_helper.c +++ b/target/s390x/mmu_helper.c @@ -313,6 +313,14 @@ static void mmu_handle_skey(target_ulong addr, int rw,= int *flags) skeyclass =3D S390_SKEYS_GET_CLASS(ss); } =20 + /* + * Don't enable storage keys if they are still disabled, i.e., no actu= al + * storage key instruction was issued yet. + */ + if (!skeyclass->skeys_are_enabled(ss)) { + return; + } + /* * Whenever we create a new TLB entry, we set the storage key reference * bit. In case we allow write accesses, we set the storage key change diff --git a/target/s390x/tcg/mem_helper.c b/target/s390x/tcg/mem_helper.c index 4f9f3e1f63..0bf775a37d 100644 --- a/target/s390x/tcg/mem_helper.c +++ b/target/s390x/tcg/mem_helper.c @@ -2186,6 +2186,9 @@ uint64_t HELPER(iske)(CPUS390XState *env, uint64_t r2) if (unlikely(!ss)) { ss =3D s390_get_skeys_device(); skeyclass =3D S390_SKEYS_GET_CLASS(ss); + if (skeyclass->enable_skeys && !skeyclass->enable_skeys(ss)) { + tlb_flush_all_cpus_synced(env_cpu(env)); + } } =20 rc =3D skeyclass->get_skeys(ss, addr / TARGET_PAGE_SIZE, 1, &key); @@ -2213,6 +2216,9 @@ void HELPER(sske)(CPUS390XState *env, uint64_t r1, ui= nt64_t r2) if (unlikely(!ss)) { ss =3D s390_get_skeys_device(); skeyclass =3D S390_SKEYS_GET_CLASS(ss); + if (skeyclass->enable_skeys && !skeyclass->enable_skeys(ss)) { + tlb_flush_all_cpus_synced(env_cpu(env)); + } } =20 key =3D r1 & 0xfe; @@ -2244,6 +2250,9 @@ uint32_t HELPER(rrbe)(CPUS390XState *env, uint64_t r2) if (unlikely(!ss)) { ss =3D s390_get_skeys_device(); skeyclass =3D S390_SKEYS_GET_CLASS(ss); + if (skeyclass->enable_skeys && !skeyclass->enable_skeys(ss)) { + tlb_flush_all_cpus_synced(env_cpu(env)); + } } =20 rc =3D skeyclass->get_skeys(ss, addr / TARGET_PAGE_SIZE, 1, &key); --=20 2.31.1