[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v4 16/23] target/i386/sev: Remove stubs by using code elision
From: |
Eric Blake |
Subject: |
Re: [PATCH v4 16/23] target/i386/sev: Remove stubs by using code elision |
Date: |
Thu, 7 Oct 2021 14:51:10 -0500 |
User-agent: |
NeoMutt/20210205-818-e2615c |
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@redhat.com>
> ---
> 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@redhat.com>
--
Eric Blake, Principal Software Engineer
Red Hat, Inc. +1-919-301-3266
Virtualization: qemu.org | libvirt.org
- [PATCH v4 13/23] target/i386/sev: Restrict SEV to system emulation, (continued)
- Re: [PATCH v4 16/23] target/i386/sev: Remove stubs by using code elision,
Eric Blake <=
[PATCH v4 17/23] target/i386/sev: Move qmp_query_sev_attestation_report() to sev.c, Philippe Mathieu-Daudé, 2021/10/07
[PATCH v4 18/23] target/i386/sev: Move qmp_sev_inject_launch_secret() to sev.c, Philippe Mathieu-Daudé, 2021/10/07
[PATCH v4 19/23] target/i386/sev: Move qmp_query_sev_capabilities() to sev.c, Philippe Mathieu-Daudé, 2021/10/07
[PATCH v4 20/23] target/i386/sev: Move qmp_query_sev_launch_measure() to sev.c, Philippe Mathieu-Daudé, 2021/10/07
[PATCH v4 21/23] target/i386/sev: Move qmp_query_sev() & hmp_info_sev() to sev.c, Philippe Mathieu-Daudé, 2021/10/07
[PATCH v4 22/23] monitor: Reduce hmp_info_sev() declaration, Philippe Mathieu-Daudé, 2021/10/07
[PATCH v4 23/23] MAINTAINERS: Cover SEV-related files with X86/KVM section, Philippe Mathieu-Daudé, 2021/10/07