|
@@ -7,6 +7,7 @@
|
|
|
|
|
|
#include "qemu.h"
|
|
|
#include "user-internals.h"
|
|
|
+#include "signal-common.h"
|
|
|
#include "loader.h"
|
|
|
#include "user-mmap.h"
|
|
|
#include "disas/disas.h"
|
|
@@ -17,6 +18,7 @@
|
|
|
#include "qemu/units.h"
|
|
|
#include "qemu/selfmap.h"
|
|
|
#include "qapi/error.h"
|
|
|
+#include "target_signal.h"
|
|
|
|
|
|
#ifdef _ARCH_PPC64
|
|
|
#undef ARCH_DLINFO
|
|
@@ -28,6 +30,10 @@
|
|
|
#undef ELF_ARCH
|
|
|
#endif
|
|
|
|
|
|
+#ifndef TARGET_ARCH_HAS_SIGTRAMP_PAGE
|
|
|
+#define TARGET_ARCH_HAS_SIGTRAMP_PAGE 0
|
|
|
+#endif
|
|
|
+
|
|
|
#define ELF_OSABI ELFOSABI_SYSV
|
|
|
|
|
|
/* from personality.h */
|
|
@@ -3249,6 +3255,18 @@ int load_elf_binary(struct linux_binprm *bprm, struct image_info *info)
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
+ /*
|
|
|
+ * TODO: load a vdso, which would also contain the signal trampolines.
|
|
|
+ * Otherwise, allocate a private page to hold them.
|
|
|
+ */
|
|
|
+ if (TARGET_ARCH_HAS_SIGTRAMP_PAGE) {
|
|
|
+ abi_ulong tramp_page = target_mmap(0, TARGET_PAGE_SIZE,
|
|
|
+ PROT_READ | PROT_WRITE,
|
|
|
+ MAP_PRIVATE | MAP_ANON, -1, 0);
|
|
|
+ setup_sigtramp(tramp_page);
|
|
|
+ target_mprotect(tramp_page, TARGET_PAGE_SIZE, PROT_READ | PROT_EXEC);
|
|
|
+ }
|
|
|
+
|
|
|
bprm->p = create_elf_tables(bprm->p, bprm->argc, bprm->envc, &elf_ex,
|
|
|
info, (elf_interpreter ? &interp_info : NULL));
|
|
|
info->start_stack = bprm->p;
|