Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/mipsco/obio Glue functions for KGDB support
details: https://anonhg.NetBSD.org/src/rev/5fb5666e27c1
branches: trunk
changeset: 504074:5fb5666e27c1
user: wdk <wdk%NetBSD.org@localhost>
date: Wed Feb 21 09:08:35 2001 +0000
description:
Glue functions for KGDB support
diffstat:
sys/arch/mipsco/obio/zs_kgdb.c | 277 +++++++++++++++++++++++++++++++++++++++++
1 files changed, 277 insertions(+), 0 deletions(-)
diffs (281 lines):
diff -r dd3b0571cf72 -r 5fb5666e27c1 sys/arch/mipsco/obio/zs_kgdb.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/arch/mipsco/obio/zs_kgdb.c Wed Feb 21 09:08:35 2001 +0000
@@ -0,0 +1,277 @@
+/* $NetBSD: zs_kgdb.c,v 1.1 2001/02/21 09:08:35 wdk Exp $ */
+
+/*-
+ * Copyright (c) 1996 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Gordon W. Ross and Wayne Knowles.
+ *
+ * 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.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the NetBSD
+ * Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * 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.
+ */
+
+/*
+ * Hooks for kgdb when attached via the z8530 driver
+ *
+ * To use this, build a kernel with: option KGDB, and
+ * boot that kernel with "-d". (The kernel will call
+ * zs_kgdb_init, kgdb_connect.) When the console prints
+ * "kgdb waiting..." you run "gdb -k kernel" and do:
+ * (gdb) set remotebaud 19200
+ * (gdb) target remote /dev/ttyb
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/proc.h>
+#include <sys/device.h>
+#include <sys/conf.h>
+#include <sys/ioctl.h>
+#include <sys/kernel.h>
+#include <sys/syslog.h>
+#include <sys/kgdb.h>
+
+#include <dev/ic/z8530reg.h>
+#include <machine/z8530var.h>
+
+/*
+ * Hooks for kgdb when attached via the z8530 driver
+ *
+ * To use this, build a kernel with: option KGDB, and
+ * boot that kernel with "-d". (The kernel will call
+ * zs_kgdb_init, kgdb_connect.) When the console prints
+ * "kgdb waiting..." you run "gdb -k kernel" and do:
+ * (gdb) set remotebaud 19200
+ * (gdb) target remote /dev/ttyb
+ */
+
+void zs_kgdb_init __P((void));
+void zskgdb __P((struct zs_chanstate *cs));
+
+static void zs_setparam __P((struct zs_chanstate *, int, int));
+static struct zsops zsops_kgdb;
+
+extern struct zschan *zs_get_chan_addr (int zs_unit, int channel);
+extern int zs_getc __P((void *arg));
+extern void zs_putc __P((void *arg, int c));
+
+static u_char zs_kgdb_regs[16] = {
+ 0, /* 0: CMD (reset, etc.) */
+ 0, /* 1: No interrupts yet. */
+ 0, /* 2: IVECT */
+ ZSWR3_RX_8 | ZSWR3_RX_ENABLE,
+ ZSWR4_CLK_X16 | ZSWR4_ONESB | ZSWR4_EVENP,
+ ZSWR5_TX_8 | ZSWR5_TX_ENABLE,
+ 0, /* 6: TXSYNC/SYNCLO */
+ 0, /* 7: RXSYNC/SYNCHI */
+ 0, /* 8: alias for data port */
+ ZSWR9_MASTER_IE | ZSWR9_NO_VECTOR,
+ 0, /*10: Misc. TX/RX control bits */
+ ZSWR11_TXCLK_BAUD | ZSWR11_RXCLK_BAUD,
+ 14, /*12: BAUDLO (default=9600) */
+ 0, /*13: BAUDHI (default=9600) */
+ ZSWR14_BAUD_ENA | ZSWR14_BAUD_FROM_PCLK,
+ ZSWR15_BREAK_IE,
+};
+
+static void
+zs_setparam(cs, iena, rate)
+ struct zs_chanstate *cs;
+ int iena;
+ int rate;
+{
+ int s, tconst;
+
+ bcopy(zs_kgdb_regs, cs->cs_preg, 16);
+
+ if (iena) {
+ cs->cs_preg[1] = ZSWR1_RIE | ZSWR1_SIE;
+ }
+
+ /* Initialize the speed, etc. */
+ tconst = BPS_TO_TCONST(cs->cs_brg_clk, rate);
+
+ cs->cs_preg[5] |= ZSWR5_DTR | ZSWR5_RTS;
+ cs->cs_preg[12] = tconst;
+ cs->cs_preg[13] = tconst >> 8;
+
+ s = splhigh();
+ zs_loadchannelregs(cs);
+ splx(s);
+}
+
+/*
+ * Set up for kgdb; called at boot time before configuration.
+ * KGDB interrupts will be enabled later when zs0 is configured.
+ * Called after cninit(), so printf() etc. works.
+ */
+void
+zs_kgdb_init()
+{
+ volatile struct zschan *zc;
+ int channel, unit;
+
+ if (major(kgdb_dev) != zs_major)
+ return;
+
+ unit = (kgdb_dev & 2) ? 2 : 0;
+ channel = kgdb_dev & 1;
+ printf("zs_kgdb_init: attaching serial%d at %d baud\n",
+ (kgdb_dev & 3), kgdb_rate);
+
+ zc = zs_get_chan_addr(unit, channel);
+
+ /* Attach KGDB comms functions to this device */
+ kgdb_attach(zs_getc, zs_putc, (void *)zc);
+}
+
+/*
+ * This is a "hook" called by the MI zstty_attach driver
+ * to allow the tty to be "taken over" for exclusive use by kgdb.
+ * Return non-zero if this is the kgdb port.
+ *
+ * Set the speed to kgdb_rate, CS8, etc.
+ */
+int
+zs_check_kgdb(cs, dev)
+ struct zs_chanstate *cs;
+ int dev;
+{
+
+ if (dev != kgdb_dev)
+ return (0);
+
+ /*
+ * Yes, this is port in use by kgdb.
+ */
+ cs->cs_private = NULL;
+ cs->cs_ops = &zsops_kgdb;
+
+ /* Now set parameters. (interrupts enabled) */
+ zs_setparam(cs, 1, kgdb_rate);
+
+ return (1);
+}
+
+/*
+ * KGDB framing character received: enter kernel debugger. This probably
+ * should time out after a few seconds to avoid hanging on spurious input.
+ */
+void
+zskgdb(cs)
+ struct zs_chanstate *cs;
+{
+ int unit = minor(kgdb_dev);
+
+ printf("zstty%d: kgdb interrupt\n", unit);
+ /* This will trap into the debugger. */
+ kgdb_connect(1);
+}
+
+
+/****************************************************************
+ * Interface to the lower layer (zscc)
+ ****************************************************************/
+
+static void zs_kgdb_rxint __P((struct zs_chanstate *));
+static void zs_kgdb_stint __P((struct zs_chanstate *, int));
+static void zs_kgdb_txint __P((struct zs_chanstate *));
+static void zs_kgdb_softint __P((struct zs_chanstate *));
+
+static struct zsops zsops_kgdb = {
+ zs_kgdb_rxint, /* receive char available */
+ zs_kgdb_stint, /* external/status */
+ zs_kgdb_txint, /* xmit buffer empty */
+ zs_kgdb_softint, /* process software interrupt */
+};
+
+int kgdb_input_lost;
+
+static void
+zs_kgdb_rxint(cs)
+ struct zs_chanstate *cs;
+{
+ register u_char c, rr1;
+
+ /*
+ * First read the status, because reading the received char
+ * destroys the status of this char.
+ */
+ rr1 = zs_read_reg(cs, 1);
+ c = zs_read_data(cs);
+
+ if (rr1 & (ZSRR1_FE | ZSRR1_DO | ZSRR1_PE)) {
+ /* Clear the receive error. */
+ zs_write_csr(cs, ZSWR0_RESET_ERRORS);
+ }
+
+ if (c == KGDB_START) {
+ zskgdb(cs);
+ } else {
+ kgdb_input_lost++;
+ }
+}
+
+static void
+zs_kgdb_txint(cs)
+ register struct zs_chanstate *cs;
+{
+ register int rr0;
+
+ rr0 = zs_read_csr(cs);
+ zs_write_csr(cs, ZSWR0_RESET_TXINT);
+}
+
+static void
+zs_kgdb_stint(cs, force)
+ register struct zs_chanstate *cs;
+ int force;
+{
+ register int rr0;
+
+ rr0 = zs_read_csr(cs);
+ zs_write_csr(cs, ZSWR0_RESET_STATUS);
+
+ /*
+ * Check here for console break, so that we can abort
+ * even when interrupts are locking up the machine.
+ */
+ if (rr0 & ZSRR0_BREAK) {
+ zskgdb(cs);
+ }
+}
+
+static void
+zs_kgdb_softint(cs)
+ struct zs_chanstate *cs;
+{
+ printf("zs_kgdb_softint?\n");
+}
+
+
Home |
Main Index |
Thread Index |
Old Index