* [PULL 01/12] linux-user: Add missing signals in strace output
2022-09-13 19:13 [PULL 00/12] linux-user patches Helge Deller
@ 2022-09-13 19:13 ` Helge Deller
2022-09-13 19:13 ` [PULL 02/12] linux-user: Add missing clock_gettime64() syscall strace Helge Deller
` (11 subsequent siblings)
12 siblings, 0 replies; 17+ messages in thread
From: Helge Deller @ 2022-09-13 19:13 UTC (permalink / raw)
To: Richard Henderson, Laurent Vivier, qemu-devel; +Cc: deller
Some of the guest signal numbers are currently not converted to
their representative names in the strace output, e.g. SIGVTALRM.
This patch introduces a smart way to generate and keep in sync the
host-to-guest and guest-to-host signal conversion tables for usage in
the qemu signal and strace code. This ensures that any signals
will now show up in both tables.
There is no functional change in this patch - with the exception that yet
missing signal names now show up in the strace code too.
Signed-off-by: Helge Deller <deller@gmx.de>
---
linux-user/signal-common.h | 46 ++++++++++++++++++++++++++++++++++++++
linux-user/signal.c | 37 +++---------------------------
linux-user/strace.c | 30 +++++++++----------------
3 files changed, 60 insertions(+), 53 deletions(-)
diff --git a/linux-user/signal-common.h b/linux-user/signal-common.h
index 6a7e4a93fc..3e2dc604c2 100644
--- a/linux-user/signal-common.h
+++ b/linux-user/signal-common.h
@@ -118,4 +118,50 @@ static inline void finish_sigsuspend_mask(int ret)
}
}
+#if defined(SIGSTKFLT) && defined(TARGET_SIGSTKFLT)
+#define MAKE_SIG_ENTRY_SIGSTKFLT MAKE_SIG_ENTRY(SIGSTKFLT)
+#else
+#define MAKE_SIG_ENTRY_SIGSTKFLT
+#endif
+
+#if defined(SIGIOT) && defined(TARGET_SIGIOT)
+#define MAKE_SIG_ENTRY_SIGIOT MAKE_SIG_ENTRY(SIGIOT)
+#else
+#define MAKE_SIG_ENTRY_SIGIOT
+#endif
+
+#define MAKE_SIGNAL_LIST \
+ MAKE_SIG_ENTRY(SIGHUP) \
+ MAKE_SIG_ENTRY(SIGINT) \
+ MAKE_SIG_ENTRY(SIGQUIT) \
+ MAKE_SIG_ENTRY(SIGILL) \
+ MAKE_SIG_ENTRY(SIGTRAP) \
+ MAKE_SIG_ENTRY(SIGABRT) \
+ MAKE_SIG_ENTRY(SIGBUS) \
+ MAKE_SIG_ENTRY(SIGFPE) \
+ MAKE_SIG_ENTRY(SIGKILL) \
+ MAKE_SIG_ENTRY(SIGUSR1) \
+ MAKE_SIG_ENTRY(SIGSEGV) \
+ MAKE_SIG_ENTRY(SIGUSR2) \
+ MAKE_SIG_ENTRY(SIGPIPE) \
+ MAKE_SIG_ENTRY(SIGALRM) \
+ MAKE_SIG_ENTRY(SIGTERM) \
+ MAKE_SIG_ENTRY(SIGCHLD) \
+ MAKE_SIG_ENTRY(SIGCONT) \
+ MAKE_SIG_ENTRY(SIGSTOP) \
+ MAKE_SIG_ENTRY(SIGTSTP) \
+ MAKE_SIG_ENTRY(SIGTTIN) \
+ MAKE_SIG_ENTRY(SIGTTOU) \
+ MAKE_SIG_ENTRY(SIGURG) \
+ MAKE_SIG_ENTRY(SIGXCPU) \
+ MAKE_SIG_ENTRY(SIGXFSZ) \
+ MAKE_SIG_ENTRY(SIGVTALRM) \
+ MAKE_SIG_ENTRY(SIGPROF) \
+ MAKE_SIG_ENTRY(SIGWINCH) \
+ MAKE_SIG_ENTRY(SIGIO) \
+ MAKE_SIG_ENTRY(SIGPWR) \
+ MAKE_SIG_ENTRY(SIGSYS) \
+ MAKE_SIG_ENTRY_SIGSTKFLT \
+ MAKE_SIG_ENTRY_SIGIOT
+
#endif
diff --git a/linux-user/signal.c b/linux-user/signal.c
index 8d29bfaa6b..61c6fa3fcf 100644
--- a/linux-user/signal.c
+++ b/linux-user/signal.c
@@ -53,40 +53,9 @@ abi_ulong default_rt_sigreturn;
QEMU_BUILD_BUG_ON(__SIGRTMAX + 1 != _NSIG);
#endif
static uint8_t host_to_target_signal_table[_NSIG] = {
- [SIGHUP] = TARGET_SIGHUP,
- [SIGINT] = TARGET_SIGINT,
- [SIGQUIT] = TARGET_SIGQUIT,
- [SIGILL] = TARGET_SIGILL,
- [SIGTRAP] = TARGET_SIGTRAP,
- [SIGABRT] = TARGET_SIGABRT,
-/* [SIGIOT] = TARGET_SIGIOT,*/
- [SIGBUS] = TARGET_SIGBUS,
- [SIGFPE] = TARGET_SIGFPE,
- [SIGKILL] = TARGET_SIGKILL,
- [SIGUSR1] = TARGET_SIGUSR1,
- [SIGSEGV] = TARGET_SIGSEGV,
- [SIGUSR2] = TARGET_SIGUSR2,
- [SIGPIPE] = TARGET_SIGPIPE,
- [SIGALRM] = TARGET_SIGALRM,
- [SIGTERM] = TARGET_SIGTERM,
-#ifdef SIGSTKFLT
- [SIGSTKFLT] = TARGET_SIGSTKFLT,
-#endif
- [SIGCHLD] = TARGET_SIGCHLD,
- [SIGCONT] = TARGET_SIGCONT,
- [SIGSTOP] = TARGET_SIGSTOP,
- [SIGTSTP] = TARGET_SIGTSTP,
- [SIGTTIN] = TARGET_SIGTTIN,
- [SIGTTOU] = TARGET_SIGTTOU,
- [SIGURG] = TARGET_SIGURG,
- [SIGXCPU] = TARGET_SIGXCPU,
- [SIGXFSZ] = TARGET_SIGXFSZ,
- [SIGVTALRM] = TARGET_SIGVTALRM,
- [SIGPROF] = TARGET_SIGPROF,
- [SIGWINCH] = TARGET_SIGWINCH,
- [SIGIO] = TARGET_SIGIO,
- [SIGPWR] = TARGET_SIGPWR,
- [SIGSYS] = TARGET_SIGSYS,
+#define MAKE_SIG_ENTRY(sig) [sig] = TARGET_##sig,
+ MAKE_SIGNAL_LIST
+#undef MAKE_SIG_ENTRY
/* next signals stay the same */
};
diff --git a/linux-user/strace.c b/linux-user/strace.c
index 7d882526da..a4eeef7ae1 100644
--- a/linux-user/strace.c
+++ b/linux-user/strace.c
@@ -17,6 +17,7 @@
#include "qemu.h"
#include "user-internals.h"
#include "strace.h"
+#include "signal-common.h"
struct syscallname {
int nr;
@@ -141,30 +142,21 @@ if( cmd == val ) { \
qemu_log("%d", cmd);
}
+static const char * const target_signal_name[] = {
+#define MAKE_SIG_ENTRY(sig) [TARGET_##sig] = #sig,
+ MAKE_SIGNAL_LIST
+#undef MAKE_SIG_ENTRY
+};
+
static void
print_signal(abi_ulong arg, int last)
{
const char *signal_name = NULL;
- switch(arg) {
- case TARGET_SIGHUP: signal_name = "SIGHUP"; break;
- case TARGET_SIGINT: signal_name = "SIGINT"; break;
- case TARGET_SIGQUIT: signal_name = "SIGQUIT"; break;
- case TARGET_SIGILL: signal_name = "SIGILL"; break;
- case TARGET_SIGABRT: signal_name = "SIGABRT"; break;
- case TARGET_SIGFPE: signal_name = "SIGFPE"; break;
- case TARGET_SIGKILL: signal_name = "SIGKILL"; break;
- case TARGET_SIGSEGV: signal_name = "SIGSEGV"; break;
- case TARGET_SIGPIPE: signal_name = "SIGPIPE"; break;
- case TARGET_SIGALRM: signal_name = "SIGALRM"; break;
- case TARGET_SIGTERM: signal_name = "SIGTERM"; break;
- case TARGET_SIGUSR1: signal_name = "SIGUSR1"; break;
- case TARGET_SIGUSR2: signal_name = "SIGUSR2"; break;
- case TARGET_SIGCHLD: signal_name = "SIGCHLD"; break;
- case TARGET_SIGCONT: signal_name = "SIGCONT"; break;
- case TARGET_SIGSTOP: signal_name = "SIGSTOP"; break;
- case TARGET_SIGTTIN: signal_name = "SIGTTIN"; break;
- case TARGET_SIGTTOU: signal_name = "SIGTTOU"; break;
+
+ if (arg < ARRAY_SIZE(target_signal_name)) {
+ signal_name = target_signal_name[arg];
}
+
if (signal_name == NULL) {
print_raw_param("%ld", arg, last);
return;
--
2.37.2
^ permalink raw reply related [flat|nested] 17+ messages in thread* [PULL 02/12] linux-user: Add missing clock_gettime64() syscall strace
2022-09-13 19:13 [PULL 00/12] linux-user patches Helge Deller
2022-09-13 19:13 ` [PULL 01/12] linux-user: Add missing signals in strace output Helge Deller
@ 2022-09-13 19:13 ` Helge Deller
2022-09-13 19:13 ` [PULL 03/12] linux-user: Add pidfd_open(), pidfd_send_signal() and pidfd_getfd() syscalls Helge Deller
` (10 subsequent siblings)
12 siblings, 0 replies; 17+ messages in thread
From: Helge Deller @ 2022-09-13 19:13 UTC (permalink / raw)
To: Richard Henderson, Laurent Vivier, qemu-devel; +Cc: deller
Allow linux-user to strace the clock_gettime64() syscall.
This syscall is used a lot on 32-bit guest architectures which use newer
glibc versions.
Signed-off-by: Helge Deller <deller@gmx.de>
---
linux-user/strace.c | 53 ++++++++++++++++++++++++++++++++++++++++++
linux-user/strace.list | 4 ++++
2 files changed, 57 insertions(+)
diff --git a/linux-user/strace.c b/linux-user/strace.c
index a4eeef7ae1..816e679995 100644
--- a/linux-user/strace.c
+++ b/linux-user/strace.c
@@ -82,6 +82,7 @@ UNUSED static void print_buf(abi_long addr, abi_long len, int last);
UNUSED static void print_raw_param(const char *, abi_long, int);
UNUSED static void print_timeval(abi_ulong, int);
UNUSED static void print_timespec(abi_ulong, int);
+UNUSED static void print_timespec64(abi_ulong, int);
UNUSED static void print_timezone(abi_ulong, int);
UNUSED static void print_itimerval(abi_ulong, int);
UNUSED static void print_number(abi_long, int);
@@ -795,6 +796,24 @@ print_syscall_ret_clock_gettime(CPUArchState *cpu_env, const struct syscallname
#define print_syscall_ret_clock_getres print_syscall_ret_clock_gettime
#endif
+#if defined(TARGET_NR_clock_gettime64)
+static void
+print_syscall_ret_clock_gettime64(CPUArchState *cpu_env, const struct syscallname *name,
+ abi_long ret, abi_long arg0, abi_long arg1,
+ abi_long arg2, abi_long arg3, abi_long arg4,
+ abi_long arg5)
+{
+ if (!print_syscall_err(ret)) {
+ qemu_log(TARGET_ABI_FMT_ld, ret);
+ qemu_log(" (");
+ print_timespec64(arg1, 1);
+ qemu_log(")");
+ }
+
+ qemu_log("\n");
+}
+#endif
+
#ifdef TARGET_NR_gettimeofday
static void
print_syscall_ret_gettimeofday(CPUArchState *cpu_env, const struct syscallname *name,
@@ -1652,6 +1671,27 @@ print_timespec(abi_ulong ts_addr, int last)
}
}
+static void
+print_timespec64(abi_ulong ts_addr, int last)
+{
+ if (ts_addr) {
+ struct target__kernel_timespec *ts;
+
+ ts = lock_user(VERIFY_READ, ts_addr, sizeof(*ts), 1);
+ if (!ts) {
+ print_pointer(ts_addr, last);
+ return;
+ }
+ qemu_log("{tv_sec = %lld"
+ ",tv_nsec = %lld}%s",
+ (long long)tswap64(ts->tv_sec), (long long)tswap64(ts->tv_nsec),
+ get_comma(last));
+ unlock_user(ts, ts_addr, 0);
+ } else {
+ qemu_log("NULL%s", get_comma(last));
+ }
+}
+
static void
print_timezone(abi_ulong tz_addr, int last)
{
@@ -2267,6 +2307,19 @@ print_clock_gettime(CPUArchState *cpu_env, const struct syscallname *name,
#define print_clock_getres print_clock_gettime
#endif
+#if defined(TARGET_NR_clock_gettime64)
+static void
+print_clock_gettime64(CPUArchState *cpu_env, const struct syscallname *name,
+ abi_long arg0, abi_long arg1, abi_long arg2,
+ abi_long arg3, abi_long arg4, abi_long arg5)
+{
+ print_syscall_prologue(name);
+ print_enums(clockids, arg0, 0);
+ print_pointer(arg1, 1);
+ print_syscall_epilogue(name);
+}
+#endif
+
#ifdef TARGET_NR_clock_settime
static void
print_clock_settime(CPUArchState *cpu_env, const struct syscallname *name,
diff --git a/linux-user/strace.list b/linux-user/strace.list
index 72e17b1acf..a78cdf3cdf 100644
--- a/linux-user/strace.list
+++ b/linux-user/strace.list
@@ -1676,3 +1676,7 @@
#ifdef TARGET_NR_copy_file_range
{ TARGET_NR_copy_file_range, "copy_file_range", "%s(%d,%p,%d,%p,"TARGET_ABI_FMT_lu",%u)", NULL, NULL },
#endif
+#ifdef TARGET_NR_clock_gettime64
+{ TARGET_NR_clock_gettime64, "clock_gettime64" , NULL, print_clock_gettime64,
+ print_syscall_ret_clock_gettime64 },
+#endif
--
2.37.2
^ permalink raw reply related [flat|nested] 17+ messages in thread* [PULL 03/12] linux-user: Add pidfd_open(), pidfd_send_signal() and pidfd_getfd() syscalls
2022-09-13 19:13 [PULL 00/12] linux-user patches Helge Deller
2022-09-13 19:13 ` [PULL 01/12] linux-user: Add missing signals in strace output Helge Deller
2022-09-13 19:13 ` [PULL 02/12] linux-user: Add missing clock_gettime64() syscall strace Helge Deller
@ 2022-09-13 19:13 ` Helge Deller
2022-09-13 19:13 ` [PULL 04/12] linux-user: Log failing executable in EXCP_DUMP() Helge Deller
` (9 subsequent siblings)
12 siblings, 0 replies; 17+ messages in thread
From: Helge Deller @ 2022-09-13 19:13 UTC (permalink / raw)
To: Richard Henderson, Laurent Vivier, qemu-devel; +Cc: deller
I noticed those were missing when running the glib2.0 testsuite.
Add the syscalls including the strace output.
Signed-off-by: Helge Deller <deller@gmx.de>
---
linux-user/strace.c | 28 ++++++++++++++++++++++++++++
linux-user/strace.list | 9 +++++++++
linux-user/syscall.c | 34 ++++++++++++++++++++++++++++++++++
3 files changed, 71 insertions(+)
diff --git a/linux-user/strace.c b/linux-user/strace.c
index 816e679995..5ac64df02b 100644
--- a/linux-user/strace.c
+++ b/linux-user/strace.c
@@ -3317,6 +3317,34 @@ print_openat(CPUArchState *cpu_env, const struct syscallname *name,
}
#endif
+#ifdef TARGET_NR_pidfd_send_signal
+static void
+print_pidfd_send_signal(CPUArchState *cpu_env, const struct syscallname *name,
+ abi_long arg0, abi_long arg1, abi_long arg2,
+ abi_long arg3, abi_long arg4, abi_long arg5)
+{
+ void *p;
+ target_siginfo_t uinfo;
+
+ print_syscall_prologue(name);
+ print_raw_param("%d", arg0, 0);
+ print_signal(arg1, 0);
+
+ p = lock_user(VERIFY_READ, arg2, sizeof(target_siginfo_t), 1);
+ if (p) {
+ get_target_siginfo(&uinfo, p);
+ print_siginfo(&uinfo);
+
+ unlock_user(p, arg2, 0);
+ } else {
+ print_pointer(arg2, 1);
+ }
+
+ print_raw_param("%u", arg3, 0);
+ print_syscall_epilogue(name);
+}
+#endif
+
#ifdef TARGET_NR_mq_unlink
static void
print_mq_unlink(CPUArchState *cpu_env, const struct syscallname *name,
diff --git a/linux-user/strace.list b/linux-user/strace.list
index a78cdf3cdf..4d8b7f6a5e 100644
--- a/linux-user/strace.list
+++ b/linux-user/strace.list
@@ -1664,6 +1664,15 @@
#ifdef TARGET_NR_pipe2
{ TARGET_NR_pipe2, "pipe2", NULL, NULL, NULL },
#endif
+#ifdef TARGET_NR_pidfd_open
+{ TARGET_NR_pidfd_open, "pidfd_open", "%s(%d,%u)", NULL, NULL },
+#endif
+#ifdef TARGET_NR_pidfd_send_signal
+{ TARGET_NR_pidfd_send_signal, "pidfd_send_signal", NULL, print_pidfd_send_signal, NULL },
+#endif
+#ifdef TARGET_NR_pidfd_getfd
+{ TARGET_NR_pidfd_getfd, "pidfd_getfd", "%s(%d,%d,%u)", NULL, NULL },
+#endif
#ifdef TARGET_NR_atomic_cmpxchg_32
{ TARGET_NR_atomic_cmpxchg_32, "atomic_cmpxchg_32", NULL, NULL, NULL },
#endif
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index f409121202..df018f0e32 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -346,6 +346,16 @@ _syscall6(int,sys_futex,int *,uaddr,int,op,int,val,
_syscall6(int,sys_futex_time64,int *,uaddr,int,op,int,val,
const struct timespec *,timeout,int *,uaddr2,int,val3)
#endif
+#if defined(__NR_pidfd_open)
+_syscall2(int, pidfd_open, pid_t, pid, unsigned int, flags);
+#endif
+#if defined(__NR_pidfd_send_signal)
+_syscall4(int, pidfd_send_signal, int, pidfd, int, sig, siginfo_t *, info,
+ unsigned int, flags);
+#endif
+#if defined(__NR_pidfd_getfd)
+_syscall3(int, pidfd_getfd, int, pidfd, int, targetfd, unsigned int, flags);
+#endif
#define __NR_sys_sched_getaffinity __NR_sched_getaffinity
_syscall3(int, sys_sched_getaffinity, pid_t, pid, unsigned int, len,
unsigned long *, user_mask_ptr);
@@ -8683,6 +8693,30 @@ static abi_long do_syscall1(CPUArchState *cpu_env, int num, abi_long arg1,
ret = do_open_by_handle_at(arg1, arg2, arg3);
fd_trans_unregister(ret);
return ret;
+#endif
+#if defined(TARGET_NR_pidfd_open)
+ case TARGET_NR_pidfd_open:
+ return get_errno(pidfd_open(arg1, arg2));
+#endif
+#if defined(TARGET_NR_pidfd_send_signal)
+ case TARGET_NR_pidfd_send_signal:
+ {
+ siginfo_t uinfo;
+
+ p = lock_user(VERIFY_READ, arg3, sizeof(target_siginfo_t), 1);
+ if (!p) {
+ return -TARGET_EFAULT;
+ }
+ target_to_host_siginfo(&uinfo, p);
+ unlock_user(p, arg3, 0);
+ ret = get_errno(pidfd_send_signal(arg1, target_to_host_signal(arg2),
+ &uinfo, arg4));
+ }
+ return ret;
+#endif
+#if defined(TARGET_NR_pidfd_getfd)
+ case TARGET_NR_pidfd_getfd:
+ return get_errno(pidfd_getfd(arg1, arg2, arg3));
#endif
case TARGET_NR_close:
fd_trans_unregister(arg1);
--
2.37.2
^ permalink raw reply related [flat|nested] 17+ messages in thread* [PULL 04/12] linux-user: Log failing executable in EXCP_DUMP()
2022-09-13 19:13 [PULL 00/12] linux-user patches Helge Deller
` (2 preceding siblings ...)
2022-09-13 19:13 ` [PULL 03/12] linux-user: Add pidfd_open(), pidfd_send_signal() and pidfd_getfd() syscalls Helge Deller
@ 2022-09-13 19:13 ` Helge Deller
2022-09-13 19:13 ` [PULL 05/12] linux-user/hppa: Use EXCP_DUMP() to show enhanced debug info Helge Deller
` (8 subsequent siblings)
12 siblings, 0 replies; 17+ messages in thread
From: Helge Deller @ 2022-09-13 19:13 UTC (permalink / raw)
To: Richard Henderson, Laurent Vivier, qemu-devel; +Cc: deller
Enhance the EXCP_DUMP() macro to print out the failing program too.
During debugging it's sometimes hard to track down the actual failing
program if you are e.g. building a whole debian package.
Signed-off-by: Helge Deller <deller@gmx.de>
---
linux-user/cpu_loop-common.h | 2 ++
1 file changed, 2 insertions(+)
diff --git a/linux-user/cpu_loop-common.h b/linux-user/cpu_loop-common.h
index dc0042e4de..36ff5b14f2 100644
--- a/linux-user/cpu_loop-common.h
+++ b/linux-user/cpu_loop-common.h
@@ -27,9 +27,11 @@
do { \
CPUState *cs = env_cpu(env); \
fprintf(stderr, fmt , ## __VA_ARGS__); \
+ fprintf(stderr, "Failing executable: %s\n", exec_path); \
cpu_dump_state(cs, stderr, 0); \
if (qemu_log_separate()) { \
qemu_log(fmt, ## __VA_ARGS__); \
+ qemu_log("Failing executable: %s\n", exec_path); \
log_cpu_state(cs, 0); \
} \
} while (0)
--
2.37.2
^ permalink raw reply related [flat|nested] 17+ messages in thread* [PULL 05/12] linux-user/hppa: Use EXCP_DUMP() to show enhanced debug info
2022-09-13 19:13 [PULL 00/12] linux-user patches Helge Deller
` (3 preceding siblings ...)
2022-09-13 19:13 ` [PULL 04/12] linux-user: Log failing executable in EXCP_DUMP() Helge Deller
@ 2022-09-13 19:13 ` Helge Deller
2022-09-13 19:13 ` [PULL 06/12] linux-user/hppa: Dump IIR on register dump Helge Deller
` (7 subsequent siblings)
12 siblings, 0 replies; 17+ messages in thread
From: Helge Deller @ 2022-09-13 19:13 UTC (permalink / raw)
To: Richard Henderson, Laurent Vivier, qemu-devel; +Cc: deller
Enhance the hppa linux-user cpu_loop() to show more debugging info
on hard errors.
Signed-off-by: Helge Deller <deller@gmx.de>
---
linux-user/hppa/cpu_loop.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/linux-user/hppa/cpu_loop.c b/linux-user/hppa/cpu_loop.c
index 64263c3dc4..1ef3b46191 100644
--- a/linux-user/hppa/cpu_loop.c
+++ b/linux-user/hppa/cpu_loop.c
@@ -147,12 +147,15 @@ void cpu_loop(CPUHPPAState *env)
force_sig_fault(TARGET_SIGSEGV, TARGET_SEGV_MAPERR, env->iaoq_f);
break;
case EXCP_ILL:
+ EXCP_DUMP(env, "qemu: got CPU exception 0x%x - aborting\n", trapnr);
force_sig_fault(TARGET_SIGILL, TARGET_ILL_ILLOPN, env->iaoq_f);
break;
case EXCP_PRIV_OPR:
+ EXCP_DUMP(env, "qemu: got CPU exception 0x%x - aborting\n", trapnr);
force_sig_fault(TARGET_SIGILL, TARGET_ILL_PRVOPC, env->iaoq_f);
break;
case EXCP_PRIV_REG:
+ EXCP_DUMP(env, "qemu: got CPU exception 0x%x - aborting\n", trapnr);
force_sig_fault(TARGET_SIGILL, TARGET_ILL_PRVREG, env->iaoq_f);
break;
case EXCP_OVERFLOW:
@@ -171,7 +174,8 @@ void cpu_loop(CPUHPPAState *env)
/* just indicate that signals should be handled asap */
break;
default:
- g_assert_not_reached();
+ EXCP_DUMP(env, "qemu: unhandled CPU exception 0x%x - aborting\n", trapnr);
+ abort();
}
process_pending_signals(env);
}
--
2.37.2
^ permalink raw reply related [flat|nested] 17+ messages in thread* [PULL 06/12] linux-user/hppa: Dump IIR on register dump
2022-09-13 19:13 [PULL 00/12] linux-user patches Helge Deller
` (4 preceding siblings ...)
2022-09-13 19:13 ` [PULL 05/12] linux-user/hppa: Use EXCP_DUMP() to show enhanced debug info Helge Deller
@ 2022-09-13 19:13 ` Helge Deller
2022-09-13 19:13 ` [PULL 07/12] linux-user: Fix strace of chmod() if mode == 0 Helge Deller
` (6 subsequent siblings)
12 siblings, 0 replies; 17+ messages in thread
From: Helge Deller @ 2022-09-13 19:13 UTC (permalink / raw)
To: Richard Henderson, Laurent Vivier, qemu-devel; +Cc: deller
Include the IIR register (which holds the opcode of the failing
instruction) when dumping the hppa registers.
Signed-off-by: Helge Deller <deller@gmx.de>
---
target/hppa/helper.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/target/hppa/helper.c b/target/hppa/helper.c
index e2758d8df3..74b8747083 100644
--- a/target/hppa/helper.c
+++ b/target/hppa/helper.c
@@ -85,9 +85,11 @@ void hppa_cpu_dump_state(CPUState *cs, FILE *f, int flags)
char psw_c[20];
int i;
- qemu_fprintf(f, "IA_F " TARGET_FMT_lx " IA_B " TARGET_FMT_lx "\n",
+ qemu_fprintf(f, "IA_F " TARGET_FMT_lx " IA_B " TARGET_FMT_lx
+ " IIR " TREG_FMT_lx "\n",
hppa_form_gva_psw(psw, env->iasq_f, env->iaoq_f),
- hppa_form_gva_psw(psw, env->iasq_b, env->iaoq_b));
+ hppa_form_gva_psw(psw, env->iasq_b, env->iaoq_b),
+ env->cr[CR_IIR]);
psw_c[0] = (psw & PSW_W ? 'W' : '-');
psw_c[1] = (psw & PSW_E ? 'E' : '-');
--
2.37.2
^ permalink raw reply related [flat|nested] 17+ messages in thread* [PULL 07/12] linux-user: Fix strace of chmod() if mode == 0
2022-09-13 19:13 [PULL 00/12] linux-user patches Helge Deller
` (5 preceding siblings ...)
2022-09-13 19:13 ` [PULL 06/12] linux-user/hppa: Dump IIR on register dump Helge Deller
@ 2022-09-13 19:13 ` Helge Deller
2022-09-13 19:13 ` [PULL 08/12] linux-user/hppa: Set TASK_UNMAPPED_BASE to 0xfa000000 for hppa arch Helge Deller
` (5 subsequent siblings)
12 siblings, 0 replies; 17+ messages in thread
From: Helge Deller @ 2022-09-13 19:13 UTC (permalink / raw)
To: Richard Henderson, Laurent Vivier, qemu-devel; +Cc: deller
If the mode parameter of chmod() is zero, this value isn't shown
when stracing a program:
chmod("filename",)
This patch fixes it up to show the zero-value as well:
chmod("filename",000)
Signed-off-by: Helge Deller <deller@gmx.de>
---
linux-user/strace.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/linux-user/strace.c b/linux-user/strace.c
index 5ac64df02b..2f539845bb 100644
--- a/linux-user/strace.c
+++ b/linux-user/strace.c
@@ -1505,6 +1505,11 @@ print_file_mode(abi_long mode, int last)
const char *sep = "";
const struct flags *m;
+ if (mode == 0) {
+ qemu_log("000%s", get_comma(last));
+ return;
+ }
+
for (m = &mode_flags[0]; m->f_string != NULL; m++) {
if ((m->f_value & mode) == m->f_value) {
qemu_log("%s%s", m->f_string, sep);
--
2.37.2
^ permalink raw reply related [flat|nested] 17+ messages in thread* [PULL 08/12] linux-user/hppa: Set TASK_UNMAPPED_BASE to 0xfa000000 for hppa arch
2022-09-13 19:13 [PULL 00/12] linux-user patches Helge Deller
` (6 preceding siblings ...)
2022-09-13 19:13 ` [PULL 07/12] linux-user: Fix strace of chmod() if mode == 0 Helge Deller
@ 2022-09-13 19:13 ` Helge Deller
2022-09-13 19:13 ` [PULL 09/12] linux-user: Add strace for clock_nanosleep() Helge Deller
` (4 subsequent siblings)
12 siblings, 0 replies; 17+ messages in thread
From: Helge Deller @ 2022-09-13 19:13 UTC (permalink / raw)
To: Richard Henderson, Laurent Vivier, qemu-devel; +Cc: deller
On the parisc architecture the stack grows upwards.
Move the TASK_UNMAPPED_BASE to high memory area as it's done by the
kernel on physical machines.
Signed-off-by: Helge Deller <deller@gmx.de>
---
linux-user/mmap.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/linux-user/mmap.c b/linux-user/mmap.c
index 048c4135af..dba6823668 100644
--- a/linux-user/mmap.c
+++ b/linux-user/mmap.c
@@ -251,8 +251,12 @@ static int mmap_frag(abi_ulong real_start,
# define TASK_UNMAPPED_BASE (1ul << 38)
#endif
#else
+#ifdef TARGET_HPPA
+# define TASK_UNMAPPED_BASE 0xfa000000
+#else
# define TASK_UNMAPPED_BASE 0x40000000
#endif
+#endif
abi_ulong mmap_next_start = TASK_UNMAPPED_BASE;
unsigned long last_brk;
--
2.37.2
^ permalink raw reply related [flat|nested] 17+ messages in thread* [PULL 09/12] linux-user: Add strace for clock_nanosleep()
2022-09-13 19:13 [PULL 00/12] linux-user patches Helge Deller
` (7 preceding siblings ...)
2022-09-13 19:13 ` [PULL 08/12] linux-user/hppa: Set TASK_UNMAPPED_BASE to 0xfa000000 for hppa arch Helge Deller
@ 2022-09-13 19:13 ` Helge Deller
2022-09-13 19:13 ` [PULL 10/12] linux-user: Show timespec on strace for futex() Helge Deller
` (3 subsequent siblings)
12 siblings, 0 replies; 17+ messages in thread
From: Helge Deller @ 2022-09-13 19:13 UTC (permalink / raw)
To: Richard Henderson, Laurent Vivier, qemu-devel; +Cc: deller
Signed-off-by: Helge Deller <deller@gmx.de>
---
linux-user/strace.c | 15 +++++++++++++++
linux-user/strace.list | 3 ++-
2 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/linux-user/strace.c b/linux-user/strace.c
index 2f539845bb..6f818212d5 100644
--- a/linux-user/strace.c
+++ b/linux-user/strace.c
@@ -3567,6 +3567,21 @@ print_unshare(CPUArchState *cpu_env, const struct syscallname *name,
}
#endif
+#ifdef TARGET_NR_clock_nanosleep
+static void
+print_clock_nanosleep(CPUArchState *cpu_env, const struct syscallname *name,
+ abi_long arg0, abi_long arg1, abi_long arg2,
+ abi_long arg3, abi_long arg4, abi_long arg5)
+{
+ print_syscall_prologue(name);
+ print_enums(clockids, arg0, 0);
+ print_raw_param("%d", arg1, 0);
+ print_timespec(arg2, 0);
+ print_timespec(arg3, 1);
+ print_syscall_epilogue(name);
+}
+#endif
+
#ifdef TARGET_NR_utime
static void
print_utime(CPUArchState *cpu_env, const struct syscallname *name,
diff --git a/linux-user/strace.list b/linux-user/strace.list
index 4d8b7f6a5e..215d971b2a 100644
--- a/linux-user/strace.list
+++ b/linux-user/strace.list
@@ -91,7 +91,8 @@
print_syscall_ret_clock_gettime },
#endif
#ifdef TARGET_NR_clock_nanosleep
-{ TARGET_NR_clock_nanosleep, "clock_nanosleep" , NULL, NULL, NULL },
+{ TARGET_NR_clock_nanosleep, "clock_nanosleep" , NULL, print_clock_nanosleep,
+ NULL },
#endif
#ifdef TARGET_NR_clock_settime
{ TARGET_NR_clock_settime, "clock_settime" , NULL, print_clock_settime, NULL },
--
2.37.2
^ permalink raw reply related [flat|nested] 17+ messages in thread* [PULL 10/12] linux-user: Show timespec on strace for futex()
2022-09-13 19:13 [PULL 00/12] linux-user patches Helge Deller
` (8 preceding siblings ...)
2022-09-13 19:13 ` [PULL 09/12] linux-user: Add strace for clock_nanosleep() Helge Deller
@ 2022-09-13 19:13 ` Helge Deller
2022-09-13 19:13 ` [PULL 11/12] linux-user: Add close_range() syscall Helge Deller
` (2 subsequent siblings)
12 siblings, 0 replies; 17+ messages in thread
From: Helge Deller @ 2022-09-13 19:13 UTC (permalink / raw)
To: Richard Henderson, Laurent Vivier, qemu-devel; +Cc: deller
Signed-off-by: Helge Deller <deller@gmx.de>
---
linux-user/strace.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/linux-user/strace.c b/linux-user/strace.c
index 6f818212d5..b6b9abaea4 100644
--- a/linux-user/strace.c
+++ b/linux-user/strace.c
@@ -3714,11 +3714,20 @@ print_futex(CPUArchState *cpu_env, const struct syscallname *name,
abi_long arg0, abi_long arg1, abi_long arg2,
abi_long arg3, abi_long arg4, abi_long arg5)
{
+ abi_long op = arg1 & FUTEX_CMD_MASK;
print_syscall_prologue(name);
print_pointer(arg0, 0);
print_futex_op(arg1, 0);
print_raw_param(",%d", arg2, 0);
- print_pointer(arg3, 0); /* struct timespec */
+ switch (op) {
+ case FUTEX_WAIT:
+ case FUTEX_WAIT_BITSET:
+ print_timespec(arg3, 0);
+ break;
+ default:
+ print_pointer(arg3, 0);
+ break;
+ }
print_pointer(arg4, 0);
print_raw_param("%d", arg4, 1);
print_syscall_epilogue(name);
--
2.37.2
^ permalink raw reply related [flat|nested] 17+ messages in thread* [PULL 11/12] linux-user: Add close_range() syscall
2022-09-13 19:13 [PULL 00/12] linux-user patches Helge Deller
` (9 preceding siblings ...)
2022-09-13 19:13 ` [PULL 10/12] linux-user: Show timespec on strace for futex() Helge Deller
@ 2022-09-13 19:13 ` Helge Deller
2022-09-13 19:13 ` [PULL 12/12] linux-user: Add parameters of getrandom() syscall for strace Helge Deller
2022-09-17 14:26 ` [PULL 00/12] linux-user patches Stefan Hajnoczi
12 siblings, 0 replies; 17+ messages in thread
From: Helge Deller @ 2022-09-13 19:13 UTC (permalink / raw)
To: Richard Henderson, Laurent Vivier, qemu-devel; +Cc: deller
Signed-off-by: Helge Deller <deller@gmx.de>
---
linux-user/strace.list | 3 +++
linux-user/syscall.c | 12 ++++++++++++
2 files changed, 15 insertions(+)
diff --git a/linux-user/strace.list b/linux-user/strace.list
index 215d971b2a..ad9ef94689 100644
--- a/linux-user/strace.list
+++ b/linux-user/strace.list
@@ -103,6 +103,9 @@
#ifdef TARGET_NR_close
{ TARGET_NR_close, "close" , "%s(%d)", NULL, NULL },
#endif
+#ifdef TARGET_NR_close_range
+{ TARGET_NR_close_range, "close_range" , "%s(%d,%d,%d)", NULL, NULL },
+#endif
#ifdef TARGET_NR_connect
{ TARGET_NR_connect, "connect" , "%s(%d,%#x,%d)", NULL, NULL },
#endif
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index df018f0e32..e63025a5e3 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -8721,6 +8721,18 @@ static abi_long do_syscall1(CPUArchState *cpu_env, int num, abi_long arg1,
case TARGET_NR_close:
fd_trans_unregister(arg1);
return get_errno(close(arg1));
+#ifdef TARGET_NR_close_range
+ case TARGET_NR_close_range:
+ {
+ abi_long fd;
+ abi_long maxfd = (arg2 == (abi_long)-1) ? target_fd_max : arg2;
+
+ for (fd = arg1; fd <= maxfd; fd++) {
+ fd_trans_unregister(fd);
+ }
+ }
+ return get_errno(close_range(arg1, arg2, arg3));
+#endif
case TARGET_NR_brk:
return do_brk(arg1);
--
2.37.2
^ permalink raw reply related [flat|nested] 17+ messages in thread* [PULL 12/12] linux-user: Add parameters of getrandom() syscall for strace
2022-09-13 19:13 [PULL 00/12] linux-user patches Helge Deller
` (10 preceding siblings ...)
2022-09-13 19:13 ` [PULL 11/12] linux-user: Add close_range() syscall Helge Deller
@ 2022-09-13 19:13 ` Helge Deller
2022-09-17 14:26 ` [PULL 00/12] linux-user patches Stefan Hajnoczi
12 siblings, 0 replies; 17+ messages in thread
From: Helge Deller @ 2022-09-13 19:13 UTC (permalink / raw)
To: Richard Henderson, Laurent Vivier, qemu-devel; +Cc: deller
Signed-off-by: Helge Deller <deller@gmx.de>
---
linux-user/strace.list | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/linux-user/strace.list b/linux-user/strace.list
index ad9ef94689..97d8ccadac 100644
--- a/linux-user/strace.list
+++ b/linux-user/strace.list
@@ -355,7 +355,7 @@
{ TARGET_NR_getpriority, "getpriority", "%s(%#x,%#x)", NULL, NULL },
#endif
#ifdef TARGET_NR_getrandom
-{ TARGET_NR_getrandom, "getrandom", NULL, NULL, NULL },
+{ TARGET_NR_getrandom, "getrandom", "%s(%p,%u,%d)", NULL, NULL },
#endif
#ifdef TARGET_NR_getresgid
{ TARGET_NR_getresgid, "getresgid" , NULL, NULL, NULL },
--
2.37.2
^ permalink raw reply related [flat|nested] 17+ messages in thread* Re: [PULL 00/12] linux-user patches
2022-09-13 19:13 [PULL 00/12] linux-user patches Helge Deller
` (11 preceding siblings ...)
2022-09-13 19:13 ` [PULL 12/12] linux-user: Add parameters of getrandom() syscall for strace Helge Deller
@ 2022-09-17 14:26 ` Stefan Hajnoczi
2022-09-17 19:31 ` Philippe Mathieu-Daudé via
12 siblings, 1 reply; 17+ messages in thread
From: Stefan Hajnoczi @ 2022-09-17 14:26 UTC (permalink / raw)
To: Helge Deller; +Cc: Richard Henderson, Laurent Vivier, qemu-devel
The close_range(2) man page says:
close_range() first appeared in Linux 5.9. Library support was added
in glibc in version 2.34.
The qemu-user GitLab CI jobs are failing. For example, see
https://gitlab.com/qemu-project/qemu/-/jobs/3043629417:
../linux-user/syscall.c:8734:26: error: implicit declaration of
function 'close_range' is invalid in C99
[-Werror,-Wimplicit-function-declaration]
return get_errno(close_range(arg1, arg2, arg3));
^
There is a second issue with this pull request:
../linux-user/syscall.c:357:16: error: ‘pidfd_getfd’ defined but not
used [-Werror=unused-function]
357 | _syscall3(int, pidfd_getfd, int, pidfd, int, targetfd, unsigned
int, flags);
| ^~~~~~~~~~~
../linux-user/syscall.c:251:13: note: in definition of macro ‘_syscall3’
See https://gitlab.com/qemu-project/qemu/-/jobs/3043629434.
Stefan
^ permalink raw reply [flat|nested] 17+ messages in thread* Re: [PULL 00/12] linux-user patches
2022-09-17 14:26 ` [PULL 00/12] linux-user patches Stefan Hajnoczi
@ 2022-09-17 19:31 ` Philippe Mathieu-Daudé via
2022-09-17 20:11 ` Stefan Hajnoczi
0 siblings, 1 reply; 17+ messages in thread
From: Philippe Mathieu-Daudé via @ 2022-09-17 19:31 UTC (permalink / raw)
To: Stefan Hajnoczi, Helge Deller
Cc: Richard Henderson, Laurent Vivier, qemu-devel, Thomas Huth
On 17/9/22 16:26, Stefan Hajnoczi wrote:
> The close_range(2) man page says:
> close_range() first appeared in Linux 5.9. Library support was added
> in glibc in version 2.34.
>
> The qemu-user GitLab CI jobs are failing. For example, see
> https://gitlab.com/qemu-project/qemu/-/jobs/3043629417:
>
> ../linux-user/syscall.c:8734:26: error: implicit declaration of
> function 'close_range' is invalid in C99
> [-Werror,-Wimplicit-function-declaration]
> return get_errno(close_range(arg1, arg2, arg3));
> ^
>
> There is a second issue with this pull request:
> ../linux-user/syscall.c:357:16: error: ‘pidfd_getfd’ defined but not
> used [-Werror=unused-function]
> 357 | _syscall3(int, pidfd_getfd, int, pidfd, int, targetfd, unsigned
> int, flags);
> | ^~~~~~~~~~~
> ../linux-user/syscall.c:251:13: note: in definition of macro ‘_syscall3’
>
> See https://gitlab.com/qemu-project/qemu/-/jobs/3043629434.
Hmm apparently this PR hasn't been reviewed (although the patches were
on the list for 2 weeks).
The 'check DCO' job - looking for S-o-b tags - is green:
https://gitlab.com/qemu-project/qemu/-/jobs/3043629425.
Should we complete it by a R-b/A-b check over the commit range?
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PULL 00/12] linux-user patches
2022-09-17 19:31 ` Philippe Mathieu-Daudé via
@ 2022-09-17 20:11 ` Stefan Hajnoczi
2022-09-18 18:52 ` Helge Deller
0 siblings, 1 reply; 17+ messages in thread
From: Stefan Hajnoczi @ 2022-09-17 20:11 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, Laurent Vivier
Cc: Helge Deller, Richard Henderson, qemu-devel, Thomas Huth
On Sat, 17 Sept 2022 at 15:31, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
>
> On 17/9/22 16:26, Stefan Hajnoczi wrote:
> > The close_range(2) man page says:
> > close_range() first appeared in Linux 5.9. Library support was added
> > in glibc in version 2.34.
> >
> > The qemu-user GitLab CI jobs are failing. For example, see
> > https://gitlab.com/qemu-project/qemu/-/jobs/3043629417:
> >
> > ../linux-user/syscall.c:8734:26: error: implicit declaration of
> > function 'close_range' is invalid in C99
> > [-Werror,-Wimplicit-function-declaration]
> > return get_errno(close_range(arg1, arg2, arg3));
> > ^
> >
> > There is a second issue with this pull request:
> > ../linux-user/syscall.c:357:16: error: ‘pidfd_getfd’ defined but not
> > used [-Werror=unused-function]
> > 357 | _syscall3(int, pidfd_getfd, int, pidfd, int, targetfd, unsigned
> > int, flags);
> > | ^~~~~~~~~~~
> > ../linux-user/syscall.c:251:13: note: in definition of macro ‘_syscall3’
> >
> > See https://gitlab.com/qemu-project/qemu/-/jobs/3043629434.
>
> Hmm apparently this PR hasn't been reviewed (although the patches were
> on the list for 2 weeks).
>
> The 'check DCO' job - looking for S-o-b tags - is green:
> https://gitlab.com/qemu-project/qemu/-/jobs/3043629425.
> Should we complete it by a R-b/A-b check over the commit range?
In some areas there will be no R-b/A-b, so I don't think we can
require those checks.
Was this pull request supposed to go through Laurent instead of being
applied directly by me?
Stefan
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PULL 00/12] linux-user patches
2022-09-17 20:11 ` Stefan Hajnoczi
@ 2022-09-18 18:52 ` Helge Deller
0 siblings, 0 replies; 17+ messages in thread
From: Helge Deller @ 2022-09-18 18:52 UTC (permalink / raw)
To: Stefan Hajnoczi, Philippe Mathieu-Daudé, Laurent Vivier
Cc: Richard Henderson, qemu-devel, Thomas Huth
On 9/17/22 22:11, Stefan Hajnoczi wrote:
> On Sat, 17 Sept 2022 at 15:31, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
>>
>> On 17/9/22 16:26, Stefan Hajnoczi wrote:
>>> The close_range(2) man page says:
>>> close_range() first appeared in Linux 5.9. Library support was added
>>> in glibc in version 2.34.
>>>
>>> The qemu-user GitLab CI jobs are failing. For example, see
>>> https://gitlab.com/qemu-project/qemu/-/jobs/3043629417:
>>>
>>> ../linux-user/syscall.c:8734:26: error: implicit declaration of
>>> function 'close_range' is invalid in C99
>>> [-Werror,-Wimplicit-function-declaration]
>>> return get_errno(close_range(arg1, arg2, arg3));
>>> ^
>>>
>>> There is a second issue with this pull request:
>>> ../linux-user/syscall.c:357:16: error: ‘pidfd_getfd’ defined but not
>>> used [-Werror=unused-function]
>>> 357 | _syscall3(int, pidfd_getfd, int, pidfd, int, targetfd, unsigned
>>> int, flags);
>>> | ^~~~~~~~~~~
>>> ../linux-user/syscall.c:251:13: note: in definition of macro ‘_syscall3’
>>>
>>> See https://gitlab.com/qemu-project/qemu/-/jobs/3043629434.
Stefan, Thanks for testing those patches!
I'll send a new series with those issues fixed soon.
>> Hmm apparently this PR hasn't been reviewed (although the patches were
>> on the list for 2 weeks).
>>
>> The 'check DCO' job - looking for S-o-b tags - is green:
>> https://gitlab.com/qemu-project/qemu/-/jobs/3043629425.
>> Should we complete it by a R-b/A-b check over the commit range?
>
> In some areas there will be no R-b/A-b, so I don't think we can
> require those checks.
>
> Was this pull request supposed to go through Laurent instead of being
> applied directly by me?
I'm fine with either way :-)
Thanks!
Helge
Btw, I have a whole bunch of additional patches on top of this
series so it would be good to get this series in first...
^ permalink raw reply [flat|nested] 17+ messages in thread