On 2025-04-22 at 0:24, Ashish Kalra wrote: > diff --git a/drivers/crypto/ccp/sev-dev.c b/drivers/crypto/ccp/sev- > dev.c > index b08db412f752..f4f8a8905115 100644 > --- a/drivers/crypto/ccp/sev-dev.c > +++ b/drivers/crypto/ccp/sev-dev.c > @@ -232,6 +232,7 @@ static int sev_cmd_buffer_len(int cmd) > case SEV_CMD_SNP_GUEST_REQUEST: return > sizeof(struct sev_data_snp_guest_request); > case SEV_CMD_SNP_CONFIG: return sizeof(struct > sev_user_data_snp_config); > case SEV_CMD_SNP_COMMIT: return sizeof(struct > sev_data_snp_commit); > + case SEV_CMD_SNP_FEATURE_INFO: return sizeof(struct > snp_feature_info); This function is supposed to return the size of the command buffer, so for this command it should return sizeof(struct sev_data_snp_feature_info). > default: return 0; > } > > @@ -1072,6 +1073,50 @@ static void snp_set_hsave_pa(void *arg) > wrmsrq(MSR_VM_HSAVE_PA, 0); > } > > +static void snp_get_platform_data(void) > +{ > + struct sev_device *sev = psp_master->sev_data; > + struct sev_data_snp_feature_info snp_feat_info; > + struct snp_feature_info *feat_info; > + struct sev_data_snp_addr buf; > + int error = 0, rc; > + > + if (!cc_platform_has(CC_ATTR_HOST_SEV_SNP)) > + return; > + > + /* > + * The output buffer must be firmware page if SEV-SNP is > + * initialized. > + */ > + if (sev->snp_initialized) > + return; > + > + buf.address = __psp_pa(&sev->snp_plat_status); > + rc = __sev_do_cmd_locked(SEV_CMD_SNP_PLATFORM_STATUS, &buf, > &error); > + > + /* > + * Do feature discovery of the currently loaded firmware, > + * and cache feature information from CPUID 0x8000_0024, > + * sub-function 0. > + */ > + if (!rc && sev->snp_plat_status.feature_info) { > + /* > + * Use dynamically allocated structure for the > SNP_FEATURE_INFO > + * command to handle any alignment and page boundary > check > + * requirements. > + */ > + feat_info = kzalloc(sizeof(*feat_info), GFP_KERNEL); The SEV firmware requires the supplied memory range to not cross a page boundary, but kzalloc() does not guarantee that the allocated memory fits this requirement. You need to allocate a larger chunk of memory (2 * sizeof(*feat_info) will be enough), and possibly set feature_info_paddr to an offset from the start of the allocated memory.