From nobody Sun May 5 10:40:10 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; arc=fail (BodyHash is different from the expected one) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1566482628547246.8085197891927; Thu, 22 Aug 2019 07:03:48 -0700 (PDT) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1i0nfZ-0006Tn-Va; Thu, 22 Aug 2019 14:02:29 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1i0nfY-0006Te-UI for xen-devel@lists.xenproject.org; Thu, 22 Aug 2019 14:02:29 +0000 Received: from EUR01-DB5-obe.outbound.protection.outlook.com (unknown [2a01:111:f400:fe02::703]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id 792ad7e4-c4e5-11e9-8980-bc764e2007e4; Thu, 22 Aug 2019 14:02:27 +0000 (UTC) Received: from AM7PR02MB5750.eurprd02.prod.outlook.com (10.141.171.8) by AM7PR02MB5781.eurprd02.prod.outlook.com (10.141.172.15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2178.16; Thu, 22 Aug 2019 14:02:25 +0000 Received: from AM7PR02MB5750.eurprd02.prod.outlook.com ([fe80::d422:432c:51e0:2d74]) by AM7PR02MB5750.eurprd02.prod.outlook.com ([fe80::d422:432c:51e0:2d74%4]) with mapi id 15.20.2178.020; Thu, 22 Aug 2019 14:02:25 +0000 X-Inumbo-ID: 792ad7e4-c4e5-11e9-8980-bc764e2007e4 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=jiJhj/xOAoremu6u9ESRReKtmnRY2+C7T76+tDamDRJlGJCnkqPBY4CiVpXdhCwwcy91zIjtB3aMLZcjouv8Ft/LQoOy7vIR0TMpwEcI/HFppoEH+cG/M6AJ2T3I0AzqmIrsR7KZdaK6xLlQu/et/VdnjYdX8XcnxXP7HdbgVP/4vxyEgOj1hXdaLRHu6qDNpGWbt+B6Fybhlhcl3+OZ61uXMtOiQZvKxsnZflwIN81MUdWetNLwOdW3yBwlOLMhXauHjGSNa0aLMWaxcFenfGLHmLtPPZ+S6g8Ir4U0ldc1GPSlHLVkGVtnz244iLKAGEFYXgcpxzueYzhMADvtew== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=rPALHPt1HIfgjmdF7S3+fMMnZ2QHXqky8WWp9AhT1MM=; b=YeMhU7dR1iWy9muXrzbZbHgP5+Hd9GYK1s/IBsSFGHZ2JoZTxXk/toYvqbc9uDGVS2fCOrSX7BL3u1kA4pv625nmwF3B9ozpX+lAtu9nIwmk0hjdGwWgmu8UGk9XYt6eIEh2615hTtdUmwNNDrSqa7JvvKYO0zZZhy03iqGuvevc6HkDUb9ziVFKYBQ6OYRXB3u+VlMl07ESuLdp7mB+4DudgK9t/NCfsaqdLb4nhATYzv5Yc9244ztZw7yvtC5vNWbCFKhIQ3XkEHL9TBesMq0X9ig2S0hLnkMq1lXVWPPFqOKuCilqyFMPCUSIP7+aRzzdzgRPdc7kf7OQIeRkTA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=bitdefender.com; dmarc=pass action=none header.from=bitdefender.com; dkim=pass header.d=bitdefender.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bitdefender.onmicrosoft.com; s=selector2-bitdefender-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=rPALHPt1HIfgjmdF7S3+fMMnZ2QHXqky8WWp9AhT1MM=; b=CzUdvZ8rwJXY/zhH5z+d0yVSpbs4k0yas6lts4oiuJhEmMaECwgGiTiI2VPAcT7ohpgda+K+fXto7SEBx2TD98lZd3PzbMPD+EeJvQDnYCLEoMi4qskeVv1+iC2Cei8+7D9+zCHlZT5WdSFzyHTdsDvE69z5TiMvTFF7DOtHWks= From: Alexandru Stefan ISAILA To: "xen-devel@lists.xenproject.org" Thread-Topic: [PATCH v2] x86/mm: Add mem access rights to NPT Thread-Index: AQHVWPI5B/wD3XiZaECvNX3mnheiUA== Date: Thu, 22 Aug 2019 14:02:24 +0000 Message-ID: <20190822140210.24749-1-aisaila@bitdefender.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-clientproxiedby: PR0P264CA0113.FRAP264.PROD.OUTLOOK.COM (2603:10a6:100:19::29) To AM7PR02MB5750.eurprd02.prod.outlook.com (2603:10a6:20b:102::8) authentication-results: spf=none (sender IP is ) smtp.mailfrom=aisaila@bitdefender.com; x-ms-exchange-messagesentrepresentingtype: 1 x-mailer: git-send-email 2.17.1 x-originating-ip: [91.199.104.6] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 74e52043-aa7b-481c-e763-08d727095bf9 x-microsoft-antispam: BCL:0; PCL:0; RULEID:(2390118)(7020095)(4652040)(8989299)(5600166)(711020)(4605104)(1401327)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(2017052603328)(7193020); SRVR:AM7PR02MB5781; x-ms-traffictypediagnostic: AM7PR02MB5781:|AM7PR02MB5781: x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:8273; x-forefront-prvs: 01371B902F x-forefront-antispam-report: SFV:NSPM; SFS:(10019020)(396003)(346002)(376002)(366004)(136003)(39860400002)(199004)(189003)(316002)(2906002)(52116002)(7416002)(5660300002)(8936002)(66446008)(66556008)(64756008)(6916009)(486006)(6512007)(66946007)(8676002)(66476007)(6436002)(5640700003)(81156014)(4326008)(54906003)(50226002)(66066001)(81166006)(25786009)(102836004)(2351001)(36756003)(53936002)(305945005)(99286004)(30864003)(1076003)(476003)(14444005)(6506007)(386003)(2501003)(256004)(2616005)(478600001)(86362001)(6486002)(26005)(186003)(14454004)(7736002)(3846002)(6116002)(71190400001)(71200400001)(21314003); DIR:OUT; SFP:1102; SCL:1; SRVR:AM7PR02MB5781; H:AM7PR02MB5750.eurprd02.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX:1; Received-SPF: none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; received-spf: None (protection.outlook.com: bitdefender.com does not designate permitted sender hosts) x-ms-exchange-senderadcheck: 1 x-microsoft-antispam-message-info: ZouNzKdNJ3M7mreS/Ng9zhmyS4SW8c5Kzasw7/tW4R7ITva4rbrhnMwNdQajuqziLA5Y6QHLeK3tyaUtz/5451cHG9IZ6INUMncCb6EXTmACHbdg81t2xWF49qb5heH2AiWR8OSQyBS9tQwYR2emxqtI9Dk/R3oOkLApPNmtMj7Ll+lLBT2a8XFKmLSDE/6JJEYpvkqMApFOjgfZDBew7yUSpbC04aU6427u7mS1Lr4+okYT7fttr5chmRZXy3gis9m61dyy1kRUgp0L2G/zTXyC9O9pqHYZZyvRDcOQLw7/bqlbZQP2T/5sO25MAUISApPer8vteDMipK2aGwcgJLFgCEPeBhybMYHhOVjwI6CHPBcci0dv0PrdgTSujL7m13C9mnRtxpa2Hcs9RFOMW4tfkPLN19thNr1qzo9819U= MIME-Version: 1.0 X-OriginatorOrg: bitdefender.com X-MS-Exchange-CrossTenant-Network-Message-Id: 74e52043-aa7b-481c-e763-08d727095bf9 X-MS-Exchange-CrossTenant-originalarrivaltime: 22 Aug 2019 14:02:24.9399 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 487baf29-f1da-469a-9221-243f830c36f3 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: PgLIRFS7hNPSW5IpqC1c8LYwbUDseuhZ3VdWYqjPb2wTW566cr0p5tNiSND1xuLU0+aMYGn0sxRvR1Fc3jL6VSxpG7kzjmmAGnlNbUR1X4Y= X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM7PR02MB5781 Subject: [Xen-devel] [PATCH v2] x86/mm: Add mem access rights to NPT X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Petre Ovidiu PIRCALABU , "kevin.tian@intel.com" , "tamas@tklengyel.com" , "wl@xen.org" , "rcojocaru@bitdefender.com" , "george.dunlap@eu.citrix.com" , "andrew.cooper3@citrix.com" , George Dunlap , Alexandru Stefan ISAILA , "jbeulich@suse.com" , "jun.nakajima@intel.com" , "roger.pau@citrix.com" Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) This patch adds access control for NPT mode. The access rights are stored in the NPT p2m table 56:53. The bits are free after clearing the IOMMU flags [1]. Modify p2m_type_to_flags() to accept and interpret an access value, parallel to the ept code. Add a set_default_access() method to the p2m-pt and p2m-ept versions of the p2m rather than setting it directly, to deal with different default permitted access values. [1] 854a49a7486a02edae5b3e53617bace526e9c1b1 Signed-off-by: Alexandru Isaila Signed-off-by: George Dunlap --- Note: Tested with xen-access write/exec Changes since V1: - Remove radix tree and store access bits in NPT p2m table. --- xen/arch/x86/mm/mem_access.c | 7 +-- xen/arch/x86/mm/p2m-ept.c | 9 +++ xen/arch/x86/mm/p2m-pt.c | 111 ++++++++++++++++++++++++++++++----- xen/include/asm-x86/p2m.h | 2 + 4 files changed, 109 insertions(+), 20 deletions(-) diff --git a/xen/arch/x86/mm/mem_access.c b/xen/arch/x86/mm/mem_access.c index 0144f92b98..d8cc7a50de 100644 --- a/xen/arch/x86/mm/mem_access.c +++ b/xen/arch/x86/mm/mem_access.c @@ -374,10 +374,7 @@ long p2m_set_mem_access(struct domain *d, gfn_t gfn, u= int32_t nr, =20 /* If request to set default access. */ if ( gfn_eq(gfn, INVALID_GFN) ) - { - p2m->default_access =3D a; - return 0; - } + return p2m->set_default_access(p2m, a); =20 p2m_lock(p2m); if ( ap2m ) @@ -520,7 +517,7 @@ void arch_p2m_set_access_required(struct domain *d, boo= l access_required) =20 bool p2m_mem_access_sanity_check(const struct domain *d) { - return is_hvm_domain(d) && cpu_has_vmx && hap_enabled(d); + return is_hvm_domain(d) && hap_enabled(d); } =20 /* diff --git a/xen/arch/x86/mm/p2m-ept.c b/xen/arch/x86/mm/p2m-ept.c index 6b8468c793..a6f2347bc1 100644 --- a/xen/arch/x86/mm/p2m-ept.c +++ b/xen/arch/x86/mm/p2m-ept.c @@ -624,6 +624,14 @@ bool_t ept_handle_misconfig(uint64_t gpa) return spurious ? (rc >=3D 0) : (rc > 0); } =20 +int ept_set_default_access(struct p2m_domain *p2m, p2m_access_t p2ma) +{ + /* All access is permitted */ + p2m->default_access =3D p2ma; + =20 + return 0; +} + /* * ept_set_entry() computes 'need_modify_vtd_table' for itself, * by observing whether any gfn->mfn translations are modified. @@ -1222,6 +1230,7 @@ int ept_p2m_init(struct p2m_domain *p2m) p2m->change_entry_type_global =3D ept_change_entry_type_global; p2m->change_entry_type_range =3D ept_change_entry_type_range; p2m->memory_type_changed =3D ept_memory_type_changed; + p2m->set_default_access =3D ept_set_default_access; p2m->audit_p2m =3D NULL; p2m->tlb_flush =3D ept_tlb_flush; =20 diff --git a/xen/arch/x86/mm/p2m-pt.c b/xen/arch/x86/mm/p2m-pt.c index 3a0a500d66..7f79eac979 100644 --- a/xen/arch/x86/mm/p2m-pt.c +++ b/xen/arch/x86/mm/p2m-pt.c @@ -63,10 +63,13 @@ #define needs_recalc(level, ent) _needs_recalc(level##e_get_flags(ent)) #define valid_recalc(level, ent) (!(level##e_get_flags(ent) & _PAGE_ACCESS= ED)) =20 +#define _PAGE_ACCESS_BITS (0x1e00) /* mem_access rights 16:13 */ + static unsigned long p2m_type_to_flags(const struct p2m_domain *p2m, p2m_type_t t, mfn_t mfn, - unsigned int level) + unsigned int level, + p2m_access_t access) { unsigned long flags =3D (unsigned long)(t & 0x7f) << 12; =20 @@ -79,23 +82,28 @@ static unsigned long p2m_type_to_flags(const struct p2m= _domain *p2m, case p2m_ram_paged: case p2m_ram_paging_in: default: - return flags | _PAGE_NX_BIT; + flags |=3D _PAGE_NX_BIT; + break; case p2m_grant_map_ro: - return flags | P2M_BASE_FLAGS | _PAGE_NX_BIT; + flags |=3D P2M_BASE_FLAGS | _PAGE_NX_BIT; + break; case p2m_ioreq_server: flags |=3D P2M_BASE_FLAGS | _PAGE_RW | _PAGE_NX_BIT; if ( p2m->ioreq.flags & XEN_DMOP_IOREQ_MEM_ACCESS_WRITE ) - return flags & ~_PAGE_RW; - return flags; + flags &=3D ~_PAGE_RW; + break; case p2m_ram_ro: case p2m_ram_logdirty: case p2m_ram_shared: - return flags | P2M_BASE_FLAGS; + flags |=3D P2M_BASE_FLAGS; + break; case p2m_ram_rw: - return flags | P2M_BASE_FLAGS | _PAGE_RW; + flags |=3D P2M_BASE_FLAGS | _PAGE_RW; + break; case p2m_grant_map_rw: case p2m_map_foreign: - return flags | P2M_BASE_FLAGS | _PAGE_RW | _PAGE_NX_BIT; + flags |=3D P2M_BASE_FLAGS | _PAGE_RW | _PAGE_NX_BIT; + break; case p2m_mmio_direct: if ( !rangeset_contains_singleton(mmio_ro_ranges, mfn_x(mfn)) ) flags |=3D _PAGE_RW; @@ -104,8 +112,32 @@ static unsigned long p2m_type_to_flags(const struct p2= m_domain *p2m, flags |=3D _PAGE_PWT; ASSERT(!level); } - return flags | P2M_BASE_FLAGS | _PAGE_PCD; + flags |=3D P2M_BASE_FLAGS | _PAGE_PCD; + break; } + + switch ( access ) + { + case p2m_access_r: + flags |=3D _PAGE_NX_BIT; + flags &=3D ~_PAGE_RW; + break; + case p2m_access_rw: + flags |=3D _PAGE_NX_BIT; + break; + case p2m_access_rx: + case p2m_access_rx2rw: + flags &=3D ~(_PAGE_NX_BIT | _PAGE_RW); + break; + case p2m_access_x: + flags &=3D ~_PAGE_RW; + break; + case p2m_access_rwx: + default: + break; + } + + return flags; } =20 =20 @@ -152,6 +184,17 @@ p2m_free_entry(struct p2m_domain *p2m, l1_pgentry_t *p= 2m_entry, int page_order) p2m_free_ptp(p2m, l1e_get_page(*p2m_entry)); } =20 +static void p2m_set_access(intpte_t *entry, p2m_access_t access) +{ + *entry |=3D put_pte_flags((get_pte_flags(*entry) & ~_PAGE_ACCESS_BITS)= | + (MASK_INSR(access, _PAGE_ACCESS_BITS))); +} + +static p2m_access_t p2m_get_access(intpte_t entry) +{ + return (p2m_access_t)(MASK_EXTR(get_pte_flags(entry), _PAGE_ACCESS_BIT= S)); +} + // Walk one level of the P2M table, allocating a new table if required. // Returns 0 on error. // @@ -226,6 +269,7 @@ p2m_next_level(struct p2m_domain *p2m, void **table, { new_entry =3D l1e_from_pfn(pfn | (i << ((level - 1) * PAGETABL= E_ORDER)), flags); + p2m_set_access(&new_entry.l1, p2m->default_access); rc =3D p2m->write_p2m_entry(p2m, gfn, l1_entry + i, new_entry,= level); if ( rc ) { @@ -237,6 +281,7 @@ p2m_next_level(struct p2m_domain *p2m, void **table, unmap_domain_page(l1_entry); =20 new_entry =3D l1e_from_mfn(mfn, P2M_BASE_FLAGS | _PAGE_RW); + p2m_set_access(&new_entry.l1, p2m->default_access); rc =3D p2m->write_p2m_entry(p2m, gfn, p2m_entry, new_entry, level + 1); if ( rc ) @@ -425,8 +470,9 @@ static int do_recalc(struct p2m_domain *p2m, unsigned l= ong gfn) if ( nt !=3D ot ) { unsigned long mfn =3D l1e_get_pfn(e); + p2m_access_t a =3D p2m_get_access(e.l1); unsigned long flags =3D p2m_type_to_flags(p2m, nt, - _mfn(mfn), level); + _mfn(mfn), level, a); =20 if ( level ) { @@ -474,6 +520,32 @@ int p2m_pt_handle_deferred_changes(uint64_t gpa) return rc; } =20 +static int p2m_pt_check_access(p2m_access_t p2ma) +{ + switch ( p2ma ) + { + case p2m_access_n: + case p2m_access_w: + case p2m_access_wx: + case p2m_access_n2rwx: + return -EINVAL; + default: + break; + } + return 0; +} + +static int p2m_pt_set_default_access(struct p2m_domain *p2m, + p2m_access_t p2ma) +{ + int rc =3D p2m_pt_check_access(p2ma); + + if ( !rc ) + p2m->default_access =3D p2ma; + + return rc; +} + /* Checks only applicable to entries with order > PAGE_ORDER_4K */ static void check_entry(mfn_t mfn, p2m_type_t new, p2m_type_t old, unsigned int order) @@ -514,6 +586,9 @@ p2m_pt_set_entry(struct p2m_domain *p2m, gfn_t gfn_, mf= n_t mfn, if ( !sve ) return -EOPNOTSUPP; =20 + if ( (rc =3D p2m_pt_check_access(p2ma)) ) + return rc; + if ( tb_init_done ) { struct { @@ -564,10 +639,11 @@ p2m_pt_set_entry(struct p2m_domain *p2m, gfn_t gfn_, = mfn_t mfn, check_entry(mfn, p2mt, p2m_flags_to_type(flags), page_order); l3e_content =3D mfn_valid(mfn) || p2m_allows_invalid_mfn(p2mt) ? p2m_l3e_from_pfn(mfn_x(mfn), - p2m_type_to_flags(p2m, p2mt, mfn, 2)) + p2m_type_to_flags(p2m, p2mt, mfn, 2, p2ma)) : l3e_empty(); entry_content.l1 =3D l3e_content.l3; =20 + p2m_set_access(&entry_content.l1, p2ma); rc =3D p2m->write_p2m_entry(p2m, gfn, p2m_entry, entry_content, 3); /* NB: paging_write_p2m_entry() handles tlb flushes properly */ if ( rc ) @@ -597,10 +673,11 @@ p2m_pt_set_entry(struct p2m_domain *p2m, gfn_t gfn_, = mfn_t mfn, =20 if ( mfn_valid(mfn) || p2m_allows_invalid_mfn(p2mt) ) entry_content =3D p2m_l1e_from_pfn(mfn_x(mfn), - p2m_type_to_flags(p2m, p2mt, mfn,= 0)); + p2m_type_to_flags(p2m, p2mt, mfn,= 0, p2ma)); else entry_content =3D l1e_empty(); =20 + p2m_set_access(&entry_content.l1, p2ma); /* level 1 entry */ rc =3D p2m->write_p2m_entry(p2m, gfn, p2m_entry, entry_content, 1); /* NB: paging_write_p2m_entry() handles tlb flushes properly */ @@ -625,10 +702,11 @@ p2m_pt_set_entry(struct p2m_domain *p2m, gfn_t gfn_, = mfn_t mfn, check_entry(mfn, p2mt, p2m_flags_to_type(flags), page_order); l2e_content =3D mfn_valid(mfn) || p2m_allows_invalid_mfn(p2mt) ? p2m_l2e_from_pfn(mfn_x(mfn), - p2m_type_to_flags(p2m, p2mt, mfn, 1)) + p2m_type_to_flags(p2m, p2mt, mfn, 1, p2ma)) : l2e_empty(); entry_content.l1 =3D l2e_content.l2; =20 + p2m_set_access(&entry_content.l1, p2ma); rc =3D p2m->write_p2m_entry(p2m, gfn, p2m_entry, entry_content, 2); /* NB: paging_write_p2m_entry() handles tlb flushes properly */ if ( rc ) @@ -676,8 +754,7 @@ p2m_pt_get_entry(struct p2m_domain *p2m, gfn_t gfn_, * XXX Once we start explicitly registering MMIO regions in the p2m=20 * XXX we will return p2m_invalid for unmapped gfns */ *t =3D p2m_mmio_dm; - /* Not implemented except with EPT */ - *a =3D p2m_access_rwx;=20 + *a =3D p2m_access_n; =20 if ( gfn > p2m->max_mapped_pfn ) { @@ -740,6 +817,7 @@ pod_retry_l3: l1_table_offset(addr)); *t =3D p2m_recalc_type(recalc || _needs_recalc(flags), p2m_flags_to_type(flags), p2m, gfn); + *a =3D p2m_get_access(l3e->l3); unmap_domain_page(l3e); =20 ASSERT(mfn_valid(mfn) || !p2m_is_ram(*t)); @@ -779,6 +857,7 @@ pod_retry_l2: mfn =3D _mfn(l2e_get_pfn(*l2e) + l1_table_offset(addr)); *t =3D p2m_recalc_type(recalc || _needs_recalc(flags), p2m_flags_to_type(flags), p2m, gfn); + *a =3D p2m_get_access(l2e->l2); unmap_domain_page(l2e); =20 ASSERT(mfn_valid(mfn) || !p2m_is_ram(*t)); @@ -815,6 +894,7 @@ pod_retry_l1: } mfn =3D l1e_get_mfn(*l1e); *t =3D p2m_recalc_type(recalc || _needs_recalc(flags), l1t, p2m, gfn); + *a =3D p2m_get_access(l1e->l1); unmap_domain_page(l1e); =20 ASSERT(mfn_valid(mfn) || !p2m_is_any_ram(*t) || p2m_is_paging(*t)); @@ -1063,6 +1143,7 @@ void p2m_pt_init(struct p2m_domain *p2m) p2m->change_entry_type_global =3D p2m_pt_change_entry_type_global; p2m->change_entry_type_range =3D p2m_pt_change_entry_type_range; p2m->write_p2m_entry =3D paging_write_p2m_entry; + p2m->set_default_access =3D p2m_pt_set_default_access; #if P2M_AUDIT p2m->audit_p2m =3D p2m_pt_audit_p2m; #else diff --git a/xen/include/asm-x86/p2m.h b/xen/include/asm-x86/p2m.h index 94285db1b4..32e71067b7 100644 --- a/xen/include/asm-x86/p2m.h +++ b/xen/include/asm-x86/p2m.h @@ -269,6 +269,8 @@ struct p2m_domain { unsigned long gfn, l1_pgentry_t = *p, l1_pgentry_t new, unsigned int l= evel); long (*audit_p2m)(struct p2m_domain *p2m); + int (*set_default_access)(struct p2m_domain *p2m, + p2m_access_t p2ma); =20 /* * P2M updates may require TLBs to be flushed (invalidated). --=20 2.17.1 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel