From: Richard Henderson <richard.henderson@linaro.org>
To: Noah Goldstein <goldstein.w.n@gmail.com>, qemu-devel@nongnu.org
Cc: iii@linux.ibm.com, laurent@vivier.eu
Subject: Re: linux-user: Add option to run `execve`d programs through QEMU
Date: Tue, 5 Nov 2024 11:37:55 +0000 [thread overview]
Message-ID: <000c9ef8-c610-4f2a-b191-04b84455d89c@linaro.org> (raw)
In-Reply-To: <20241030141037.375897-1-goldstein.w.n@gmail.com>
On 10/30/24 14:10, Noah Goldstein wrote:
> The new option '-qemu-children' makes it so that on `execve` the child
> process will be launch by the same `qemu` executable that is currently
> running along with its current commandline arguments.
>
> The motivation for the change is to make it so that plugins running
> through `qemu` can continue to run on children. Why not just
> `binfmt`?: Plugins can be desirable regardless of system/architecture
> emulation, and can sometimes be useful for elf files that can run
> natively. Enabling `binfmt` for all natively runnable elf files may
> not be desirable.
>
> Signed-off-by: Noah Goldstein <goldstein.w.n@gmail.com>
> ---
> linux-user/main.c | 21 ++++++
> linux-user/syscall.c | 21 ++++--
> linux-user/user-internals.h | 4 ++
> tests/tcg/multiarch/Makefile.target | 8 +++
> .../linux/linux-execve-qemu-children.c | 68 +++++++++++++++++++
> 5 files changed, 117 insertions(+), 5 deletions(-)
> create mode 100644 tests/tcg/multiarch/linux/linux-execve-qemu-children.c
>
> diff --git a/linux-user/main.c b/linux-user/main.c
> index 8143a0d4b0..5e3d41dc2b 100644
> --- a/linux-user/main.c
> +++ b/linux-user/main.c
> @@ -81,6 +81,10 @@ unsigned long mmap_min_addr;
> uintptr_t guest_base;
> bool have_guest_base;
>
> +bool qemu_dup_for_children;
> +int qemu_argc;
> +char **qemu_argv;
> +
> /*
> * Used to implement backwards-compatibility for the `-strace`, and
> * QEMU_STRACE options. Without this, the QEMU_LOG can be overwritten by
> @@ -451,6 +455,11 @@ static void handle_arg_jitdump(const char *arg)
> perf_enable_jitdump();
> }
>
> +static void handle_arg_qemu_children(const char *arg)
> +{
> + qemu_dup_for_children = true;
> +}
> +
> static QemuPluginList plugins = QTAILQ_HEAD_INITIALIZER(plugins);
>
> #ifdef CONFIG_PLUGIN
> @@ -526,6 +535,10 @@ static const struct qemu_argument arg_table[] = {
> "", "Generate a /tmp/perf-${pid}.map file for perf"},
> {"jitdump", "QEMU_JITDUMP", false, handle_arg_jitdump,
> "", "Generate a jit-${pid}.dump file for perf"},
> + {"qemu-children",
> + "QEMU_CHILDREN", false, handle_arg_qemu_children,
> + "", "Run child processes (created with execve) with qemu "
> + "(as instantiated for the parent)"},
> {NULL, NULL, false, NULL, NULL, NULL}
> };
>
> @@ -729,6 +742,14 @@ int main(int argc, char **argv, char **envp)
>
> optind = parse_args(argc, argv);
>
> + if (qemu_dup_for_children) {
> + qemu_argc = optind;
> + qemu_argv = g_new0(char *, qemu_argc);
> + for (i = 0; i < optind; ++i) {
> + qemu_argv[i] = strdup(argv[i]);
g_strdup.
> + bool through_qemu = dirfd == AT_FDCWD && qemu_dup_for_children;
Why is this limited to AT_FDCWD? Why not for execvat too?
> @@ -8628,9 +8631,16 @@ static int do_execv(CPUArchState *cpu_env, int dirfd,
> }
>
> const char *exe = p;
> - if (is_proc_myself(p, "exe")) {
> + if (through_qemu) {
> + int i;
> + for (i = 0; i < argp_offset; ++i) {
> + argp[i] = qemu_argv[i];
> + }
> + exe = qemu_argv[0];
> + } else if (is_proc_myself(p, "exe")) {
> exe = exec_path;
> }
> +
You still need to handle is_proc_myself, for the guest binary.
I wonder if those two cases are related. Do we need to also add an argument so that we
can pass the executable to the next qemu via file descriptor? I.e. execvat becomes
f = openat()
execv(qemu, "-execfd", f)
and is_proc_myself uses execfd, which we already have open.
r~
next prev parent reply other threads:[~2024-11-05 11:38 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-30 22:36 [PATCH v1] linux-user: Add option to run `execve`d programs through QEMU Noah Goldstein
2024-08-30 22:37 ` Noah Goldstein
2024-09-10 22:06 ` Noah Goldstein
2024-09-24 14:43 ` Noah Goldstein
2024-10-02 8:08 ` Ilya Leoshkevich
2024-10-02 14:05 ` Noah Goldstein
2024-10-02 16:39 ` Ilya Leoshkevich
2024-10-02 16:42 ` Noah Goldstein
2024-10-11 18:14 ` Noah Goldstein
2024-10-22 22:06 ` Noah Goldstein
2024-10-29 14:51 ` Noah Goldstein
2024-10-02 14:08 ` Laurent Vivier
2024-10-02 14:25 ` Ilya Leoshkevich
2024-10-02 14:44 ` Noah Goldstein
2024-10-02 14:53 ` Ilya Leoshkevich
2024-10-02 15:10 ` Noah Goldstein
2024-10-02 16:14 ` Ilya Leoshkevich
2024-10-02 16:24 ` Noah Goldstein
2024-10-02 16:35 ` Ilya Leoshkevich
2024-10-02 16:36 ` Noah Goldstein
2024-10-02 15:59 ` Laurent Vivier
2024-10-02 14:50 ` [PATCH v2] " Noah Goldstein
2024-10-29 15:23 ` [PATCH v1] " Alex Bennée
2024-10-29 15:27 ` Noah Goldstein
2024-10-30 14:10 ` Noah Goldstein
2024-10-30 14:11 ` Noah Goldstein
2024-11-05 11:37 ` Richard Henderson [this message]
2024-11-05 23:48 ` Noah Goldstein
2024-11-05 23:54 ` Noah Goldstein
2024-11-06 9:38 ` Richard Henderson
2024-11-06 17:03 ` Noah Goldstein
2024-11-06 17:25 ` Richard Henderson
2024-11-06 17:53 ` Noah Goldstein
2024-11-06 18:13 ` Noah Goldstein
2024-11-06 21:10 ` Richard Henderson
2024-11-06 21:30 ` Noah Goldstein
2024-11-06 23:49 ` Noah Goldstein
2024-11-07 9:42 ` Richard Henderson
2024-11-07 9:29 ` Richard Henderson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=000c9ef8-c610-4f2a-b191-04b84455d89c@linaro.org \
--to=richard.henderson@linaro.org \
--cc=goldstein.w.n@gmail.com \
--cc=iii@linux.ibm.com \
--cc=laurent@vivier.eu \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).