[Qemu-devel] [PATCH] cputlb: cast size_t to target_ulong before using for address masks

Alex Bennée posted 1 patch 6 years, 5 months ago
Failed in applying to current master (apply log)
accel/tcg/cputlb.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
[Qemu-devel] [PATCH] cputlb: cast size_t to target_ulong before using for address masks
Posted by Alex Bennée 6 years, 5 months ago
While size_t is defined to happily access the biggest host object this
isn't the case when generating masks for 64 bit guests on 32 bit
hosts. Otherwise we end up truncating the address when we fall back to
our unaligned helper.

Cc: Andrew Randrianasulu <randrianasulu@gmail.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
 accel/tcg/cputlb.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/accel/tcg/cputlb.c b/accel/tcg/cputlb.c
index b796ab1cbe..8f814a1a2c 100644
--- a/accel/tcg/cputlb.c
+++ b/accel/tcg/cputlb.c
@@ -1306,7 +1306,7 @@ load_helper(CPUArchState *env, target_ulong addr, TCGMemOpIdx oi,
         uint64_t r1, r2;
         unsigned shift;
     do_unaligned_access:
-        addr1 = addr & ~(size - 1);
+        addr1 = addr & ~((target_ulong)size - 1);
         addr2 = addr1 + size;
         r1 = full_load(env, addr1, oi, retaddr);
         r2 = full_load(env, addr2, oi, retaddr);
-- 
2.20.1


Re: [Qemu-devel] [PATCH] cputlb: cast size_t to target_ulong before using for address masks
Posted by Andrew Randrianasulu 6 years, 5 months ago
В сообщении от Thursday 06 June 2019 18:43:10 Alex Bennée написал(а):
> addr1 = addr & ~((target_ulong)size - 1);

yes, this fixes my hang! Thanks!
Re: [Qemu-devel] [PATCH] cputlb: cast size_t to target_ulong before using for address masks
Posted by Alex Bennée 6 years, 5 months ago
Andrew Randrianasulu <randrianasulu@gmail.com> writes:

> В сообщении от Thursday 06 June 2019 18:43:10 Alex Bennée написал(а):
>> addr1 = addr & ~((target_ulong)size - 1);
>
> yes, this fixes my hang! Thanks!

Can I take that as a:

Tested-by: Andrew Randrianasulu <randrianasulu@gmail.com>

?

--
Alex Bennée

Re: [Qemu-devel] [PATCH] cputlb: cast size_t to target_ulong before using for address masks
Posted by Andrew Randrianasulu 6 years, 5 months ago
В сообщении от Thursday 06 June 2019 20:04:07 Alex Bennée написал(а):
> 
> Andrew Randrianasulu <randrianasulu@gmail.com> writes:
> 
> > В сообщении от Thursday 06 June 2019 18:43:10 Alex Bennée написал(а):
> >> addr1 = addr & ~((target_ulong)size - 1);
> >
> > yes, this fixes my hang! Thanks!
> 
> Can I take that as a:
> 
> Tested-by: Andrew Randrianasulu <randrianasulu@gmail.com>
> 
> ?

Yes, while I only tested 64-bit x86-64 kernel on 32-bit x86 host, not other machines.

> 
> --
> Alex Bennée
> 


Re: [Qemu-devel] [PATCH] cputlb: cast size_t to target_ulong before using for address masks
Posted by Richard Henderson 6 years, 5 months ago
On 6/6/19 10:43 AM, Alex Bennée wrote:
> While size_t is defined to happily access the biggest host object this
> isn't the case when generating masks for 64 bit guests on 32 bit
> hosts. Otherwise we end up truncating the address when we fall back to
> our unaligned helper.
> 
> Cc: Andrew Randrianasulu <randrianasulu@gmail.com>
> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
> ---
>  accel/tcg/cputlb.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>


r~

Re: [Qemu-devel] [PATCH] cputlb: cast size_t to target_ulong before using for address masks
Posted by Philippe Mathieu-Daudé 6 years, 5 months ago
On 6/6/19 5:43 PM, Alex Bennée wrote:
> While size_t is defined to happily access the biggest host object this
> isn't the case when generating masks for 64 bit guests on 32 bit
> hosts. Otherwise we end up truncating the address when we fall back to
> our unaligned helper.
> 
> Cc: Andrew Randrianasulu <randrianasulu@gmail.com>

Fixes: https://bugs.launchpad.net/qemu/+bug/1831545

> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
> ---
>  accel/tcg/cputlb.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/accel/tcg/cputlb.c b/accel/tcg/cputlb.c
> index b796ab1cbe..8f814a1a2c 100644
> --- a/accel/tcg/cputlb.c
> +++ b/accel/tcg/cputlb.c
> @@ -1306,7 +1306,7 @@ load_helper(CPUArchState *env, target_ulong addr, TCGMemOpIdx oi,
>          uint64_t r1, r2;
>          unsigned shift;
>      do_unaligned_access:
> -        addr1 = addr & ~(size - 1);
> +        addr1 = addr & ~((target_ulong)size - 1);

Tricky...
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>


>          addr2 = addr1 + size;
>          r1 = full_load(env, addr1, oi, retaddr);
>          r2 = full_load(env, addr2, oi, retaddr);
>