From nobody Thu Nov 14 06:53:14 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; 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=pass(p=none dis=none) header.from=nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1708712139; cv=none; d=zohomail.com; s=zohoarc; b=mPwpfYt5oY9DaDzCimmx9yCPDkrtfOSHyi1bghWN8888beqg+UKHDCkU+qd+Ql+XxI5JtST78QlypzZpqhcqx5Qi0rq3c4WPFDEtpO462Rlit7Ycr3Qj1CHlg0vag1oXkPKnkjPtA2NgLV2pCaS5hZNf4vj08DWXeyGM/f96dyo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1708712139; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:Sender:Subject:Subject:To:To:Message-Id; bh=uHWIBdAlnwpwfCZTIhh4GM+pgEpq7UgbrCUK25Elotg=; b=H61p5agKbfXprQep8B4DkGUgU0Kp8bG2PAzThAZJmmIOLVsFCfQgG5w9JsfHwmdtr2QUbxmd5d+IIBf5TFK3Y6zkK+std2/zTRXXDe6XX7rkuNP+PxgmIt+ap+1oJvAi2EcSbGwd7QxxEQWz2unr8JftPHJnCrmsOzLNy+fWNT0= ARC-Authentication-Results: i=1; mx.zohomail.com; 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=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1708712139449143.75311824026278; Fri, 23 Feb 2024 10:15:39 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rda4p-0002FP-0A; Fri, 23 Feb 2024 13:15:17 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rdZrI-0001G9-Nd for qemu-devel@nongnu.org; Fri, 23 Feb 2024 13:01:16 -0500 Received: from frasgout.his.huawei.com ([185.176.79.56]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rdZrD-0007cr-Qw for qemu-devel@nongnu.org; Fri, 23 Feb 2024 13:01:16 -0500 Received: from mail.maildlp.com (unknown [172.18.186.31]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4ThHl648vyz6K5ly; Sat, 24 Feb 2024 01:56:50 +0800 (CST) Received: from lhrpeml500005.china.huawei.com (unknown [7.191.163.240]) by mail.maildlp.com (Postfix) with ESMTPS id 5D80614153B; Sat, 24 Feb 2024 02:01:00 +0800 (CST) Received: from SecurePC-101-06.china.huawei.com (10.122.247.231) by lhrpeml500005.china.huawei.com (7.191.163.240) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.35; Fri, 23 Feb 2024 18:01:00 +0000 To: , Peter Maydell , Gregory Price , =?UTF-8?q?Alex=20Benn=C3=A9e?= , CC: , Subject: [PATCH v3] arm/ptw: Handle atomic updates of page tables entries in MMIO during PTW. Date: Fri, 23 Feb 2024 18:01:02 +0000 Message-ID: <20240223180102.7657-1-Jonathan.Cameron@huawei.com> X-Mailer: git-send-email 2.39.2 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [10.122.247.231] X-ClientProxiedBy: lhrpeml100004.china.huawei.com (7.191.162.219) To lhrpeml500005.china.huawei.com (7.191.163.240) 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=185.176.79.56; envelope-from=jonathan.cameron@huawei.com; helo=frasgout.his.huawei.com X-Spam_score_int: -41 X-Spam_score: -4.2 X-Spam_bar: ---- X-Spam_report: (-4.2 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_MED=-2.3, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-to: Jonathan Cameron From: Jonathan Cameron via Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1708712140874100003 Content-Type: text/plain; charset="utf-8" Seen testing of CXL emulation on arm64 (currently out of tree). CXL interleave occurs at subpage granularity so is emulated using an IO Memory Region. The memory is general purpose and as such may contain page tables. FEAT_HADFS using atomic accesses from the page table walkers to update accessed and dirty bits. Note that disabling kernel support this ARM 8.1 feature avoids this issue as the PTW no longer does an atomic update of the page table entries, but that is a nasty workaround beyond its use in root causing this issue. Signed-off-by: Jonathan Cameron Reviewed-by: Richard Henderson --- v3: Thanks Richard and Peter for reviewing. Much simpler error handle + use of BQL_LOCK_GUARD() (Richard) Dropped RFC and updated description as seems this is converging! --- target/arm/ptw.c | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/target/arm/ptw.c b/target/arm/ptw.c index 5eb3577bcd..140afed451 100644 --- a/target/arm/ptw.c +++ b/target/arm/ptw.c @@ -711,8 +711,35 @@ static uint64_t arm_casq_ptw(CPUARMState *env, uint64_= t old_val, void *host =3D ptw->out_host; =20 if (unlikely(!host)) { - fi->type =3D ARMFault_UnsuppAtomicUpdate; - return 0; + /* Page table in MMIO Memory Region */ + CPUState *cs =3D env_cpu(env); + MemTxAttrs attrs =3D { + .space =3D ptw->out_space, + .secure =3D arm_space_is_secure(ptw->out_space), + }; + AddressSpace *as =3D arm_addressspace(cs, attrs); + MemTxResult result =3D MEMTX_OK; + BQL_LOCK_GUARD(); + + cur_val =3D (ptw->out_be + ? address_space_ldq_be(as, ptw->out_phys, attrs, &resul= t) + : address_space_ldq_le(as, ptw->out_phys, attrs, &resul= t)); + if (result =3D=3D MEMTX_OK && cur_val =3D=3D old_val) { + if (ptw->out_be) { + address_space_stq_be(as, ptw->out_phys, new_val, attrs, + &result); + } else { + address_space_stq_le(as, ptw->out_phys, new_val, attrs, + &result); + } + } + if (unlikely(result !=3D MEMTX_OK)) { + fi->type =3D ARMFault_SyncExternalOnWalk; + fi->ea =3D arm_extabort_type(result); + return old_val; + } + + return cur_val; } =20 /* --=20 2.39.2