188 lines
6.3 KiB
Diff
188 lines
6.3 KiB
Diff
|
|
From 0b83779bb381053ce5de13807dfdc46d2781a2ca Mon Sep 17 00:00:00 2001
|
||
|
|
From: =?UTF-8?q?=E5=88=98=E5=A9=A720201110?=
|
||
|
|
<liujing_yewu@cmss.chinamobile.com>
|
||
|
|
Date: Wed, 13 Nov 2024 19:32:32 +0800
|
||
|
|
Subject: [PATCH] linux-user: Add missing signals in strace output
|
||
|
|
|
||
|
|
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>
|
||
|
|
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
|
||
|
|
Message-Id: <20220918194555.83535-2-deller@gmx.de>
|
||
|
|
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
|
||
|
|
Signed-off-by: Liu Jing <liujing_yewu@cmss.chinamobile.com>
|
||
|
|
---
|
||
|
|
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 7457f8025c..00d9e04d74 100644
|
||
|
|
--- a/linux-user/signal-common.h
|
||
|
|
+++ b/linux-user/signal-common.h
|
||
|
|
@@ -90,4 +90,50 @@ abi_long do_swapcontext(CPUArchState *env, abi_ulong uold_ctx,
|
||
|
|
*/
|
||
|
|
int block_signals(void); /* Returns non zero if signal pending */
|
||
|
|
|
||
|
|
+#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 6d5e5b698c..f65d6cff2f 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 37d66d0dff..019fa329f1 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.33.0
|
||
|
|
|