diff options
author | Brijesh Singh <brijesh.singh@amd.com> | 2017-10-20 10:30:57 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2017-11-07 09:35:59 -0500 |
commit | ac26963a1175c813e3ed21c0d2435b083173136e (patch) | |
tree | 0142c85cd9037d5d790a10d78588409558f26b96 | |
parent | dfaaec9033b80d71056e21cda920752e55f2c514 (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.h | 19 | ||||
-rw-r--r-- | include/linux/percpu-defs.h | 15 |
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__. |