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)®s->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);
+ }
+}