[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH 4/6] accel/tcg: Declare missing cpu_loop_exit*() stubs
From: |
Claudio Fontana |
Subject: |
Re: [PATCH 4/6] accel/tcg: Declare missing cpu_loop_exit*() stubs |
Date: |
Mon, 18 Jan 2021 10:29:17 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.12.0 |
On 1/17/21 5:48 PM, Philippe Mathieu-Daudé wrote:
> cpu_loop_exit*() functions are declared in accel/tcg/cpu-exec-common.c,
> and are not available when TCG accelerator is not built. Add stubs so
> linking without TCG succeed.
The reason why stubs are needed here at all seems to be that that the code
calling cpu_loop_exit is not refactored properly yet;
if we look at the example of i386, after the refactoring moving tcg related
code into target/i386/tcg/,
(and really even before that I think),
the code calling cpu_loop_exit is not built for non-TCG at all, and so we don't
need stubs.
I am ok with this anyway, just wanted to convey that I think we should look at
stubs as a necessary evil until all code stops mixing tcg, kvm and other
accels...
Thanks,
Claudio
>
> Problematic files:
>
> - hw/semihosting/console.c in qemu_semihosting_console_inc()
> - hw/ppc/spapr_hcall.c in h_confer()
> - hw/s390x/ipl.c in s390_ipl_reset_request()
> - hw/misc/mips_itu.c
>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> ---
> I suppose the s390x kvm-only build didn't catch this because
> of compiler optimization:
>
> in s390_ipl_reset_request():
>
> 640 if (tcg_enabled()) {
> 641 cpu_loop_exit(cs);
> 642 }
>
> and "sysemu/tcg.h" is:
>
> 13 #ifdef CONFIG_TCG
> 14 extern bool tcg_allowed;
> 15 #define tcg_enabled() (tcg_allowed)
> 16 #else
> 17 #define tcg_enabled() 0
> 18 #endif
> ---
> accel/stubs/tcg-stub.c | 10 ++++++++++
> 1 file changed, 10 insertions(+)
>
> diff --git a/accel/stubs/tcg-stub.c b/accel/stubs/tcg-stub.c
> index 8c18d3eabdd..2304606f8e0 100644
> --- a/accel/stubs/tcg-stub.c
> +++ b/accel/stubs/tcg-stub.c
> @@ -28,3 +28,13 @@ void *probe_access(CPUArchState *env, target_ulong addr,
> int size,
> /* Handled by hardware accelerator. */
> g_assert_not_reached();
> }
> +
> +void QEMU_NORETURN cpu_loop_exit(CPUState *cpu)
> +{
> + g_assert_not_reached();
> +}
> +
> +void QEMU_NORETURN cpu_loop_exit_restore(CPUState *cpu, uintptr_t pc)
> +{
> + g_assert_not_reached();
> +}
>