@@ -13,6 +13,9 @@ extern phys_addr_t mktme_keyid_mask;
extern int mktme_nr_keyids;
extern int mktme_keyid_shift;
+/* Set the encryption keyid bits in a VMA */
+extern void mprotect_set_encrypt(struct vm_area_struct *vma, int newkeyid);
+
/* Manage mappings between hardware keyids and userspace keys */
extern int mktme_map_alloc(void);
extern void mktme_map_free(void);
@@ -63,6 +63,21 @@ int vma_keyid(struct vm_area_struct *vma)
return (prot & mktme_keyid_mask) >> mktme_keyid_shift;
}
+/* Set the encryption keyid bits in a VMA */
+void mprotect_set_encrypt(struct vm_area_struct *vma, int newkeyid)
+{
+ int oldkeyid = vma_keyid(vma);
+ pgprotval_t newprot;
+
+ if (newkeyid == oldkeyid)
+ return;
+
+ newprot = pgprot_val(vma->vm_page_prot);
+ newprot &= ~mktme_keyid_mask;
+ newprot |= (unsigned long)newkeyid << mktme_keyid_shift;
+ vma->vm_page_prot = __pgprot(newprot);
+}
+
/*
* struct mktme_mapping and the mktme_map_* functions manage the mapping
* of userspace keys to hardware keyids in MKTME. They are used by the
@@ -2799,5 +2799,9 @@ void __init setup_nr_node_ids(void);
static inline void setup_nr_node_ids(void) {}
#endif
+#ifndef CONFIG_X86_INTEL_MKTME
+static inline void mprotect_set_encrypt(struct vm_area_struct *vma,
+ int newkeyid) {}
+#endif /* CONFIG_X86_INTEL_MKTME */
#endif /* __KERNEL__ */
#endif /* _LINUX_MM_H */
Store the memory encryption keyid in the upper bits of vm_page_prot that match position of keyid, bits 51:46, in a PTE. Signed-off-by: Alison Schofield <alison.schofield@intel.com> --- arch/x86/include/asm/mktme.h | 3 +++ arch/x86/mm/mktme.c | 15 +++++++++++++++ include/linux/mm.h | 4 ++++ 3 files changed, 22 insertions(+)