linux-user/x86_64: Allocate vsyscall page as a commpage
We're about to start validating PAGE_EXEC, which means that we've got to mark the vsyscall page executable. We had been special casing this entirely within translate. Acked-by: Ilya Leoshkevich <iii@linux.ibm.com> Tested-by: Ilya Leoshkevich <iii@linux.ibm.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
eee816c0b9
commit
d461b73ec0
@ -195,6 +195,27 @@ static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUX86State *en
|
||||
(*regs)[26] = tswapreg(env->segs[R_GS].selector & 0xffff);
|
||||
}
|
||||
|
||||
#if ULONG_MAX > UINT32_MAX
|
||||
#define INIT_GUEST_COMMPAGE
|
||||
static bool init_guest_commpage(void)
|
||||
{
|
||||
/*
|
||||
* The vsyscall page is at a high negative address aka kernel space,
|
||||
* which means that we cannot actually allocate it with target_mmap.
|
||||
* We still should be able to use page_set_flags, unless the user
|
||||
* has specified -R reserved_va, which would trigger an assert().
|
||||
*/
|
||||
if (reserved_va != 0 &&
|
||||
TARGET_VSYSCALL_PAGE + TARGET_PAGE_SIZE >= reserved_va) {
|
||||
error_report("Cannot allocate vsyscall page");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
page_set_flags(TARGET_VSYSCALL_PAGE,
|
||||
TARGET_VSYSCALL_PAGE + TARGET_PAGE_SIZE,
|
||||
PAGE_EXEC | PAGE_VALID);
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
#else
|
||||
|
||||
#define ELF_START_MMAP 0x80000000
|
||||
@ -2360,8 +2381,10 @@ static abi_ulong create_elf_tables(abi_ulong p, int argc, int envc,
|
||||
#else
|
||||
#define HI_COMMPAGE 0
|
||||
#define LO_COMMPAGE -1
|
||||
#ifndef INIT_GUEST_COMMPAGE
|
||||
#define init_guest_commpage() true
|
||||
#endif
|
||||
#endif
|
||||
|
||||
static void pgb_fail_in_use(const char *image_name)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user