Message ID | 20220512031803.3315890-8-xiaoyao.li@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | TDX QEMU support | expand |
> diff --git a/target/i386/kvm/tdx.h b/target/i386/kvm/tdx.h > index c8a23d95258d..4036ca2f3f99 100644 > --- a/target/i386/kvm/tdx.h > +++ b/target/i386/kvm/tdx.h > @@ -1,6 +1,10 @@ > #ifndef QEMU_I386_TDX_H > #define QEMU_I386_TDX_H > > +#ifndef CONFIG_USER_ONLY > +#include CONFIG_DEVICES /* CONFIG_TDX */ > +#endif > + > #include "exec/confidential-guest-support.h" > > #define TYPE_TDX_GUEST "tdx-guest" > @@ -16,6 +20,12 @@ typedef struct TdxGuest { > uint64_t attributes; /* TD attributes */ > } TdxGuest; > > +#ifdef CONFIG_TDX > +bool is_tdx_vm(void); > +#else > +#define is_tdx_vm() 0 Just add that to the tdx-stubs.c file you already created in one of the previous patches and drop this #ifdef mess ;) take care, Gerd
On Mon, May 23, 2022 at 10:48:17AM +0200, Gerd Hoffmann <kraxel@redhat.com> wrote: > > diff --git a/target/i386/kvm/tdx.h b/target/i386/kvm/tdx.h > > index c8a23d95258d..4036ca2f3f99 100644 > > --- a/target/i386/kvm/tdx.h > > +++ b/target/i386/kvm/tdx.h > > @@ -1,6 +1,10 @@ > > #ifndef QEMU_I386_TDX_H > > #define QEMU_I386_TDX_H > > > > +#ifndef CONFIG_USER_ONLY > > +#include CONFIG_DEVICES /* CONFIG_TDX */ > > +#endif > > + > > #include "exec/confidential-guest-support.h" > > > > #define TYPE_TDX_GUEST "tdx-guest" > > @@ -16,6 +20,12 @@ typedef struct TdxGuest { > > uint64_t attributes; /* TD attributes */ > > } TdxGuest; > > > > +#ifdef CONFIG_TDX > > +bool is_tdx_vm(void); > > +#else > > +#define is_tdx_vm() 0 > > Just add that to the tdx-stubs.c file you already created in one of the > previous patches and drop this #ifdef mess ;) This is for consistency with SEV. Anyway Either way is okay. From target/i386/sev.h ... #ifdef CONFIG_SEV bool sev_enabled(void); bool sev_es_enabled(void); #else #define sev_enabled() 0 #define sev_es_enabled() 0 #endif
> > > +#ifdef CONFIG_TDX > > > +bool is_tdx_vm(void); > > > +#else > > > +#define is_tdx_vm() 0 > > > > Just add that to the tdx-stubs.c file you already created in one of the > > previous patches and drop this #ifdef mess ;) > > This is for consistency with SEV. Anyway Either way is okay. > From target/i386/sev.h > ... > #ifdef CONFIG_SEV > bool sev_enabled(void); > bool sev_es_enabled(void); > #else > #define sev_enabled() 0 > #define sev_es_enabled() 0 > #endif Hmm, not sure why sev did it this way. One possible reason is that the compiler optimizer can see sev_enabled() evaluates to 0 and throw away the dead code branches then. So, yes, maybe it makes sense to stick to the #ifdef in this specific case. take care, Gerd
diff --git a/target/i386/kvm/tdx.c b/target/i386/kvm/tdx.c index 68bedbad0ebe..803154efdb91 100644 --- a/target/i386/kvm/tdx.c +++ b/target/i386/kvm/tdx.c @@ -19,6 +19,14 @@ #include "hw/i386/x86.h" #include "tdx.h" +static TdxGuest *tdx_guest; + +/* It's valid after kvm_confidential_guest_init()->kvm_tdx_init() */ +bool is_tdx_vm(void) +{ + return !!tdx_guest; +} + enum tdx_ioctl_level{ TDX_PLATFORM_IOCTL, TDX_VM_IOCTL, @@ -101,10 +109,15 @@ static void get_tdx_capabilities(void) int tdx_kvm_init(MachineState *ms, Error **errp) { + TdxGuest *tdx = (TdxGuest *)object_dynamic_cast(OBJECT(ms->cgs), + TYPE_TDX_GUEST); + if (!tdx_caps) { get_tdx_capabilities(); } + tdx_guest = tdx; + return 0; } diff --git a/target/i386/kvm/tdx.h b/target/i386/kvm/tdx.h index c8a23d95258d..4036ca2f3f99 100644 --- a/target/i386/kvm/tdx.h +++ b/target/i386/kvm/tdx.h @@ -1,6 +1,10 @@ #ifndef QEMU_I386_TDX_H #define QEMU_I386_TDX_H +#ifndef CONFIG_USER_ONLY +#include CONFIG_DEVICES /* CONFIG_TDX */ +#endif + #include "exec/confidential-guest-support.h" #define TYPE_TDX_GUEST "tdx-guest" @@ -16,6 +20,12 @@ typedef struct TdxGuest { uint64_t attributes; /* TD attributes */ } TdxGuest; +#ifdef CONFIG_TDX +bool is_tdx_vm(void); +#else +#define is_tdx_vm() 0 +#endif /* CONFIG_TDX */ + int tdx_kvm_init(MachineState *ms, Error **errp); #endif /* QEMU_I386_TDX_H */
It will need special handling for TDX VMs all around the QEMU. Introduce is_tdx_vm() helper to query if it's a TDX VM. Cache tdx_guest object thus no need to cast from ms->cgs every time. Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com> --- target/i386/kvm/tdx.c | 13 +++++++++++++ target/i386/kvm/tdx.h | 10 ++++++++++ 2 files changed, 23 insertions(+)