Module Name: src
Committed By: reinoud
Date: Wed Aug 1 09:44:32 UTC 2018
Modified Files:
src/sys/arch/usermode/usermode: machdep.c pmap.c thunk.c trap.c
Log Message:
Oops, forgot a debug printf
To generate a diff of this commit:
cvs rdiff -u -r1.56 -r1.57 src/sys/arch/usermode/usermode/machdep.c
cvs rdiff -u -r1.108 -r1.109 src/sys/arch/usermode/usermode/pmap.c
cvs rdiff -u -r1.90 -r1.91 src/sys/arch/usermode/usermode/thunk.c
cvs rdiff -u -r1.69 -r1.70 src/sys/arch/usermode/usermode/trap.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/usermode/usermode/machdep.c
diff -u src/sys/arch/usermode/usermode/machdep.c:1.56 src/sys/arch/usermode/usermode/machdep.c:1.57
--- src/sys/arch/usermode/usermode/machdep.c:1.56 Mon Jun 11 19:35:56 2018
+++ src/sys/arch/usermode/usermode/machdep.c Wed Aug 1 09:44:31 2018
@@ -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 <[email protected]>
@@ -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 @@ __KERNEL_RCSID(0, "$NetBSD: machdep.c,v
#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 @@ main(int argc, char *argv[])
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 @@ setstatclockrate(int arg)
void
consinit(void)
{
+// kgdb_connect(0);
printf("NetBSD/usermode startup\n");
}
Index: src/sys/arch/usermode/usermode/pmap.c
diff -u src/sys/arch/usermode/usermode/pmap.c:1.108 src/sys/arch/usermode/usermode/pmap.c:1.109
--- src/sys/arch/usermode/usermode/pmap.c:1.108 Wed Aug 1 09:43:17 2018
+++ src/sys/arch/usermode/usermode/pmap.c Wed Aug 1 09:44:31 2018
@@ -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 <[email protected]>
@@ -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 @@ pmap_fault(pmap_t pmap, vaddr_t va, vm_p
/* 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;
Index: src/sys/arch/usermode/usermode/thunk.c
diff -u src/sys/arch/usermode/usermode/thunk.c:1.90 src/sys/arch/usermode/usermode/thunk.c:1.91
--- src/sys/arch/usermode/usermode/thunk.c:1.90 Mon Jun 4 19:53:01 2018
+++ src/sys/arch/usermode/usermode/thunk.c Wed Aug 1 09:44:31 2018
@@ -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 <[email protected]>
@@ -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 @@ __RCSID("$NetBSD: thunk.c,v 1.90 2018/06
//#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 @@ thunk_rfb_open(thunk_rfb_t *rfb, uint16_
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)
{
Index: src/sys/arch/usermode/usermode/trap.c
diff -u src/sys/arch/usermode/usermode/trap.c:1.69 src/sys/arch/usermode/usermode/trap.c:1.70
--- src/sys/arch/usermode/usermode/trap.c:1.69 Sat Jul 28 17:17:38 2018
+++ src/sys/arch/usermode/usermode/trap.c Wed Aug 1 09:44:31 2018
@@ -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 <[email protected]>
@@ -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 @@ __KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.6
#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 alarm;
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 @@ setup_signal_handlers(void)
/* 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 @@ handle_signal(int sig, siginfo_t *info,
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 @@ handle_signal(int sig, siginfo_t *info,
/* 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 @@ handle_signal(int sig, siginfo_t *info,
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 */