Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/usermode/usermode Oops, forgot a debug printf



details:   https://anonhg.NetBSD.org/src/rev/1755e6e80362
branches:  trunk
changeset: 834183:1755e6e80362
user:      reinoud <reinoud%NetBSD.org@localhost>
date:      Wed Aug 01 09:44:31 2018 +0000

description:
Oops, forgot a debug printf

diffstat:

 sys/arch/usermode/usermode/machdep.c |  22 +++++++++-
 sys/arch/usermode/usermode/pmap.c    |   5 +-
 sys/arch/usermode/usermode/thunk.c   |  79 +++++++++++++++++++++++++++++++++++-
 sys/arch/usermode/usermode/trap.c    |  38 ++++++++++++++---
 4 files changed, 130 insertions(+), 14 deletions(-)

diffs (284 lines):

diff -r ea1dd9d2870a -r 1755e6e80362 sys/arch/usermode/usermode/machdep.c
--- a/sys/arch/usermode/usermode/machdep.c      Wed Aug 01 09:43:17 2018 +0000
+++ b/sys/arch/usermode/usermode/machdep.c      Wed Aug 01 09:44:31 2018 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.56 2018/06/11 19:35:56 reinoud Exp $ */
+/* $NetBSD: machdep.c,v 1.57 2018/08/01 09:44:31 reinoud Exp $ */
 
 /*-
  * Copyright (c) 2011 Reinoud Zandijk <reinoud%netbsd.org@localhost>
@@ -37,7 +37,7 @@
 #include "opt_memsize.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.56 2018/06/11 19:35:56 reinoud Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.57 2018/08/01 09:44:31 reinoud Exp $");
 
 #include <sys/types.h>
 #include <sys/systm.h>
@@ -59,6 +59,11 @@
 #include <machine/machdep.h>
 #include <machine/mainbus.h>
 #include <machine/thunk.h>
+#include <machine/cpu.h>
+#include <sys/kgdb.h>
+
+#include "opt_ddb.h"
+#include "opt_kgdb.h"
 
 #ifndef MAX_DISK_IMAGES
 #define MAX_DISK_IMAGES        4
@@ -272,6 +277,18 @@
        splinit();
        splraise(IPL_HIGH);
 
+#ifdef DDB
+       if (boothowto & RB_KDB)
+               Debugger();
+#endif
+#ifdef KGDB
+       if (boothowto & RB_KDB) {
+               kgdb_port_init();
+               kgdb_debug_init = 1;
+               kgdb_connect(1);
+       }
+#endif
+
        kernmain();
 }
 
@@ -297,6 +314,7 @@
 void
 consinit(void)
 {
+//     kgdb_connect(0);
        printf("NetBSD/usermode startup\n");
 }
 
diff -r ea1dd9d2870a -r 1755e6e80362 sys/arch/usermode/usermode/pmap.c
--- a/sys/arch/usermode/usermode/pmap.c Wed Aug 01 09:43:17 2018 +0000
+++ b/sys/arch/usermode/usermode/pmap.c Wed Aug 01 09:44:31 2018 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.c,v 1.108 2018/08/01 09:43:17 reinoud Exp $ */
+/* $NetBSD: pmap.c,v 1.109 2018/08/01 09:44:31 reinoud Exp $ */
 
 /*-
  * Copyright (c) 2011 Reinoud Zandijk <reinoud%NetBSD.org@localhost>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.108 2018/08/01 09:43:17 reinoud Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.109 2018/08/01 09:44:31 reinoud Exp $");
 
 #include "opt_memsize.h"
 #include "opt_kmempages.h"
@@ -660,7 +660,6 @@
 
        /* not known! then it must be UVM's work */
        if (pv == NULL) {
-thunk_printf("%s: no mapping yet for %p\n", __func__, (void *) va);
                thunk_printf_debug("%s: no mapping yet\n", __func__);
                *atype = VM_PROT_READ;          /* assume it was a read */
                return false;
diff -r ea1dd9d2870a -r 1755e6e80362 sys/arch/usermode/usermode/thunk.c
--- a/sys/arch/usermode/usermode/thunk.c        Wed Aug 01 09:43:17 2018 +0000
+++ b/sys/arch/usermode/usermode/thunk.c        Wed Aug 01 09:44:31 2018 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: thunk.c,v 1.90 2018/06/04 19:53:01 reinoud Exp $ */
+/* $NetBSD: thunk.c,v 1.91 2018/08/01 09:44:31 reinoud Exp $ */
 
 /*-
  * Copyright (c) 2011 Jared D. McNeill <jmcneill%invisible.ca@localhost>
@@ -28,7 +28,7 @@
 
 #include <sys/cdefs.h>
 #ifdef __NetBSD__
-__RCSID("$NetBSD: thunk.c,v 1.90 2018/06/04 19:53:01 reinoud Exp $");
+__RCSID("$NetBSD: thunk.c,v 1.91 2018/08/01 09:44:31 reinoud Exp $");
 #endif
 
 #define _KMEMUSER
@@ -92,6 +92,9 @@
 
 //#define RFB_DEBUG
 
+static ssize_t safe_recv(int s, void *buf, int len);
+static ssize_t safe_send(int s, const void *msg, int len);
+
 extern int boothowto;
 
 void
@@ -1017,6 +1020,78 @@
        return 0;
 }
 
+int
+thunk_gdb_open(void)
+{
+       struct sockaddr_in sin;
+       int sockfd;
+       int portnr = 5001;      /* XXX configurable or random */
+
+       /* create socket */
+       sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+       if (sockfd < 0) {
+               warn("kgdb stub: couldn't create socket");
+               return 0;
+       }
+
+       /* bind to requested port */
+       memset(&sin, 0, sizeof(sin));
+       sin.sin_family      = AF_INET;
+       sin.sin_addr.s_addr = htonl(INADDR_ANY);
+       sin.sin_port        = htons(portnr);
+
+       if (bind(sockfd, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
+               warn("kgdb stub: couldn't bind port %d", portnr);
+               close(sockfd);
+               return 0;
+       }
+
+       /* listen for connections */
+       if (listen(sockfd, 1) < 0) {
+               warn("kgdb stub: couldn't listen on socket");
+               close(sockfd);
+               return 0;
+       }
+       printf("kgdb stub: accepting connections on port %d\n", portnr);
+
+       return sockfd;
+}
+
+int
+thunk_gdb_accept(int sockfd)
+{
+       struct sockaddr_in client_addr;
+       socklen_t client_addrlen;
+       int fd, flags;
+
+       fd = accept(sockfd, (struct sockaddr *) &client_addr, &client_addrlen);
+       if (fd < 0) {
+               warn("kgdb_stub: connect error");
+               return 0;
+       }
+
+       /* make FIFO unblocking */
+       flags = fcntl(fd, F_GETFL, 0);
+       if (flags == -1)
+               flags = 0;
+       if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) < 0) {
+               warn("kgdb_stub: can't make socket non blocking");
+       }
+       return fd;
+}
+
+int
+thunk_kgdb_getc(int fd, char *ch)
+{
+       return safe_recv(fd, ch, 1);
+}
+
+int
+thunk_kgdb_putc(int fd, char ch)
+{
+       return safe_send(fd, &ch, 1);
+}
+
 static ssize_t
 safe_send(int s, const void *msg, int len)
 {
diff -r ea1dd9d2870a -r 1755e6e80362 sys/arch/usermode/usermode/trap.c
--- a/sys/arch/usermode/usermode/trap.c Wed Aug 01 09:43:17 2018 +0000
+++ b/sys/arch/usermode/usermode/trap.c Wed Aug 01 09:44:31 2018 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: trap.c,v 1.69 2018/07/28 17:17:38 reinoud Exp $ */
+/* $NetBSD: trap.c,v 1.70 2018/08/01 09:44:31 reinoud Exp $ */
 
 /*-
  * Copyright (c) 2011 Reinoud Zandijk <reinoud%netbsd.org@localhost>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.69 2018/07/28 17:17:38 reinoud Exp $");
+__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.70 2018/08/01 09:44:31 reinoud Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -46,6 +46,12 @@
 #include <machine/intr.h>
 #include <machine/thunk.h>
 
+#include "opt_kgdb.h"
+
+#ifdef KGDB
+#include <sys/kgdb.h>
+#endif
+
 /* define maximum signal number */
 #ifndef NSIG
 #define NSIG 64
@@ -61,6 +67,8 @@
 static sigfunc_t sigio;
 static sigfunc_t pass_on;
 
+void kgdb_kernel_trap(int signo, vaddr_t pc, vaddr_t va, ucontext_t *ctx);
+
 /* raw signal handlers */
 static char    sig_stack[SIGSTKSZ];
 static stack_t sigstk;
@@ -123,7 +131,7 @@
        /* INT */       /* ttycons ^C */
        /* QUIT */
        signal_intr_establish(SIGILL, illegal_instruction);
-       /* TRAP */
+       signal_intr_establish(SIGTRAP, pass_on);        /* special */
        /* ABRT */
        /* SIGEMT */
        signal_intr_establish(SIGFPE, pass_on);
@@ -317,9 +325,6 @@
        f = sig_funcs[sig];
        KASSERT(f);
 
-       l = curlwp; KASSERT(l);
-       pcb = lwp_getpcb(l); KASSERT(pcb);
-
        /* get address of possible faulted memory access and page align it */
        va = (vaddr_t) info->si_addr;
        va = trunc_page(va);
@@ -327,7 +332,22 @@
        /* get PC address of possibly faulted instruction */
        pc = md_get_pc(ctx);
 
-       /* nest it on the stack */
+       /*
+        * short-cut for SIGTRAP as we have NO indication anything is valid
+        */
+#ifdef KGDB
+       if (sig == SIGTRAP) {
+               from_userland = 0;
+               if (pc < kmem_user_end)
+                       from_userland = 1;
+               if (!from_userland) {
+                       kgdb_kernel_trap(sig, pc, va, ucp);
+                       return;
+               }
+       }
+#endif
+
+       /* get stack pointer for nesting */
        sp = md_get_sp(ctx);
 
        if (sig == SIGBUS || sig == SIGSEGV)
@@ -335,6 +355,10 @@
        if (sig == SIGILL)
                print_illegal_instruction_siginfo(sig, info, ctx, pc, va, sp);
 
+       /* get thread */
+       l = curlwp; KASSERT(l);
+       pcb = lwp_getpcb(l); KASSERT(pcb);
+
        /* currently running on the dedicated signal stack */
 
        /* if we're running on a userland stack, switch to the system stack */



Home | Main Index | Thread Index | Old Index