v3 changes:
- rebase the patchset against current code
-diff --git a/linux-user/main.c b/linux-user/main.c
-index ee12035..5951279 100644
---- a/linux-user/main.c
-+++ b/linux-user/main.c
-@@ -79,6 +79,7 @@ static void usage(int exitcode);
+diff -urNpa qemu-7.2.0.orig/linux-user/main.c qemu-7.2.0/linux-user/main.c
+--- qemu-7.2.0.orig/linux-user/main.c 2023-02-08 21:23:07.149156085 +0100
++++ qemu-7.2.0/linux-user/main.c 2023-02-08 21:23:36.695149312 +0100
+@@ -123,6 +123,7 @@ static void usage(int exitcode);
static const char *interp_prefix = CONFIG_QEMU_INTERP_PREFIX;
const char *qemu_uname_release;
+const char *qemu_execve_path;
+ #if !defined(TARGET_DEFAULT_STACK_SIZE)
/* XXX: on x86 MAP_GROWSDOWN only works if ESP <= address + 32, so
- we allocate a bigger stack. Need a better solution, for example
-@@ -3828,6 +3829,11 @@ static void handle_arg_guest_base(const char *arg)
- have_guest_base = 1;
+@@ -362,6 +363,11 @@ static void handle_arg_guest_base(const
+ have_guest_base = true;
}
+static void handle_arg_execve(const char *arg)
static void handle_arg_reserved_va(const char *arg)
{
char *p;
-@@ -3913,6 +3919,8 @@ static const struct qemu_argument arg_table[] = {
+@@ -464,6 +470,8 @@ static const struct qemu_argument arg_ta
"uname", "set qemu uname release string to 'uname'"},
{"B", "QEMU_GUEST_BASE", true, handle_arg_guest_base,
"address", "set guest_base address to 'address'"},
{"R", "QEMU_RESERVED_VA", true, handle_arg_reserved_va,
"size", "reserve 'size' bytes for guest virtual address space"},
{"d", "QEMU_LOG", true, handle_arg_log,
-diff --git a/linux-user/qemu.h b/linux-user/qemu.h
-index bd90cc3..0d9b058 100644
---- a/linux-user/qemu.h
-+++ b/linux-user/qemu.h
-@@ -140,6 +140,7 @@ void init_task_state(TaskState *ts);
- void task_settid(TaskState *);
- void stop_all_tasks(void);
- extern const char *qemu_uname_release;
-+extern const char *qemu_execve_path;
- extern unsigned long mmap_min_addr;
-
- /* ??? See if we can avoid exposing so much of the loader internals. */
---- qemu-2.12.0/linux-user/syscall.c~ 2018-04-30 21:43:39.000000000 +0300
-+++ qemu-2.12.0/linux-user/syscall.c 2018-04-30 21:46:36.362935706 +0300
-@@ -5854,6 +5854,109 @@ static target_timer_t get_timer_id(abi_long arg)
+diff -urNpa qemu-7.2.0.orig/linux-user/syscall.c qemu-7.2.0/linux-user/syscall.c
+--- qemu-7.2.0.orig/linux-user/syscall.c 2023-02-08 21:23:07.150156084 +0100
++++ qemu-7.2.0/linux-user/syscall.c 2023-02-08 21:28:50.327077355 +0100
+@@ -8378,6 +8378,109 @@ static target_timer_t get_timer_id(abi_l
return timerid;
}
+ return get_errno(safe_execve(qemu_execve_path, new_argp, envp));
+}
+
- /* do_syscall() should always have a single exit point at the end so
- that actions, such as logging of syscall results, can be performed.
- All errnos that do_syscall() returns must be -TARGET_<errcode>. */
-@@ -8257,7 +8257,12 @@
- * before the execve completes and makes it the other
+ static int target_to_host_cpu_mask(unsigned long *host_mask,
+ size_t host_size,
+ abi_ulong target_addr,
+@@ -8933,9 +9036,17 @@ static abi_long do_syscall1(CPUArchState
* program's problem.
*/
-- ret = get_errno(safe_execve(p, argp, envp));
-+ if (qemu_execve_path && *qemu_execve_path) {
-+ ret = get_errno(qemu_execve(p, argp, envp));
-+ } else {
-+ ret = get_errno(safe_execve(p, argp, envp));
-+ }
-+
+ if (is_proc_myself(p, "exe")) {
+- ret = get_errno(safe_execve(exec_path, argp, envp));
++ if (qemu_execve_path && *qemu_execve_path) {
++ ret = get_errno(qemu_execve(exec_path, argp, envp));
++ } else {
++ ret = get_errno(safe_execve(exec_path, argp, envp));
++ }
+ } else {
+- ret = get_errno(safe_execve(p, argp, envp));
++ if (qemu_execve_path && *qemu_execve_path) {
++ ret = get_errno(qemu_execve(p, argp, envp));
++ } else {
++ ret = get_errno(safe_execve(p, argp, envp));
++ }
+ }
unlock_user(p, arg1, 0);
- goto execve_end;
+diff -urNpa qemu-7.2.0.orig/linux-user/user-internals.h qemu-7.2.0/linux-user/user-internals.h
+--- qemu-7.2.0.orig/linux-user/user-internals.h 2023-02-08 21:23:07.148156085 +0100
++++ qemu-7.2.0/linux-user/user-internals.h 2023-02-08 21:23:36.697149312 +0100
+@@ -27,6 +27,7 @@ void init_task_state(TaskState *ts);
+ void task_settid(TaskState *);
+ void stop_all_tasks(void);
+ extern const char *qemu_uname_release;
++extern const char *qemu_execve_path;
+ extern unsigned long mmap_min_addr;
+
+ typedef struct IOCTLEntry IOCTLEntry;