Module Name:    src
Committed By:   maxv
Date:           Tue Aug 15 08:51:38 UTC 2017

Modified Files:
        src/sys/arch/amd64/conf: files.amd64
        src/sys/arch/i386/conf: files.i386
        src/sys/arch/x86/conf: files.x86
        src/sys/arch/xen/conf: files.xen
Added Files:
        src/sys/arch/x86/x86: kgdb_machdep.c
Removed Files:
        src/sys/arch/amd64/amd64: kgdb_machdep.c
        src/sys/arch/i386/i386: kgdb_machdep.c

Log Message:
Merge into x86/.


To generate a diff of this commit:
cvs rdiff -u -r1.11 -r0 src/sys/arch/amd64/amd64/kgdb_machdep.c
cvs rdiff -u -r1.91 -r1.92 src/sys/arch/amd64/conf/files.amd64
cvs rdiff -u -r1.386 -r1.387 src/sys/arch/i386/conf/files.i386
cvs rdiff -u -r1.23 -r0 src/sys/arch/i386/i386/kgdb_machdep.c
cvs rdiff -u -r1.89 -r1.90 src/sys/arch/x86/conf/files.x86
cvs rdiff -u -r0 -r1.1 src/sys/arch/x86/x86/kgdb_machdep.c
cvs rdiff -u -r1.155 -r1.156 src/sys/arch/xen/conf/files.xen

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/amd64/conf/files.amd64
diff -u src/sys/arch/amd64/conf/files.amd64:1.91 src/sys/arch/amd64/conf/files.amd64:1.92
--- src/sys/arch/amd64/conf/files.amd64:1.91	Tue Aug 15 06:27:40 2017
+++ src/sys/arch/amd64/conf/files.amd64	Tue Aug 15 08:51:38 2017
@@ -1,4 +1,4 @@
-#	$NetBSD: files.amd64,v 1.91 2017/08/15 06:27:40 maxv Exp $
+#	$NetBSD: files.amd64,v 1.92 2017/08/15 08:51:38 maxv Exp $
 #
 # new style config file for amd64 architecture
 #
@@ -43,7 +43,6 @@ file	arch/amd64/amd64/db_disasm.c		ddb
 file	arch/amd64/amd64/db_interface.c		ddb
 file	arch/amd64/amd64/db_machdep.c		ddb
 file	arch/amd64/amd64/kobj_machdep.c		modular
-file	arch/amd64/amd64/kgdb_machdep.c		kgdb
 file	kern/subr_disk_mbr.c			disk
 file	arch/amd64/amd64/gdt.c			machdep
 file	arch/amd64/amd64/machdep.c		machdep

Index: src/sys/arch/i386/conf/files.i386
diff -u src/sys/arch/i386/conf/files.i386:1.386 src/sys/arch/i386/conf/files.i386:1.387
--- src/sys/arch/i386/conf/files.i386:1.386	Tue Aug 15 06:27:40 2017
+++ src/sys/arch/i386/conf/files.i386	Tue Aug 15 08:51:38 2017
@@ -1,4 +1,4 @@
-#	$NetBSD: files.i386,v 1.386 2017/08/15 06:27:40 maxv Exp $
+#	$NetBSD: files.i386,v 1.387 2017/08/15 08:51:38 maxv Exp $
 #
 # new style config file for i386 architecture
 #
@@ -65,7 +65,6 @@ file	kern/subr_spldebug.c		spldebug
 file	arch/i386/i386/gdt.c
 file	arch/i386/i386/i386func.S
 file	arch/i386/i386/ipkdb_glue.c	ipkdb
-file	arch/i386/i386/kgdb_machdep.c	kgdb
 file	arch/i386/i386/kobj_machdep.c	modular
 file	arch/i386/i386/machdep.c
 file 	arch/i386/i386/longrun.c

