On 9/21/24 22:36, Pavan Kumar Paluri wrote: > Move SEV specific kernel command line option parsing support from > arch/x86/coco/sev/core.c to arch/x86/virt/svm/cmdline.c so that both > host and guest related SEV command line options can be supported. > > No functional changes intended. > > Signed-off-by: Pavan Kumar Paluri <papaluri@xxxxxxx> > Reviewed-by: Tom Lendacky <thomas.lendacky@xxxxxxx> > --- > arch/x86/coco/sev/core.c | 44 ------------------------------- > arch/x86/include/asm/sev-common.h | 29 ++++++++++++++++++++ > arch/x86/virt/svm/Makefile | 1 + > arch/x86/virt/svm/cmdline.c | 32 ++++++++++++++++++++++ > 4 files changed, 62 insertions(+), 44 deletions(-) > create mode 100644 arch/x86/virt/svm/cmdline.c > ... > diff --git a/arch/x86/include/asm/sev-common.h b/arch/x86/include/asm/sev-common.h > index 98726c2b04f8..adddcf3edaf0 100644 > --- a/arch/x86/include/asm/sev-common.h > +++ b/arch/x86/include/asm/sev-common.h > @@ -8,6 +8,8 @@ > #ifndef __ASM_X86_SEV_COMMON_H > #define __ASM_X86_SEV_COMMON_H > > +#include <asm/cache.h> > + > #define GHCB_MSR_INFO_POS 0 > #define GHCB_DATA_LOW 12 > #define GHCB_MSR_INFO_MASK (BIT_ULL(GHCB_DATA_LOW) - 1) > @@ -220,4 +222,31 @@ struct snp_psc_desc { > #define GHCB_ERR_INVALID_INPUT 5 > #define GHCB_ERR_INVALID_EVENT 6 > > +struct sev_config { > + __u64 debug : 1, > + > + /* > + * Indicates when the per-CPU GHCB has been created and registered > + * and thus can be used by the BSP instead of the early boot GHCB. > + * > + * For APs, the per-CPU GHCB is created before they are started > + * and registered upon startup, so this flag can be used globally > + * for the BSP and APs. > + */ > + ghcbs_initialized : 1, > + > + /* > + * Indicates when the per-CPU SVSM CA is to be used instead of the > + * boot SVSM CA. > + * > + * For APs, the per-CPU SVSM CA is created as part of the AP > + * bringup, so this flag can be used globally for the BSP and APs. > + */ > + use_cas : 1, > + > + __reserved : 61; > +}; > + > +extern struct sev_config sev_cfg __read_mostly; So I believe the "__read_mostly" attribute really needs to be on the actual declaration of the struct, below, in cmdline.c, right? You can check and see which section the sev_cfg struct ends up being placed after a build to verify. Thanks, Tom > + > #endif > diff --git a/arch/x86/virt/svm/Makefile b/arch/x86/virt/svm/Makefile > index ef2a31bdcc70..eca6d71355fa 100644 > --- a/arch/x86/virt/svm/Makefile > +++ b/arch/x86/virt/svm/Makefile > @@ -1,3 +1,4 @@ > # SPDX-License-Identifier: GPL-2.0 > > obj-$(CONFIG_KVM_AMD_SEV) += sev.o > +obj-$(CONFIG_CPU_SUP_AMD) += cmdline.o > diff --git a/arch/x86/virt/svm/cmdline.c b/arch/x86/virt/svm/cmdline.c > new file mode 100644 > index 000000000000..964677ab02d6 > --- /dev/null > +++ b/arch/x86/virt/svm/cmdline.c > @@ -0,0 +1,32 @@ > +// SPDX-License-Identifier: GPL-2.0-only > +/* > + * AMD SVM-SEV command line parsing support > + * > + * Copyright (C) 2023 - 2024 Advanced Micro Devices, Inc. > + * > + * Author: Michael Roth <michael.roth@xxxxxxx> > + */ > + > +#include <linux/string.h> > +#include <linux/printk.h> > + > +#include <asm/sev-common.h> > + > +struct sev_config sev_cfg; > + > +static int __init init_sev_config(char *str) > +{ > + char *s; > + > + while ((s = strsep(&str, ","))) { > + if (!strcmp(s, "debug")) { > + sev_cfg.debug = true; > + continue; > + } > + > + pr_info("SEV command-line option '%s' was not recognized\n", s); > + } > + > + return 1; > +} > +__setup("sev=", init_sev_config);