Received: by 2002:ac0:a591:0:0:0:0:0 with SMTP id m17-v6csp682209imm; Thu, 5 Jul 2018 07:13:13 -0700 (PDT) X-Google-Smtp-Source: AAOMgpewWxPz0D/JUJpm+4SH/DeEmnUuGifQU48tE2KCwJGxlfo7BiAErxF/LxFmy7LdBbTDl3jY X-Received: by 2002:a63:b349:: with SMTP id x9-v6mr5802374pgt.337.1530799993373; Thu, 05 Jul 2018 07:13:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1530799993; cv=none; d=google.com; s=arc-20160816; b=HcJESVLLOdKPwNBgGt5jzA6OHW+RrUNQ041m8/sF5jVcZolkmoY7oxnGiZSbOhKvU0 gmWypMOztwRJzGhyZfZjIuojjA8UB7IECzEJz05+7rSM6zryvazmGwDFr13+JN/3zfdI w9XCon95u1HbftyYCowKyE4BegwFd+Kituk4IaJTO4ZCv8EjFdFBxRUIHDWi45N9NIje dNg5jbFzbGG+vE8xqLkb32X4A5YUGWFIK+66NfEbSGtEbsiVDD98S6escRTOlXwAbZy2 pq1QIWtmbK9GsIqTUCq+bxxrQMx9tqavgTdOFr2Kc78gCJio8gVPDV8uUrZ/Ge5CpzQ7 b6OQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=5hFlXDpuE2pWUpA1GAZTmR7qMkvJll1VYQrarAXwsM8=; b=LF+9Xk3J9oKTqAqslc810gKFFxWMN51oxkzKWQAKg6xqlmUqImvq63YmMgNiJcVLMb aWlG4SHcIBcGl18Zy+Iwv6rINgdyevYql0zwO+JGNxWr6tiI9wQbY445ManyPPvAkSpH +VECCKwGeN2X91Us8DIL1Vt26iEBJlSyPxjgkH/ijlPgr/UUK4khc5/926JmnCunGMM8 NR6pRekVYW9uq8HPiKgHD6Xa3RBp9T+NY//mm8bTbeXB6GO1S8fLSHlZxHCaw9rdmzCB rrHpD2pDLN0+o5heHAZJdRNq0Z1K26wS1OL2C7nEZt0wLmRDdxYRzGpM9Y6O+X+fS1QN FQMg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id j72-v6si6497408pfe.187.2018.07.05.07.12.58; Thu, 05 Jul 2018 07:13:13 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753956AbeGEOJr (ORCPT + 99 others); Thu, 5 Jul 2018 10:09:47 -0400 Received: from usa-sjc-mx-foss1.foss.arm.com ([217.140.101.70]:50294 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753449AbeGEOJo (ORCPT ); Thu, 5 Jul 2018 10:09:44 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 940F780D; Thu, 5 Jul 2018 07:09:43 -0700 (PDT) Received: from localhost (e105922-lin.cambridge.arm.com [10.1.206.33]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 157F33F5BA; Thu, 5 Jul 2018 07:09:42 -0700 (PDT) From: Punit Agrawal To: kvmarm@lists.cs.columbia.edu Cc: Punit Agrawal , linux-arm-kernel@lists.infradead.org, marc.zyngier@arm.com, christoffer.dall@arm.com, linux-kernel@vger.kernel.org, suzuki.poulose@arm.com, Russell King , Catalin Marinas , Will Deacon Subject: [PATCH v4 4/7] KVM: arm64: Support PUD hugepage in stage2_is_exec() Date: Thu, 5 Jul 2018 15:08:47 +0100 Message-Id: <20180705140850.5801-5-punit.agrawal@arm.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180705140850.5801-1-punit.agrawal@arm.com> References: <20180705140850.5801-1-punit.agrawal@arm.com> X-ARM-No-Footer: FoSSMail Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In preparation for creating PUD hugepages at stage 2, add support for detecting execute permissions on PUD page table entries. Faults due to lack of execute permissions on page table entries is used to perform i-cache invalidation on first execute. Provide trivial implementations of arm32 helpers to allow sharing of code. Signed-off-by: Punit Agrawal Cc: Christoffer Dall Cc: Marc Zyngier Cc: Russell King Cc: Catalin Marinas Cc: Will Deacon --- arch/arm/include/asm/kvm_mmu.h | 6 ++++++ arch/arm64/include/asm/kvm_mmu.h | 5 +++++ arch/arm64/include/asm/pgtable-hwdef.h | 2 ++ virt/kvm/arm/mmu.c | 10 +++++++++- 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/arch/arm/include/asm/kvm_mmu.h b/arch/arm/include/asm/kvm_mmu.h index c23722f75d5c..d05c8986e495 100644 --- a/arch/arm/include/asm/kvm_mmu.h +++ b/arch/arm/include/asm/kvm_mmu.h @@ -96,6 +96,12 @@ static inline bool kvm_s2pud_readonly(pud_t *pud) } +static inline bool kvm_s2pud_exec(pud_t *pud) +{ + BUG(); + return false; +} + static inline void kvm_set_pmd(pmd_t *pmd, pmd_t new_pmd) { *pmd = new_pmd; diff --git a/arch/arm64/include/asm/kvm_mmu.h b/arch/arm64/include/asm/kvm_mmu.h index 84051930ddfe..15bc1be8f82f 100644 --- a/arch/arm64/include/asm/kvm_mmu.h +++ b/arch/arm64/include/asm/kvm_mmu.h @@ -249,6 +249,11 @@ static inline bool kvm_s2pud_readonly(pud_t *pudp) return kvm_s2pte_readonly((pte_t *)pudp); } +static inline bool kvm_s2pud_exec(pud_t *pudp) +{ + return !(READ_ONCE(pud_val(*pudp)) & PUD_S2_XN); +} + static inline bool kvm_page_empty(void *ptr) { struct page *ptr_page = virt_to_page(ptr); diff --git a/arch/arm64/include/asm/pgtable-hwdef.h b/arch/arm64/include/asm/pgtable-hwdef.h index fd208eac9f2a..10ae592b78b8 100644 --- a/arch/arm64/include/asm/pgtable-hwdef.h +++ b/arch/arm64/include/asm/pgtable-hwdef.h @@ -193,6 +193,8 @@ #define PMD_S2_RDWR (_AT(pmdval_t, 3) << 6) /* HAP[2:1] */ #define PMD_S2_XN (_AT(pmdval_t, 2) << 53) /* XN[1:0] */ +#define PUD_S2_XN (_AT(pudval_t, 2) << 53) /* XN[1:0] */ + /* * Memory Attribute override for Stage-2 (MemAttr[3:0]) */ diff --git a/virt/kvm/arm/mmu.c b/virt/kvm/arm/mmu.c index db04b18218c1..ccdea0edabb3 100644 --- a/virt/kvm/arm/mmu.c +++ b/virt/kvm/arm/mmu.c @@ -1040,10 +1040,18 @@ static int stage2_set_pmd_huge(struct kvm *kvm, struct kvm_mmu_memory_cache static bool stage2_is_exec(struct kvm *kvm, phys_addr_t addr) { + pud_t *pudp; pmd_t *pmdp; pte_t *ptep; - pmdp = stage2_get_pmd(kvm, NULL, addr); + pudp = stage2_get_pud(kvm, NULL, addr); + if (!pudp || pud_none(*pudp) || !pud_present(*pudp)) + return false; + + if (pud_huge(*pudp)) + return kvm_s2pud_exec(pudp); + + pmdp = stage2_pmd_offset(pudp, addr); if (!pmdp || pmd_none(*pmdp) || !pmd_present(*pmdp)) return false; -- 2.17.1