Message ID | 20240206082852.3333299-2-xiaoyao.li@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Confidential Guest Support: Introduce kvm_init() and kvm_reset() virtual functions | expand |
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.li@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
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; + } + + 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 */
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.li@intel.com> --- include/exec/confidential-guest-support.h | 42 ++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-)