Message ID | 20240228202518.33180-2-richard.henderson@linaro.org |
---|---|
State | New |
Headers | show |
Series | linux-user: Rewrite target_shmat | expand |
On 28/2/24 21:25, Richard Henderson wrote: > This is the only case in which we expect to have no host memory backing > for a guest memory page, because in general linux user processes cannot > map any pages in the top half of the 64-bit address space. > > Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2170 > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > linux-user/syscall.c | 16 ++++++++++++++++ > 1 file changed, 16 insertions(+) > > diff --git a/linux-user/syscall.c b/linux-user/syscall.c > index e384e14248..bc8c06522f 100644 > --- a/linux-user/syscall.c > +++ b/linux-user/syscall.c > @@ -7994,6 +7994,10 @@ static void open_self_maps_4(const struct open_self_maps_data *d, > path = "[heap]"; > } else if (start == info->vdso) { > path = "[vdso]"; > +#ifdef TARGET_X86_64 Alternatively "#ifdef TARGET_VSYSCALL_PAGE" like in i386_tr_translate_insn()? > + } else if (start == TARGET_VSYSCALL_PAGE) { > + path = "[vsyscall]"; > +#endif Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
diff --git a/linux-user/syscall.c b/linux-user/syscall.c index e384e14248..bc8c06522f 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -7994,6 +7994,10 @@ static void open_self_maps_4(const struct open_self_maps_data *d, path = "[heap]"; } else if (start == info->vdso) { path = "[vdso]"; +#ifdef TARGET_X86_64 + } else if (start == TARGET_VSYSCALL_PAGE) { + path = "[vsyscall]"; +#endif } /* Except null device (MAP_ANON), adjust offset for this fragment. */ @@ -8082,6 +8086,18 @@ static int open_self_maps_2(void *opaque, target_ulong guest_start, uintptr_t host_start = (uintptr_t)g2h_untagged(guest_start); uintptr_t host_last = (uintptr_t)g2h_untagged(guest_end - 1); +#ifdef TARGET_X86_64 + /* + * Because of the extremely high position of the page within the guest + * virtual address space, this is not backed by host memory at all. + * Therefore the loop below would fail. This is the only instance + * of not having host backing memory. + */ + if (guest_start == TARGET_VSYSCALL_PAGE) { + return open_self_maps_3(opaque, guest_start, guest_end, flags); + } +#endif + while (1) { IntervalTreeNode *n = interval_tree_iter_first(d->host_maps, host_start, host_start);
This is the only case in which we expect to have no host memory backing for a guest memory page, because in general linux user processes cannot map any pages in the top half of the 64-bit address space. Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2170 Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- linux-user/syscall.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)