2021-01-16 00:28:39

by Sean Christopherson

[permalink] [raw]
Subject: [PATCH] x86/sev: Add AMD_SEV_ES_GUEST Kconfig for including SEV-ES support

Introduce a new Kconfig, AMD_SEV_ES_GUEST, to control the inclusion of
support for running as an SEV-ES guest. Pivoting on AMD_MEM_ENCRYPT for
guest SEV-ES support is undesirable for host-only kernel builds as
AMD_MEM_ENCRYPT is also required to enable KVM/host support for SEV and
SEV-ES.

A dedicated Kconfig also makes it easier to understand exactly what is
and isn't support in a given configuration.

Opportunistically update the AMD_MEM_ENCRYPT help text to note that it
also enables support for SEV guests.

Cc: Tom Lendacky <[email protected]>
Cc: Brijesh Singh <[email protected]>
Signed-off-by: Sean Christopherson <[email protected]>
---

Tested everything except an actual SEV-ES guest, I don't yet have a
workflow for testing those.

arch/x86/Kconfig | 13 ++++++++++++-
arch/x86/boot/compressed/Makefile | 2 +-
arch/x86/boot/compressed/idt_64.c | 7 ++++---
arch/x86/boot/compressed/idt_handlers_64.S | 2 +-
arch/x86/boot/compressed/misc.h | 5 ++++-
arch/x86/entry/entry_64.S | 2 +-
arch/x86/include/asm/idtentry.h | 2 +-
arch/x86/include/asm/mem_encrypt.h | 12 ++++++++----
arch/x86/include/asm/realmode.h | 4 ++--
arch/x86/include/asm/sev-es.h | 2 +-
arch/x86/kernel/Makefile | 2 +-
arch/x86/kernel/head64.c | 6 +++---
arch/x86/kernel/head_64.S | 6 +++---
arch/x86/kernel/idt.c | 2 +-
arch/x86/kernel/kvm.c | 4 ++--
arch/x86/mm/mem_encrypt.c | 2 ++
arch/x86/realmode/rm/header.S | 2 +-
arch/x86/realmode/rm/trampoline_64.S | 4 ++--
18 files changed, 50 insertions(+), 29 deletions(-)

diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index 21f851179ff0..5f03e6313113 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -1527,12 +1527,14 @@ config AMD_MEM_ENCRYPT
select DYNAMIC_PHYSICAL_MASK
select ARCH_USE_MEMREMAP_PROT
select ARCH_HAS_FORCE_DMA_UNENCRYPTED
- select INSTRUCTION_DECODER
help
Say yes to enable support for the encryption of system memory.
This requires an AMD processor that supports Secure Memory
Encryption (SME).

+ This also enables support for running as a Secure Encrypted
+ Virtualization (SEV) guest.
+
config AMD_MEM_ENCRYPT_ACTIVE_BY_DEFAULT
bool "Activate AMD Secure Memory Encryption (SME) by default"
default y
@@ -1547,6 +1549,15 @@ config AMD_MEM_ENCRYPT_ACTIVE_BY_DEFAULT
If set to N, then the encryption of system memory can be
activated with the mem_encrypt=on command line option.

+config AMD_SEV_ES_GUEST
+ bool "AMD Secure Encrypted Virtualization - Encrypted State (SEV-ES) Guest support"
+ depends on AMD_MEM_ENCRYPT
+ select INSTRUCTION_DECODER
+ help
+ Enable support for running as a Secure Encrypted Virtualization -
+ Encrypted State (SEV-ES) Guest. This enables SEV-ES boot protocol
+ changes, #VC handling, SEV-ES specific hypercalls, etc...
+
# Common NUMA Features
config NUMA
bool "NUMA Memory Allocation and Scheduler Support"
diff --git a/arch/x86/boot/compressed/Makefile b/arch/x86/boot/compressed/Makefile
index e0bc3988c3fa..8c036b6fc0c2 100644
--- a/arch/x86/boot/compressed/Makefile
+++ b/arch/x86/boot/compressed/Makefile
@@ -92,7 +92,7 @@ ifdef CONFIG_X86_64
vmlinux-objs-y += $(obj)/idt_64.o $(obj)/idt_handlers_64.o
vmlinux-objs-y += $(obj)/mem_encrypt.o
vmlinux-objs-y += $(obj)/pgtable_64.o
- vmlinux-objs-$(CONFIG_AMD_MEM_ENCRYPT) += $(obj)/sev-es.o
+ vmlinux-objs-$(CONFIG_AMD_SEV_ES_GUEST) += $(obj)/sev-es.o
endif

vmlinux-objs-$(CONFIG_ACPI) += $(obj)/acpi.o
diff --git a/arch/x86/boot/compressed/idt_64.c b/arch/x86/boot/compressed/idt_64.c
index 804a502ee0d2..916dde4a84b6 100644
--- a/arch/x86/boot/compressed/idt_64.c
+++ b/arch/x86/boot/compressed/idt_64.c
@@ -33,8 +33,9 @@ void load_stage1_idt(void)
boot_idt_desc.address = (unsigned long)boot_idt;


- if (IS_ENABLED(CONFIG_AMD_MEM_ENCRYPT))
- set_idt_entry(X86_TRAP_VC, boot_stage1_vc);
+#ifdef CONFIG_AMD_SEV_ES_GUEST
+ set_idt_entry(X86_TRAP_VC, boot_stage1_vc);
+#endif

load_boot_idt(&boot_idt_desc);
}
@@ -46,7 +47,7 @@ void load_stage2_idt(void)

set_idt_entry(X86_TRAP_PF, boot_page_fault);

-#ifdef CONFIG_AMD_MEM_ENCRYPT
+#ifdef CONFIG_AMD_SEV_ES_GUEST
set_idt_entry(X86_TRAP_VC, boot_stage2_vc);
#endif

diff --git a/arch/x86/boot/compressed/idt_handlers_64.S b/arch/x86/boot/compressed/idt_handlers_64.S
index 22890e199f5b..b2b1fad0d0e2 100644
--- a/arch/x86/boot/compressed/idt_handlers_64.S
+++ b/arch/x86/boot/compressed/idt_handlers_64.S
@@ -71,7 +71,7 @@ SYM_FUNC_END(\name)

EXCEPTION_HANDLER boot_page_fault do_boot_page_fault error_code=1

-#ifdef CONFIG_AMD_MEM_ENCRYPT
+#ifdef CONFIG_AMD_SEV_ES_GUEST
EXCEPTION_HANDLER boot_stage1_vc do_vc_no_ghcb error_code=1
EXCEPTION_HANDLER boot_stage2_vc do_boot_stage2_vc error_code=1
#endif
diff --git a/arch/x86/boot/compressed/misc.h b/arch/x86/boot/compressed/misc.h
index 901ea5ebec22..3a0393d50e92 100644
--- a/arch/x86/boot/compressed/misc.h
+++ b/arch/x86/boot/compressed/misc.h
@@ -118,7 +118,7 @@ static inline void console_init(void)

void set_sev_encryption_mask(void);

-#ifdef CONFIG_AMD_MEM_ENCRYPT
+#ifdef CONFIG_AMD_SEV_ES_GUEST
void sev_es_shutdown_ghcb(void);
extern bool sev_es_check_ghcb_fault(unsigned long address);
#else
@@ -157,8 +157,11 @@ extern struct desc_ptr boot_idt_desc;

