Message ID | 20200605041733.415188-8-richard.henderson@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | target-arm: Implement ARMv8.5-MemTag, user mode | expand |
On Fri, 5 Jun 2020 at 05:17, Richard Henderson <richard.henderson@linaro.org> wrote: > > We must always use GUEST_ADDR_MAX, because even 32-bit hosts can > use -R <reserved_va> to restrict the memory address of the guest. > > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > include/exec/cpu_ldst.h | 9 ++++----- > 1 file changed, 4 insertions(+), 5 deletions(-) Doesn't this run into trouble with the arm32 commpage? The reserved_va is set there to 0xffff0000 (stopping at the commpage), but the addresses within the commpage themselves are still valid guest addresses. thanks -- PMM
On 6/25/20 9:37 AM, Peter Maydell wrote: > On Fri, 5 Jun 2020 at 05:17, Richard Henderson > <richard.henderson@linaro.org> wrote: >> >> We must always use GUEST_ADDR_MAX, because even 32-bit hosts can >> use -R <reserved_va> to restrict the memory address of the guest. >> >> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> >> --- >> include/exec/cpu_ldst.h | 9 ++++----- >> 1 file changed, 4 insertions(+), 5 deletions(-) > > Doesn't this run into trouble with the arm32 commpage? > The reserved_va is set there to 0xffff0000 (stopping > at the commpage), but the addresses within the commpage > themselves are still valid guest addresses. Not really. The commpage is Special, and gets allocated differently. Normal binaries work, e.g. our standard busybox ls. I would imagine the corner case that doesn't work is that you couldn't issue a syscall to the commpage, e.g. write(1, 0xfffff000, 1); because the commpage is now outside the normal address space. But given that it only matters with an explicit -R command-line option, this falls into the Well Don't Do That Then category. This is a generic option, and works as expected with other 32-bit guests. r~
diff --git a/include/exec/cpu_ldst.h b/include/exec/cpu_ldst.h index 3930362e20..066cf33f70 100644 --- a/include/exec/cpu_ldst.h +++ b/include/exec/cpu_ldst.h @@ -72,11 +72,10 @@ typedef uint64_t abi_ptr; /* All direct uses of g2h and h2g need to go away for usermode softmmu. */ #define g2h(x) ((void *)((unsigned long)(abi_ptr)(x) + guest_base)) -#if HOST_LONG_BITS <= TARGET_VIRT_ADDR_SPACE_BITS -#define guest_addr_valid(x) (1) -#else -#define guest_addr_valid(x) ((x) <= GUEST_ADDR_MAX) -#endif +static inline bool guest_addr_valid(abi_ptr x) +{ + return x <= GUEST_ADDR_MAX; +} static inline int guest_range_valid(unsigned long start, unsigned long len) {
We must always use GUEST_ADDR_MAX, because even 32-bit hosts can use -R <reserved_va> to restrict the memory address of the guest. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- include/exec/cpu_ldst.h | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) -- 2.25.1