On Fri, Dec 10, 2021 at 11:52:28AM -0800, Dave Hansen wrote:
On 12/10/21 7:43 AM, Brijesh Singh wrote:
quoted
+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!