mirror of https://gitee.com/openkylin/linux.git
percpu: Introduce DEFINE_PER_CPU_DECRYPTED
KVM guest defines three per-CPU variables (steal-time, apf_reason, and kvm_pic_eoi) which are shared between a guest and a hypervisor. When SEV is active, memory is encrypted with a guest-specific key, and if the guest OS wants to share the memory region with the hypervisor then it must clear the C-bit (i.e set decrypted) before sharing it. DEFINE_PER_CPU_DECRYPTED can be used to define the per-CPU variables which will be shared between a guest and a hypervisor. Signed-off-by: Brijesh Singh <brijesh.singh@amd.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Tested-by: Borislav Petkov <bp@suse.de> Acked-by: Tejun Heo <tj@kernel.org> Reviewed-by: Borislav Petkov <bp@suse.de> Cc: linux-arch@vger.kernel.org Cc: Tom Lendacky <thomas.lendacky@amd.com> Cc: kvm@vger.kernel.org Cc: Arnd Bergmann <arnd@arndb.de> Cc: Borislav Petkov <bp@alien8.de> Cc: Christoph Lameter <cl@linux.com> Link: https://lkml.kernel.org/r/20171020143059.3291-16-brijesh.singh@amd.com
This commit is contained in:
parent
dfaaec9033
commit
ac26963a11
|
@ -777,6 +777,24 @@
|
||||||
#define INIT_RAM_FS
|
#define INIT_RAM_FS
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Memory encryption operates on a page basis. Since we need to clear
|
||||||
|
* the memory encryption mask for this section, it needs to be aligned
|
||||||
|
* on a page boundary and be a page-size multiple in length.
|
||||||
|
*
|
||||||
|
* Note: We use a separate section so that only this section gets
|
||||||
|
* decrypted to avoid exposing more than we wish.
|
||||||
|
*/
|
||||||
|
#ifdef CONFIG_AMD_MEM_ENCRYPT
|
||||||
|
#define PERCPU_DECRYPTED_SECTION \
|
||||||
|
. = ALIGN(PAGE_SIZE); \
|
||||||
|
*(.data..percpu..decrypted) \
|
||||||
|
. = ALIGN(PAGE_SIZE);
|
||||||
|
#else
|
||||||
|
#define PERCPU_DECRYPTED_SECTION
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Default discarded sections.
|
* Default discarded sections.
|
||||||
*
|
*
|
||||||
|
@ -815,6 +833,7 @@
|
||||||
. = ALIGN(cacheline); \
|
. = ALIGN(cacheline); \
|
||||||
*(.data..percpu) \
|
*(.data..percpu) \
|
||||||
*(.data..percpu..shared_aligned) \
|
*(.data..percpu..shared_aligned) \
|
||||||
|
PERCPU_DECRYPTED_SECTION \
|
||||||
VMLINUX_SYMBOL(__per_cpu_end) = .;
|
VMLINUX_SYMBOL(__per_cpu_end) = .;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -172,6 +172,21 @@
|
||||||
#define DEFINE_PER_CPU_READ_MOSTLY(type, name) \
|
#define DEFINE_PER_CPU_READ_MOSTLY(type, name) \
|
||||||
DEFINE_PER_CPU_SECTION(type, name, "..read_mostly")
|
DEFINE_PER_CPU_SECTION(type, name, "..read_mostly")
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Declaration/definition used for per-CPU variables that should be accessed
|
||||||
|
* as decrypted when memory encryption is enabled in the guest.
|
||||||
|
*/
|
||||||
|
#if defined(CONFIG_VIRTUALIZATION) && defined(CONFIG_AMD_MEM_ENCRYPT)
|
||||||
|
|
||||||
|
#define DECLARE_PER_CPU_DECRYPTED(type, name) \
|
||||||
|
DECLARE_PER_CPU_SECTION(type, name, "..decrypted")
|
||||||
|
|
||||||
|
#define DEFINE_PER_CPU_DECRYPTED(type, name) \
|
||||||
|
DEFINE_PER_CPU_SECTION(type, name, "..decrypted")
|
||||||
|
#else
|
||||||
|
#define DEFINE_PER_CPU_DECRYPTED(type, name) DEFINE_PER_CPU(type, name)
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Intermodule exports for per-CPU variables. sparse forgets about
|
* Intermodule exports for per-CPU variables. sparse forgets about
|
||||||
* address space across EXPORT_SYMBOL(), change EXPORT_SYMBOL() to
|
* address space across EXPORT_SYMBOL(), change EXPORT_SYMBOL() to
|
||||||
|
|
Loading…
Reference in New Issue