/* IDT Entry Points */
void boot_page_fault(void);
+
+#ifdef CONFIG_AMD_SEV_ES_GUEST
void boot_stage1_vc(void);
void boot_stage2_vc(void);
+#endif

unsigned long sev_verify_cbit(unsigned long cr3);

diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S
index cad08703c4ad..98e52ec3cbf6 100644
--- a/arch/x86/entry/entry_64.S
+++ b/arch/x86/entry/entry_64.S
@@ -448,7 +448,7 @@ _ASM_NOKPROBE(\asmsym)
SYM_CODE_END(\asmsym)
.endm

-#ifdef CONFIG_AMD_MEM_ENCRYPT
+#ifdef CONFIG_AMD_SEV_ES_GUEST
/**
* idtentry_vc - Macro to generate entry stub for #VC
* @vector: Vector number
diff --git a/arch/x86/include/asm/idtentry.h b/arch/x86/include/asm/idtentry.h
index 247a60a47331..bc3a22d67741 100644
--- a/arch/x86/include/asm/idtentry.h
+++ b/arch/x86/include/asm/idtentry.h
@@ -607,7 +607,7 @@ DECLARE_IDTENTRY_RAW(X86_TRAP_DB, xenpv_exc_debug);
DECLARE_IDTENTRY_DF(X86_TRAP_DF, exc_double_fault);

/* #VC */
-#ifdef CONFIG_AMD_MEM_ENCRYPT
+#ifdef CONFIG_AMD_SEV_ES_GUEST
DECLARE_IDTENTRY_VC(X86_TRAP_VC, exc_vmm_communication);
#endif

diff --git a/arch/x86/include/asm/mem_encrypt.h b/arch/x86/include/asm/mem_encrypt.h
index 31c4df123aa0..a3f04b9b1a11 100644
--- a/arch/x86/include/asm/mem_encrypt.h
+++ b/arch/x86/include/asm/mem_encrypt.h
@@ -50,10 +50,8 @@ void __init mem_encrypt_free_decrypted_mem(void);
/* Architecture __weak replacement functions */
void __init mem_encrypt_init(void);

-void __init sev_es_init_vc_handling(void);
bool sme_active(void);
bool sev_active(void);
-bool sev_es_active(void);

#define __bss_decrypted __section(".bss..decrypted")

@@ -75,10 +73,8 @@ static inline void __init sev_setup_arch(void) { }
static inline void __init sme_encrypt_kernel(struct boot_params *bp) { }
static inline void __init sme_enable(struct boot_params *bp) { }

-static inline void sev_es_init_vc_handling(void) { }
static inline bool sme_active(void) { return false; }
static inline bool sev_active(void) { return false; }
-static inline bool sev_es_active(void) { return false; }

static inline int __init
early_set_memory_decrypted(unsigned long vaddr, unsigned long size) { return 0; }
@@ -91,6 +87,14 @@ static inline void mem_encrypt_free_decrypted_mem(void) { }

#endif /* CONFIG_AMD_MEM_ENCRYPT */

+#ifdef CONFIG_AMD_SEV_ES_GUEST
+bool sev_es_active(void);
+void __init sev_es_init_vc_handling(void);
+#else
+static inline bool sev_es_active(void) { return false; }
+static inline void sev_es_init_vc_handling(void) { }
+#endif /* CONFIG_AMD_SEV_ES_GUEST */
+
/*
* The __sme_pa() and __sme_pa_nodebug() macros are meant for use when
* writing to or comparing values from the cr3 register. Having the
diff --git a/arch/x86/include/asm/realmode.h b/arch/x86/include/asm/realmode.h
index 5db5d083c873..353449b26589 100644
--- a/arch/x86/include/asm/realmode.h
+++ b/arch/x86/include/asm/realmode.h
@@ -21,7 +21,7 @@ struct real_mode_header {
/* SMP trampoline */
u32 trampoline_start;
u32 trampoline_header;
-#ifdef CONFIG_AMD_MEM_ENCRYPT
+#ifdef CONFIG_AMD_SEV_ES_GUEST
u32 sev_es_trampoline_start;
#endif
#ifdef CONFIG_X86_64
@@ -60,7 +60,7 @@ extern unsigned char real_mode_blob_end[];
extern unsigned long initial_code;
extern unsigned long initial_gs;
extern unsigned long initial_stack;
-#ifdef CONFIG_AMD_MEM_ENCRYPT
+#ifdef CONFIG_AMD_SEV_ES_GUEST
extern unsigned long initial_vc_handler;
#endif

diff --git a/arch/x86/include/asm/sev-es.h b/arch/x86/include/asm/sev-es.h
index cf1d957c7091..146dc77dc67e 100644
--- a/arch/x86/include/asm/sev-es.h
+++ b/arch/x86/include/asm/sev-es.h
@@ -81,7 +81,7 @@ extern void vc_no_ghcb(void);
extern void vc_boot_ghcb(void);
extern bool handle_vc_boot_ghcb(struct pt_regs *regs);

-#ifdef CONFIG_AMD_MEM_ENCRYPT
+#ifdef CONFIG_AMD_SEV_ES_GUEST
extern struct static_key_false sev_es_enable_key;
extern void __sev_es_ist_enter(struct pt_regs *regs);
extern void __sev_es_ist_exit(void);
diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile
index 5eeb808eb024..d2119dc1e6f9 100644
--- a/arch/x86/kernel/Makefile
+++ b/arch/x86/kernel/Makefile
@@ -150,7 +150,7 @@ obj-$(CONFIG_UNWINDER_ORC) += unwind_orc.o
obj-$(CONFIG_UNWINDER_FRAME_POINTER) += unwind_frame.o
obj-$(CONFIG_UNWINDER_GUESS) += unwind_guess.o

-obj-$(CONFIG_AMD_MEM_ENCRYPT) += sev-es.o
+obj-$(CONFIG_AMD_SEV_ES_GUEST) += sev-es.o
###
# 64 bit specific files
ifeq ($(CONFIG_X86_64),y)
diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c
index 5e9beb77cafd..dafe13db714c 100644
--- a/arch/x86/kernel/head64.c
+++ b/arch/x86/kernel/head64.c
@@ -405,7 +405,7 @@ void __init do_early_exception(struct pt_regs *regs, int trapnr)
early_make_pgtable(native_read_cr2()))
return;

