diff options
author | nox <nox@FreeBSD.org> | 2014-07-07 02:14:57 +0800 |
---|---|---|
committer | nox <nox@FreeBSD.org> | 2014-07-07 02:14:57 +0800 |
commit | 698cea380536f7c4dce81b1437c466948daf377e (patch) | |
tree | b14669624ce7d889073ba07eed27edbf30182d28 /emulators | |
parent | 6d94ab96294152f3bf2f2e40f5301f962cdb630b (diff) | |
download | freebsd-ports-gnome-698cea380536f7c4dce81b1437c466948daf377e.tar.gz freebsd-ports-gnome-698cea380536f7c4dce81b1437c466948daf377e.tar.zst freebsd-ports-gnome-698cea380536f7c4dce81b1437c466948daf377e.zip |
- bsd-user: Follow exec_copyout_strings more closely when setting
up guest stack. [1]
- Bump PORTREVISION.
Submitted by: kan [1]
Obtained from: https://github.com/seanbruno/qemu-bsd-user/commit/21927cffcc7bcacbb953155f778200846df9f60e [1]
Diffstat (limited to 'emulators')
-rw-r--r-- | emulators/qemu-devel/Makefile | 3 | ||||
-rw-r--r-- | emulators/qemu-devel/files/extra-patch-21927cffcc7bcacbb953155f778200846df9f60e | 274 |
2 files changed, 276 insertions, 1 deletions
diff --git a/emulators/qemu-devel/Makefile b/emulators/qemu-devel/Makefile index d2c3577cc734..e3c4c177789f 100644 --- a/emulators/qemu-devel/Makefile +++ b/emulators/qemu-devel/Makefile @@ -3,7 +3,7 @@ PORTNAME= qemu PORTVERSION= 2.0.0 -PORTREVISION= 8 +PORTREVISION= 9 CATEGORIES= emulators MASTER_SITES= http://wiki.qemu.org/download/:release \ LOCAL/nox:snapshot @@ -76,6 +76,7 @@ EXTRA_PATCHES+= ${FILESDIR}/extra-patch-bsd-user-freebsd-target_os_stack.h EXTRA_PATCHES+= ${FILESDIR}/extra-patch-bsd-user-arm-target_arch_thread.h EXTRA_PATCHES+= ${FILESDIR}/extra-patch-bsd-user-sparc64-target_arch_cpu.h EXTRA_PATCHES+= ${FILESDIR}/extra-patch-bsd-user-trapsig +EXTRA_PATCHES+= ${FILESDIR}/extra-patch-21927cffcc7bcacbb953155f778200846df9f60e .endif CONFIGURE_ARGS+= --extra-ldflags=-L${LOCALBASE}/lib diff --git a/emulators/qemu-devel/files/extra-patch-21927cffcc7bcacbb953155f778200846df9f60e b/emulators/qemu-devel/files/extra-patch-21927cffcc7bcacbb953155f778200846df9f60e new file mode 100644 index 000000000000..3c370fc2507a --- /dev/null +++ b/emulators/qemu-devel/files/extra-patch-21927cffcc7bcacbb953155f778200846df9f60e @@ -0,0 +1,274 @@ +From 96cc385829084403d39ad71d4ee366993900e632 Mon Sep 17 00:00:00 2001 +From: Alexander Kabaev <kan@FreeBSD.ORG> +Date: Fri, 27 Jun 2014 16:42:16 -0400 +Subject: [PATCH] Follow exec_copyout_strings more closely when setting up + guest stack. + +Remove mysterious TARGET_SPACE_USRSPACE define that limited the +compined size of argvp and envp vectors to just 4k and use the same +calculation that FreeBSD kernel uses to allocate the space for +strings and vectors sans aux vector, which we do not support just +yet. Remove assumption that argv and env strings end up at the top +of the stack and pass the pointer around instead. + +This allows one to run programs with more than 4096/sizeof(abi_long) +env and args strings on command line. +--- + bsd-user/elfload.c | 11 +++++------ + bsd-user/freebsd/target_os_elf.h | 3 ++- + bsd-user/freebsd/target_os_stack.h | 25 ++++++++++++++++--------- + bsd-user/freebsd/target_os_vmparam.h | 1 - + bsd-user/netbsd/target_os_elf.h | 3 ++- + bsd-user/netbsd/target_os_stack.h | 6 +++++- + bsd-user/openbsd/target_os_elf.h | 3 ++- + bsd-user/openbsd/target_os_stack.h | 6 +++++- + bsd-user/qemu.h | 1 + + 9 files changed, 38 insertions(+), 21 deletions(-) + +diff --git a/bsd-user/elfload.c b/bsd-user/elfload.c +index 945e2a0..406d1c2 100644 +--- a/bsd-user/elfload.c ++++ b/bsd-user/elfload.c +@@ -166,8 +166,8 @@ static abi_ulong copy_elf_strings(int argc,char ** argv, void **page, + return p; + } + +-static abi_ulong setup_arg_pages(abi_ulong p, struct bsd_binprm *bprm, +- struct image_info *info) ++static void setup_arg_pages(struct bsd_binprm *bprm, struct image_info *info, ++ abi_ulong *stackp, abi_ulong *stringp) + { + abi_ulong stack_base, size; + abi_long addr; +@@ -189,12 +189,10 @@ static abi_ulong setup_arg_pages(abi_ulong p, struct bsd_binprm *bprm, + target_stksiz = size; + target_stkbas = addr; + +- if (setup_initial_stack(bprm, &p) != 0) { ++ if (setup_initial_stack(bprm, stackp, stringp) != 0) { + perror("stk setup"); + exit(-1); + } +- +- return p; + } + + static void set_brk(abi_ulong start, abi_ulong end) +@@ -819,7 +817,7 @@ int load_elf_binary(struct bsd_binprm *bprm, struct target_pt_regs *regs, + /* Do this so that we can load the interpreter, if need be. We will + change some of these later */ + info->rss = 0; +- bprm->p = setup_arg_pages(bprm->p, bprm, info); ++ setup_arg_pages(bprm, info, &bprm->p, &bprm->stringp); + info->start_stack = bprm->p; + + /* Now we do a little grungy work by mmaping the ELF image into +@@ -945,6 +943,7 @@ int load_elf_binary(struct bsd_binprm *bprm, struct target_pt_regs *regs, + bprm->p = target_create_elf_tables(bprm->p, + bprm->argc, + bprm->envc, ++ bprm->stringp, + &elf_ex, + load_addr, load_bias, + interp_load_addr, +diff --git a/bsd-user/freebsd/target_os_elf.h b/bsd-user/freebsd/target_os_elf.h +index 5bc689a..592a1c2 100644 +--- a/bsd-user/freebsd/target_os_elf.h ++++ b/bsd-user/freebsd/target_os_elf.h +@@ -85,6 +85,7 @@ struct exec + #define DLINFO_ITEMS 12 + + static abi_ulong target_create_elf_tables(abi_ulong p, int argc, int envc, ++ abi_ulong stringp, + struct elfhdr * exec, + abi_ulong load_addr, + abi_ulong load_bias, +@@ -140,7 +141,7 @@ static abi_ulong target_create_elf_tables(abi_ulong p, int argc, int envc, + #endif + #undef NEW_AUX_ENT + +- sp = loader_build_argptr(envc, argc, sp, p, !ibcs); ++ sp = loader_build_argptr(envc, argc, sp, stringp, !ibcs); + return sp; + } + +diff --git a/bsd-user/freebsd/target_os_stack.h b/bsd-user/freebsd/target_os_stack.h +index 73aea8f..410b282 100644 +--- a/bsd-user/freebsd/target_os_stack.h ++++ b/bsd-user/freebsd/target_os_stack.h +@@ -44,7 +44,7 @@ + * "destp" -> argv, env strings (up to 262144 bytes) + */ + static inline int setup_initial_stack(struct bsd_binprm *bprm, +- abi_ulong *ret_addr) ++ abi_ulong *ret_addr, abi_ulong *stringp) + { + int i; + abi_ulong stack_hi_addr; +@@ -88,6 +88,15 @@ static inline int setup_initial_stack(struct bsd_binprm *bprm, + errno = EFAULT; + return -1; + } ++ /* ++ * Deviate from FreeBSD stack layout: force stack to new page here ++ * so that signal trampoline is not sharing the page with user stack ++ * frames. This is actively harmful in qemu as it marks pages with ++ * code it translated as read-only, which is somewhat problematic ++ * for user trying to use the stack as intended. ++ */ ++ p = rounddown(p, TARGET_PAGE_SIZE); ++ + /* Calculate the string space needed */ + stringspace = 0; + for (i = 0; i < bprm->argc; ++i) { +@@ -100,20 +109,17 @@ static inline int setup_initial_stack(struct bsd_binprm *bprm, + errno = ENOMEM; + return -1; + } +- + /* Make room for the argv and envp strings */ +- argvp = roundup(p - TARGET_SPACE_USRSPACE - (TARGET_ARG_MAX - stringspace), +- sizeof(abi_ulong)); +- p = destp = p - TARGET_SPACE_USRSPACE - TARGET_ARG_MAX; +- ++ destp = rounddown(p - stringspace, sizeof(abi_ulong)); ++ p = argvp = destp - (bprm->argc + bprm->envc + 2) * sizeof(abi_ulong); ++ /* Remember the strings pointer */ ++ if (stringp) ++ *stringp = destp; + /* + * Add argv strings. Note that the argv[] vectors are added by + * loader_build_argptr() + */ + /* XXX need to make room for auxargs */ +- /* argvp = destp - ((bprm->argc + bprm->envc + 2) * sizeof(abi_ulong)); */ +- /* envp = argvp + (bprm->argc + 2) * sizeof(abi_ulong); */ +- envp = argvp + (bprm->argc + 1) * sizeof(abi_ulong); + ps_strs.ps_argvstr = tswapl(argvp); + ps_strs.ps_nargvstr = tswap32(bprm->argc); + for (i = 0; i < bprm->argc; ++i) { +@@ -138,6 +144,7 @@ static inline int setup_initial_stack(struct bsd_binprm *bprm, + * Add env strings. Note that the envp[] vectors are added by + * loader_build_argptr(). + */ ++ envp = argvp + sizeof(abi_ulong); + ps_strs.ps_envstr = tswapl(envp); + ps_strs.ps_nenvstr = tswap32(bprm->envc); + for (i = 0; i < bprm->envc; ++i) { +diff --git a/bsd-user/freebsd/target_os_vmparam.h b/bsd-user/freebsd/target_os_vmparam.h +index 80ac6c8..7415809 100644 +--- a/bsd-user/freebsd/target_os_vmparam.h ++++ b/bsd-user/freebsd/target_os_vmparam.h +@@ -3,7 +3,6 @@ + + #include "target_arch_vmparam.h" + +-#define TARGET_SPACE_USRSPACE 4096 + #define TARGET_ARG_MAX 262144 + + /* Compare to sys/exec.h */ +diff --git a/bsd-user/netbsd/target_os_elf.h b/bsd-user/netbsd/target_os_elf.h +index bf663d2..1f6421c 100644 +--- a/bsd-user/netbsd/target_os_elf.h ++++ b/bsd-user/netbsd/target_os_elf.h +@@ -146,6 +146,7 @@ struct exec + #define DLINFO_ITEMS 12 + + static abi_ulong target_create_elf_tables(abi_ulong p, int argc, int envc, ++ abi_ulong stringp, + struct elfhdr * exec, + abi_ulong load_addr, + abi_ulong load_bias, +@@ -219,7 +220,7 @@ static abi_ulong target_create_elf_tables(abi_ulong p, int argc, int envc, + #endif + #undef NEW_AUX_ENT + +- sp = loader_build_argptr(envc, argc, sp, p, !ibcs); ++ sp = loader_build_argptr(envc, argc, sp, stringp, !ibcs); + return sp; + } + +diff --git a/bsd-user/netbsd/target_os_stack.h b/bsd-user/netbsd/target_os_stack.h +index 1a26c3f..912207c 100644 +--- a/bsd-user/netbsd/target_os_stack.h ++++ b/bsd-user/netbsd/target_os_stack.h +@@ -3,7 +3,8 @@ + + #include "target_arch_sigtramp.h" + +-static inline int setup_initial_stack(struct bsd_binprm *bprm, abi_ulong *p) ++static inline int setup_initial_stack(struct bsd_binprm *bprm, abi_ulong *p, ++ abi_ulong *stringp) + { + int i; + abi_ulong stack_base; +@@ -13,6 +14,9 @@ static inline int setup_initial_stack(struct bsd_binprm *bprm, abi_ulong *p) + if (p) { + *p = stack_base; + } ++ if (stringp) { ++ *stringp = stack_base; ++ } + + for (i = 0; i < MAX_ARG_PAGES; i++) { + if (bprm->page[i]) { +diff --git a/bsd-user/openbsd/target_os_elf.h b/bsd-user/openbsd/target_os_elf.h +index 978d944..b991e02 100644 +--- a/bsd-user/openbsd/target_os_elf.h ++++ b/bsd-user/openbsd/target_os_elf.h +@@ -146,6 +146,7 @@ struct exec + #define DLINFO_ITEMS 12 + + static abi_ulong target_create_elf_tables(abi_ulong p, int argc, int envc, ++ abi_ulong stringp, + struct elfhdr * exec, + abi_ulong load_addr, + abi_ulong load_bias, +@@ -219,7 +220,7 @@ static abi_ulong target_create_elf_tables(abi_ulong p, int argc, int envc, + #endif + #undef NEW_AUX_ENT + +- sp = loader_build_argptr(envc, argc, sp, p, !ibcs); ++ sp = loader_build_argptr(envc, argc, sp, stringp, !ibcs); + return sp; + } + +diff --git a/bsd-user/openbsd/target_os_stack.h b/bsd-user/openbsd/target_os_stack.h +index 1a26c3f..42959fd 100644 +--- a/bsd-user/openbsd/target_os_stack.h ++++ b/bsd-user/openbsd/target_os_stack.h +@@ -3,7 +3,8 @@ + + #include "target_arch_sigtramp.h" + +-static inline int setup_initial_stack(struct bsd_binprm *bprm, abi_ulong *p) ++static inline int setup_initial_stack(struct bsd_binprm *bprm, abi_ulong *p, ++ abi_ulong *stringp) + { + int i; + abi_ulong stack_base; +@@ -13,6 +14,9 @@ static inline int setup_initial_stack(struct bsd_binprm *bprm, abi_ulong *p) + if (p) { + *p = stack_base; + } ++ if (stringp) { ++ *stringp = stack_base; ++ } + + for (i = 0; i < MAX_ARG_PAGES; i++) { + if (bprm->page[i]) { +diff --git a/bsd-user/qemu.h b/bsd-user/qemu.h +index 5791037..09af1b4 100644 +--- a/bsd-user/qemu.h ++++ b/bsd-user/qemu.h +@@ -134,6 +134,7 @@ struct bsd_binprm { + char buf[128]; + void *page[MAX_ARG_PAGES]; + abi_ulong p; ++ abi_ulong stringp; + int fd; + int e_uid, e_gid; + int argc, envc; +-- +1.9.3 + |