Re: [PATCH v8 33/40] x86/compressed/64: add identity mapping for Confidential Computing blob

Michael Roth
2021-12-13T18:08:40Z

On Fri, Dec 10, 2021 at 11:52:28AM -0800, Dave Hansen wrote:
> On 12/10/21 7:43 AM, Brijesh Singh wrote:
> > +static void sev_prep_identity_maps(void)
> > +{
> > + /*
> > + * The ConfidentialComputing blob is used very early in uncompressed
> > + * kernel to find the in-memory cpuid table to handle cpuid
> > + * instructions. Make sure an identity-mapping exists so it can be
> > + * accessed after switchover.
> > + */
> > + if (sev_snp_enabled()) {
> > + struct cc_blob_sev_info *cc_info =
> > + (void *)(unsigned long)boot_params->cc_blob_address;
> > +
> > + add_identity_map((unsigned long)cc_info,
> > + (unsigned long)cc_info + sizeof(*cc_info));
> > + add_identity_map((unsigned long)cc_info->cpuid_phys,
> > + (unsigned long)cc_info->cpuid_phys + cc_info->cpuid_len);
> > + }
>
> The casting here is pretty ugly. Also, isn't ->cpuid_phys already a
> u64? Whats the idea behind casting it?
>
> I also have a sneaking suspicion that a single "unsigned long cc_blob"
> could remove virtually all the casting. Does this work?
>
> unsigned long cc_blob = boot_params->cc_blob_addres;
> struct cc_blob_sev_info *cc_info;
>
> add_identity_map(cc_blob, cc_blob + sizeof(*cc_info));
>
> cc_info = (struct cc_blob_sev_info *)cc_blob;
> add_identity_map(cc_info->cpuid_phys,
> cc_info->cpuid_phys + cc_info->cpuid_len);

Yes, the cc->cpuid_phys cast is not needed, and your suggested implementation
is clearer and compiles/runs without any issues. I'll implement it this way for
the next spin. Thanks!