mirror of https://github.com/torvalds/linux.git
arm64: mm: Add top-level dispatcher for internal mem_encrypt API
Implementing the internal mem_encrypt API for arm64 depends entirely on the Confidential Computing environment in which the kernel is running. Introduce a simple dispatcher so that backend hooks can be registered depending upon the environment in which the kernel finds itself. Reviewed-by: Catalin Marinas <catalin.marinas@arm.com> Reviewed-by: Steven Price <steven.price@arm.com> Acked-by: Marc Zyngier <maz@kernel.org> Link: https://lore.kernel.org/r/20240830130150.8568-4-will@kernel.org Signed-off-by: Will Deacon <will@kernel.org>
This commit is contained in:
parent
a06c3fad49
commit
e7bafbf717
|
|
@ -34,6 +34,7 @@ config ARM64
|
||||||
select ARCH_HAS_KERNEL_FPU_SUPPORT if KERNEL_MODE_NEON
|
select ARCH_HAS_KERNEL_FPU_SUPPORT if KERNEL_MODE_NEON
|
||||||
select ARCH_HAS_KEEPINITRD
|
select ARCH_HAS_KEEPINITRD
|
||||||
select ARCH_HAS_MEMBARRIER_SYNC_CORE
|
select ARCH_HAS_MEMBARRIER_SYNC_CORE
|
||||||
|
select ARCH_HAS_MEM_ENCRYPT
|
||||||
select ARCH_HAS_NMI_SAFE_THIS_CPU_OPS
|
select ARCH_HAS_NMI_SAFE_THIS_CPU_OPS
|
||||||
select ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE
|
select ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE
|
||||||
select ARCH_HAS_PTE_DEVMAP
|
select ARCH_HAS_PTE_DEVMAP
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||||
|
#ifndef __ASM_MEM_ENCRYPT_H
|
||||||
|
#define __ASM_MEM_ENCRYPT_H
|
||||||
|
|
||||||
|
struct arm64_mem_crypt_ops {
|
||||||
|
int (*encrypt)(unsigned long addr, int numpages);
|
||||||
|
int (*decrypt)(unsigned long addr, int numpages);
|
||||||
|
};
|
||||||
|
|
||||||
|
int arm64_mem_crypt_ops_register(const struct arm64_mem_crypt_ops *ops);
|
||||||
|
|
||||||
|
int set_memory_encrypted(unsigned long addr, int numpages);
|
||||||
|
int set_memory_decrypted(unsigned long addr, int numpages);
|
||||||
|
|
||||||
|
#endif /* __ASM_MEM_ENCRYPT_H */
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
#ifndef _ASM_ARM64_SET_MEMORY_H
|
#ifndef _ASM_ARM64_SET_MEMORY_H
|
||||||
#define _ASM_ARM64_SET_MEMORY_H
|
#define _ASM_ARM64_SET_MEMORY_H
|
||||||
|
|
||||||
|
#include <asm/mem_encrypt.h>
|
||||||
#include <asm-generic/set_memory.h>
|
#include <asm-generic/set_memory.h>
|
||||||
|
|
||||||
bool can_set_direct_map(void);
|
bool can_set_direct_map(void);
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
# SPDX-License-Identifier: GPL-2.0
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
obj-y := dma-mapping.o extable.o fault.o init.o \
|
obj-y := dma-mapping.o extable.o fault.o init.o \
|
||||||
cache.o copypage.o flush.o \
|
cache.o copypage.o flush.o \
|
||||||
ioremap.o mmap.o pgd.o mmu.o \
|
ioremap.o mmap.o pgd.o mem_encrypt.o mmu.o \
|
||||||
context.o proc.o pageattr.o fixmap.o
|
context.o proc.o pageattr.o fixmap.o
|
||||||
obj-$(CONFIG_ARM64_CONTPTE) += contpte.o
|
obj-$(CONFIG_ARM64_CONTPTE) += contpte.o
|
||||||
obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o
|
obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,50 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
|
/*
|
||||||
|
* Implementation of the memory encryption/decryption API.
|
||||||
|
*
|
||||||
|
* Since the low-level details of the operation depend on the
|
||||||
|
* Confidential Computing environment (e.g. pKVM, CCA, ...), this just
|
||||||
|
* acts as a top-level dispatcher to whatever hooks may have been
|
||||||
|
* registered.
|
||||||
|
*
|
||||||
|
* Author: Will Deacon <will@kernel.org>
|
||||||
|
* Copyright (C) 2024 Google LLC
|
||||||
|
*
|
||||||
|
* "Hello, boils and ghouls!"
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/bug.h>
|
||||||
|
#include <linux/compiler.h>
|
||||||
|
#include <linux/err.h>
|
||||||
|
#include <linux/mm.h>
|
||||||
|
|
||||||
|
#include <asm/mem_encrypt.h>
|
||||||
|
|
||||||
|
static const struct arm64_mem_crypt_ops *crypt_ops;
|
||||||
|
|
||||||
|
int arm64_mem_crypt_ops_register(const struct arm64_mem_crypt_ops *ops)
|
||||||
|
{
|
||||||
|
if (WARN_ON(crypt_ops))
|
||||||
|
return -EBUSY;
|
||||||
|
|
||||||
|
crypt_ops = ops;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int set_memory_encrypted(unsigned long addr, int numpages)
|
||||||
|
{
|
||||||
|
if (likely(!crypt_ops) || WARN_ON(!PAGE_ALIGNED(addr)))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return crypt_ops->encrypt(addr, numpages);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(set_memory_encrypted);
|
||||||
|
|
||||||
|
int set_memory_decrypted(unsigned long addr, int numpages)
|
||||||
|
{
|
||||||
|
if (likely(!crypt_ops) || WARN_ON(!PAGE_ALIGNED(addr)))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return crypt_ops->decrypt(addr, numpages);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(set_memory_decrypted);
|
||||||
Loading…
Reference in New Issue