Index: src/sys/arch/x86/conf/files.x86
diff -u src/sys/arch/x86/conf/files.x86:1.89 src/sys/arch/x86/conf/files.x86:1.90
--- src/sys/arch/x86/conf/files.x86:1.89	Tue Aug 15 06:27:40 2017
+++ src/sys/arch/x86/conf/files.x86	Tue Aug 15 08:51:38 2017
@@ -1,4 +1,4 @@
-#	$NetBSD: files.x86,v 1.89 2017/08/15 06:27:40 maxv Exp $
+#	$NetBSD: files.x86,v 1.90 2017/08/15 08:51:38 maxv Exp $
 
 # options for MP configuration through the MP spec
 defflag opt_mpbios.h MPBIOS MPVERBOSE MPDEBUG MPBIOS_SCANPCI
@@ -84,6 +84,7 @@ file	arch/x86/x86/genfb_machdep.c	machde
 file	arch/x86/x86/identcpu.c		machdep
 file	arch/x86/x86/i8259.c		machdep
 file	arch/x86/x86/intr.c		machdep
+file	arch/x86/x86/kgdb_machdep.c	kgdb
 file	arch/x86/x86/nmi.c		machdep
 file	arch/x86/x86/idt.c		machdep
 file	arch/x86/x86/ipi.c		machdep

Index: src/sys/arch/xen/conf/files.xen
diff -u src/sys/arch/xen/conf/files.xen:1.155 src/sys/arch/xen/conf/files.xen:1.156
--- src/sys/arch/xen/conf/files.xen:1.155	Tue Aug 15 06:27:39 2017
+++ src/sys/arch/xen/conf/files.xen	Tue Aug 15 08:51:38 2017
@@ -1,4 +1,4 @@
-#	$NetBSD: files.xen,v 1.155 2017/08/15 06:27:39 maxv Exp $
+#	$NetBSD: files.xen,v 1.156 2017/08/15 08:51:38 maxv Exp $
 #	NetBSD: files.x86,v 1.10 2003/10/08 17:30:00 bouyer Exp 
 #	NetBSD: files.i386,v 1.254 2004/03/25 23:32:10 jmc Exp 
 
@@ -45,7 +45,6 @@ file	arch/i386/i386/db_machdep.c	ddb
 file	arch/i386/i386/dumpsys.c
 file	arch/i386/i386/gdt.c
 file	arch/i386/i386/ipkdb_glue.c	ipkdb
-file	arch/i386/i386/kgdb_machdep.c	kgdb
 file	arch/i386/i386/kobj_machdep.c	modular
 file	arch/i386/i386/machdep.c
 file	arch/i386/i386/longrun.c
