summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrijesh Singh <brijesh.singh@amd.com>2017-10-20 10:30:57 -0400
committerThomas Gleixner <tglx@linutronix.de>2017-11-07 09:35:59 -0500
commitac26963a1175c813e3ed21c0d2435b083173136e (patch)
tree0142c85cd9037d5d790a10d78588409558f26b96
parentdfaaec9033b80d71056e21cda920752e55f2c514 (diff)
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
-rw-r--r--include/asm-generic/vmlinux.lds.h19
-rw-r--r--include/linux/percpu-defs.h15
2 files changed, 34 insertions, 0 deletions
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
index 63e56f6c1877..c58f3805e348 100644
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -778,6 +778,24 @@
778#endif 778#endif
779 779
780/* 780/*
781 * Memory encryption operates on a page basis. Since we need to clear
782 * the memory encryption mask for this section, it needs to be aligned
783 * on a page boundary and be a page-size multiple in length.
784 *
785 * Note: We use a separate section so that only this section gets
786 * decrypted to avoid exposing more than we wish.
787 */
788#ifdef CONFIG_AMD_MEM_ENCRYPT
789#define PERCPU_DECRYPTED_SECTION \
790 . = ALIGN(PAGE_SIZE); \
791 *(.data..percpu..decrypted) \
792 . = ALIGN(PAGE_SIZE);
793#else
794#define PERCPU_DECRYPTED_SECTION
795#endif
796
797
798/*
781 * Default discarded sections. 799 * Default discarded sections.
782 * 800 *
783 * Some archs want to discard exit text/data at runtime rather than 801 * Some archs want to discard exit text/data at runtime rather than
@@ -815,6 +833,7 @@
815 . = ALIGN(cacheline); \ 833 . = ALIGN(cacheline); \
816 *(.data..percpu) \ 834 *(.data..percpu) \
817 *(.data..percpu..shared_aligned) \ 835 *(.data..percpu..shared_aligned) \
836 PERCPU_DECRYPTED_SECTION \
818 VMLINUX_SYMBOL(__per_cpu_end) = .; 837 VMLINUX_SYMBOL(__per_cpu_end) = .;
819 838
820/** 839/**
diff --git a/include/linux/percpu-defs.h b/include/linux/percpu-defs.h
index 8f16299ca068..2d2096ba1cfe 100644
--- a/include/linux/percpu-defs.h
+++ b/include/linux/percpu-defs.h
@@ -173,6 +173,21 @@
173 DEFINE_PER_CPU_SECTION(type, name, "..read_mostly") 173 DEFINE_PER_CPU_SECTION(type, name, "..read_mostly")
174 174
175/* 175/*
176 * Declaration/definition used for per-CPU variables that should be accessed
177 * as decrypted when memory encryption is enabled in the guest.
178 */
179#if defined(CONFIG_VIRTUALIZATION) && defined(CONFIG_AMD_MEM_ENCRYPT)
180
181#define DECLARE_PER_CPU_DECRYPTED(type, name) \
182 DECLARE_PER_CPU_SECTION(type, name, "..decrypted")
183
184#define DEFINE_PER_CPU_DECRYPTED(type, name) \
185 DEFINE_PER_CPU_SECTION(type, name, "..decrypted")
186#else
187#define DEFINE_PER_CPU_DECRYPTED(type, name) DEFINE_PER_CPU(type, name)
188#endif
189
190/*
176 * Intermodule exports for per-CPU variables. sparse forgets about 191 * Intermodule exports for per-CPU variables. sparse forgets about
177 * address space across EXPORT_SYMBOL(), change EXPORT_SYMBOL() to 192 * address space across EXPORT_SYMBOL(), change EXPORT_SYMBOL() to
178 * noop if __CHECKER__. 193 * noop if __CHECKER__.