On Tue, Feb 06, 2024 at 03:28:49AM -0500, Xiaoyao Li wrote: > Different confidential VMs in different architectures all have the same > needs to do their specific initialization (and maybe resetting) stuffs > with KVM. Currently each of them exposes individual *_kvm_init() > functions and let machine code or kvm code to call it. > > To make it more object oriented, add two virtual functions, kvm_init() > and kvm_reset() in ConfidentialGuestSupportClass, and expose two helpers > functions for invodking them. > > Signed-off-by: Xiaoyao Li <xiaoyao...@intel.com> > --- > include/exec/confidential-guest-support.h | 42 ++++++++++++++++++++++- > 1 file changed, 41 insertions(+), 1 deletion(-) > > diff --git a/include/exec/confidential-guest-support.h > b/include/exec/confidential-guest-support.h > index ba2dd4b5dfc4..ff0bfb26ad7a 100644 > --- a/include/exec/confidential-guest-support.h > +++ b/include/exec/confidential-guest-support.h > @@ -23,7 +23,10 @@ > #include "qom/object.h" > > #define TYPE_CONFIDENTIAL_GUEST_SUPPORT "confidential-guest-support" > -OBJECT_DECLARE_SIMPLE_TYPE(ConfidentialGuestSupport, > CONFIDENTIAL_GUEST_SUPPORT) > +OBJECT_DECLARE_TYPE(ConfidentialGuestSupport, > + ConfidentialGuestSupportClass, > + CONFIDENTIAL_GUEST_SUPPORT) > + > > struct ConfidentialGuestSupport { > Object parent; > @@ -55,8 +58,45 @@ struct ConfidentialGuestSupport { > > typedef struct ConfidentialGuestSupportClass { > ObjectClass parent; > + > + int (*kvm_init)(ConfidentialGuestSupport *cgs, Error **errp); > + int (*kvm_reset)(ConfidentialGuestSupport *cgs, Error **errp); > } ConfidentialGuestSupportClass; > > +static inline int confidential_guest_kvm_init(ConfidentialGuestSupport *cgs, > + Error **errp) > +{ > + ConfidentialGuestSupportClass *klass; > + > + if (!cgs) { > + return 0; > + }
Typically I would expect any class/object methods to mandate a non-NULL class/instance pointer. IOW, the caller would generally be expected to check NULL and not call this method in that case. > + > + klass = CONFIDENTIAL_GUEST_SUPPORT_GET_CLASS(cgs); > + if (klass->kvm_init) { > + return klass->kvm_init(cgs, errp); > + } > + > + return 0; > +} > + > +static inline int confidential_guest_kvm_reset(ConfidentialGuestSupport *cgs, > + Error **errp) > +{ > + ConfidentialGuestSupportClass *klass; > + > + if (!cgs) { > + return 0; > + } > + > + klass = CONFIDENTIAL_GUEST_SUPPORT_GET_CLASS(cgs); > + if (klass->kvm_reset) { > + return klass->kvm_reset(cgs, errp); > + } > + > + return 0; > +} > + > #endif /* !CONFIG_USER_ONLY */ > > #endif /* QEMU_CONFIDENTIAL_GUEST_SUPPORT_H */ > -- > 2.34.1 > With regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|