summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustus Winter <justus@gnupg.org>2016-04-25 19:13:02 +0200
committerJustus Winter <justus@gnupg.org>2016-04-25 19:13:02 +0200
commitc79e50576dceb7357a7f4baaa83d7285848602c6 (patch)
treed5b4c2956fde355ba1813050f40e61c98fe3d9a7
parent6780772faf07947e52b42ea744c01067108da884 (diff)
add patch series
-rw-r--r--debian/patches/crash0001-xxx-crash-logging-works.patch178
-rw-r--r--debian/patches/series1
2 files changed, 179 insertions, 0 deletions
diff --git a/debian/patches/crash0001-xxx-crash-logging-works.patch b/debian/patches/crash0001-xxx-crash-logging-works.patch
new file mode 100644
index 00000000..624bcfe2
--- /dev/null
+++ b/debian/patches/crash0001-xxx-crash-logging-works.patch
@@ -0,0 +1,178 @@
+From 7c92bdc07b4beab676a099ffe074ed21fdf50d80 Mon Sep 17 00:00:00 2001
+From: Justus Winter <4winter@informatik.uni-hamburg.de>
+Date: Mon, 1 Dec 2014 22:23:29 +0100
+Subject: [PATCH hurd] xxx crash logging works
+
+---
+ hurd/paths.h | 1 +
+ trans/crash.c | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 121 insertions(+)
+
+diff --git a/hurd/paths.h b/hurd/paths.h
+index a13ba9b..c6cb7a0 100644
+--- a/hurd/paths.h
++++ b/hurd/paths.h
+@@ -54,6 +54,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+ #define _HURD_IFSOCK _HURD "ifsock" /* S_IFSOCK */
+
+ /* Symbolic names for all non-essential translators. */
++#define _HURD_CRASH _HURD "crash"
+ #define _HURD_MTAB _HURD "mtab"
+
+ #endif /* hurd/paths.h */
+diff --git a/trans/crash.c b/trans/crash.c
+index 9279bab..479e9bf 100644
+--- a/trans/crash.c
++++ b/trans/crash.c
+@@ -21,14 +21,17 @@
+ along with the GNU Hurd; see the file COPYING. If not, write to
+ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
++#include <assert.h>
+ #include <hurd.h>
+ #include <fcntl.h>
+ #include <hurd/trivfs.h>
++#include <hurd/paths.h>
+ #include <sys/wait.h>
+ #include <error.h>
+ #include <argp.h>
+ #include <argz.h>
+ #include <sys/mman.h>
++#include <syslog.h>
+
+ #include <version.h>
+
+@@ -141,6 +144,121 @@ stop_pgrp (process_t userproc, mach_port_t cttyid)
+ munmap (pids, numpids);
+ }
+
++void mach_print(const char *);
++
++#ifndef EXTERNAL_MACH_PRINT
++asm (".global mach_print;"
++ " mach_print:;"
++ " mov $0xffffffe2, %eax;"
++ " lcall $0x7, $0x0;"
++ " ret;");
++#endif /* EXTERNAL_MACH_PRINT */
++
++#include <mach/thread_status.h>
++
++error_t
++get_pcs (task_t task, char **pcs)
++{
++ error_t err;
++ thread_t *threads;
++ size_t i, nthreads;
++
++#ifdef i386_THREAD_STATE
++ struct i386_thread_state state;
++ mach_msg_type_number_t count = i386_THREAD_STATE_COUNT;
++ int flavor = i386_THREAD_STATE;
++
++ err = task_threads (task, &threads, &nthreads);
++ if (err)
++ return err;
++
++ *pcs = NULL;
++ for (i = 0; i < nthreads; i++)
++ {
++ char *old = *pcs;
++ err = thread_get_state (threads[i], flavor,
++ (thread_state_t) &state, &count);
++ if (err)
++ return err;
++
++ if (old)
++ asprintf (pcs, "%s, 0x%x", old, state.eip);
++ else
++ asprintf (pcs, "0x%x", state.eip);
++
++ free (old);
++ err = mach_port_deallocate (mach_task_self (), threads[i]);
++ assert_perror (err);
++ }
++#else
++ *pcs = strdup ("architecture not supported");
++#endif
++ return 0;
++}
++
++error_t
++log_crash (task_t task,
++ int signo, integer_t sigcode, int sigerror,
++ natural_t exc, natural_t code, natural_t subcode,
++ enum crash_action how)
++{
++ error_t err;
++ pid_t pid;
++ char argz_buf[128], *argz = argz_buf;
++ size_t argz_len = sizeof argz;
++ char *msg;
++ char *how_msg;
++ char *pcs;
++
++ switch (how)
++ {
++ case crash_suspend:
++ how_msg = "suspending task";
++ break;
++ case crash_kill:
++ how_msg = "killing task";
++ break;
++ case crash_corefile:
++ how_msg = "writing core file";
++ break;
++ default:
++ assert (! "reached");
++ }
++
++ err = proc_task2pid (procserver, task, &pid);
++ if (err)
++ return err;
++
++ err = proc_getprocargs (procserver, pid, &argz, &argz_len);
++ if (err)
++ return err;
++
++ err = get_pcs (task, &pcs);
++ if (err)
++ return err;
++
++ argz_stringify (argz, argz_len, ' ');
++ asprintf (&msg, "%s: %s(%d) crashed, signal {no:%d, code:%d, error:%d}, "
++ "exception {%d, code:%d, subcode:%d}, PCs: {%s}, %s.\n",
++ _HURD_CRASH, argz, pid,
++ signo, sigcode, sigerror,
++ exc, code, subcode,
++ pcs,
++ how_msg);
++ if (argz != argz_buf)
++ vm_deallocate (mach_task_self (), argz, argz_len);
++ free (pcs);
++ if (! msg)
++ return ENOMEM;
++
++ fprintf (stderr, "%s", msg);
++ mach_print (msg);
++ syslog (LOG_ERR, "%s", msg);
++
++ free (msg);
++
++ return 0;
++}
+
+ kern_return_t
+ S_crash_dump_task (mach_port_t port,
+@@ -174,6 +292,8 @@ S_crash_dump_task (mach_port_t port,
+ }
+ }
+
++ log_crash (task, signo, sigcode, sigerror, exc, code, subcode, how);
++
+ switch (how)
+ {
+ default: /* NOTREACHED */
+--
+2.1.4
+
diff --git a/debian/patches/series b/debian/patches/series
index 247a0b04..03dd2945 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -50,3 +50,4 @@ fixes0005-fstests-new-micro-benchmark.patch
assert0001-libpager-add-missing-include.patch
assert0002-libshouldbeinlibc-add-assert-3-variant-that-prints-b.patch
assert0003-libshouldbeinlibc-use-the-new-assert-in-the-refcount.patch
+crash0001-xxx-crash-logging-works.patch