This is the mail archive of the
systemtap@sourceware.org
mailing list for the systemtap project.
Re: [PATCH] Added new functions in tapset/signal.stp
- From: Eugene Teo <eugeneteo at kernel dot sg>
- To: Ulrich Drepper <drepper at redhat dot com>
- Cc: Eugene Teo <eugeneteo at kernel dot sg>, systemtap at sources dot redhat dot com
- Date: Tue, 15 Jan 2008 00:22:22 +0800
- Subject: Re: [PATCH] Added new functions in tapset/signal.stp
- References: <20080114030238.GA6933@kernel.sg> <478B8156.8050309@redhat.com>
- Reply-to: Eugene Teo <eugeneteo at kernel dot sg>
Hi Ulrich,
<quote sender="Ulrich Drepper">
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> Eugene Teo wrote:
> > + if (sig == 45) return "RTMIN+13";
> > + if (sig == 46) return "RTMIN+14";
> > + if (sig == 47) return "RTMIN+15";
> > + if (sig == 48) return "RTMIN+16";
> > + if (sig == 49) return "RTMAX-15";
> > + if (sig == 50) return "RTMAX-14";
> > + if (sig == 51) return "RTMAX-13";
>
> While I appreciate what you want to do with switching from RTMIN+xx to
> RTMAX-xx it is not something you should do. The signal system has
> always the possibility to see the number of signals to be increased if
> this should become necessary or desirable. Or: somebody could decide to
> slash the number of signals.
>
> In these cases the absolute values of the RTMAX+xx reports will change
> and collected output is not universally understandable. You should use
> only the RTMIN+xx syntax.
Thanks for your advice.
Here's the amended patch with only the RTMIN+xx syntax.
diff -Naur src.default/tapset/ChangeLog src/tapset/ChangeLog
--- src.default/tapset/ChangeLog 2008-01-05 03:39:54.000000000 +0800
+++ src/tapset/ChangeLog 2008-01-15 00:18:14.000000000 +0800
@@ -1,3 +1,16 @@
+2008-1-14 Eugene Teo <eteo@redhat.com>
+
+ * signal.stp (get_sa_flags, get_sa_handler): New functions to
+ return addresses of sa_flags and sa_handler of struct k_sigaction.
+ (sigset_mask_str): New function. Returns a string containing the
+ set of signals to be blocked when executing the signal handler.
+ (is_sig_blocked): New function. Checks task_struct->blocked signal
+ mask for signals that are currently blocked.
+ (signal_str): New function. Translates a signal number.
+ (sa_flags_str): New function. Translates the sa_flags.
+ (sa_handler_str): New function. Returns the signal action or handler
+ associated to the signal.
+
2008-1-4 Masami Hiramatsu <mhiramat@redhat.com>
* aux_syscalls.stp (_stp_fork_list): Check kernel version for new
diff -Naur src.default/tapset/signal.stp src/tapset/signal.stp
--- src.default/tapset/signal.stp 2007-12-27 14:58:23.000000000 +0800
+++ src/tapset/signal.stp 2008-01-15 00:18:36.000000000 +0800
@@ -1,6 +1,7 @@
// Signal tapset
// Copyright (C) 2006 IBM Corp.
// Copyright (C) 2006 Intel Corporation.
+// Copyright (C) 2008 Red Hat, Inc.
//
// This file is part of systemtap, and is free software. You can
// redistribute it and/or modify it under the terms of the GNU General
@@ -505,3 +506,139 @@
sig_pid = $t->pid
pid_name = kernel_string($t->comm)
}
+
+function get_sa_flags:long (act:long) %{ /* pure */
+ struct k_sigaction *act = (struct k_sigaction *)((long)THIS->act);
+ THIS->__retvalue = (long)act->sa.sa_flags;
+%}
+
+function get_sa_handler:long (act:long) %{ /* pure */
+ struct k_sigaction *act = (struct k_sigaction *)((long)THIS->act);
+ THIS->__retvalue = (long)act->sa.sa_handler;
+%}
+
+/*
+ * sa_mask contains the set of signals to be blocked when executing the
+ * signal handler. This function returns a string, delimited by ",".
+ *
+ * struct task_struct {
+ * [...]
+ * struct signal_struct *signal;
+ * struct sighand_struct *sighand;
+ * [...]
+ * struct sighand_struct {
+ * atomic_t count;
+ * struct k_sigaction action[_NSIG];
+ * [...]
+ * struct k_sigaction {
+ * struct sigaction sa;
+ * };
+ *
+ * struct sigaction {
+ * [...]
+ * sigset_t sa_mask;
+ * };
+ */
+function sigset_mask_str:string (mask:long) %{ /* pure */
+ int i;
+ char str[256], tmp[10];
+ str[0] = '\0';
+ for (i = 1; i < _NSIG; ++i) {
+ if (THIS->mask & 1) {
+ sprintf(tmp, "%u,", i);
+ strcat(str, tmp);
+ }
+ THIS->mask >>= 1;
+ }
+ if (str[0] != '\0') str[strlen(str)-1] = '\0';
+ strlcpy (THIS->__retvalue, str, MAXSTRINGLEN);
+%}
+
+/*
+ * task_struct->blocked signal mask contains the set of signals that are
+ * currently blocked.
+ *
+ * struct task_struct {
+ * [...]
+ * sigset_t blocked, real_blocked;
+ */
+function is_sig_blocked:long (task:long, sig:long) %{ /* pure */
+ struct task_struct *p = (struct task_struct *)((long)THIS->task);
+ THIS->__retvalue = !p ? -1 : sigismember(&p->blocked, THIS->sig);
+%}
+
+/*
+ * Signals start from 1 not 0.
+ */
+function signal_str(sig) {
+ if (sig == 1) return "HUP";
+ if (sig == 2) return "INT";
+ if (sig == 3) return "QUIT";
+ if (sig == 4) return "ILL";
+ if (sig == 5) return "TRAP";
+ if (sig == 6) return "ABRT"; /* or IOT */
+ if (sig == 7) return "BUS";
+ if (sig == 8) return "FPE";
+ if (sig == 9) return "KILL";
+ if (sig == 10) return "USR1";
+ if (sig == 11) return "SEGV";
+ if (sig == 12) return "USR2";
+ if (sig == 13) return "PIPE";
+ if (sig == 14) return "ALRM";
+ if (sig == 15) return "TERM";
+ if (sig == 16) return "STKFLT";
+ if (sig == 17) return "CHLD"; /* or CLD */
+ if (sig == 18) return "CONT";
+ if (sig == 19) return "STOP";
+ if (sig == 20) return "TSTP";
+ if (sig == 21) return "TTIN";
+ if (sig == 22) return "TTOU";
+ if (sig == 23) return "URG";
+ if (sig == 24) return "XCPU";
+ if (sig == 25) return "XFSZ";
+ if (sig == 26) return "VTALRM";
+ if (sig == 27) return "PROF";
+ if (sig == 28) return "WINCH";
+ if (sig == 29) return "IO/POLL";
+ if (sig == 30) return "PWR";
+ if (sig == 31) return "SYS"; /* or UNUSED */
+ if (sig == 32) return "RTMIN";
+ if (sig == 33) return "RTMIN+1";
+ if (sig == 34) return "RTMIN+2";
+ if (sig == 35) return "RTMIN+3";
+ if (sig == 36) return "RTMIN+4";
+ if (sig == 37) return "RTMIN+5";
+ if (sig == 38) return "RTMIN+6";
+ if (sig == 39) return "RTMIN+7";
+ if (sig == 40) return "RTMIN+8";
+ if (sig == 41) return "RTMIN+9";
+ if (sig == 42) return "RTMIN+10";
+ if (sig == 43) return "RTMIN+11";
+ if (sig == 44) return "RTMIN+12";
+ if (sig == 45) return "RTMIN+13";
+ if (sig == 46) return "RTMIN+14";
+ if (sig == 47) return "RTMIN+15";
+ if (sig == 48) return "RTMIN+16";
+}
+
+function sa_flags_str:string (sa_flags:long) %{ /* pure */
+ char str[256];
+ str[0] = '\0';
+ if (THIS->sa_flags & 0x00000001u) strcat(str, "NOCLDSTOP|");
+ if (THIS->sa_flags & 0x00000002u) strcat(str, "NOCLDWAIT|");
+ if (THIS->sa_flags & 0x00000004u) strcat(str, "SIGINFO|");
+ if (THIS->sa_flags & 0x08000000u) strcat(str, "ONSTACK|");
+ if (THIS->sa_flags & 0x10000000u) strcat(str, "RESTART|");
+ if (THIS->sa_flags & 0x40000000u) strcat(str, "NODEFER|");
+ if (THIS->sa_flags & 0x80000000u) strcat(str, "RESETHAND|");
+ if (THIS->sa_flags & 0x04000000) strcat(str, "RESTORER|");
+ if (str[0] != '\0') str[strlen(str)-1] = '\0';
+ strlcpy (THIS->__retvalue, str, MAXSTRINGLEN);
+%}
+
+function sa_handler_str(handler) {
+ if (handler == 0) return "default"; /* SIG_DFL */
+ if (handler == 1) return "ignored"; /* SIG_IGN */
+ if (handler == -1) return "error"; /* SIG_ERR */
+ return sprintf("%p", handler); /* userspace address */
+}