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.
>
> 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é <[email protected]>
> ---
> 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 }
Ciao Philippe,
yes I have seen this a lot on x86 also, and seems to depend on the compiler
used.
On OpenSUSE 15.2, with gcc based on 7.5.0, I am getting this optimization also,
and so no error happens in these cases.
It is a bit inconvenient because I have to rely completely on the CI to catch
these situations.
Ciao,
Claudio
>
> 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();
> +}
>