On Thu, Oct 07, 2021 at 06:17:09PM +0200, Philippe Mathieu-Daudé wrote: > Only declare sev_enabled() and sev_es_enabled() when CONFIG_SEV is > set, to allow the compiler to elide unused code. Remove unnecessary > stubs. > > Signed-off-by: Philippe Mathieu-Daudé <philmd@xxxxxxxxxx> > --- > target/i386/sev.h | 14 ++++++++++++-- > target/i386/cpu.c | 13 +++++++------ > target/i386/sev-stub.c | 41 ----------------------------------------- > target/i386/meson.build | 2 +- > 4 files changed, 20 insertions(+), 50 deletions(-) > delete mode 100644 target/i386/sev-stub.c > > diff --git a/target/i386/sev.h b/target/i386/sev.h > index c96072bf78d..d9548e3e642 100644 > --- a/target/i386/sev.h > +++ b/target/i386/sev.h > @@ -14,6 +14,10 @@ > #ifndef QEMU_SEV_I386_H > #define QEMU_SEV_I386_H > > +#ifndef CONFIG_USER_ONLY > +#include CONFIG_DEVICES /* CONFIG_SEV */ > +#endif > + > #include "exec/confidential-guest-support.h" > #include "qapi/qapi-types-misc-target.h" > > @@ -35,8 +39,14 @@ typedef struct SevKernelLoaderContext { > size_t cmdline_size; > } SevKernelLoaderContext; > > -bool sev_enabled(void); > -extern bool sev_es_enabled(void); > +#ifdef CONFIG_SEV > + bool sev_enabled(void); > +bool sev_es_enabled(void); > +#else Is that leading space on the sev_enabled() line intentional? > +#define sev_enabled() 0 > +#define sev_es_enabled() 0 > +#endif > + This allows an optimizing compiler to elide code, but does not require that the elision worked. The real test is whether there is a link error when functions that are only called inside what we hope is elided have no stub. > extern SevInfo *sev_get_info(void); > extern uint32_t sev_get_cbit_position(void); > extern uint32_t sev_get_reduced_phys_bits(void); > diff --git a/target/i386/cpu.c b/target/i386/cpu.c > index 8289dc87bd5..fc3ed80ef1e 100644 > --- a/target/i386/cpu.c > +++ b/target/i386/cpu.c > @@ -5764,12 +5764,13 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count, > *edx = 0; > break; > case 0x8000001F: > - *eax = sev_enabled() ? 0x2 : 0; > - *eax |= sev_es_enabled() ? 0x8 : 0; > - *ebx = sev_get_cbit_position(); > - *ebx |= sev_get_reduced_phys_bits() << 6; > - *ecx = 0; > - *edx = 0; > + *eax = *ebx = *ecx = *edx = 0; > + if (sev_enabled()) { > + *eax = 0x2; > + *eax |= sev_es_enabled() ? 0x8 : 0; > + *ebx = sev_get_cbit_position(); > + *ebx |= sev_get_reduced_phys_bits() << 6; > + } As long as this compiles in all of our configurations, then the compiler really has elided the calls and we can get rid of the stub. But that's merely because we're relying on our particular gcc or clang compiler behavior, and NOT because it is standardized behavior. On the other hand, I doubt either compiler would break this assumption, as it is probably used in lots of places, even if it is not portable. Since you asked for my opinion, I'm okay giving: Reviewed-by: Eric Blake <eblake@xxxxxxxxxx> -- Eric Blake, Principal Software Engineer Red Hat, Inc. +1-919-301-3266 Virtualization: qemu.org | libvirt.org