--- crash-4.0-3.3/defs.h	2006-09-07 21:00:08.000000000 +0200
+++ crash-4.0-3.3-patch/defs.h	2006-09-13 18:10:09.000000000 +0200
@@ -911,6 +911,7 @@
 	long tms_tms_stime;
 	long signal_struct_count;
 	long signal_struct_action;
+	long signal_struct_shared_pending;
 	long k_sigaction_sa;
 	long sigaction_sa_handler;
 	long sigaction_sa_flags;
@@ -1362,6 +1363,7 @@
 	long net_device;
 	long sock;
 	long signal_struct;
+	long sigpending_signal;
 	long signal_queue;
 	long sighand_struct;
 	long sigqueue;
--- crash-4.0-3.3/symbols.c	2006-09-07 21:00:08.000000000 +0200
+++ crash-4.0-3.3-patch/symbols.c	2006-09-12 19:25:32.000000000 +0200
@@ -5674,6 +5674,8 @@
         	OFFSET(signal_struct_count));
 	fprintf(fp, "          signal_struct_action: %ld\n",
         	OFFSET(signal_struct_action));
+	fprintf(fp, "          signal_struct_shared_pending: %ld\n",
+        	OFFSET(signal_struct_shared_pending));
         fprintf(fp, "        task_struct_start_time: %ld\n",
                 OFFSET(task_struct_start_time));
         fprintf(fp, "             task_struct_times: %ld\n",
--- crash-4.0-3.3/task.c	2006-09-07 21:00:08.000000000 +0200
+++ crash-4.0-3.3-patch/task.c	2006-09-13 18:48:08.000000000 +0200
@@ -52,7 +52,8 @@
 static void dump_signal_data(struct task_context *);
 static int sigrt_minmax(int *, int *);
 static void signame_list(void);
-static ulonglong task_signal(ulong);
+static void sigqueue_list(ulong);
+static ulonglong task_signal(ulong,ulong*);
 static ulonglong task_blocked(ulong);
 static void translate_sigset(ulonglong);
 static ulonglong sigaction_mask(ulong);
@@ -211,6 +212,7 @@
 	 
 	MEMBER_OFFSET_INIT(signal_struct_count, "signal_struct", "count");
 	MEMBER_OFFSET_INIT(signal_struct_action, "signal_struct", "action");
+	MEMBER_OFFSET_INIT(signal_struct_shared_pending,"signal_struct","shared_pending");
 
 	MEMBER_OFFSET_INIT(k_sigaction_sa, "k_sigaction", "sa");
 	
@@ -221,6 +223,7 @@
 	if (INVALID_MEMBER(sigpending_head))
 		MEMBER_OFFSET_INIT(sigpending_list, "sigpending", "list");
 	MEMBER_OFFSET_INIT(sigpending_signal, "sigpending", "signal");
+	MEMBER_SIZE_INIT(sigpending_signal, "sigpending", "signal");
 
 	STRUCT_SIZE_INIT(sigqueue, "sigqueue");
        	STRUCT_SIZE_INIT(signal_queue, "signal_queue");
@@ -5805,10 +5808,10 @@
 dump_signal_data(struct task_context *tc)
 {
 	int i, sigrtmax, others, use_sighand;
-	int translate, sig, sigpending;
+	int translate, sigpending;
 	uint ti_flags;
 	ulonglong sigset, blocked, mask;
-	ulong signal_struct, kaddr, handler, flags, sigqueue, sigqueue_save, next;
+	ulong signal_struct, kaddr, handler, flags, sigqueue;
 	ulong sighand_struct;
 	long size;
 	char *signal_buf, *uaddr;
@@ -5826,7 +5829,7 @@
                 MEMBER_OFFSET_INIT(signal_queue_info, "signal_queue", "info");
         }
 
-	sigset = task_signal(tc->task);
+	sigset = task_signal(tc->task,0);
 	if (!tt->last_task_read)
 		return;
 	blocked = task_blocked(tc->task);
@@ -5840,11 +5843,6 @@
 		sigpending = ti_flags & (1<<TIF_SIGPENDING);
 	}
 	
