vkernel - Add SIGINFO support (experimental)
authorMatthew Dillon <dillon@apollo.backplane.com>
Thu, 28 Jul 2011 23:19:29 +0000 (16:19 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Thu, 28 Jul 2011 23:19:29 +0000 (16:19 -0700)
* Display the lwp id and the pc and sp of the thread.

sys/platform/vkernel/i386/exception.c
sys/platform/vkernel64/x86_64/exception.c

index 8b770ef..a866b41 100644 (file)
@@ -54,6 +54,7 @@
 
 #include <err.h>
 #include <signal.h>
+#include <stdio.h>
 #include <unistd.h>
 
 int _ucodesel = LSEL(LUCODE_SEL, SEL_UPL);
@@ -140,6 +141,20 @@ iosig(int nada, siginfo_t *info, void *ctxp)
 
 #endif
 
+static
+void
+infosig(int nada, siginfo_t *info, void *ctxp)
+{
+       ucontext_t *ctx = ctxp;
+       char buf[256];
+
+       snprintf(buf, sizeof(buf), "lwp %d pc=%p sp=%p\n",
+               (int)lwp_gettid(),
+               (void *)(intptr_t)ctx->uc_mcontext.mc_eip,
+               (void *)(intptr_t)ctx->uc_mcontext.mc_esp);
+       write(2, buf, strlen(buf));
+}
+
 void
 init_exceptions(void)
 {
@@ -168,6 +183,8 @@ init_exceptions(void)
        sa.sa_sigaction = iosig;
        sigaction(SIGIO, &sa, NULL);
 #endif
+       sa.sa_sigaction = infosig;
+       sigaction(SIGINFO, &sa, NULL);
 }
 
 /*
index 34ef724..cb266e3 100644 (file)
@@ -54,6 +54,7 @@
 
 #include <err.h>
 #include <signal.h>
+#include <stdio.h>
 #include <unistd.h>
 
 int _ucodesel = GSEL(GUCODE_SEL, SEL_UPL);
@@ -145,6 +146,20 @@ iosig(int nada, siginfo_t *info, void *ctxp)
 
 #endif
 
+static
+void
+infosig(int nada, siginfo_t *info, void *ctxp)
+{
+       ucontext_t *ctx = ctxp;
+       char buf[256];
+
+       snprintf(buf, sizeof(buf), "lwp %d pc=%p sp=%p\n",
+               (int)lwp_gettid(),
+               (void *)(intptr_t)ctx->uc_mcontext.mc_rip,
+               (void *)(intptr_t)ctx->uc_mcontext.mc_rsp);
+       write(2, buf, strlen(buf));
+}
+
 void
 init_exceptions(void)
 {
@@ -173,6 +188,8 @@ init_exceptions(void)
        sa.sa_sigaction = iosig;
        sigaction(SIGIO, &sa, NULL);
 #endif
+       sa.sa_sigaction = infosig;
+       sigaction(SIGINFO, &sa, NULL);
 }
 
 /*