From patchwork Wed Sep 5 22:09:25 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alistair Francis X-Patchwork-Id: 10589573 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 31BCA920 for ; Wed, 5 Sep 2018 22:11:36 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1FCF92AA3B for ; Wed, 5 Sep 2018 22:11:36 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 13E8A2ABA7; Wed, 5 Sep 2018 22:11:36 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.8 required=2.0 tests=BAD_ENC_HEADER,BAYES_00, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 56BCB2AB94 for ; Wed, 5 Sep 2018 22:11:35 +0000 (UTC) Received: from localhost ([::1]:58253 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fxg1O-0000y2-JU for patchwork-qemu-devel@patchwork.kernel.org; Wed, 05 Sep 2018 18:11:34 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:57482) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fxfzz-0000oY-Fz for qemu-devel@nongnu.org; Wed, 05 Sep 2018 18:10:11 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fxfzv-0003Sm-BT for qemu-devel@nongnu.org; Wed, 05 Sep 2018 18:10:07 -0400 Received: from esa4.hgst.iphmx.com ([216.71.154.42]:45376) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fxfzu-0003Qk-Hx for qemu-devel@nongnu.org; Wed, 05 Sep 2018 18:10:03 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=wdc.com; i=@wdc.com; q=dns/txt; s=dkim.wdc.com; t=1536185403; x=1567721403; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version; bh=lwca9t1+nDg0F6GuVLYbWuIUyAMn+u2+4eXGZEUYqY8=; b=qH77w0FmWe/LHMvlsMrI5GoSVFXr4wulVVSbgPeHLuvVi7nqhQXYIijS NgimDO0WgXOx5Kc/nUNgcHTWMVIlBN8IcmPHVesFr3QemVXQBBexYOIu2 Ho5ifRPr+TEGYKz8uUCW5MneX2nSDhMPFAzQ9pme4/AGpbQwZDR+4k4js 7F9V1/is2RRhjykG5EOA9Af4odPPGSFaH6A709+8XrNgWXuCgNHRFAs1c 5cGRrAyrgTOKm1/IOvNHe15x8Pj7Bgotsbo/kyh2b/PFNPLUINtYDeF0A WvCllwQtAxqtUFCX2dalIiuuV6RDAHB22SmoD1Qcc+/xpx0xXwFnSp+vW g==; X-IronPort-AV: E=Sophos;i="5.53,334,1531756800"; d="scan'208";a="89140638" Received: from mail-by2nam01lp0183.outbound.protection.outlook.com (HELO NAM01-BY2-obe.outbound.protection.outlook.com) ([216.32.181.183]) by ob1.hgst.iphmx.com with ESMTP; 06 Sep 2018 06:09:59 +0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sharedspace.onmicrosoft.com; s=selector1-wdc-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=YaZw2XM1x9YOL7GYhd4mphFT6b4jR0fzfWKQZA4ZGXk=; b=eSKYUuTT5/o2KtuyazwQdUgxa8CfXiD9cmyZUuJhBSHwIC2bCBo4sLlLPp0elBU3i7flwsjXawNa1c/Sq3M/61WeRtZVL6+7h7cvQXbfIqea0l8d7UN6iIfGWVYLko9UvH0TyEOUsEjLnVlPqXqEBlgkLUMmE9VfjRZ7JnfdNns= Received: from risc6-mainframe.int.fusionio.com (199.255.44.171) by BN6PR04MB0386.namprd04.prod.outlook.com (2603:10b6:404:91::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1101.18; Wed, 5 Sep 2018 22:09:51 +0000 From: Alistair Francis To: qemu-devel@nongnu.org Date: Wed, 5 Sep 2018 15:09:25 -0700 Message-Id: <20180905220932.6152-3-alistair.francis@wdc.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180905220932.6152-1-alistair.francis@wdc.com> References: <20180905220932.6152-1-alistair.francis@wdc.com> MIME-Version: 1.0 X-Originating-IP: [199.255.44.171] X-ClientProxiedBy: CO2PR06CA0060.namprd06.prod.outlook.com (2603:10b6:104:3::18) To BN6PR04MB0386.namprd04.prod.outlook.com (2603:10b6:404:91::15) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 16558791-1ac4-4e46-bcb7-08d6137c50a5 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: BCL:0; PCL:0; RULEID:(7020095)(4652040)(8989137)(4534165)(4627221)(201703031133081)(201702281549075)(8990107)(5600074)(711020)(4618075)(2017052603328)(7153060)(7193020); SRVR:BN6PR04MB0386; X-Microsoft-Exchange-Diagnostics: 1; BN6PR04MB0386; 3:mhf5oEC99cWFExXwn04eNigo+7jrzzwcxCkEPrdZJGh/2XezSVZUpVRsEb/14RcWlNigqK3GOjCdF030Xypo8MJzorRo/y3WkLM4gQvu/UcTDJEldqGqNnAZS00M82sjZg1pWzUUYXBI1l0WVMV/TAuVbd/zwqf/LFDdpgOLwTfT4NDXtw49HXhjBculoqa9bWoby2IRjHpbUIy7ObQPzb6F28KmXU3QvNz/orWj5CKEcQT/lYnYPmH8FTEjREGD; 25:srQ9nk/uX20BP6DHd680FRXQqhCYmqbpZYAYcDp7+fr3wt+u5i8fKaylcvSH19NznoQXEIz3K54kx8WjjkR1hWKxlws8ys95JKhmmXfTjk6d/fXFt/MQiOQVqDblKHPGpjqCVKQok3TJEykAnWNdhdfYerWHjxLNmg7U/0tyB8gRmwF99NN+BZswpWJPBWYZPIAM7x8Zgd7fV/SOaHJsEgA9Pyb+80x0MmWI9J4RnhwAFfu5+b2bmZr055GwgXbwOoLRivxxtSbKR64vxIpg77LRp5exheD1T8lW7Pp3LYdB9KsGeaphxkQfHT9+EcdwAoDLtS37yKkmFiNsP8H51Q==; 31:31snj/lhesKwN4e9e2GUpmbYEEpTgQ4VobvCMMJz0ieQSr8kctcrtEQ16Y2cloghLeRXIRYXTnx0C4I4VAl+FBZRQDaTz+r5dDSn9Ojw+ThMI0hK5wMzq71kacYEyp1sxzf6LBUXqQD1ACV5co1v/oNsT9Sp/ucnNusN7++0THt+mEcjeDZWgqQwHZp84CLEVVXSohSEEh5ShMg9BaIBsDq8m59U+/4rOarNBMTUF5I= X-MS-TrafficTypeDiagnostic: BN6PR04MB0386: WDCIPOUTBOUND: EOP-TRUE X-Microsoft-Exchange-Diagnostics: 1; BN6PR04MB0386; 20:dozHYBjLoVVYP3QhTxTFozBDgu+JdmJkEqTgdRJlWGsJGLf373477AWohfgxP/gyK+kO6guajuPmLEb5EiV4yiSml9zAf7GYV8EjWVySV6uSmBgt0Rbe7pIoOB+34A4KOj/YXqfvktkVFV7aiRBDf7Tr95aIlFRZHuf2QpsjIJgzoj3w0TIcQfPxX+Ov8ORdrQR1o7H6YMNX4LFuRWFyjxTdl7wvctdw3reroUhJMdiVWwJ5PrUz6dW8aUlXv/9T2bzr5LsX7xHEk3KKmOJWv7hWb9LRL1fOr6OZaRxrE/20j7dAV/kzM4adfTWuOT1VjCqYgc+gYKmXGCvnTSn9xsAht7YyTk5DH04OTQnEB1hZ6LyZPCNOOvCZ6zo5Tk99TKQwbFpoFAb0hNg2ptCIEWFsaf+j5bIPrAPZBx4O5DbM9OkBXGVKCLgwa5ibNyWPg7MAgV6qPfTdbBaRWCm1hucbtjUq2qE8VXS0v5B25hTkYPPpLmVLhVKySoDWj/yv; 4:iRlKZ8Cu6UnH3I+OJnD6rAndCPV1Yxo5R60p6N2cT7FMxIxOl7ucYl1l7TlcmDmWA46Nyg96nZUEQHQVA4crTiSLnGHXCHcxxJmcYy1hmXNXXTlCV6JkKFBcVZAbsBvT870tIzwFoCmhy0weeb3/bRCDTQeMPHs7H99XO0jZz8MEwluxK/jCqdmopbT4VK0WyN6PwTxncncGp+UqfjQuJ6XQKM40cb1tILfhqoGfU97znRvJOuC4WSxCxzNNohwEnFnccvANozGos0O5JOQAAg== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(823301075)(10201501046)(3231344)(944501410)(52105095)(3002001)(93006095)(93001095)(6055026)(149027)(150027)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123562045)(20161123558120)(20161123560045)(20161123564045)(201708071742011)(7699016); SRVR:BN6PR04MB0386; BCL:0; PCL:0; RULEID:; SRVR:BN6PR04MB0386; X-Forefront-PRVS: 078693968A X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(366004)(39860400002)(346002)(396003)(376002)(136003)(199004)(189003)(44832011)(53936002)(6512007)(86362001)(5660300001)(97736004)(6346003)(48376002)(6666003)(2906002)(6916009)(50466002)(386003)(6506007)(72206003)(186003)(26005)(1076002)(478600001)(36756003)(47776003)(66066001)(8676002)(16526019)(486006)(3846002)(68736007)(6486002)(6116002)(11346002)(956004)(2616005)(106356001)(105586002)(7736002)(2361001)(4326008)(16586007)(476003)(76176011)(81156014)(81166006)(316002)(54906003)(8936002)(50226002)(2351001)(52116002)(51416003)(25786009)(305945005)(14444005)(446003); DIR:OUT; SFP:1102; SCL:1; SRVR:BN6PR04MB0386; H:risc6-mainframe.int.fusionio.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX:1; Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Alistair.Francis@wdc.com; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BN6PR04MB0386; 23:NuyoGoHVtwBGvNNbfb1MzodlIeJIMPC7R213kQW9T?= EeDfFnuunG7Zvz4QSmvEx0o73Eaar+LmqL+ufPB2jf7zQcVgvVPWjdpxtzvKO2ZXs8/CWXSKpUWnMLP2GelM/V1wPrqwKt8xiPwsfgK49c78gacLB+wPKAOWJb2A7faARev9VmtLoYyOa5Vu3we1HMHuSMFcUinh3ljhAdHytfyDBZqDkbvFqIPmdkZLuB+MhKrqy9BlQaU9AUP68vQszba7mf1tzQLwLfC0+MC1Cznar3BTVCS0jvmvxEC1Wf+Bqul9Z0YelrrQyZFSGH3vFKxUbnnRlT6cUod+B+XiOee8h3zfbKgGTY3xyZ3HNSuD9D2+AHotEszYhr4pMTVIu+kK7M/1JraY4ydtfgIDF71JmyrHpZuprbb6gMjOpkfgULJyMeOkfh1YJlV+N++ybQADOX+vzX3BnKBGkLsYbC3oX07C+1Kc2gNDYOyY9a3zoqcCnc8TG96FGkkjT6o05hfxJ2b4g/mDJNNXk7kxPRadkZIDv/vJu95eCEmORYbawfoxfCCC4VJxDyzAUh8ixDvI93iGqVKzXHjzoltUIs3dkD/ta+lEGB2lV+uEanM1ENhPfxxuxLE0zBMqnBYM3EnT3W8Ub2sOIMk3TLfa9wJuo4jcaDZZEj1JHiPP2OYaNpweIvUbbSm9sj7Fn5LJdQmAOadQqC6bg6q5QzWmmCyHw0nmZYhVsf+CPszsXdlNKvEve4TfaZ05Lfao931pkiC7HmXi0pV1Lol6wcD3E5veb3z5Ks4N7RlyoekELyF0+mmOXf/JcQnZ/5C+v3HTzG9xc/sYbAGt6m/mLauIN6f7TSvLHwmHXsbm0QOjyrRxpyEXz3FjE2ZA+ULyrCSpsDPySH5jvzoifJYVhis5ZYyswUMHa/TjMnvTMxVrXXxN9CVixMVPw8JjfdP6B6nmGMUsNmWVjcCcTuOF/+XfNgW3LPUg67kEf5SFwl/7vTt+AJOY7MAGGxX1Oy/7GXT45GdNzfnRsMoFc+/94hv9cWifVp/4Cl6zGY9sFRNyu45dYwfSHRYNCbsl9d+BiEbwGcBrvvkYkE5fhHgriUfZyQ2on8+UmuzoXOVQag/FMrW8JHlmwPiBW8bsNfL89rDq+X9tqyOvJpKCWfIArsaLdStqjFcZjeTixux59DFei9a7IQgy3hrlpzax+x7UoiXWEk4/XL7xLzJOdNmw/s3SReuiBGoynCTECppbUDFRW5VO76Kp8aaexSnzyyg0MQMaYE4OwneuF3173iFD7feYSH/qqqbuoQ6WftmL52GA4tKVw2O2Rt4c5I9L2AcImo27bLM X-Microsoft-Antispam-Message-Info: xd1eui3BrO77APQQ0E2JYrLFdO71A129H/baMlttwDh4AsINOgdz/Gd/XjLtEfJdNZ2kp1wcAXO+HzCGFUz1IF8uwwOK1S8BjRjt8UON2kWxmsKbBq3fYHvzNzUdmg3uV6ChkGUnCgQDS+qWF9fgYOJ3xLdLMLTQ6D9OsPfpUWuqA7JnuylmG2dLIk0xqnKUSNAvLnGjhTimoGIw0spc1gP7P6IJI1Y0nlTQK1Fp0UV73I1zuoqZ8foujt2sNNk+wQ8gVUaDvEmJqEmAmE5RozOrOo0PQaTC6L16G8oZ2ldbmKmNE/He13kqtN7j9THSv+uf7cPS+Yd10vD1S4riTVkyj+4Ib7Kw/kRL3NjBDSQ= X-Microsoft-Exchange-Diagnostics: 1; BN6PR04MB0386; 6:eUYLIyAsSozWItPT0fl6Y+Afw2spgXRThkP4pLdNG034pROgKV85nVY0EXg3Ernl6ZRNh71okuAF6V2gJxfQzhFsKY2noAv8S1kVSTNnfS8rvMRNNQMlBiV0ktN6cOyVYrAisFUX2MFFUFRUZmcErxE2KKNhBZaqe9DecSlzBhfBRsEYYjNRl252SCvTAxG8V7Q5Nrj+s8jRXVaDnJ6ANArWVrhn9hjX2EgPwlbPL2D5foEufS464Dm4eErnGY0o9lu1eXjfDKd/HsgRoSgo6OnKcgN4lZUyMrHqC6LdGUxCrHaDW/hCWz2cZ0ucfTQ83fScSQmr0w5jReekoiM1OkfILREoS4A0YhqAJtH8FOJ2eY6VoAP7cz1KgAeVRGbm0HUNnSmKbrtiZV9tbfaj/fGvZvee050yPST5mEj1MmsZ51VCBYA1q4goTqPqdIzPuXR+ZxRjTh5doMbO/N3BuQ==; 5:sSUz9U/rwkmgUVQThbUle/RRoGS6uBtA+/TdynKMVAwxVWgWJwkiYE7buRc28kaj714D+Kvv+f91MlR6GdNQnsx8gI1+WxTW0hriyaJFcjsV/xxcClh95z5pu9kIsYnbhkdHtBSbmzORGTFA5TKZbn01Ta7GoZ86858SkYQAtCY=; 7:5wAwzXqR1UfHADicSvqh3czdZQlZKAa/C0IelxN5jsgTtnKyv4tdXxR/yrvD5jeQl8TpY4ZFEpGnPoj0k0XCrxhm8FTUlecJqzjfV4g+UE2rl3yAf+wEyJzGrJUEXlfGpYuf5tJ9ZfDDrih6+QbUYJh9TC017NJdshkUkx7Jj6OELFm4Lt+4ElOXwMNY4vebKmhWVdXAGqRGEWEiGjuD3JAs6j6jRehi79q7RKXkM9uxkbcBL/leagOp2rtXa+kY SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: wdc.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Sep 2018 22:09:51.0663 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 16558791-1ac4-4e46-bcb7-08d6137c50a5 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: b61c8803-16f3-4c35-9b17-6f65f441df86 X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN6PR04MB0386 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 216.71.154.42 Subject: [Qemu-devel] [PULL v2 02/10] RISC-V: Improve page table walker spec compliance X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Bastian Koppelmann , Alistair Francis , Michael Clark , Palmer Dabbelt , Sagar Karandikar Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP From: Michael Clark - Inline PTE_TABLE check for better readability - Change access checks from ternary operator to if - Improve readibility of User page U mode and SUM test - Disallow non U mode from fetching from User pages - Add reserved PTE flag check: W or W|X - Add misaligned PPN check - Set READ protection for PTE X flag and mstatus.mxr - Use memory_region_is_ram in pte update Cc: Sagar Karandikar Cc: Bastian Koppelmann Cc: Palmer Dabbelt Cc: Alistair Francis Signed-off-by: Michael Clark Reviewed-by: Alistair Francis Signed-off-by: Alistair Francis --- target/riscv/cpu_bits.h | 2 -- target/riscv/helper.c | 64 +++++++++++++++++++++++++++++------------ 2 files changed, 45 insertions(+), 21 deletions(-) diff --git a/target/riscv/cpu_bits.h b/target/riscv/cpu_bits.h index 64aa097181..12b4757088 100644 --- a/target/riscv/cpu_bits.h +++ b/target/riscv/cpu_bits.h @@ -407,5 +407,3 @@ #define PTE_SOFT 0x300 /* Reserved for Software */ #define PTE_PPN_SHIFT 10 - -#define PTE_TABLE(PTE) (((PTE) & (PTE_V | PTE_R | PTE_W | PTE_X)) == PTE_V) diff --git a/target/riscv/helper.c b/target/riscv/helper.c index 29e1a603dc..1f0527e07f 100644 --- a/target/riscv/helper.c +++ b/target/riscv/helper.c @@ -185,16 +185,39 @@ restart: #endif target_ulong ppn = pte >> PTE_PPN_SHIFT; - if (PTE_TABLE(pte)) { /* next level of page table */ + if (!(pte & PTE_V)) { + /* Invalid PTE */ + return TRANSLATE_FAIL; + } else if (!(pte & (PTE_R | PTE_W | PTE_X))) { + /* Inner PTE, continue walking */ base = ppn << PGSHIFT; - } else if ((pte & PTE_U) ? (mode == PRV_S) && !sum : !(mode == PRV_S)) { - break; - } else if (!(pte & PTE_V) || (!(pte & PTE_R) && (pte & PTE_W))) { - break; - } else if (access_type == MMU_INST_FETCH ? !(pte & PTE_X) : - access_type == MMU_DATA_LOAD ? !(pte & PTE_R) && - !(mxr && (pte & PTE_X)) : !((pte & PTE_R) && (pte & PTE_W))) { - break; + } else if ((pte & (PTE_R | PTE_W | PTE_X)) == PTE_W) { + /* Reserved leaf PTE flags: PTE_W */ + return TRANSLATE_FAIL; + } else if ((pte & (PTE_R | PTE_W | PTE_X)) == (PTE_W | PTE_X)) { + /* Reserved leaf PTE flags: PTE_W + PTE_X */ + return TRANSLATE_FAIL; + } else if ((pte & PTE_U) && ((mode != PRV_U) && + (!sum || access_type == MMU_INST_FETCH))) { + /* User PTE flags when not U mode and mstatus.SUM is not set, + or the access type is an instruction fetch */ + return TRANSLATE_FAIL; + } else if (!(pte & PTE_U) && (mode != PRV_S)) { + /* Supervisor PTE flags when not S mode */ + return TRANSLATE_FAIL; + } else if (ppn & ((1ULL << ptshift) - 1)) { + /* Misaligned PPN */ + return TRANSLATE_FAIL; + } else if (access_type == MMU_DATA_LOAD && !((pte & PTE_R) || + ((pte & PTE_X) && mxr))) { + /* Read access check failed */ + return TRANSLATE_FAIL; + } else if (access_type == MMU_DATA_STORE && !(pte & PTE_W)) { + /* Write access check failed */ + return TRANSLATE_FAIL; + } else if (access_type == MMU_INST_FETCH && !(pte & PTE_X)) { + /* Fetch access check failed */ + return TRANSLATE_FAIL; } else { /* if necessary, set accessed and dirty bits. */ target_ulong updated_pte = pte | PTE_A | @@ -202,16 +225,19 @@ restart: /* Page table updates need to be atomic with MTTCG enabled */ if (updated_pte != pte) { - /* if accessed or dirty bits need updating, and the PTE is - * in RAM, then we do so atomically with a compare and swap. - * if the PTE is in IO space, then it can't be updated. - * if the PTE changed, then we must re-walk the page table - as the PTE is no longer valid */ + /* + * - if accessed or dirty bits need updating, and the PTE is + * in RAM, then we do so atomically with a compare and swap. + * - if the PTE is in IO space or ROM, then it can't be updated + * and we return TRANSLATE_FAIL. + * - if the PTE changed by the time we went to update it, then + * it is no longer valid and we must re-walk the page table. + */ MemoryRegion *mr; hwaddr l = sizeof(target_ulong), addr1; mr = address_space_translate(cs->as, pte_addr, &addr1, &l, false, MEMTXATTRS_UNSPECIFIED); - if (memory_access_is_direct(mr, true)) { + if (memory_region_is_ram(mr)) { target_ulong *pte_pa = qemu_map_ram_ptr(mr->ram_block, addr1); #if TCG_OVERSIZED_GUEST @@ -239,15 +265,15 @@ restart: target_ulong vpn = addr >> PGSHIFT; *physical = (ppn | (vpn & ((1L << ptshift) - 1))) << PGSHIFT; - if ((pte & PTE_R)) { + /* set permissions on the TLB entry */ + if ((pte & PTE_R) || ((pte & PTE_X) && mxr)) { *prot |= PAGE_READ; } if ((pte & PTE_X)) { *prot |= PAGE_EXEC; } - /* only add write permission on stores or if the page - is already dirty, so that we don't miss further - page table walks to update the dirty bit */ + /* add write permission on stores or if the page is already dirty, + so that we TLB miss on later writes to update the dirty bit */ if ((pte & PTE_W) && (access_type == MMU_DATA_STORE || (pte & PTE_D))) { *prot |= PAGE_WRITE;