- if (IS_ENABLED(CONFIG_AMD_MEM_ENCRYPT) &&
+ if (IS_ENABLED(CONFIG_AMD_SEV_ES_GUEST) &&
trapnr == X86_TRAP_VC && handle_vc_boot_ghcb(regs))
return;

@@ -563,7 +563,7 @@ static void startup_64_load_idt(unsigned long physbase)
gate_desc *idt = fixup_pointer(bringup_idt_table, physbase);


- if (IS_ENABLED(CONFIG_AMD_MEM_ENCRYPT)) {
+ if (IS_ENABLED(CONFIG_AMD_SEV_ES_GUEST)) {
void *handler;

/* VMM Communication Exception */
@@ -579,7 +579,7 @@ static void startup_64_load_idt(unsigned long physbase)
void early_setup_idt(void)
{
/* VMM Communication Exception */
- if (IS_ENABLED(CONFIG_AMD_MEM_ENCRYPT))
+ if (IS_ENABLED(CONFIG_AMD_SEV_ES_GUEST))
set_bringup_idt_handler(bringup_idt_table, X86_TRAP_VC, vc_boot_ghcb);

bringup_idt_descr.address = (unsigned long)bringup_idt_table;
diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S
index 04bddaaba8e2..01243ec06ee6 100644
--- a/arch/x86/kernel/head_64.S
+++ b/arch/x86/kernel/head_64.S
@@ -300,7 +300,7 @@ SYM_CODE_START(start_cpu0)
SYM_CODE_END(start_cpu0)
#endif

-#ifdef CONFIG_AMD_MEM_ENCRYPT
+#ifdef CONFIG_AMD_SEV_ES_GUEST
/*
* VC Exception handler used during early boot when running on kernel
* addresses, but before the switch to the idt_table can be made.
@@ -338,7 +338,7 @@ SYM_CODE_END(vc_boot_ghcb)
.balign 8
SYM_DATA(initial_code, .quad x86_64_start_kernel)
SYM_DATA(initial_gs, .quad INIT_PER_CPU_VAR(fixed_percpu_data))
-#ifdef CONFIG_AMD_MEM_ENCRYPT
+#ifdef CONFIG_AMD_SEV_ES_GUEST
SYM_DATA(initial_vc_handler, .quad handle_vc_boot_ghcb)
#endif

@@ -403,7 +403,7 @@ SYM_CODE_START_LOCAL(early_idt_handler_common)
jmp restore_regs_and_return_to_kernel
SYM_CODE_END(early_idt_handler_common)

-#ifdef CONFIG_AMD_MEM_ENCRYPT
+#ifdef CONFIG_AMD_SEV_ES_GUEST
/*
* VC Exception handler used during very early boot. The
* early_idt_handler_array can't be used because it returns via the
diff --git a/arch/x86/kernel/idt.c b/arch/x86/kernel/idt.c
index ee1a283f8e96..ab783e81b806 100644
--- a/arch/x86/kernel/idt.c
+++ b/arch/x86/kernel/idt.c
@@ -232,7 +232,7 @@ static const __initconst struct idt_data ist_idts[] = {
#ifdef CONFIG_X86_MCE
ISTG(X86_TRAP_MC, asm_exc_machine_check, IST_INDEX_MCE),
#endif
-#ifdef CONFIG_AMD_MEM_ENCRYPT
+#ifdef CONFIG_AMD_SEV_ES_GUEST
ISTG(X86_TRAP_VC, asm_exc_vmm_communication, IST_INDEX_VC),
#endif
};
diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c
index 5e78e01ca3b4..69efdd20836a 100644
--- a/arch/x86/kernel/kvm.c
+++ b/arch/x86/kernel/kvm.c
@@ -751,7 +751,7 @@ static void __init kvm_init_platform(void)
x86_platform.apic_post_init = kvm_apic_init;
}

-#if defined(CONFIG_AMD_MEM_ENCRYPT)
+#ifdef CONFIG_AMD_SEV_ES_GUEST
static void kvm_sev_es_hcall_prepare(struct ghcb *ghcb, struct pt_regs *regs)
{
/* RAX and CPL are already in the GHCB */
@@ -776,7 +776,7 @@ const __initconst struct hypervisor_x86 x86_hyper_kvm = {
.init.x2apic_available = kvm_para_available,
.init.msi_ext_dest_id = kvm_msi_ext_dest_id,
.init.init_platform = kvm_init_platform,
-#if defined(CONFIG_AMD_MEM_ENCRYPT)
+#ifdef CONFIG_AMD_SEV_ES_GUEST
.runtime.sev_es_hcall_prepare = kvm_sev_es_hcall_prepare,
.runtime.sev_es_hcall_finish = kvm_sev_es_hcall_finish,
#endif
diff --git a/arch/x86/mm/mem_encrypt.c b/arch/x86/mm/mem_encrypt.c
index c79e5736ab2b..a527537133d1 100644
--- a/arch/x86/mm/mem_encrypt.c
+++ b/arch/x86/mm/mem_encrypt.c
@@ -383,11 +383,13 @@ bool sev_active(void)
return sev_status & MSR_AMD64_SEV_ENABLED;
}

+#ifdef CONFIG_AMD_SEV_ES_GUEST
/* Needs to be called from non-instrumentable code */
bool noinstr sev_es_active(void)
{
return sev_status & MSR_AMD64_SEV_ES_ENABLED;
}
+#endif

/* Override for DMA direct allocation check - ARCH_HAS_FORCE_DMA_UNENCRYPTED */
bool force_dma_unencrypted(struct device *dev)
diff --git a/arch/x86/realmode/rm/header.S b/arch/x86/realmode/rm/header.S
index 8c1db5bf5d78..88b2435b52d5 100644
--- a/arch/x86/realmode/rm/header.S
+++ b/arch/x86/realmode/rm/header.S
@@ -20,7 +20,7 @@ SYM_DATA_START(real_mode_header)
/* SMP trampoline */
.long pa_trampoline_start
.long pa_trampoline_header
-#ifdef CONFIG_AMD_MEM_ENCRYPT
+#ifdef CONFIG_AMD_SEV_ES_GUEST
.long pa_sev_es_trampoline_start
#endif
#ifdef CONFIG_X86_64
diff --git a/arch/x86/realmode/rm/trampoline_64.S b/arch/x86/realmode/rm/trampoline_64.S
index 84c5d1b33d10..9830f3a3a90c 100644
--- a/arch/x86/realmode/rm/trampoline_64.S
+++ b/arch/x86/realmode/rm/trampoline_64.S
@@ -81,7 +81,7 @@ no_longmode:
jmp no_longmode
SYM_CODE_END(trampoline_start)

-#ifdef CONFIG_AMD_MEM_ENCRYPT
+#ifdef CONFIG_AMD_SEV_ES_GUEST
/* SEV-ES supports non-zero IP for entry points - no alignment needed */
SYM_CODE_START(sev_es_trampoline_start)
cli # We should be safe anyway
@@ -98,7 +98,7 @@ SYM_CODE_START(sev_es_trampoline_start)

jmp .Lswitch_to_protected
SYM_CODE_END(sev_es_trampoline_start)
-#endif /* CONFIG_AMD_MEM_ENCRYPT */
+#endif /* CONFIG_AMD_SEV_ES_GUEST */

#include "../kernel/verify_cpu.S"

--
2.30.0.284.gd98b1dd5eaa7-goog


2021-01-16 05:42:23

by Tom Lendacky

[permalink] [raw]
Subject: Re: [PATCH] x86/sev: Add AMD_SEV_ES_GUEST Kconfig for including SEV-ES support

On 1/15/21 6:25 PM, Sean Christopherson wrote:
> Introduce a new Kconfig, AMD_SEV_ES_GUEST, to control the inclusion of
> support for running as an SEV-ES guest. Pivoting on AMD_MEM_ENCRYPT for
> guest SEV-ES support is undesirable for host-only kernel builds as
> AMD_MEM_ENCRYPT is also required to enable KVM/host support for SEV and
> SEV-ES.

I believe only KVM_AMD_SEV is required to enable the KVM support to run
SEV and SEV-ES guests. The AMD_MEM_ENCRYPT_ACTIVE_BY_DEFAULT setting is
only used to determine whether to enable the KVM SEV/SEV-ES support by
default on module load.

Thanks,
Tom

>
> A dedicated Kconfig also makes it easier to understand exactly what is
> and isn't support in a given configuration.
>
> Opportunistically update the AMD_MEM_ENCRYPT help text to note that it
> also enables support for SEV guests.
>
> Cc: Tom Lendacky <[email protected]>
> Cc: Brijesh Singh <[email protected]>
> Signed-off-by: Sean Christopherson <[email protected]>
> ---
>
> Tested everything except an actual SEV-ES guest, I don't yet have a
> workflow for testing those.
>
> arch/x86/Kconfig | 13 ++++++++++++-
> arch/x86/boot/compressed/Makefile | 2 +-
> arch/x86/boot/compressed/idt_64.c | 7 ++++---
> arch/x86/boot/compressed/idt_handlers_64.S | 2 +-
> arch/x86/boot/compressed/misc.h | 5 ++++-
> arch/x86/entry/entry_64.S | 2 +-
> arch/x86/include/asm/idtentry.h | 2 +-
> arch/x86/include/asm/mem_encrypt.h | 12 ++++++++----
> arch/x86/include/asm/realmode.h | 4 ++--
> arch/x86/include/asm/sev-es.h | 2 +-
> arch/x86/kernel/Makefile | 2 +-
> arch/x86/kernel/head64.c | 6 +++---
> arch/x86/kernel/head_64.S | 6 +++---
> arch/x86/kernel/idt.c | 2 +-
> arch/x86/kernel/kvm.c | 4 ++--
> arch/x86/mm/mem_encrypt.c | 2 ++
> arch/x86/realmode/rm/header.S | 2 +-
> arch/x86/realmode/rm/trampoline_64.S | 4 ++--
> 18 files changed, 50 insertions(+), 29 deletions(-)
>
> diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
> index 21f851179ff0..5f03e6313113 100644
> --- a/arch/x86/Kconfig
> +++ b/arch/x86/Kconfig
> @@ -1527,12 +1527,14 @@ config AMD_MEM_ENCRYPT
> select DYNAMIC_PHYSICAL_MASK
> select ARCH_USE_MEMREMAP_PROT
> select ARCH_HAS_FORCE_DMA_UNENCRYPTED
> - select INSTRUCTION_DECODER
> help
> Say yes to enable support for the encryption of system memory.
> This requires an AMD processor that supports Secure Memory
> Encryption (SME).
>
> + This also enables support for running as a Secure Encrypted
> + Virtualization (SEV) guest.
> +
> config AMD_MEM_ENCRYPT_ACTIVE_BY_DEFAULT
> bool "Activate AMD Secure Memory Encryption (SME) by default"
> default y
> @@ -1547,6 +1549,15 @@ config AMD_MEM_ENCRYPT_ACTIVE_BY_DEFAULT
> If set to N, then the encryption of system memory can be
> activated with the mem_encrypt=on command line option.
>
> +config AMD_SEV_ES_GUEST
> + bool "AMD Secure Encrypted Virtualization - Encrypted State (SEV-ES) Guest support"
> + depends on AMD_MEM_ENCRYPT
> + select INSTRUCTION_DECODER
> + help
> + Enable support for running as a Secure Encrypted Virtualization -
> + Encrypted State (SEV-ES) Guest. This enables SEV-ES boot protocol
> + changes, #VC handling, SEV-ES specific hypercalls, etc...
> +
> # Common NUMA Features
> config NUMA
> bool "NUMA Memory Allocation and Scheduler Support"
> diff --git a/arch/x86/boot/compressed/Makefile b/arch/x86/boot/compressed/Makefile
> index e0bc3988c3fa..8c036b6fc0c2 100644
> --- a/arch/x86/boot/compressed/Makefile
> +++ b/arch/x86/boot/compressed/Makefile
> @@ -92,7 +92,7 @@ ifdef CONFIG_X86_64
> vmlinux-objs-y += $(obj)/idt_64.o $(obj)/idt_handlers_64.o
> vmlinux-objs-y += $(obj)/mem_encrypt.o
> vmlinux-objs-y += $(obj)/pgtable_64.o
> - vmlinux-objs-$(CONFIG_AMD_MEM_ENCRYPT) += $(obj)/sev-es.o
> + vmlinux-objs-$(CONFIG_AMD_SEV_ES_GUEST) += $(obj)/sev-es.o
> endif
>
> vmlinux-objs-$(CONFIG_ACPI) += $(obj)/acpi.o
> diff --git a/arch/x86/boot/compressed/idt_64.c b/arch/x86/boot/compressed/idt_64.c
> index 804a502ee0d2..916dde4a84b6 100644
> --- a/arch/x86/boot/compressed/idt_64.c
> +++ b/arch/x86/boot/compressed/idt_64.c
> @@ -33,8 +33,9 @@ void load_stage1_idt(void)
> boot_idt_desc.address = (unsigned long)boot_idt;
>
>
> - if (IS_ENABLED(CONFIG_AMD_MEM_ENCRYPT))
> - set_idt_entry(X86_TRAP_VC, boot_stage1_vc);
> +#ifdef CONFIG_AMD_SEV_ES_GUEST
> + set_idt_entry(X86_TRAP_VC, boot_stage1_vc);
> +#endif
>
> load_boot_idt(&boot_idt_desc);
> }
> @@ -46,7 +47,7 @@ void load_stage2_idt(void)
>
> set_idt_entry(X86_TRAP_PF, boot_page_fault);
>
> -#ifdef CONFIG_AMD_MEM_ENCRYPT
> +#ifdef CONFIG_AMD_SEV_ES_GUEST
> set_idt_entry(X86_TRAP_VC, boot_stage2_vc);
> #endif
>
> diff --git a/arch/x86/boot/compressed/idt_handlers_64.S b/arch/x86/boot/compressed/idt_handlers_64.S
> index 22890e199f5b..b2b1fad0d0e2 100644
> --- a/arch/x86/boot/compressed/idt_handlers_64.S
> +++ b/arch/x86/boot/compressed/idt_handlers_64.S
> @@ -71,7 +71,7 @@ SYM_FUNC_END(\name)
>
> EXCEPTION_HANDLER boot_page_fault do_boot_page_fault error_code=1
>
> -#ifdef CONFIG_AMD_MEM_ENCRYPT
> +#ifdef CONFIG_AMD_SEV_ES_GUEST
> EXCEPTION_HANDLER boot_stage1_vc do_vc_no_ghcb error_code=1
> EXCEPTION_HANDLER boot_stage2_vc do_boot_stage2_vc error_code=1
> #endif
> diff --git a/arch/x86/boot/compressed/misc.h b/arch/x86/boot/compressed/misc.h
> index 901ea5ebec22..3a0393d50e92 100644
> --- a/arch/x86/boot/compressed/misc.h
> +++ b/arch/x86/boot/compressed/misc.h
> @@ -118,7 +118,7 @@ static inline void console_init(void)
>
> void set_sev_encryption_mask(void);
>
> -#ifdef CONFIG_AMD_MEM_ENCRYPT
> +#ifdef CONFIG_AMD_SEV_ES_GUEST
> void sev_es_shutdown_ghcb(void);
> extern bool sev_es_check_ghcb_fault(unsigned long address);
> #else
> @@ -157,8 +157,11 @@ extern struct desc_ptr boot_idt_desc;
>
> /* IDT Entry Points */
> void boot_page_fault(void);
> +
> +#ifdef CONFIG_AMD_SEV_ES_GUEST
> void boot_stage1_vc(void);
> void boot_stage2_vc(void);
> +#endif
>
> unsigned long sev_verify_cbit(unsigned long cr3);
>
> diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S
> index cad08703c4ad..98e52ec3cbf6 100644
> --- a/arch/x86/entry/entry_64.S
> +++ b/arch/x86/entry/entry_64.S
> @@ -448,7 +448,7 @@ _ASM_NOKPROBE(\asmsym)
> SYM_CODE_END(\asmsym)
> .endm
>
> -#ifdef CONFIG_AMD_MEM_ENCRYPT
> +#ifdef CONFIG_AMD_SEV_ES_GUEST
> /**
> * idtentry_vc - Macro to generate entry stub for #VC
> * @vector: Vector number
> diff --git a/arch/x86/include/asm/idtentry.h b/arch/x86/include/asm/idtentry.h
> index 247a60a47331..bc3a22d67741 100644
> --- a/arch/x86/include/asm/idtentry.h
> +++ b/arch/x86/include/asm/idtentry.h
> @@ -607,7 +607,7 @@ DECLARE_IDTENTRY_RAW(X86_TRAP_DB, xenpv_exc_debug);
> DECLARE_IDTENTRY_DF(X86_TRAP_DF, exc_double_fault);
>
> /* #VC */
> -#ifdef CONFIG_AMD_MEM_ENCRYPT
> +#ifdef CONFIG_AMD_SEV_ES_GUEST
> DECLARE_IDTENTRY_VC(X86_TRAP_VC, exc_vmm_communication);
> #endif
>
> diff --git a/arch/x86/include/asm/mem_encrypt.h b/arch/x86/include/asm/mem_encrypt.h
> index 31c4df123aa0..a3f04b9b1a11 100644
> --- a/arch/x86/include/asm/mem_encrypt.h
> +++ b/arch/x86/include/asm/mem_encrypt.h
> @@ -50,10 +50,8 @@ void __init mem_encrypt_free_decrypted_mem(void);
> /* Architecture __weak replacement functions */
> void __init mem_encrypt_init(void);
>
> -void __init sev_es_init_vc_handling(void);
> bool sme_active(void);
> bool sev_active(void);
> -bool sev_es_active(void);
>
> #define __bss_decrypted __section(".bss..decrypted")
>
> @@ -75,10 +73,8 @@ static inline void __init sev_setup_arch(void) { }
> static inline void __init sme_encrypt_kernel(struct boot_params *bp) { }
> static inline void __init sme_enable(struct boot_params *bp) { }
>
> -static inline void sev_es_init_vc_handling(void) { }
> static inline bool sme_active(void) { return false; }
> static inline bool sev_active(void) { return false; }
> -static inline bool sev_es_active(void) { return false; }
>
> static inline int __init
> early_set_memory_decrypted(unsigned long vaddr, unsigned long size) { return 0; }
> @@ -91,6 +87,14 @@ static inline void mem_encrypt_free_decrypted_mem(void) { }
>
> #endif /* CONFIG_AMD_MEM_ENCRYPT */
>
> +#ifdef CONFIG_AMD_SEV_ES_GUEST
> +bool sev_es_active(void);
> +void __init sev_es_init_vc_handling(void);
> +#else
> +static inline bool sev_es_active(void) { return false; }
> +static inline void sev_es_init_vc_handling(void) { }
> +#endif /* CONFIG_AMD_SEV_ES_GUEST */
> +
> /*
> * The __sme_pa() and __sme_pa_nodebug() macros are meant for use when
> * writing to or comparing values from the cr3 register. Having the
> diff --git a/arch/x86/include/asm/realmode.h b/arch/x86/include/asm/realmode.h
> index 5db5d083c873..353449b26589 100644
> --- a/arch/x86/include/asm/realmode.h
> +++ b/arch/x86/include/asm/realmode.h
> @@ -21,7 +21,7 @@ struct real_mode_header {
> /* SMP trampoline */
> u32 trampoline_start;
> u32 trampoline_header;
> -#ifdef CONFIG_AMD_MEM_ENCRYPT
> +#ifdef CONFIG_AMD_SEV_ES_GUEST
> u32 sev_es_trampoline_start;
> #endif
> #ifdef CONFIG_X86_64
> @@ -60,7 +60,7 @@ extern unsigned char real_mode_blob_end[];
> extern unsigned long initial_code;
> extern unsigned long initial_gs;
> extern unsigned long initial_stack;
> -#ifdef CONFIG_AMD_MEM_ENCRYPT
> +#ifdef CONFIG_AMD_SEV_ES_GUEST
> extern unsigned long initial_vc_handler;
> #endif
>
> diff --git a/arch/x86/include/asm/sev-es.h b/arch/x86/include/asm/sev-es.h
> index cf1d957c7091..146dc77dc67e 100644
> --- a/arch/x86/include/asm/sev-es.h
> +++ b/arch/x86/include/asm/sev-es.h
> @@ -81,7 +81,7 @@ extern void vc_no_ghcb(void);
> extern void vc_boot_ghcb(void);
> extern bool handle_vc_boot_ghcb(struct pt_regs *regs);
>
> -#ifdef CONFIG_AMD_MEM_ENCRYPT
> +#ifdef CONFIG_AMD_SEV_ES_GUEST
> extern struct static_key_false sev_es_enable_key;
> extern void __sev_es_ist_enter(struct pt_regs *regs);
> extern void __sev_es_ist_exit(void);
> diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile
> index 5eeb808eb024..d2119dc1e6f9 100644
> --- a/arch/x86/kernel/Makefile
> +++ b/arch/x86/kernel/Makefile
> @@ -150,7 +150,7 @@ obj-$(CONFIG_UNWINDER_ORC) += unwind_orc.o
> obj-$(CONFIG_UNWINDER_FRAME_POINTER) += unwind_frame.o
> obj-$(CONFIG_UNWINDER_GUESS) += unwind_guess.o
>
> -obj-$(CONFIG_AMD_MEM_ENCRYPT) += sev-es.o
> +obj-$(CONFIG_AMD_SEV_ES_GUEST) += sev-es.o
> ###
> # 64 bit specific files
> ifeq ($(CONFIG_X86_64),y)
> diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c
> index 5e9beb77cafd..dafe13db714c 100644
> --- a/arch/x86/kernel/head64.c
> +++ b/arch/x86/kernel/head64.c
> @@ -405,7 +405,7 @@ void __init do_early_exception(struct pt_regs *regs, int trapnr)
> early_make_pgtable(native_read_cr2()))
> return;
>
> - if (IS_ENABLED(CONFIG_AMD_MEM_ENCRYPT) &&
> + if (IS_ENABLED(CONFIG_AMD_SEV_ES_GUEST) &&
> trapnr == X86_TRAP_VC && handle_vc_boot_ghcb(regs))
> return;
>
> @@ -563,7 +563,7 @@ static void startup_64_load_idt(unsigned long physbase)
> gate_desc *idt = fixup_pointer(bringup_idt_table, physbase);
>
>
> - if (IS_ENABLED(CONFIG_AMD_MEM_ENCRYPT)) {
> + if (IS_ENABLED(CONFIG_AMD_SEV_ES_GUEST)) {
> void *handler;
>
> /* VMM Communication Exception */
> @@ -579,7 +579,7 @@ static void startup_64_load_idt(unsigned long physbase)
> void early_setup_idt(void)
> {
> /* VMM Communication Exception */
> - if (IS_ENABLED(CONFIG_AMD_MEM_ENCRYPT))
> + if (IS_ENABLED(CONFIG_AMD_SEV_ES_GUEST))
> set_bringup_idt_handler(bringup_idt_table, X86_TRAP_VC, vc_boot_ghcb);
>
> bringup_idt_descr.address = (unsigned long)bringup_idt_table;
> diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S
> index 04bddaaba8e2..01243ec06ee6 100644
> --- a/arch/x86/kernel/head_64.S
> +++ b/arch/x86/kernel/head_64.S
> @@ -300,7 +300,7 @@ SYM_CODE_START(start_cpu0)
> SYM_CODE_END(start_cpu0)
> #endif
>
> -#ifdef CONFIG_AMD_MEM_ENCRYPT
> +#ifdef CONFIG_AMD_SEV_ES_GUEST
> /*
> * VC Exception handler used during early boot when running on kernel
> * addresses, but before the switch to the idt_table can be made.
> @@ -338,7 +338,7 @@ SYM_CODE_END(vc_boot_ghcb)
> .balign 8
> SYM_DATA(initial_code, .quad x86_64_start_kernel)
> SYM_DATA(initial_gs, .quad INIT_PER_CPU_VAR(fixed_percpu_data))
> -#ifdef CONFIG_AMD_MEM_ENCRYPT
> +#ifdef CONFIG_AMD_SEV_ES_GUEST
> SYM_DATA(initial_vc_handler, .quad handle_vc_boot_ghcb)
> #endif
>
> @@ -403,7 +403,7 @@ SYM_CODE_START_LOCAL(early_idt_handler_common)
> jmp restore_regs_and_return_to_kernel
> SYM_CODE_END(early_idt_handler_common)
>
> -#ifdef CONFIG_AMD_MEM_ENCRYPT
> +#ifdef CONFIG_AMD_SEV_ES_GUEST
> /*
> * VC Exception handler used during very early boot. The
> * early_idt_handler_array can't be used because it returns via the
> diff --git a/arch/x86/kernel/idt.c b/arch/x86/kernel/idt.c
> index ee1a283f8e96..ab783e81b806 100644
> --- a/arch/x86/kernel/idt.c
> +++ b/arch/x86/kernel/idt.c
> @@ -232,7 +232,7 @@ static const __initconst struct idt_data ist_idts[] = {
> #ifdef CONFIG_X86_MCE
> ISTG(X86_TRAP_MC, asm_exc_machine_check, IST_INDEX_MCE),
> #endif
> -#ifdef CONFIG_AMD_MEM_ENCRYPT
> +#ifdef CONFIG_AMD_SEV_ES_GUEST
> ISTG(X86_TRAP_VC, asm_exc_vmm_communication, IST_INDEX_VC),
> #endif
> };
> diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c
> index 5e78e01ca3b4..69efdd20836a 100644
> --- a/arch/x86/kernel/kvm.c
> +++ b/arch/x86/kernel/kvm.c
> @@ -751,7 +751,7 @@ static void __init kvm_init_platform(void)
> x86_platform.apic_post_init = kvm_apic_init;
> }
>
> -#if defined(CONFIG_AMD_MEM_ENCRYPT)
> +#ifdef CONFIG_AMD_SEV_ES_GUEST
> static void kvm_sev_es_hcall_prepare(struct ghcb *ghcb, struct pt_regs *regs)
> {
> /* RAX and CPL are already in the GHCB */
> @@ -776,7 +776,7 @@ const __initconst struct hypervisor_x86 x86_hyper_kvm = {
> .init.x2apic_available = kvm_para_available,
> .init.msi_ext_dest_id = kvm_msi_ext_dest_id,
> .init.init_platform = kvm_init_platform,
> -#if defined(CONFIG_AMD_MEM_ENCRYPT)
> +#ifdef CONFIG_AMD_SEV_ES_GUEST
> .runtime.sev_es_hcall_prepare = kvm_sev_es_hcall_prepare,
> .runtime.sev_es_hcall_finish = kvm_sev_es_hcall_finish,
> #endif
> diff --git a/arch/x86/mm/mem_encrypt.c b/arch/x86/mm/mem_encrypt.c
> index c79e5736ab2b..a527537133d1 100644
> --- a/arch/x86/mm/mem_encrypt.c
> +++ b/arch/x86/mm/mem_encrypt.c
> @@ -383,11 +383,13 @@ bool sev_active(void)
> return sev_status & MSR_AMD64_SEV_ENABLED;
> }
>
> +#ifdef CONFIG_AMD_SEV_ES_GUEST
> /* Needs to be called from non-instrumentable code */
> bool noinstr sev_es_active(void)
> {
> return sev_status & MSR_AMD64_SEV_ES_ENABLED;
> }
> +#endif
>
> /* Override for DMA direct allocation check - ARCH_HAS_FORCE_DMA_UNENCRYPTED */
> bool force_dma_unencrypted(struct device *dev)
> diff --git a/arch/x86/realmode/rm/header.S b/arch/x86/realmode/rm/header.S
> index 8c1db5bf5d78..88b2435b52d5 100644
> --- a/arch/x86/realmode/rm/header.S
> +++ b/arch/x86/realmode/rm/header.S
> @@ -20,7 +20,7 @@ SYM_DATA_START(real_mode_header)
> /* SMP trampoline */
> .long pa_trampoline_start
> .long pa_trampoline_header
> -#ifdef CONFIG_AMD_MEM_ENCRYPT
> +#ifdef CONFIG_AMD_SEV_ES_GUEST
> .long pa_sev_es_trampoline_start
> #endif
> #ifdef CONFIG_X86_64
> diff --git a/arch/x86/realmode/rm/trampoline_64.S b/arch/x86/realmode/rm/trampoline_64.S
> index 84c5d1b33d10..9830f3a3a90c 100644
> --- a/arch/x86/realmode/rm/trampoline_64.S
> +++ b/arch/x86/realmode/rm/trampoline_64.S
> @@ -81,7 +81,7 @@ no_longmode:
> jmp no_longmode
> SYM_CODE_END(trampoline_start)
>
> -#ifdef CONFIG_AMD_MEM_ENCRYPT
> +#ifdef CONFIG_AMD_SEV_ES_GUEST
> /* SEV-ES supports non-zero IP for entry points - no alignment needed */
> SYM_CODE_START(sev_es_trampoline_start)
> cli # We should be safe anyway
> @@ -98,7 +98,7 @@ SYM_CODE_START(sev_es_trampoline_start)
>
> jmp .Lswitch_to_protected
> SYM_CODE_END(sev_es_trampoline_start)
> -#endif /* CONFIG_AMD_MEM_ENCRYPT */
> +#endif /* CONFIG_AMD_SEV_ES_GUEST */
>
> #include "../kernel/verify_cpu.S"
>
>

2021-01-18 18:10:32

by Paolo Bonzini

[permalink] [raw]
Subject: Re: [PATCH] x86/sev: Add AMD_SEV_ES_GUEST Kconfig for including SEV-ES support

On 16/01/21 06:40, Tom Lendacky wrote:
>
>> Introduce a new Kconfig, AMD_SEV_ES_GUEST, to control the inclusion of
>> support for running as an SEV-ES guest.  Pivoting on AMD_MEM_ENCRYPT for
>> guest SEV-ES support is undesirable for host-only kernel builds as
>> AMD_MEM_ENCRYPT is also required to enable KVM/host support for SEV and
>> SEV-ES.
>
> I believe only KVM_AMD_SEV is required to enable the KVM support to run
> SEV and SEV-ES guests. The AMD_MEM_ENCRYPT_ACTIVE_BY_DEFAULT setting is
> only used to determine whether to enable the KVM SEV/SEV-ES support by
> default on module load.

Right:

if (IS_ENABLED(CONFIG_KVM_AMD_SEV) && sev) {
sev_hardware_setup();
} else {
sev = false;
sev_es = false;
}

I removed the addition to "config AMD_MEM_ENCRYPT_ from Sean's patch,
but (despite merging it not once but twice) I don't really like the
hidden dependency on AMD_MEM_ENCRYPT_ACTIVE_BY_DEFAULT and thus
AMD_MEM_ENCRYPT. Is there any reason to not always enable sev/sev_es by
default?

Paolo

2021-01-18 18:12:22

by Paolo Bonzini

[permalink] [raw]
Subject: Re: [PATCH] x86/sev: Add AMD_SEV_ES_GUEST Kconfig for including SEV-ES support

On 16/01/21 01:25, Sean Christopherson wrote:
>
> @@ -1527,12 +1527,14 @@ config AMD_MEM_ENCRYPT
> select DYNAMIC_PHYSICAL_MASK
> select ARCH_USE_MEMREMAP_PROT
> select ARCH_HAS_FORCE_DMA_UNENCRYPTED
> - select INSTRUCTION_DECODER
> help
> Say yes to enable support for the encryption of system memory.
> This requires an AMD processor that supports Secure Memory
> Encryption (SME).
>
> + This also enables support for running as a Secure Encrypted
> + Virtualization (SEV) guest.
> +
> config AMD_MEM_ENCRYPT_ACTIVE_BY_DEFAULT
> bool "Activate AMD Secure Memory Encryption (SME) by default"
> default y
> @@ -1547,6 +1549,15 @@ config AMD_MEM_ENCRYPT_ACTIVE_BY_DEFAULT
> If set to N, then the encryption of system memory can be
> activated with the mem_encrypt=on command line option.
>
> +config AMD_SEV_ES_GUEST
> + bool "AMD Secure Encrypted Virtualization - Encrypted State (SEV-ES) Guest support"
> + depends on AMD_MEM_ENCRYPT
> + select INSTRUCTION_DECODER
> + help
> + Enable support for running as a Secure Encrypted Virtualization -
> + Encrypted State (SEV-ES) Guest. This enables SEV-ES boot protocol
> + changes, #VC handling, SEV-ES specific hypercalls, etc...
> +

Queued, thanks.

Paolo

2021-01-18 18:20:20

by Tom Lendacky

[permalink] [raw]
Subject: Re: [PATCH] x86/sev: Add AMD_SEV_ES_GUEST Kconfig for including SEV-ES support

On 1/18/21 12:03 PM, Paolo Bonzini wrote:
> On 16/01/21 06:40, Tom Lendacky wrote:
>>
>>> Introduce a new Kconfig, AMD_SEV_ES_GUEST, to control the inclusion of
>>> support for running as an SEV-ES guest.  Pivoting on AMD_MEM_ENCRYPT for
>>> guest SEV-ES support is undesirable for host-only kernel builds as
>>> AMD_MEM_ENCRYPT is also required to enable KVM/host support for SEV and
>>> SEV-ES.
>>
>> I believe only KVM_AMD_SEV is required to enable the KVM support to run
>> SEV and SEV-ES guests. The AMD_MEM_ENCRYPT_ACTIVE_BY_DEFAULT setting is
>> only used to determine whether to enable the KVM SEV/SEV-ES support by
>> default on module load.
>
> Right:
>
>         if (IS_ENABLED(CONFIG_KVM_AMD_SEV) && sev) {
>                 sev_hardware_setup();
>         } else {
>                 sev = false;
>                 sev_es = false;
>         }
>
> I removed the addition to "config AMD_MEM_ENCRYPT_ from Sean's patch, but
> (despite merging it not once but twice) I don't really like the hidden
> dependency on AMD_MEM_ENCRYPT_ACTIVE_BY_DEFAULT and thus AMD_MEM_ENCRYPT.
> Is there any reason to not always enable sev/sev_es by default?

I don't remember where the AMD_MEM_ENCRYPT_ACTIVE_BY_DEFAULT suggestion
originally came from. I thought it was from review feedback on the
original SEV patches, but can't find anything about it. @Brijesh might
remember.

But I see no reason not to enable them by default.

Thanks,
Tom

>
> Paolo
>

2021-01-18 20:30:06

by Borislav Petkov

[permalink] [raw]
Subject: Re: [PATCH] x86/sev: Add AMD_SEV_ES_GUEST Kconfig for including SEV-ES support

On Mon, Jan 18, 2021 at 06:59:38PM +0100, Paolo Bonzini wrote:
> On 16/01/21 01:25, Sean Christopherson wrote:
> >
> > @@ -1527,12 +1527,14 @@ config AMD_MEM_ENCRYPT
> > select DYNAMIC_PHYSICAL_MASK
> > select ARCH_USE_MEMREMAP_PROT
> > select ARCH_HAS_FORCE_DMA_UNENCRYPTED
> > - select INSTRUCTION_DECODER
> > help
> > Say yes to enable support for the encryption of system memory.
> > This requires an AMD processor that supports Secure Memory
> > Encryption (SME).
> > + This also enables support for running as a Secure Encrypted
> > + Virtualization (SEV) guest.
> > +
> > config AMD_MEM_ENCRYPT_ACTIVE_BY_DEFAULT
> > bool "Activate AMD Secure Memory Encryption (SME) by default"
> > default y
> > @@ -1547,6 +1549,15 @@ config AMD_MEM_ENCRYPT_ACTIVE_BY_DEFAULT
> > If set to N, then the encryption of system memory can be
> > activated with the mem_encrypt=on command line option.
> > +config AMD_SEV_ES_GUEST
> > + bool "AMD Secure Encrypted Virtualization - Encrypted State (SEV-ES) Guest support"
> > + depends on AMD_MEM_ENCRYPT
> > + select INSTRUCTION_DECODER
> > + help
> > + Enable support for running as a Secure Encrypted Virtualization -
> > + Encrypted State (SEV-ES) Guest. This enables SEV-ES boot protocol
> > + changes, #VC handling, SEV-ES specific hypercalls, etc...
> > +
>
> Queued, thanks.

Say, Paolo, why are you queuing a patch which goes through tip, if at all?

--
Regards/Gruss,
Boris.

https://people.kernel.org/tglx/notes-about-netiquette

2021-01-18 20:33:33

by Borislav Petkov

[permalink] [raw]
Subject: Re: [PATCH] x86/sev: Add AMD_SEV_ES_GUEST Kconfig for including SEV-ES support

On Fri, Jan 15, 2021 at 04:25:17PM -0800, Sean Christopherson wrote:
> Introduce a new Kconfig, AMD_SEV_ES_GUEST, to control the inclusion of
> support for running as an SEV-ES guest. Pivoting on AMD_MEM_ENCRYPT for
> guest SEV-ES support is undesirable for host-only kernel builds as
> AMD_MEM_ENCRYPT is also required to enable KVM/host support for SEV and
> SEV-ES.

Huh, what?

I'm not sure I understand what you're trying to say here and am not
convinced why yet another Kconfig symbol is needed?

--
Regards/Gruss,
Boris.

https://people.kernel.org/tglx/notes-about-netiquette

2021-01-18 20:37:43

by Paolo Bonzini

[permalink] [raw]
Subject: Re: [PATCH] x86/sev: Add AMD_SEV_ES_GUEST Kconfig for including SEV-ES support

On 18/01/21 21:26, Borislav Petkov wrote:
> On Mon, Jan 18, 2021 at 06:59:38PM +0100, Paolo Bonzini wrote:
>> On 16/01/21 01:25, Sean Christopherson wrote:
>>>
>>> @@ -1527,12 +1527,14 @@ config AMD_MEM_ENCRYPT
>>> select DYNAMIC_PHYSICAL_MASK
>>> select ARCH_USE_MEMREMAP_PROT
>>> select ARCH_HAS_FORCE_DMA_UNENCRYPTED
>>> - select INSTRUCTION_DECODER
>>> help
>>> Say yes to enable support for the encryption of system memory.
>>> This requires an AMD processor that supports Secure Memory
>>> Encryption (SME).
>>> + This also enables support for running as a Secure Encrypted
>>> + Virtualization (SEV) guest.
>>> +
>>> config AMD_MEM_ENCRYPT_ACTIVE_BY_DEFAULT
>>> bool "Activate AMD Secure Memory Encryption (SME) by default"
>>> default y
>>> @@ -1547,6 +1549,15 @@ config AMD_MEM_ENCRYPT_ACTIVE_BY_DEFAULT
>>> If set to N, then the encryption of system memory can be
>>> activated with the mem_encrypt=on command line option.
>>> +config AMD_SEV_ES_GUEST
>>> + bool "AMD Secure Encrypted Virtualization - Encrypted State (SEV-ES) Guest support"
>>> + depends on AMD_MEM_ENCRYPT
>>> + select INSTRUCTION_DECODER
>>> + help
>>> + Enable support for running as a Secure Encrypted Virtualization -
>>> + Encrypted State (SEV-ES) Guest. This enables SEV-ES boot protocol
>>> + changes, #VC handling, SEV-ES specific hypercalls, etc...
>>> +
>>
>> Queued, thanks.
>
> Say, Paolo, why are you queuing a patch which goes through tip, if at all?

Right you are, unqueued. I would have caught the mistake before
actually crystallizing the hashes, but thanks for noticing!

Sean, please send a v2 that removes the help change for AMD_MEM_ENCRYPT,
too.

Thanks,

Paolo

2021-01-18 20:49:57

by Borislav Petkov

[permalink] [raw]
Subject: Re: [PATCH] x86/sev: Add AMD_SEV_ES_GUEST Kconfig for including SEV-ES support

On Mon, Jan 18, 2021 at 09:32:07PM +0100, Paolo Bonzini wrote:
> I think it makes sense because AMD_SEV_ES_GUEST's #VC handling is quite a
> bit of code that you may not want or need.

Quite a bit of code which ends up practically enabled on the majority of
distros.

And it ain't about savings of whopping KiBs. And yet another Kconfig symbol
in our gazillion Kconfig symbols space means ugly ifdeffery and paying
attention to randconfig builds.

For tailored configs you simply disable AMD_MEM_ENCRYPT on !AMD hw and
all done.

So I don't see the point for this.

Thx.

--
Regards/Gruss,
Boris.

https://people.kernel.org/tglx/notes-about-netiquette

2021-01-19 05:17:42

by Paolo Bonzini

[permalink] [raw]
Subject: Re: [PATCH] x86/sev: Add AMD_SEV_ES_GUEST Kconfig for including SEV-ES support

On 18/01/21 21:29, Borislav Petkov wrote:
> On Fri, Jan 15, 2021 at 04:25:17PM -0800, Sean Christopherson wrote:
>> Introduce a new Kconfig, AMD_SEV_ES_GUEST, to control the inclusion of
>> support for running as an SEV-ES guest. Pivoting on AMD_MEM_ENCRYPT for
>> guest SEV-ES support is undesirable for host-only kernel builds as
>> AMD_MEM_ENCRYPT is also required to enable KVM/host support for SEV and
>> SEV-ES.
>
> Huh, what?
>
> I'm not sure I understand what you're trying to say here and am not
> convinced why yet another Kconfig symbol is needed?

I think it makes sense because AMD_SEV_ES_GUEST's #VC handling is quite
a bit of code that you may not want or need. The commit message does
need a rewrite though.

Paolo

2021-01-19 16:27:27

by Sean Christopherson

[permalink] [raw]
Subject: Re: [PATCH] x86/sev: Add AMD_SEV_ES_GUEST Kconfig for including SEV-ES support

On Mon, Jan 18, 2021, Borislav Petkov wrote:
> On Mon, Jan 18, 2021 at 09:32:07PM +0100, Paolo Bonzini wrote:
> > I think it makes sense because AMD_SEV_ES_GUEST's #VC handling is quite a
> > bit of code that you may not want or need.
>
> Quite a bit of code which ends up practically enabled on the majority of
> distros.
>
> And it ain't about savings of whopping KiBs. And yet another Kconfig symbol
> in our gazillion Kconfig symbols space means ugly ifdeffery and paying
> attention to randconfig builds.
>
> For tailored configs you simply disable AMD_MEM_ENCRYPT on !AMD hw and
> all done.

It was the AMD_MEM_ENCRYPT_ACTIVE_BY_DEFAULT dependency that tripped me up. To
get KVM to enable SEV/SEV-ES by default, that needs to be enabled, which in turn
requires AMD_MEM_ENCRYPT=y. I didn't realize that there isn't actually a
dependency on AMD_MEM_ENCRYPT=y

> So I don't see the point for this.

Agreed, I'll send a KVM patch to remove the AMD_MEM_ENCRYPT_ACTIVE_BY_DEFAULT
dependency.

2021-01-19 17:13:43

by Borislav Petkov

[permalink] [raw]
Subject: Re: [PATCH] x86/sev: Add AMD_SEV_ES_GUEST Kconfig for including SEV-ES support

On Tue, Jan 19, 2021 at 08:23:20AM -0800, Sean Christopherson wrote:
> It was the AMD_MEM_ENCRYPT_ACTIVE_BY_DEFAULT dependency that tripped me up. To
> get KVM to enable SEV/SEV-ES by default,

By default? What would be the use case for that?

> Agreed, I'll send a KVM patch to remove the
> AMD_MEM_ENCRYPT_ACTIVE_BY_DEFAULT dependency.

Yah, AMD_MEM_ENCRYPT_ACTIVE_BY_DEFAULT came out of the initial memory
enc. SME patchset where the use case was something along the lines of
booting a kernel and SME being enabled by default. But Tom doesn't
remember exactly either. I guess that thing doesn't belong in kvm code
anyway...

--
Regards/Gruss,
Boris.

https://people.kernel.org/tglx/notes-about-netiquette

2021-01-19 17:17:26

by Paolo Bonzini

[permalink] [raw]
Subject: Re: [PATCH] x86/sev: Add AMD_SEV_ES_GUEST Kconfig for including SEV-ES support

On 19/01/21 18:09, Borislav Petkov wrote:
>> It was the AMD_MEM_ENCRYPT_ACTIVE_BY_DEFAULT dependency that tripped me up. To
>> get KVM to enable SEV/SEV-ES by default,
> By default? What would be the use case for that?

It doesn't enable by default SEV/SEV-ES for all the guests, it only
enables the functionality.

But tying that to a Kconfig value is useless, it should just default to
1 (allow creating encrypted guests) if the hardware is available.

Paolo