[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20210820151933.22401-31-brijesh.singh@amd.com>
Date: Fri, 20 Aug 2021 10:19:25 -0500
From: Brijesh Singh <brijesh.singh@....com>
To: x86@...nel.org, linux-kernel@...r.kernel.org, kvm@...r.kernel.org,
linux-efi@...r.kernel.org, platform-driver-x86@...r.kernel.org,
linux-coco@...ts.linux.dev, linux-mm@...ck.org
Cc: Thomas Gleixner <tglx@...utronix.de>,
Ingo Molnar <mingo@...hat.com>, Joerg Roedel <jroedel@...e.de>,
Tom Lendacky <thomas.lendacky@....com>,
"H. Peter Anvin" <hpa@...or.com>, Ard Biesheuvel <ardb@...nel.org>,
Paolo Bonzini <pbonzini@...hat.com>,
Sean Christopherson <seanjc@...gle.com>,
Vitaly Kuznetsov <vkuznets@...hat.com>,
Wanpeng Li <wanpengli@...cent.com>,
Jim Mattson <jmattson@...gle.com>,
Andy Lutomirski <luto@...nel.org>,
Dave Hansen <dave.hansen@...ux.intel.com>,
Sergio Lopez <slp@...hat.com>, Peter Gonda <pgonda@...gle.com>,
Peter Zijlstra <peterz@...radead.org>,
Srinivas Pandruvada <srinivas.pandruvada@...ux.intel.com>,
David Rientjes <rientjes@...gle.com>,
Dov Murik <dovmurik@...ux.ibm.com>,
Tobin Feldman-Fitzthum <tobin@....com>,
Borislav Petkov <bp@...en8.de>,
Michael Roth <michael.roth@....com>,
Vlastimil Babka <vbabka@...e.cz>,
"Kirill A . Shutemov" <kirill@...temov.name>,
Andi Kleen <ak@...ux.intel.com>, tony.luck@...el.com,
marcorr@...gle.com, sathyanarayanan.kuppuswamy@...ux.intel.com,
Brijesh Singh <brijesh.singh@....com>
Subject: [PATCH Part1 v5 30/38] x86/compressed/64: store Confidential Computing blob address in bootparams
From: Michael Roth <michael.roth@....com>
When the Confidential Computing blob is located by the boot/compressed
kernel, store a pointer to it in bootparams->cc_blob_address to avoid
the need for the run-time kernel to rescan the EFI config table to find
it again.
Since this function is also shared by the run-time kernel, this patch
also adds the logic to make use of bootparams->cc_blob_address when it
has been initialized.
Signed-off-by: Michael Roth <michael.roth@....com>
Signed-off-by: Brijesh Singh <brijesh.singh@....com>
---
arch/x86/kernel/sev-shared.c | 40 ++++++++++++++++++++++++++----------
1 file changed, 29 insertions(+), 11 deletions(-)
diff --git a/arch/x86/kernel/sev-shared.c b/arch/x86/kernel/sev-shared.c
index 651980ddbd65..6f70ba293c5e 100644
--- a/arch/x86/kernel/sev-shared.c
+++ b/arch/x86/kernel/sev-shared.c
@@ -868,7 +868,6 @@ static enum es_result vc_handle_rdtsc(struct ghcb *ghcb,
return ES_OK;
}
-#ifdef BOOT_COMPRESSED
static struct setup_data *get_cc_setup_data(struct boot_params *bp)
{
struct setup_data *hdr = (struct setup_data *)bp->hdr.setup_data;
@@ -888,6 +887,16 @@ static struct setup_data *get_cc_setup_data(struct boot_params *bp)
* 1) Search for CC blob in the following order/precedence:
* - via linux boot protocol / setup_data entry
* - via EFI configuration table
+ * 2) If found, initialize boot_params->cc_blob_address to point to the
+ * blob so that uncompressed kernel can easily access it during very
+ * early boot without the need to re-parse EFI config table
+ * 3) Return a pointer to the CC blob, NULL otherwise.
+ *
+ * For run-time/uncompressed kernel:
+ *
+ * 1) Search for CC blob in the following order/precedence:
+ * - via linux boot protocol / setup_data entry
+ * - via boot_params->cc_blob_address
* 2) Return a pointer to the CC blob, NULL otherwise.
*/
static struct cc_blob_sev_info *sev_snp_probe_cc_blob(struct boot_params *bp)
@@ -897,9 +906,11 @@ static struct cc_blob_sev_info *sev_snp_probe_cc_blob(struct boot_params *bp)
struct setup_data header;
u32 cc_blob_address;
} *sd;
+#ifdef __BOOT_COMPRESSED
unsigned long conf_table_pa;
unsigned int conf_table_len;
bool efi_64;
+#endif
/* Try to get CC blob via setup_data */
sd = (struct setup_data_cc *)get_cc_setup_data(bp);
@@ -908,29 +919,36 @@ static struct cc_blob_sev_info *sev_snp_probe_cc_blob(struct boot_params *bp)
goto out_verify;
}
+#ifdef __BOOT_COMPRESSED
/* CC blob isn't in setup_data, see if it's in the EFI config table */
if (!efi_get_conf_table(bp, &conf_table_pa, &conf_table_len, &efi_64))
(void)efi_find_vendor_table(conf_table_pa, conf_table_len,
EFI_CC_BLOB_GUID, efi_64,
(unsigned long *)&cc_info);
+#else
+ /*
+ * CC blob isn't in setup_data, see if boot kernel passed it via
+ * boot_params.
+ */
+ if (bp->cc_blob_address)
+ cc_info = (struct cc_blob_sev_info *)(unsigned long)bp->cc_blob_address;
+#endif
out_verify:
/* CC blob should be either valid or not present. Fail otherwise. */
if (cc_info && cc_info->magic != CC_BLOB_SEV_HDR_MAGIC)
sev_es_terminate(1, GHCB_SNP_UNSUPPORTED);
+#ifdef __BOOT_COMPRESSED
+ /*
+ * Pass run-time kernel a pointer to CC info via boot_params for easier
+ * access during early boot.
+ */
+ bp->cc_blob_address = (u32)(unsigned long)cc_info;
+#endif
+
return cc_info;
}
-#else
-/*
- * Probing for CC blob for run-time kernel will be enabled in a subsequent
- * patch. For now we need to stub this out.
- */
-static struct cc_blob_sev_info *sev_snp_probe_cc_blob(struct boot_params *bp)
-{
- return NULL;
-}
-#endif
/*
* Initial set up of CPUID table when running identity-mapped.
--
2.17.1
Powered by blists - more mailing lists