On 10/12/21 7:34 AM, Peter Gonda wrote: > On Fri, Oct 8, 2021 at 9:52 AM Brijesh Singh <brijesh.singh@xxxxxxx> wrote: >> >> 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. > Good catch, I took Marc's suggested approach for a V2. Does that sound > reasonable? Yes, that works. thanks