Hi David,

On Thu, Sep 26, 2024 at 07:37:57PM +0100, David Woodhouse wrote:
> @@ -392,6 +403,32 @@ static int kvm_psci_1_x_call(struct kvm_vcpu *vcpu, u32 
> minor)
>                       break;
>               }
>               break;
> +     case PSCI_1_3_FN_SYSTEM_OFF2:
> +             kvm_psci_narrow_to_32bit(vcpu);
> +             fallthrough;
> +     case PSCI_1_3_FN64_SYSTEM_OFF2:
> +             if (minor < 3)
> +                     break;
> +
> +             arg = smccc_get_arg1(vcpu);
> +             if (arg != PSCI_1_3_HIBERNATE_TYPE_OFF) {
> +                     val = PSCI_RET_INVALID_PARAMS;
> +                     break;
> +             }

This is missing a check that arg2 must be zero.

> +             kvm_psci_system_off2(vcpu);
> +             /*
> +              * We shouldn't be going back to guest VCPU after
> +              * receiving SYSTEM_OFF2 request.
> +              *
> +              * If user space accidentally/deliberately resumes
> +              * guest VCPU after SYSTEM_OFF2 request then guest
> +              * VCPU should see internal failure from PSCI return
> +              * value. To achieve this, we preload r0 (or x0) with
> +              * PSCI return value INTERNAL_FAILURE.
> +              */
> +             val = PSCI_RET_INTERNAL_FAILURE;
> +             ret = 0;
> +             break;
>       default:
>               return kvm_psci_0_2_call(vcpu);
>       }
> -- 
> 2.44.0
>

-- 
Thanks,
Oliver

Reply via email to