Re: [PATCH for-5.18] KVM: fix bad user ABI for KVM_EXIT_SYSTEM_EVENT

From: Sean Christopherson
Date: Fri Apr 29 2022 - 10:06:58 EST


On Fri, Apr 22, 2022, Paolo Bonzini wrote:
> For compatibility with userspace that was using the flags field,
> a union overlaps flags with data[0].

I think "compatibility" is slightly misleading, e.g. the offset of the field is
changing for 32-bit userspace.

To avoid breaking compilation of userspace that was using the flags
field, provide a userspace-only union to overlap flags with data[0].

> diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h
> index 91a6fe4e02c0..f903ab0c8d7a 100644
> --- a/include/uapi/linux/kvm.h
> +++ b/include/uapi/linux/kvm.h
> @@ -445,7 +445,11 @@ struct kvm_run {
> #define KVM_SYSTEM_EVENT_RESET 2
> #define KVM_SYSTEM_EVENT_CRASH 3
> __u32 type;
> - __u64 flags;
> + __u32 ndata;
> + union {
> + __u64 flags;

As alluded to above, what about wrapping flags in

#ifndef __KERNEL__
__u64 flags;
#endif

so that KVM doesn't try to use flags?

> + __u64 data[16];
> + };
> } system_event;
> /* KVM_EXIT_S390_STSI */
> struct {