On Sun, May 30, 2021 at 11:06:21AM -0400, Tianyu Lan wrote:
> +void hv_ghcb_msr_write(u64 msr, u64 value)
> +{
> +     union hv_ghcb *hv_ghcb;
> +     void **ghcb_base;
> +     unsigned long flags;
> +
> +     if (!ms_hyperv.ghcb_base)
> +             return;
> +
> +     local_irq_save(flags);
> +     ghcb_base = (void **)this_cpu_ptr(ms_hyperv.ghcb_base);
> +     hv_ghcb = (union hv_ghcb *)*ghcb_base;
> +     if (!hv_ghcb) {
> +             local_irq_restore(flags);
> +             return;
> +     }
> +
> +     memset(hv_ghcb, 0x00, HV_HYP_PAGE_SIZE);
> +
> +     hv_ghcb->ghcb.protocol_version = 1;
> +     hv_ghcb->ghcb.ghcb_usage = 0;
> +
> +     ghcb_set_sw_exit_code(&hv_ghcb->ghcb, SVM_EXIT_MSR);
> +     ghcb_set_rcx(&hv_ghcb->ghcb, msr);
> +     ghcb_set_rax(&hv_ghcb->ghcb, lower_32_bits(value));
> +     ghcb_set_rdx(&hv_ghcb->ghcb, value >> 32);
> +     ghcb_set_sw_exit_info_1(&hv_ghcb->ghcb, 1);
> +     ghcb_set_sw_exit_info_2(&hv_ghcb->ghcb, 0);
> +
> +     VMGEXIT();

This is not safe to use from NMI context. You need at least some
checking or WARN_ON/assertion/whatever to catch cases where this is
violated. Otherwise it will result in some hard to debug bug reports.

Regards,

        Joerg
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Reply via email to