On 30 June 2015 at 17:19, Laurent Vivier <laur...@vivier.eu> wrote:
> When guest base is disabled, RESERVED_VA is 0, and
> (__guest < RESERVED_VA) is always false as __guest is unsigned.
>
> With -Werror=type-limits, this triggers an error:
>
>     include/exec/cpu_ldst.h:60:31: error: comparison of unsigned expression < 
> 0 is always false [-Werror=type-limits]
>          (!RESERVED_VA || (__guest < RESERVED_VA)); \
>
> This patch removes this comparison when guest base is disabled.

Is there a useful reason to compile with --disable-guest-base
(ie why we should retain the !CONFIG_USE_GUEST_BASE code
in QEMU at all) ? It was originally optional because we
didn't support it in all our TCG hosts, but we fixed that
back in 2012...

(We can certainly take a compile fix for 2.4 even if
we decide we want to rip it out for 2.5, of course.)

> Signed-off-by: Laurent Vivier <laur...@vivier.eu>
> ---
>  include/exec/cpu_ldst.h | 5 +++++
>  1 file changed, 5 insertions(+)
>
> diff --git a/include/exec/cpu_ldst.h b/include/exec/cpu_ldst.h
> index 1239c60..f278126 100644
> --- a/include/exec/cpu_ldst.h
> +++ b/include/exec/cpu_ldst.h
> @@ -54,11 +54,16 @@
>  #if HOST_LONG_BITS <= TARGET_VIRT_ADDR_SPACE_BITS
>  #define h2g_valid(x) 1
>  #else
> +#if defined(CONFIG_USE_GUEST_BASE)
>  #define h2g_valid(x) ({ \
>      unsigned long __guest = (unsigned long)(x) - GUEST_BASE; \
>      (__guest < (1ul << TARGET_VIRT_ADDR_SPACE_BITS)) && \
>      (!RESERVED_VA || (__guest < RESERVED_VA)); \
>  })
> +#else
> +#define h2g_valid(x) \
> +    ((unsigned long)(x) < (1ul << TARGET_VIRT_ADDR_SPACE_BITS))

"ul" as a suffix is almost always wrong, incidentally,
though obviously here you're just copying the condition
from the existing code. Consider the case when an
unsigned long is 32 bits but TARGET_VIRT_ADDR_SPACE_BITS
is 32 or more (ie almost always on a 32-bit host).

thanks
-- PMM

Reply via email to