[PATCH 11/20] KVM: arm64: Add support for stage-2 write-protect in generic page-table
Will Deacon
will at kernel.org
Thu Jul 30 11:33:57 EDT 2020
From: Quentin Perret <qperret at google.com>
Add a stage-2 wrprotect() operation to the generic page-table code.
Cc: Marc Zyngier <maz at kernel.org>
Signed-off-by: Quentin Perret <qperret at google.com>
Signed-off-by: Will Deacon <will at kernel.org>
---
arch/arm64/include/asm/kvm_pgtable.h | 15 +++++++++++++++
arch/arm64/kvm/pgtable.c | 6 ++++++
2 files changed, 21 insertions(+)
diff --git a/arch/arm64/include/asm/kvm_pgtable.h b/arch/arm64/include/asm/kvm_pgtable.h
index 7bc55e874a90..ce90432ec6b9 100644
--- a/arch/arm64/include/asm/kvm_pgtable.h
+++ b/arch/arm64/include/asm/kvm_pgtable.h
@@ -155,6 +155,21 @@ int kvm_pgtable_stage2_map(void *cookie, u64 addr, u64 size, u64 phys,
*/
int kvm_pgtable_stage2_unmap(void *cookie, u64 addr, u64 size);
+/**
+ * kvm_pgtable_stage2_wrprotect() - Write-protect guest stage-2 address range
+ * without TLB invalidation.
+ * @cookie: Opaque cookie allocated by kvm_pgtable_stage2_alloc_cookie().
+ * @addr: Intermediate physical address from which to write-protect,
+ * @size: Size of the range.
+ *
+ * Note that it is the caller's responsibility to invalidate the TLB after
+ * calling this function to ensure that the updated permissions are visible
+ * to the CPUs.
+ *
+ * Return: 0 on success, negative error code on failure.
+ */
+int kvm_pgtable_stage2_wrprotect(void *cookie, u64 addr, u64 size);
+
/**
* kvm_pgtable_stage2_mkyoung() - Set the access flag in a page-table entry.
* @cookie: Opaque cookie allocated by kvm_pgtable_stage2_alloc_cookie().
diff --git a/arch/arm64/kvm/pgtable.c b/arch/arm64/kvm/pgtable.c
index af15282d3df9..52cb3d5f156e 100644
--- a/arch/arm64/kvm/pgtable.c
+++ b/arch/arm64/kvm/pgtable.c
@@ -764,6 +764,12 @@ static int stage2_update_leaf_attrs(struct kvm_pgtable *pgt, u64 addr,
return 0;
}
+int kvm_pgtable_stage2_wrprotect(void *cookie, u64 addr, u64 size)
+{
+ return stage2_update_leaf_attrs(cookie, addr, size, 0,
+ KVM_PTE_LEAF_ATTR_LO_S2_S2AP_W, NULL);
+}
+
kvm_pte_t kvm_pgtable_stage2_mkyoung(void *cookie, u64 addr)
{
kvm_pte_t pte = 0;
--
2.28.0.rc0.142.g3c755180ce-goog
More information about the linux-arm-kernel
mailing list