Hi Heyi, On 24/09/2019 16:20, Heyi Guo wrote: > Add new KVM capability "KVM_CAP_FORWARD_HYPERCALL" for user space to > probe whether KVM supports forwarding hypercall. > > The capability should be enabled by user space explicitly, for we > don't want user space application to deal with unexpected hypercall > exits. We also use an additional argument to pass exception bit mask, > to request KVM to forward all hypercalls except the classes specified > in the bit mask. > > Currently only PSCI can be set as exception, so that we can still keep > consistent with the old PSCI processing flow. I agree this needs to be default-on, but I don't think this exclusion mechanism is extensible. > diff --git a/arch/arm64/kvm/reset.c b/arch/arm64/kvm/reset.c > index f4a8ae9..2201b62 100644 > --- a/arch/arm64/kvm/reset.c > +++ b/arch/arm64/kvm/reset.c > @@ -102,6 +105,28 @@ int kvm_arch_vm_ioctl_check_extension(struct kvm *kvm, long ext) > return r; > } > > +int kvm_vm_ioctl_enable_cap(struct kvm *kvm, > + struct kvm_enable_cap *cap) > +{ > + if (cap->flags) > + return -EINVAL; > + > + switch (cap->cap) { > + case KVM_CAP_FORWARD_HYPERCALL: { > + __u64 exclude_flags = cap->args[0]; and if there are more than 64 things to exclude? > + /* Only support excluding PSCI right now */ > + if (exclude_flags & ~KVM_CAP_FORWARD_HYPERCALL_EXCL_PSCI) > + return -EINVAL; Once we have a 65th bit, older kernels will let user-space set it, but nothing happens. > + kvm->arch.hypercall_forward = true; > + if (exclude_flags & KVM_CAP_FORWARD_HYPERCALL_EXCL_PSCI) > + kvm->arch.hypercall_excl_psci = true; > + return 0; > + } > + } > + > + return -EINVAL; > +} While 4*64 'named bits' for SMC/HVC ranges might be enough, it is tricky to work with. Both the kernel and user-space have to maintain a list of bit->name and name->call-number-range, which may change over time. A case in point: According to PSCI's History (Section 7 of DEN022D), PSCIv1.1 added SYSTEM_RESET2, MEM_PROTECT and MEM_PROTECT_CHECK_RANGE. I think its simpler for the HYPERCALL thing to act as a catch-all, and we provide something to enumerate the list of function id's the kernel implements. We can then add controls to disable the PSCI (which I think is the only one we have a case for disabling). I think the PSCI disable should wait until it has a user. Thanks, James