diff options
author | Justus Winter <justus@gnupg.org> | 2016-04-25 19:13:02 +0200 |
---|---|---|
committer | Justus Winter <justus@gnupg.org> | 2016-04-25 19:13:02 +0200 |
commit | c79e50576dceb7357a7f4baaa83d7285848602c6 (patch) | |
tree | d5b4c2956fde355ba1813050f40e61c98fe3d9a7 /debian/patches | |
parent | 6780772faf07947e52b42ea744c01067108da884 (diff) |
add patch series
Diffstat (limited to 'debian/patches')
-rw-r--r-- | debian/patches/crash0001-xxx-crash-logging-works.patch | 178 | ||||
-rw-r--r-- | debian/patches/series | 1 |
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 |