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);
|
(*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
|
#else
|
||||||
|
|
||||||
#define ELF_START_MMAP 0x80000000
|
#define ELF_START_MMAP 0x80000000
|
||||||
@ -2360,8 +2381,10 @@ static abi_ulong create_elf_tables(abi_ulong p, int argc, int envc,
|
|||||||
#else
|
#else
|
||||||
#define HI_COMMPAGE 0
|
#define HI_COMMPAGE 0
|
||||||
#define LO_COMMPAGE -1
|
#define LO_COMMPAGE -1
|
||||||
|
#ifndef INIT_GUEST_COMMPAGE
|
||||||
#define init_guest_commpage() true
|
#define init_guest_commpage() true
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
static void pgb_fail_in_use(const char *image_name)
|
static void pgb_fail_in_use(const char *image_name)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user