On 10/5/21 12:52 PM, Peter Gonda wrote: > > +static int sev_init_if_required(int cmd_id, bool writable, > + struct sev_issue_cmd *argp) > +{ > + struct sev_device *sev = psp_master->sev_data; > + > + lockdep_assert_held(&sev_cmd_mutex); > + > + if (!writable) > + return -EPERM; > + > + if (cmd_id == SEV_FACTORY_RESET || cmd_id == SEV_PLATFORM_STATUS || > + cmd_id == SEV_GET_ID || cmd_id == SEV_GET_ID2) > + return 0; > + > + if (sev->state == SEV_STATE_UNINIT) > + return __sev_platform_init_locked(&argp->error); > + > + return 0; > +} > + > static long sev_ioctl(struct file *file, unsigned int ioctl, unsigned long arg) > { > void __user *argp = (void __user *)arg; > @@ -840,8 +825,11 @@ static long sev_ioctl(struct file *file, unsigned int ioctl, unsigned long arg) > > mutex_lock(&sev_cmd_mutex); > > - switch (input.cmd) { > + ret = sev_init_if_required(input.cmd, writable, &input); > + if (ret) > + goto copy_out; We need to call this function only for the SEV commands (i.e input.cmd >=0 && input.cmd <= SEV_GET_ID2). Otherwise a invalid command may trigger SEV_INIT. e.g below sequence: 1) SEV_FACTORY_RESET // this will transition the fw to UNINIT state. 2) <INVALID_CMD_ID> // since fw was in uninit this invalid command will initialize the fw and then later switch will fail. thanks