This is the mail archive of the systemtap@sourceware.org mailing list for the systemtap project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Added new functions in tapset/signal.stp


<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";
> 
> You don't have to stop at signal 48.  Just continue until RTMIN+31.

Amended. Thanks.

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:32: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,155 @@
     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";
+	if (sig == 49) return "RTMIN+17";
+	if (sig == 50) return "RTMIN+18";
+	if (sig == 51) return "RTMIN+19";
+	if (sig == 52) return "RTMIN+20";
+	if (sig == 53) return "RTMIN+21";
+	if (sig == 54) return "RTMIN+22";
+	if (sig == 55) return "RTMIN+23";
+	if (sig == 56) return "RTMIN+24";
+	if (sig == 57) return "RTMIN+25";
+	if (sig == 58) return "RTMIN+26";
+	if (sig == 59) return "RTMIN+27";
+	if (sig == 60) return "RTMIN+28";
+	if (sig == 61) return "RTMIN+29";
+	if (sig == 62) return "RTMIN+30";
+	if (sig == 63) return "RTMIN+31";
+	if (sig == 64) return "RTMIN+32";
+}
+
+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 */
+}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]