-	fprintf(fp, "SIGPENDING: %s\n", sigpending ? "yes" : "no");
-		
-	fprintf(fp, "    SIGNAL: %016llx\n", sigset);
-
-	fprintf(fp, "   BLOCKED: %016llx\n", blocked);
 
 	if (VALID_MEMBER(task_struct_sig))
 		signal_struct = ULONG(tt->task_struct + 
@@ -5974,6 +5972,12 @@
                 fprintf(fp, "\n");
         }
 
+	fprintf(fp, "SIGPENDING: %s\n", sigpending ? "yes" : "no");
+		
+	fprintf(fp, "    SIGNAL: %016llx\n", sigset);
+
+	fprintf(fp, "   BLOCKED: %016llx\n", blocked);
+
 	if (VALID_MEMBER(task_struct_sigqueue)) 
 		sigqueue = ULONG(tt->task_struct + 
 			OFFSET(task_struct_sigqueue));
@@ -5986,14 +5990,54 @@
 	if (VALID_MEMBER(sigqueue_list) && empty_list(sigqueue))
 		sigqueue = 0;
 
-	if (sigqueue)
+	if (sigqueue) {
                 fprintf(fp, "SIGQUEUE:  SIG  %s\n",
                         mkstring(buf1, VADDR_PRLEN, CENTER|LJUST, "SIGINFO"));
-	else
+		 sigqueue_list(sigqueue);
+	} else
                 fprintf(fp, "SIGQUEUE: (empty)\n");
 
-	sigqueue_save = sigqueue;
+	if (VALID_MEMBER(signal_struct_shared_pending) ) {
+		ulong shared_pending,signal;
+		fprintf(fp, "SHARED_PENDING\n");
+		shared_pending = signal_struct + OFFSET(signal_struct_shared_pending);
+		signal = shared_pending + OFFSET(sigpending_signal);
+		readmem(signal, KVADDR, signal_buf,SIZE(sigpending_signal),
+			"signal", FAULT_ON_ERROR);
+		sigset= task_signal(0, (ulong*)signal_buf);
+		fprintf(fp, "    SIGNAL: %016llx\n", sigset);
+                sigqueue  = (shared_pending + 
+			OFFSET(sigpending_list) + OFFSET(list_head_next));
+		readmem(sigqueue,KVADDR, signal_buf,
+			SIZE(sigqueue),
+                        "sigqueue", FAULT_ON_ERROR);
+		sigqueue = ULONG(signal_buf);
 
+		if (VALID_MEMBER(sigqueue_list) && empty_list(sigqueue))
+			sigqueue = 0;
+		if (sigqueue) {
+               		fprintf(fp, "SIGQUEUE:  SIG  %s\n",
+                       		mkstring(buf1, VADDR_PRLEN, CENTER|LJUST, "SIGINFO"));
+			 sigqueue_list(sigqueue);
+		} else
+               		fprintf(fp, "SIGQUEUE: (empty)\n");
+	}
+	FREEBUF(signal_buf);
+}
+
+/*
+ *  Dump a pending signal queue (private/shared).
+ */
+
+static void sigqueue_list(ulong sigqueue) {
+        ulong sigqueue_save, next;
+	int sig;
+	char *signal_buf;
+	long size;
+        size = VALID_SIZE(signal_queue) ?  SIZE(signal_queue) : SIZE(sigqueue);
+        signal_buf = GETBUF(size);
+
+        sigqueue_save = sigqueue;
         while (sigqueue) {
         	readmem(sigqueue, KVADDR, signal_buf, 
 			SIZE_OPTION(signal_queue, sigqueue), 
@@ -6020,8 +6064,8 @@
 
                 sigqueue = next;
         }
-
 	FREEBUF(signal_buf);
+
 }
 
 /*
@@ -6031,11 +6075,11 @@
  */
 
 static ulonglong 
-task_signal(ulong task)
+task_signal(ulong task,ulong *signal)
 {
 	ulonglong sigset;
 	ulong *sigset_ptr;
-
+	if(task) {
         fill_task_struct(task);
 
 	if (!tt->last_task_read) 
@@ -6050,6 +6094,10 @@
                         OFFSET(task_struct_signal));
         } else
 		return 0;
+	} else if (signal) {
+		sigset_ptr=signal;
+	} else
+		return 0;
 
 	switch (_NSIG_WORDS)
 	{
