Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp907834imu; Tue, 11 Dec 2018 09:22:44 -0800 (PST) X-Google-Smtp-Source: AFSGD/U3gYxgKPJInlOHL1watYH5VBPO/zAOfaoMEZDLzIanlp/ui/9GO7JO4xxtss6u1YEODEAk X-Received: by 2002:a62:c583:: with SMTP id j125mr17268561pfg.37.1544548964351; Tue, 11 Dec 2018 09:22:44 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1544548964; cv=none; d=google.com; s=arc-20160816; b=CeBYqTTqSMmZW2JGWP7ff9c4L52tiJ8rRqx5oBRm2LLM+h4E3J6/FySCy87DhO4S19 80FP1oxk81nZiqFnW1EU5QviEMCuMXB/O3ibZxAR3IwCU75Li1Z09+NIJSIz0knZ7ir5 EjaxvWi2XbfcjiMQPoXGE8XK0nwBY8LgbYATjyQURUtO6tPdEGvlVcThpSs8hWEdO/ao t+/NYmD/d0S88LeVX7nG5LCHlZhm170br+6jroPqAc4sPNmjCYI/LHbz/FKZQKDwsZ07 wKQhkL2Xa1MFWZBks4QLS51Rfkj3KMmW/BvOL7kmyYCuZx3MQfdKxKsNKKLvWlDdJy3j 58tg== 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; bh=rWHuAXT5Bvz9ygBxhgJU4d9PWWRBNirbw9QWAQnN4OU=; b=EXjsVT3bTKUcQJtuaLvf9g3uRVv8u35NO8WUlxvihR5/nXlzBqUB7HRKBm9IRBF3dP Ro+H4h3prDkrskS1ssBkHJllJYtATwo415sjA0l0hbMEfauMq2IV0UmrTiwMYO7hWoMv Gd4GHYryNFvsTVwzF6xrQh3d87sPqifsH4ZbCWcaSkNJdZTI8RbhBV7HfYnkhdrt1FPK qcSaKbTRl4aIa4f5Gs/2nJyr9dJDn1n7XVFnR7PSkjyva1eoWWdSZmY23wkxdEizlg8q q+VzawDGEsyjgHvSgOqeXcdamnt63WwFWj5Inz7MjNXZfTGeLebgh4qg3cuJSJKYHPa4 Se6A== 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 e17si12242298pgj.142.2018.12.11.09.22.29; Tue, 11 Dec 2018 09:22:44 -0800 (PST) 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 S1727697AbeLKRMM (ORCPT + 99 others); Tue, 11 Dec 2018 12:12:12 -0500 Received: from foss.arm.com ([217.140.101.70]:53564 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727535AbeLKRMK (ORCPT ); Tue, 11 Dec 2018 12:12:10 -0500 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 2C6FC165C; Tue, 11 Dec 2018 09:12:10 -0800 (PST) Received: from en101.cambridge.arm.com (en101.cambridge.arm.com [10.1.196.93]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 609C53F6A8; Tue, 11 Dec 2018 09:12:08 -0800 (PST) From: Suzuki K Poulose To: linux-arm-kernel@lists.infradead.org Cc: suzuki.poulose@arm.com, linux-kernel@vger.kernel.org, kvmarm@lists.cs.columbia.edu, kvm@vger.kernel.org, marc.zyngier@arm.com, christoffer.dall@arm.com, will.deacon@arm.com, catalin.marinas@arm.com, anshuman.khandual@arm.com Subject: [PATCH v10 2/8] KVM: arm/arm64: Re-factor setting the Stage 2 entry to exec on fault Date: Tue, 11 Dec 2018 17:10:35 +0000 Message-Id: <1544548241-6417-3-git-send-email-suzuki.poulose@arm.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1544548241-6417-1-git-send-email-suzuki.poulose@arm.com> References: <1544548241-6417-1-git-send-email-suzuki.poulose@arm.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Punit Agrawal Stage 2 fault handler marks a page as executable if it is handling an execution fault or if it was a permission fault in which case the executable bit needs to be preserved. The logic to decide if the page should be marked executable is duplicated for PMD and PTE entries. To avoid creating another copy when support for PUD hugepages is introduced refactor the code to share the checks needed to mark a page table entry as executable. Signed-off-by: Punit Agrawal Reviewed-by: Suzuki K Poulose Cc: Christoffer Dall Cc: Marc Zyngier Signed-off-by: Suzuki K Poulose --- virt/kvm/arm/mmu.c | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/virt/kvm/arm/mmu.c b/virt/kvm/arm/mmu.c index 5959520..6912529 100644 --- a/virt/kvm/arm/mmu.c +++ b/virt/kvm/arm/mmu.c @@ -1475,7 +1475,8 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, unsigned long fault_status) { int ret; - bool write_fault, exec_fault, writable, force_pte = false; + bool write_fault, writable, force_pte = false; + bool exec_fault, needs_exec; unsigned long mmu_seq; gfn_t gfn = fault_ipa >> PAGE_SHIFT; struct kvm *kvm = vcpu->kvm; @@ -1598,19 +1599,25 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, if (exec_fault) invalidate_icache_guest_page(pfn, vma_pagesize); + /* + * If we took an execution fault we have made the + * icache/dcache coherent above and should now let the s2 + * mapping be executable. + * + * Write faults (!exec_fault && FSC_PERM) are orthogonal to + * execute permissions, and we preserve whatever we have. + */ + needs_exec = exec_fault || + (fault_status == FSC_PERM && stage2_is_exec(kvm, fault_ipa)); + if (vma_pagesize == PMD_SIZE) { pmd_t new_pmd = pfn_pmd(pfn, mem_type); new_pmd = pmd_mkhuge(new_pmd); if (writable) new_pmd = kvm_s2pmd_mkwrite(new_pmd); - if (exec_fault) { + if (needs_exec) new_pmd = kvm_s2pmd_mkexec(new_pmd); - } else if (fault_status == FSC_PERM) { - /* Preserve execute if XN was already cleared */ - if (stage2_is_exec(kvm, fault_ipa)) - new_pmd = kvm_s2pmd_mkexec(new_pmd); - } ret = stage2_set_pmd_huge(kvm, memcache, fault_ipa, &new_pmd); } else { @@ -1621,13 +1628,8 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, mark_page_dirty(kvm, gfn); } - if (exec_fault) { + if (needs_exec) new_pte = kvm_s2pte_mkexec(new_pte); - } else if (fault_status == FSC_PERM) { - /* Preserve execute if XN was already cleared */ - if (stage2_is_exec(kvm, fault_ipa)) - new_pte = kvm_s2pte_mkexec(new_pte); - } ret = stage2_set_pte(kvm, memcache, fault_ipa, &new_pte, flags); } -- 2.7.4