@@ -67,7 +66,6 @@ file	arch/amd64/amd64/cpu_in_cksum.S		(i
 file	arch/amd64/amd64/db_disasm.c		ddb
 file	arch/amd64/amd64/db_interface.c		ddb
 file	arch/amd64/amd64/db_machdep.c		ddb
-file	arch/amd64/amd64/kgdb_machdep.c	 kgdb
 file	arch/amd64/amd64/kobj_machdep.c	 	modular
 file	arch/amd64/amd64/gdt.c
 file	arch/amd64/amd64/machdep.c
@@ -84,6 +82,7 @@ file	arch/x86/x86/db_trace.c		ddb
 file	arch/x86/x86/fpu.c
 file	arch/x86/x86/dbregs.c
 file	arch/xen/x86/hypervisor_machdep.c
+file	arch/x86/x86/kgdb_machdep.c	kgdb
 # file 	arch/x86/x86/mtrr_i686.c	mtrr
 file	arch/x86/x86/syscall.c
 file	arch/xen/x86/x86_xpmap.c

Added files:

Index: src/sys/arch/x86/x86/kgdb_machdep.c
diff -u /dev/null src/sys/arch/x86/x86/kgdb_machdep.c:1.1
--- /dev/null	Tue Aug 15 08:51:39 2017
+++ src/sys/arch/x86/x86/kgdb_machdep.c	Tue Aug 15 08:51:38 2017
@@ -0,0 +1,295 @@
+/*	$NetBSD: kgdb_machdep.c,v 1.1 2017/08/15 08:51:38 maxv Exp $	*/
+
+/*-
+ * Copyright (c) 1997 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
+ * NASA Ames Research Center.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * Copyright (c) 1996 Matthias Pfaller.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: kgdb_machdep.c,v 1.1 2017/08/15 08:51:38 maxv Exp $");
+
+#include "opt_ddb.h"
+
+/*
+ * Machine-dependent functions for remote KGDB.  Originally written
+ * for NetBSD/pc532 by Matthias Pfaller.  Modified for NetBSD/i386
+ * by Jason R. Thorpe. Modified for NetBSD/amd64 by Frank van der Linden.
+ */
+
+#include <sys/param.h>
+#include <sys/kgdb.h>
+#include <sys/systm.h>
+
+#include <machine/pte.h>
+#include <machine/trap.h>
+
+/*
+ * Determine if the memory at va..(va+len) is valid.
+ */
+int
+kgdb_acc(vaddr_t va, size_t len)
+{
+	vaddr_t last_va;
+	pt_entry_t *pte;
+
+	last_va = va + len;
+	va  &= ~PGOFSET;
+	last_va &= ~PGOFSET;
+
+	do {
+		if (va < VM_MIN_KERNEL_ADDRESS)
+			pte = vtopte(va);
+		else
+			pte = kvtopte(va);
+		if ((*pte & PG_V) == 0)
+			return (0);
+		if (*pte & PG_PS)
+			va = (va & PG_LGFRAME) + NBPD_L2;
+		else
+			va += PAGE_SIZE;
+	} while (va < last_va);
+
+	return (1);
+}
+
+void
+kgdb_entry_notice(int type, db_regs_t *regs)
+{
+	if (type == T_NMI)
+		printf("NMI ... going to debugger\n");
+}
+
+/*
+ * Translate a trap number into a unix compatible signal value.
+ * (gdb only understands unix signal numbers).
+ */
+int
+kgdb_signal(int type)
+{
+	switch (type) {
+	case T_NMI:
+		return (SIGINT);
+
+	case T_ALIGNFLT:
+		return (SIGILL);
+
+	case T_BPTFLT:
+	case T_TRCTRAP:
+		return (SIGTRAP);
+
+	case T_ASTFLT:
+	case T_DOUBLEFLT:
+		return (SIGEMT);
+
+	case T_ARITHTRAP:
+	case T_DIVIDE:
+	case T_OFLOW:
+	case T_DNA:
+	case T_FPOPFLT:
+		return (SIGFPE);
+
+	case T_PRIVINFLT:
+	case T_PROTFLT:
+	case T_PAGEFLT:
+	case T_TSSFLT:
+	case T_SEGNPFLT:
+	case T_STKFLT:
+		return (SIGSEGV);
+
+	case T_BOUND:
+		return (SIGURG);
+
+	default:
+		return (SIGEMT);
+	}
+}
+
+/*
+ * Translate the values stored in the kernel regs struct to the format
+ * understood by gdb.
+ */
+void
+kgdb_getregs(db_regs_t *regs, kgdb_reg_t *gdb_regs)
+{
+#ifdef __x86_64__
+	gdb_regs[ 0] = regs->tf_rax;
+	gdb_regs[ 1] = regs->tf_rbx;
+	gdb_regs[ 2] = regs->tf_rcx;
+	gdb_regs[ 3] = regs->tf_rdx;
+	gdb_regs[ 4] = regs->tf_rsi;
+	gdb_regs[ 5] = regs->tf_rdi;
+	gdb_regs[ 6] = regs->tf_rbp;
+	gdb_regs[ 7] = regs->tf_rsp;
+	gdb_regs[ 8] = regs->tf_r8;
+	gdb_regs[ 9] = regs->tf_r9;
+	gdb_regs[10] = regs->tf_r10;
+	gdb_regs[11] = regs->tf_r11;
+	gdb_regs[12] = regs->tf_r12;
+	gdb_regs[13] = regs->tf_r13;
+	gdb_regs[14] = regs->tf_r14;
+	gdb_regs[15] = regs->tf_r15;
+	gdb_regs[16] = regs->tf_rip;
+	gdb_regs[17] = regs->tf_rflags;
+	gdb_regs[18] = regs->tf_cs;
+	gdb_regs[19] = regs->tf_ss;
+#else
+	gdb_regs[ 0] = regs->tf_eax;
+	gdb_regs[ 1] = regs->tf_ecx;
+	gdb_regs[ 2] = regs->tf_edx;
+	gdb_regs[ 3] = regs->tf_ebx;
+	gdb_regs[ 5] = regs->tf_ebp;
+	gdb_regs[ 6] = regs->tf_esi;
+	gdb_regs[ 7] = regs->tf_edi;
+	gdb_regs[ 8] = regs->tf_eip;
+	gdb_regs[ 9] = regs->tf_eflags;
+	gdb_regs[10] = regs->tf_cs;
+	gdb_regs[12] = regs->tf_ds;
+	gdb_regs[13] = regs->tf_es;
+	gdb_regs[14] = regs->tf_fs;
+	gdb_regs[15] = regs->tf_gs;
+
+	if (KERNELMODE(regs->tf_cs, regs->tf_eflags)) {
+		/*
+		 * Kernel mode - esp and ss not saved.
+		 */
+		gdb_regs[ 4] = (kgdb_reg_t)&regs->tf_esp; /* kernel stack
+							     pointer */
+		gdb_regs[11] = x86_getss();
+	}
+#endif
+}
+
+/*
+ * Reverse the above.
+ */
+void
+kgdb_setregs(db_regs_t *regs, kgdb_reg_t *gdb_regs)
+{
+#ifdef __x86_64__
+	regs->tf_rax = gdb_regs[ 0];
+	regs->tf_rbx = gdb_regs[ 1];
+	regs->tf_rcx = gdb_regs[ 2];
+	regs->tf_rdx = gdb_regs[ 3];
+	regs->tf_rsi = gdb_regs[ 4];
+	regs->tf_rdi = gdb_regs[ 5];
+	regs->tf_rbp = gdb_regs[ 6];
+	regs->tf_rsp = gdb_regs[ 7];
+	regs->tf_r8  = gdb_regs[ 8];
+	regs->tf_r9  = gdb_regs[ 9];
+	regs->tf_r10 = gdb_regs[10];
+	regs->tf_r11 = gdb_regs[11];
+	regs->tf_r12 = gdb_regs[12];
+	regs->tf_r13 = gdb_regs[13];
+	regs->tf_r14 = gdb_regs[14];
+	regs->tf_r15 = gdb_regs[15];
+	regs->tf_rip = gdb_regs[16];
+	regs->tf_rflags = gdb_regs[17];
+	regs->tf_cs  = gdb_regs[18];
+	regs->tf_ss  = gdb_regs[19];
+#else
+	regs->tf_eax    = gdb_regs[ 0];
+	regs->tf_ecx    = gdb_regs[ 1];
+	regs->tf_edx    = gdb_regs[ 2];
+	regs->tf_ebx    = gdb_regs[ 3];
+	regs->tf_ebp    = gdb_regs[ 5];
+	regs->tf_esi    = gdb_regs[ 6];
+	regs->tf_edi    = gdb_regs[ 7];
+	regs->tf_eip    = gdb_regs[ 8];
+	regs->tf_eflags = gdb_regs[ 9];
+	regs->tf_cs     = gdb_regs[10];
+	regs->tf_ds     = gdb_regs[12];
+	regs->tf_es     = gdb_regs[13];
+
+	if (KERNELMODE(regs->tf_cs, regs->tf_eflags) == 0) {
+		/*
+		 * Trapped in user mode - restore esp and ss.
+		 */
+		regs->tf_esp = gdb_regs[ 4];
+		regs->tf_ss  = gdb_regs[11];
+	}
+#endif
+}
+
+/*
+ * Trap into kgdb to wait for debugger to connect,
+ * noting on the console why nothing else is going on.
+ */
+void
+kgdb_connect(int verbose)
+{
+	if (kgdb_dev == NODEV)
+		return;
+
+	if (verbose)
+		printf("kgdb waiting...");
+
+	breakpoint();
+
+	if (verbose)
+		printf("connected.\n");
+
+	kgdb_debug_panic = 1;
+}
+
+/*
+ * Decide what to do on panic.
+ * (This is called by panic, like Debugger())
+ */
+void
+kgdb_panic(void)
+{
+	if (kgdb_dev != NODEV && kgdb_debug_panic) {
+		printf("entering kgdb\n");
+		kgdb_connect(kgdb_active == 0);
+	}
+}

Reply via email to