On Fri, Jun 21, 2024, Michael Roth wrote: > diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst > index ecfa25b505e7..2eea9828d9aa 100644 > --- a/Documentation/virt/kvm/api.rst > +++ b/Documentation/virt/kvm/api.rst > @@ -7122,6 +7122,97 @@ Please note that the kernel is allowed to use the kvm_run structure as the > primary storage for certain register types. Therefore, the kernel may use the > values in kvm_run even if the corresponding bit in kvm_dirty_regs is not set. > > +:: > + > + /* KVM_EXIT_COCO */ > + struct kvm_exit_coco { > + #define KVM_EXIT_COCO_REQ_CERTS 0 > + #define KVM_EXIT_COCO_MAX 1 > + __u8 nr; > + __u8 pad0[7]; > + union { > + struct { > + __u64 gfn; > + __u32 npages; > + #define KVM_EXIT_COCO_REQ_CERTS_ERR_INVALID_LEN 1 > + #define KVM_EXIT_COCO_REQ_CERTS_ERR_GENERIC (1 << 31) Unless I'm mistaken, these error codes are defined by the GHCB, which means the values matter, i.e. aren't arbitrary KVM-defined values. I forget exactly what we discussed in PUCK, but for the error codes, I think KVM should either define it's own values that are completely disconnected from any "harware" spec, or KVM should very explicitly #define all hardware values and have the semantics of "ret" be vendor specific. A hybrid approach doesn't really work, e.g. KVM_EXIT_COCO_REQ_CERTS_ERR_GENERIC isn't used anywhere and and looks quite odd. My vote is for vendor specific error codes, because unlike having a common user exit reason+struct, I don't think arch-neutral error codes will minimize KVM's ABI, I think it'll do the exact opposite. The only thing we need to require is that '0' == success. E.g. I think we can end up with something like: static int snp_complete_req_certs(struct kvm_vcpu *vcpu) { struct vcpu_svm *svm = to_svm(vcpu); struct vmcb_control_area *control = &svm->vmcb->control; if (vcpu->run->coco.req_certs.ret) if (vcpu->run->coco.req_certs.ret == SNP_GUEST_VMM_ERR_INVALID_LEN) vcpu->arch.regs[VCPU_REGS_RBX] = vcpu->run->coco.req_certs.npages; ghcb_set_sw_exit_info_2(svm->sev_es.ghcb, SNP_GUEST_ERR(vcpu->run->coco.req_certs.ret, 0)); return 1; } return snp_handle_guest_req(svm, control->exit_info_1, control->exit_info_2); } > + __u32 ret; > + } req_certs; > + };