summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/arch/sun3/conf/DISKLESS43
-rw-r--r--sys/arch/sun3/conf/FOUR_TTYS32
-rw-r--r--sys/arch/sun3/conf/GENERIC48
-rw-r--r--sys/arch/sun3/conf/GENERIC_KGDB171
-rw-r--r--sys/arch/sun3/conf/Makefile.sun32
-rw-r--r--sys/arch/sun3/conf/RAMDISK33
-rw-r--r--sys/arch/sun3/conf/SMD_TEST46
-rw-r--r--sys/arch/sun3/conf/files.sun34
-rw-r--r--sys/arch/sun3/conf/std.sun39
-rw-r--r--sys/arch/sun3/dev/cg4.c6
-rw-r--r--sys/arch/sun3/dev/if_ie.c46
-rw-r--r--sys/arch/sun3/dev/if_le.c74
-rw-r--r--sys/arch/sun3/dev/if_levar.h33
-rw-r--r--sys/arch/sun3/dev/kd.c10
-rw-r--r--sys/arch/sun3/dev/si.c28
-rw-r--r--sys/arch/sun3/dev/si_obio.c156
-rw-r--r--sys/arch/sun3/dev/si_vme.c119
-rw-r--r--sys/arch/sun3/dev/xd.c6
-rw-r--r--sys/arch/sun3/dev/xy.c9
-rw-r--r--sys/arch/sun3/dev/zs.c39
-rw-r--r--sys/arch/sun3/dev/zs_kgdb.c42
-rw-r--r--sys/arch/sun3/include/autoconf.h4
-rw-r--r--sys/arch/sun3/include/exec.h7
-rw-r--r--sys/arch/sun3/include/kcore.h47
-rw-r--r--sys/arch/sun3/include/param.h6
-rw-r--r--sys/arch/sun3/include/pcb.h6
-rw-r--r--sys/arch/sun3/include/pte.h4
-rw-r--r--sys/arch/sun3/include/remote-sl.h68
-rw-r--r--sys/arch/sun3/stand/installboot/installboot.82
-rw-r--r--sys/arch/sun3/stand/libsa/Makefile4
-rw-r--r--sys/arch/sun3/stand/libsa/dev_disk.c40
-rw-r--r--sys/arch/sun3/stand/libsa/exec_sun.c12
-rw-r--r--sys/arch/sun3/stand/libsa/netif_sun.c2
-rw-r--r--sys/arch/sun3/stand/libsa/panic.c8
-rw-r--r--sys/arch/sun3/stand/libsa/promdev.c10
-rw-r--r--sys/arch/sun3/stand/netboot/dev_net.c4
-rw-r--r--sys/arch/sun3/stand/netboot/version.c2
-rw-r--r--sys/arch/sun3/stand/ufsboot/version.c2
-rw-r--r--sys/arch/sun3/sun3/conf.c4
-rw-r--r--sys/arch/sun3/sun3/db_memrw.c6
-rw-r--r--sys/arch/sun3/sun3/disksubr.c5
-rw-r--r--sys/arch/sun3/sun3/kgdb_proto.h74
-rw-r--r--sys/arch/sun3/sun3/kgdb_stub.c623
-rw-r--r--sys/arch/sun3/sun3/locore.s49
-rw-r--r--sys/arch/sun3/sun3/pmap.c51
-rw-r--r--sys/arch/sun3/sun3/stub.c19
-rw-r--r--sys/arch/sun3/sun3/sun3_startup.c77
-rw-r--r--sys/arch/sun3/sun3/trap.c58
48 files changed, 1621 insertions, 529 deletions
diff --git a/sys/arch/sun3/conf/DISKLESS b/sys/arch/sun3/conf/DISKLESS
index 4a8592cb886..48e021de254 100644
--- a/sys/arch/sun3/conf/DISKLESS
+++ b/sys/arch/sun3/conf/DISKLESS
@@ -1,4 +1,4 @@
-# $NetBSD: DISKLESS,v 1.12 1996/03/26 15:15:46 gwr Exp $
+# $NetBSD: DISKLESS,v 1.12.4.1 1996/08/19 23:35:03 gwr Exp $
#
# DISKLESS Sun3 (3/50, 3/60, 3/110, 3/160, 3/260)
@@ -16,33 +16,37 @@ options HAVECACHE # Sun3/260 VAC
maxusers 4
# Standard system options
-options SWAPPAGER, DEVPAGER # paging
-options KTRACE # system call tracing support
-#makeoptions DEBUG="-g" # symbols for kgdb + nm
+options SWAPPAGER, VNODEPAGER, DEVPAGER # paging
+options KTRACE # system call tracing support
+
+# Debugging options. Uncomment either this:
#options DDB
+# ... or these two: (for KGDB on another machine)
+makeoptions DEBUG="-g" # symbols for kgdb + nm
+options KGDB
# Filesystem options
-options NFSCLIENT # nfs client support
+options NFSCLIENT # nfs client support
#
options FDESC # /dev/fd/*
-options FIFO # FIFOs; RECOMMENDED
-options KERNFS # /kern
-options NULLFS # loopback file system
-#options PROCFS # /proc
-#options UNION # union file system
+options FIFO # FIFOs; RECOMMENDED
+options KERNFS # /kern
+options NULLFS # loopback file system
+options PROCFS # /proc
# Networking options
-options INET # IP prototol stack support
+options INET # IP prototol stack support
+#options GATEWAY # IP packet forwarding
+options TCP_COMPAT_42 # TCP bug compatibility with 4.2BSD
# XXX - Work-around for root on slow SunOS/Sun3 servers (sigh...)
options NFS_BOOT_RWSIZE=1024
# Compatability options
options COMPAT_SUNOS # can run SunOS 4.1.1 executables
-#options COMPAT_09 # NetBSD 0.9,
-options COMPAT_10 # NetBSD 1.0,
-options COMPAT_11 # NetBSD 1.1,
-options COMPAT_43 # and 4.3BSD
-#options TCP_COMPAT_42 # TCP bug compatibility with 4.2BSD
+options COMPAT_43 # and 4.3BSD and ...
+options COMPAT_10 # NetBSD 1.0
+options COMPAT_11 # NetBSD 1.1
+options COMPAT_12 # NetBSD 1.2
options UCONSOLE # Allow non-root TIOCCONS
# Sun3-specific debugging options
@@ -52,7 +56,7 @@ options UCONSOLE # Allow non-root TIOCCONS
#options EXEC_DEBUG
#options DIAGNOSTIC
-config bsd root on nfs swap on nfs
+config netbsd root on nfs swap on nfs
#
# Serial ports
@@ -106,10 +110,5 @@ cgtwo0 at vmes0 addr 0xff400000 level 4 vect 0xA8
# Misc.
pseudo-device loop 1 # network loopback
-#pseudo-device bpfilter 8 # packet filter
-#pseudo-device sl 2 # CSLIP
-#pseudo-device ppp 2 # PPP
-#pseudo-device tun 2 # network tunneling over tty
pseudo-device pty 32 # pseudo-terminals
-#pseudo-device vnd 4 # paging to files
diff --git a/sys/arch/sun3/conf/FOUR_TTYS b/sys/arch/sun3/conf/FOUR_TTYS
index bb5ea510136..456110d4862 100644
--- a/sys/arch/sun3/conf/FOUR_TTYS
+++ b/sys/arch/sun3/conf/FOUR_TTYS
@@ -1,4 +1,4 @@
-# $NetBSD: FOUR_TTYS,v 1.1 1996/03/26 15:14:27 gwr Exp $
+# $NetBSD: FOUR_TTYS,v 1.1.4.1 1996/08/19 23:35:05 gwr Exp $
#
# FOUR_TTYS Sun3 (3/50, 3/60, 3/110, 3/160, 3/260)
@@ -16,15 +16,19 @@ options HAVECACHE # Sun3/260 VAC
maxusers 4
# Standard system options
-options SWAPPAGER, DEVPAGER # paging
+options SWAPPAGER, VNODEPAGER, DEVPAGER # paging
options KTRACE # system call tracing support
-#makeoptions DEBUG="-g" # symbols for kgdb + nm
+
+# Debugging options. Uncomment either this:
options DDB
+# ... or these two: (for KGDB on another machine)
+#makeoptions DEBUG="-g" # symbols for kgdb + nm
+#options KGDB
# Filesystem options
-options NFSSERVER # nfs server support
-options NFSCLIENT # nfs client support
-options FFS # ufs file system
+options NFSSERVER # nfs server support
+options NFSCLIENT # nfs client support
+options FFS # ufs file system
#
options CD9660 # ISO 9660 + Rock Ridge file system
options FDESC # /dev/fd/*
@@ -33,19 +37,21 @@ options KERNFS # /kern
options NULLFS # loopback file system
options PROCFS # /proc
options UNION # union file system
+options MFS # memory-based filesystem
# Networking options
-options INET # IP prototol stack support
+options INET # IP prototol stack support
+#options GATEWAY # IP packet forwarding
+options TCP_COMPAT_42 # TCP bug compatibility with 4.2BSD
# XXX - Work-around for root on slow SunOS/Sun3 servers (sigh...)
options NFS_BOOT_RWSIZE=1024
# Compatability options
options COMPAT_SUNOS # can run SunOS 4.1.1 executables
-#options COMPAT_09 # NetBSD 0.9,
-options COMPAT_10 # NetBSD 1.0,
-options COMPAT_11 # NetBSD 1.1,
-options COMPAT_43 # and 4.3BSD
-#options TCP_COMPAT_42 # TCP bug compatibility with 4.2BSD
+options COMPAT_43 # and 4.3BSD and ...
+options COMPAT_10 # NetBSD 1.0
+options COMPAT_11 # NetBSD 1.1
+options COMPAT_12 # NetBSD 1.2
options UCONSOLE # Allow non-root TIOCCONS
# Sun3-specific debugging options
@@ -56,7 +62,7 @@ options PMAP_DEBUG
options DIAGNOSTIC
#options SCSIDEBUG
-config bsd swap generic
+config netbsd swap generic
#
# Serial ports
diff --git a/sys/arch/sun3/conf/GENERIC b/sys/arch/sun3/conf/GENERIC
index c74494aaa6e..e14fe023624 100644
--- a/sys/arch/sun3/conf/GENERIC
+++ b/sys/arch/sun3/conf/GENERIC
@@ -1,4 +1,4 @@
-# $NetBSD: GENERIC,v 1.27 1996/03/26 15:15:50 gwr Exp $
+# $NetBSD: GENERIC,v 1.27.4.1 1996/08/19 23:35:06 gwr Exp $
#
# GENERIC Sun3 (3/50, 3/60, 3/110, 3/160, 3/260)
@@ -8,7 +8,7 @@
include "std.sun3"
# Machines to be supported by this kernel
-options GENERIC
+options GENERIC
options FPU_EMULATE
options HAVECACHE # Sun3/260 VAC
@@ -16,36 +16,42 @@ options HAVECACHE # Sun3/260 VAC
maxusers 4
# Standard system options
-options SWAPPAGER, DEVPAGER # paging
-options KTRACE # system call tracing support
-#makeoptions DEBUG="-g" # symbols for kgdb + nm
+options SWAPPAGER, VNODEPAGER, DEVPAGER # paging
+options KTRACE # system call tracing support
+
+# Debugging options. Uncomment either this:
options DDB
+# ... or these two: (for KGDB on another machine)
+#makeoptions DEBUG="-g" # symbols for kgdb + nm
+#options KGDB
# Filesystem options
-options NFSSERVER # nfs server support
-options NFSCLIENT # nfs client support
-options FFS # ufs file system
+options NFSSERVER # nfs server support
+options NFSCLIENT # nfs client support
+options FFS # ufs file system
#
-options CD9660 # ISO 9660 + Rock Ridge file system
+options CD9660 # ISO 9660 + Rock Ridge file system
options FDESC # /dev/fd/*
-options FIFO # FIFOs; RECOMMENDED
-options KERNFS # /kern
-options NULLFS # loopback file system
+options FIFO # FIFOs; RECOMMENDED
+options KERNFS # /kern
+options NULLFS # loopback file system
options PROCFS # /proc
options UNION # union file system
+options MFS # memory-based filesystem
# Networking options
-options INET # IP prototol stack support
+options INET # IP prototol stack support
+#options GATEWAY # IP packet forwarding
+options TCP_COMPAT_42 # TCP bug compatibility with 4.2BSD
# XXX - Work-around for root on slow SunOS/Sun3 servers (sigh...)
options NFS_BOOT_RWSIZE=1024
# Compatability options
options COMPAT_SUNOS # can run SunOS 4.1.1 executables
-#options COMPAT_09 # NetBSD 0.9,
-options COMPAT_10 # NetBSD 1.0,
-options COMPAT_11 # NetBSD 1.1,
-options COMPAT_43 # and 4.3BSD
-#options TCP_COMPAT_42 # TCP bug compatibility with 4.2BSD
+options COMPAT_43 # and 4.3BSD and ...
+options COMPAT_10 # NetBSD 1.0
+options COMPAT_11 # NetBSD 1.1
+options COMPAT_12 # NetBSD 1.2
options UCONSOLE # Allow non-root TIOCCONS
# Sun3-specific debugging options
@@ -56,7 +62,7 @@ options PMAP_DEBUG
options DIAGNOSTIC
#options SCSIDEBUG
-config bsd swap generic
+config netbsd swap generic
#
# Serial ports
@@ -148,9 +154,7 @@ st* at scsibus? target ? lun ?
cd0 at scsibus? target 6 lun 0
cd* at scsibus? target ? lun ?
-ch* at scsibus? target ? lun ?
-ss* at scsibus? target ? lun ?
-uk* at scsibus? target ? lun ?
+#ch* at scsibus? target ? lun ?
# RAM-disk drivers
pseudo-device rd 2
diff --git a/sys/arch/sun3/conf/GENERIC_KGDB b/sys/arch/sun3/conf/GENERIC_KGDB
new file mode 100644
index 00000000000..e083844dc4a
--- /dev/null
+++ b/sys/arch/sun3/conf/GENERIC_KGDB
@@ -0,0 +1,171 @@
+# $NetBSD: GENERIC_KGDB,v 1.1.2.1 1996/08/19 23:35:07 gwr Exp $
+
+#
+# GENERIC_KGDB Sun3 (3/50, 3/60, 3/110, 3/160, 3/260)
+# like GENERIC but supports KGDB (gdb -k on other machine)
+#
+
+include "std.sun3"
+
+# Machines to be supported by this kernel
+options GENERIC
+options FPU_EMULATE
+options HAVECACHE # Sun3/260 VAC
+
+# Needs to be set per system. i.e change these as you see fit
+maxusers 4
+
+# Standard system options
+options SWAPPAGER, VNODEPAGER, DEVPAGER # paging
+options KTRACE # system call tracing support
+
+# Debugging options. Uncomment either this:
+#options DDB
+# ... or these two: (for KGDB on another machine)
+makeoptions DEBUG="-g" # symbols for kgdb + nm
+options KGDB
+
+# Filesystem options
+options NFSSERVER # nfs server support
+options NFSCLIENT # nfs client support
+options FFS # ufs file system
+#
+options CD9660 # ISO 9660 + Rock Ridge file system
+options FDESC # /dev/fd/*
+options FIFO # FIFOs; RECOMMENDED
+options KERNFS # /kern
+options NULLFS # loopback file system
+options PROCFS # /proc
+options UNION # union file system
+options MFS # memory-based filesystem
+
+# Networking options
+options INET # IP prototol stack support
+#options GATEWAY # IP packet forwarding
+options TCP_COMPAT_42 # TCP bug compatibility with 4.2BSD
+# XXX - Work-around for root on slow SunOS/Sun3 servers (sigh...)
+options NFS_BOOT_RWSIZE=1024
+
+# Compatability options
+options COMPAT_SUNOS # can run SunOS 4.1.1 executables
+options COMPAT_43 # and 4.3BSD and ...
+options COMPAT_10 # NetBSD 1.0
+options COMPAT_11 # NetBSD 1.1
+options COMPAT_12 # NetBSD 1.2
+options UCONSOLE # Allow non-root TIOCCONS
+
+# Sun3-specific debugging options
+options PMAP_DEBUG
+#options VMFAULT_TRACE
+#options SYSCALL_DEBUG
+#options EXEC_DEBUG
+options DIAGNOSTIC
+#options SCSIDEBUG
+options NCR5380_DEBUG
+
+config netbsd swap generic
+
+#
+# Serial ports
+#
+zstty0 at zsc1 channel 0 # ttya
+zstty1 at zsc1 channel 1 # ttyb
+
+kbd0 at zsc0 channel 0 # keyboard
+ms0 at zsc0 channel 1 # mouse
+
+#
+# Network devices
+#
+
+# Intel Ethernet (onboard, or VME)
+ie0 at obio0 addr ? level ?
+ie1 at vmes0 addr 0xffe88000 level 3 vect 0x75
+
+# Lance Ethernet (only onboard)
+le0 at obio0 addr ? level ?
+
+#
+# Disk and tape devices
+#
+
+# Sun3 "si" SCSI controller (NCR 5380)
+si0 at obio0 addr ? level ?
+si0 at vmes0 addr 0xff200000 level 2 vect 0x40
+si1 at vmes0 addr 0xff204000 level 2 vect 0x41
+
+# Xylogics 7053 controllers
+# xdc0 at vmel0 addr 0xffffee80 level 2 vect 0x44
+# xdc1 at vmel0 addr 0xffffee90 level 2 vect 0x45
+# xd* at xdc? drive ?
+
+# Xylogics 450/451 controllers
+# xyc0 at vmes0 addr 0xffffee40 level 2 vect 0x48
+# xyc1 at vmes0 addr 0xffffee48 level 2 vect 0x49
+# xy* at xyc? drive ?
+
+# Xylogics 472 tape controllers?
+
+#
+# Frame buffer devices
+#
+
+# The default cgfour address depends on the machine:
+# 3/60: obmem 0xFF200000 .. 0xFF9fffff
+# 3/110: different? (not tested)
+cgfour0 at obmem0 addr ?
+
+# 3/60 P4 accelerated 8-bit color frame buffer
+# cgsix0 at obmem0 addr ?
+
+# 3/60 P4 24-bit color frame buffer
+# cgeight0 at obmem0 addr ?
+
+# The default bwtwo address depends on the machine:
+# 3/50: obmem 0x100000
+# else: obmem 0xff000000
+bwtwo0 at obmem0 addr ?
+# 3/60 P4 color frame buffer overlay plane, or P4 monochrome frame buffer
+#bwtwo1 at obmem0 addr 0xff300000
+# 3/60 plug-in color frame buffer overlay plane
+#bwtwo1 at obmem0 addr 0xff400000
+
+# Sun-3 color board, or CG5 8-bit VME frame buffer.
+cgtwo0 at vmes0 addr 0xff400000 level 4 vect 0xA8
+
+# Support for the CG9 24-bit VME frame buffer.
+# cgnine0 at vmel0 addr 0x08000000
+
+#
+# SCSI infrastructure
+#
+scsibus* at scsi?
+
+# Sun compatible scsi device mappings
+sd0 at scsibus? target 0 lun 0
+sd1 at scsibus? target 0 lun 1
+sd2 at scsibus? target 1 lun 0
+sd3 at scsibus? target 1 lun 1
+sd* at scsibus? target ? lun ?
+
+st0 at scsibus? target 4 lun 0
+st1 at scsibus? target 5 lun 0
+st* at scsibus? target ? lun ?
+
+cd0 at scsibus? target 6 lun 0
+cd* at scsibus? target ? lun ?
+
+#ch* at scsibus? target ? lun ?
+
+# RAM-disk drivers
+pseudo-device rd 2
+
+# Misc.
+pseudo-device loop 1 # network loopback
+pseudo-device bpfilter 8 # packet filter
+pseudo-device sl 2 # CSLIP
+pseudo-device ppp 2 # PPP
+pseudo-device tun 2 # network tunneling over tty
+
+pseudo-device pty 64 # pseudo-terminals
+#pseudo-device vnd 4 # paging to files
diff --git a/sys/arch/sun3/conf/Makefile.sun3 b/sys/arch/sun3/conf/Makefile.sun3
index 1406711ba2d..eecbcb42fdf 100644
--- a/sys/arch/sun3/conf/Makefile.sun3
+++ b/sys/arch/sun3/conf/Makefile.sun3
@@ -146,7 +146,7 @@ links:
SRCS= ${SUN3}/sun3/locore.s \
param.c ioconf.c ${CFILES} ${SFILES}
-depend: .depend
+depend:: .depend
.depend: ${SRCS} assym.h param.c
mkdep ${AFLAGS} ${CPPFLAGS} ${SUN3}/sun3/locore.s
mkdep -a ${CFLAGS} ${CPPFLAGS} param.c ioconf.c ${CFILES}
diff --git a/sys/arch/sun3/conf/RAMDISK b/sys/arch/sun3/conf/RAMDISK
index 39f5858ef16..435ec57f078 100644
--- a/sys/arch/sun3/conf/RAMDISK
+++ b/sys/arch/sun3/conf/RAMDISK
@@ -1,4 +1,4 @@
-# $NetBSD: RAMDISK,v 1.3 1996/03/26 15:15:53 gwr Exp $
+# $NetBSD: RAMDISK,v 1.3.4.1 1996/08/19 23:35:10 gwr Exp $
#
# RAMDISK: Root/swap on ramdisk
@@ -11,15 +11,20 @@
include "std.sun3"
# Machines to be supported by this kernel
+options FPU_EMULATE # XXX - Should not be needed!
options HAVECACHE # Sun3/260 VAC
# Needs to be set per system. i.e change these as you see fit
maxusers 2
# Standard system options
-options SWAPPAGER # paging
-#makeoptions DEBUG="-g" # symbols for kgdb + nm
+options SWAPPAGER, VNODEPAGER, DEVPAGER # paging
+
+# Debugging options. Uncomment either this:
#options DDB
+# ... or these two: (for KGDB on another machine)
+makeoptions DEBUG="-g" # symbols for kgdb + nm
+options KGDB
# Enable the hooks used for initializing the ram-disk.
options RAMDISK_HOOKS
@@ -27,31 +32,31 @@ options MINIROOTSIZE=512 # 256K
# Filesystem options
# May need NFSCLIENT to get miniroot image
-options NFSCLIENT # nfs client support
+options NFSCLIENT # nfs client support
# Need FFS for the ramdisk image
-options FFS # ufs file system
-options FIFO # FIFOs; RECOMMENDED
+options FFS # ufs file system
+options FIFO # FIFOs; RECOMMENDED
# Networking options
-options INET # IP prototol stack support
+options INET # IP prototol stack support
+options TCP_COMPAT_42 # TCP bug compatibility with 4.2BSD
# XXX - Work-around for root on slow SunOS/Sun3 servers (sigh...)
options NFS_BOOT_RWSIZE=1024
# Compatability options
#options COMPAT_SUNOS # can run SunOS 4.1.1 executables
-#options COMPAT_09 # NetBSD 0.9,
-options COMPAT_10 # NetBSD 1.0,
-options COMPAT_11 # NetBSD 1.1,
-options COMPAT_43 # and 4.3BSD
-#options TCP_COMPAT_42 # TCP bug compatibility with 4.2BSD
-#options UCONSOLE # Allow non-root TIOCCONS
+#options COMPAT_43 # and 4.3BSD and ...
+#options COMPAT_10 # NetBSD 1.0
+options COMPAT_11 # NetBSD 1.1
+options COMPAT_12 # NetBSD 1.2
+options UCONSOLE # Allow non-root TIOCCONS
# Sun3-specific debugging options
options DIAGNOSTIC
# The config program assumes all devices have partions...
# Is it OK to put swap on a non-existent partition?
-config bsd root on rd0a swap on rd0b
+config netbsd root on rd0a swap on rd0b
#
# Serial ports
diff --git a/sys/arch/sun3/conf/SMD_TEST b/sys/arch/sun3/conf/SMD_TEST
index 0c0eefc4fa1..404e60e938d 100644
--- a/sys/arch/sun3/conf/SMD_TEST
+++ b/sys/arch/sun3/conf/SMD_TEST
@@ -1,4 +1,4 @@
-# $NetBSD: SMD_TEST,v 1.2 1996/03/26 15:15:57 gwr Exp $
+# $NetBSD: SMD_TEST,v 1.2.4.1 1996/08/19 23:35:11 gwr Exp $
#
# SMD_TEST - for Sun3 (3/50, 3/60, 3/110, 3/160, 3/260)
@@ -8,7 +8,7 @@
include "std.sun3"
# Machines to be supported by this kernel
-options GENERIC
+options GENERIC
options FPU_EMULATE
options HAVECACHE # Sun3/260 VAC
@@ -16,36 +16,42 @@ options HAVECACHE # Sun3/260 VAC
maxusers 4
# Standard system options
-options SWAPPAGER # paging
-options KTRACE # system call tracing support
-#makeoptions DEBUG="-g" # symbols for kgdb + nm
-options DDB
+options SWAPPAGER, VNODEPAGER, DEVPAGER # paging
+options KTRACE # system call tracing support
+
+# Debugging options. Uncomment either this:
+options DDB
+# ... or these two: (for KGDB on another machine)
+#makeoptions DEBUG="-g" # symbols for kgdb + nm
+#options KGDB
# Filesystem options
-options NFSSERVER # nfs server support
-options NFSCLIENT # nfs client support
-options FFS # ufs file system
+options NFSSERVER # nfs server support
+options NFSCLIENT # nfs client support
+options FFS # ufs file system
#
-options CD9660 # ISO 9660 + Rock Ridge file system
+options CD9660 # ISO 9660 + Rock Ridge file system
options FDESC # /dev/fd/*
-options FIFO # FIFOs; RECOMMENDED
-options KERNFS # /kern
-options NULLFS # loopback file system
+options FIFO # FIFOs; RECOMMENDED
+options KERNFS # /kern
+options NULLFS # loopback file system
options PROCFS # /proc
options UNION # union file system
+options MFS # memory-based filesystem
# Networking options
-options INET # IP prototol stack support
+options INET # IP prototol stack support
+#options GATEWAY # IP packet forwarding
+options TCP_COMPAT_42 # TCP bug compatibility with 4.2BSD
# XXX - Work-around for root on slow SunOS/Sun3 servers (sigh...)
options NFS_BOOT_RWSIZE=1024
# Compatability options
options COMPAT_SUNOS # can run SunOS 4.1.1 executables
-#options COMPAT_09 # NetBSD 0.9,
-options COMPAT_10 # NetBSD 1.0,
-options COMPAT_11 # NetBSD 1.1,
-options COMPAT_43 # and 4.3BSD
-#options TCP_COMPAT_42 # TCP bug compatibility with 4.2BSD
+options COMPAT_43 # and 4.3BSD and ...
+options COMPAT_10 # NetBSD 1.0
+options COMPAT_11 # NetBSD 1.1
+options COMPAT_12 # NetBSD 1.2
options UCONSOLE # Allow non-root TIOCCONS
# Sun3-specific debugging options
@@ -56,7 +62,7 @@ options UCONSOLE # Allow non-root TIOCCONS
options DIAGNOSTIC
#options SCSIDEBUG
-config bsd swap generic
+config netbsd swap generic
#
# Serial ports
diff --git a/sys/arch/sun3/conf/files.sun3 b/sys/arch/sun3/conf/files.sun3
index ca1e4d39201..d8e9006bd90 100644
--- a/sys/arch/sun3/conf/files.sun3
+++ b/sys/arch/sun3/conf/files.sun3
@@ -1,4 +1,4 @@
-# $NetBSD: files.sun3,v 1.23 1996/03/26 15:15:59 gwr Exp $
+# $NetBSD: files.sun3,v 1.24 1996/05/07 01:30:18 thorpej Exp $
#
# sun3-specific configuration info
@@ -105,7 +105,7 @@ file arch/sun3/dev/if_ie_obio.c ie_obio
file arch/sun3/dev/if_ie_vmes.c ie_vmes
file arch/sun3/dev/if_ie.c ie
-device le: ifnet, ether
+# device defined in sys/conf/files
attach le at obio
file arch/sun3/dev/if_le.c le
diff --git a/sys/arch/sun3/conf/std.sun3 b/sys/arch/sun3/conf/std.sun3
index 245382232bf..2274f33b012 100644
--- a/sys/arch/sun3/conf/std.sun3
+++ b/sys/arch/sun3/conf/std.sun3
@@ -1,4 +1,4 @@
-# $NetBSD: std.sun3,v 1.15 1996/03/26 15:16:02 gwr Exp $
+# $NetBSD: std.sun3,v 1.15.4.1 1996/08/19 23:35:12 gwr Exp $
# Standard information for sun3's.
machine sun3 m68k
@@ -31,8 +31,7 @@ intreg0 at obio? addr ?
options NEWCONFIG
options MACHINE_NONCONTIG
-# These are used ONLY when reading the hardware time/date clock.
-# All Sun machines keep the hardware time/date clock on GMT.
-options TIMEZONE=0 # minutes west of GMT (for param.c)
-options DST=0 # daylight savings rules (for param.c)
+# All Sun3 machines with an "le" (3/50, 3/60) should be
+# presumed to have the old, buggy LANCE chip. (Rev. C)
+options LANCE_REVC_BUG
diff --git a/sys/arch/sun3/dev/cg4.c b/sys/arch/sun3/dev/cg4.c
index 99f4ed80872..7c3be6c1e63 100644
--- a/sys/arch/sun3/dev/cg4.c
+++ b/sys/arch/sun3/dev/cg4.c
@@ -1,4 +1,4 @@
-/* $NetBSD: cg4.c,v 1.7 1996/03/17 02:03:45 thorpej Exp $ */
+/* $NetBSD: cg4.c,v 1.7.4.1 1996/08/08 23:14:47 gwr Exp $ */
/*
* Copyright (c) 1992, 1993
@@ -162,7 +162,7 @@ cg4attach(parent, self, args)
struct confargs *ca = args;
struct fbtype *fbt;
volatile struct bt_regs *bt;
- int i, ramsize, pa;
+ int i;
fb->fb_driver = &cg4fbdriver;
fb->fb_private = sc;
@@ -178,7 +178,7 @@ cg4attach(parent, self, args)
fbt->fb_size = CG4_MMAP_SIZE;
sc->sc_phys = ca->ca_paddr;
- sc->sc_bt = (struct bt_regs *)
+ sc->sc_bt = bt = (volatile struct bt_regs *)
bus_mapin(ca->ca_bustype, ca->ca_paddr,
sizeof(struct bt_regs *));
diff --git a/sys/arch/sun3/dev/if_ie.c b/sys/arch/sun3/dev/if_ie.c
index 3309c3d3a33..2ab99bc4a20 100644
--- a/sys/arch/sun3/dev/if_ie.c
+++ b/sys/arch/sun3/dev/if_ie.c
@@ -1,4 +1,4 @@
-/* $NetBSD: if_ie.c,v 1.10 1996/03/26 22:04:14 gwr Exp $ */
+/* $NetBSD: if_ie.c,v 1.12 1996/05/09 21:15:47 thorpej Exp $ */
/*-
* Copyright (c) 1993, 1994, 1995 Charles Hannum.
@@ -128,6 +128,11 @@
#include <netinet/if_ether.h>
#endif
+#ifdef NS
+#include <netns/ns.h>
+#include <netns/ns_if.h>
+#endif
+
#include <vm/vm.h>
/*
@@ -162,7 +167,7 @@ static struct mbuf *last_not_for_us;
#define ETHER_MAX_LEN 1518
#define ETHER_ADDR_LEN 6
-void iewatchdog __P(( /* short */ ));
+void iewatchdog __P((struct ifnet *));
int ieinit __P((struct ie_softc *));
int ieioctl __P((struct ifnet *, u_long, caddr_t));
void iestart __P((struct ifnet *));
@@ -293,8 +298,8 @@ ie_attach(sc)
/*
* Initialize and attach S/W interface
*/
- ifp->if_unit = sc->sc_dev.dv_unit;
- ifp->if_name = ie_cd.cd_name;
+ bcopy(sc->sc_dev.dv_xname, ifp->if_xname, IFNAMSIZ);
+ ifp->if_softc = sc;
ifp->if_start = iestart;
ifp->if_ioctl = ieioctl;
ifp->if_watchdog = iewatchdog;
@@ -314,10 +319,10 @@ ie_attach(sc)
* generate an interrupt after a transmit has been started on it.
*/
void
-iewatchdog(unit)
- short unit;
+iewatchdog(ifp)
+ struct ifnet *ifp;
{
- struct ie_softc *sc = ie_cd.cd_devs[unit];
+ struct ie_softc *sc = ifp->if_softc;
log(LOG_ERR, "%s: device timeout\n", sc->sc_dev.dv_xname);
++sc->sc_arpcom.ac_if.if_oerrors;
@@ -1037,7 +1042,7 @@ void
iestart(ifp)
struct ifnet *ifp;
{
- struct ie_softc *sc = ie_cd.cd_devs[ifp->if_unit];
+ struct ie_softc *sc = ifp->if_softc;
struct mbuf *m0, *m;
u_char *buffer;
u_short len;
@@ -1556,18 +1561,13 @@ ieioctl(ifp, cmd, data)
u_long cmd;
caddr_t data;
{
- struct ie_softc *sc = ie_cd.cd_devs[ifp->if_unit];
+ struct ie_softc *sc = ifp->if_softc;
struct ifaddr *ifa = (struct ifaddr *) data;
struct ifreq *ifr = (struct ifreq *) data;
int s, error = 0;
s = splnet();
- if ((error = ether_ioctl(ifp, &sc->sc_arpcom, cmd, data)) > 0) {
- splx(s);
- return error;
- }
-
switch (cmd) {
case SIOCSIFADDR:
@@ -1580,6 +1580,24 @@ ieioctl(ifp, cmd, data)
arp_ifinit(&sc->sc_arpcom, ifa);
break;
#endif
+#ifdef NS
+ /* XXX - This code is probably wrong. */
+ case AF_NS:
+ {
+ struct ns_addr *ina = &IA_SNS(ifa)->sns_addr;
+
+ if (ns_nullhost(*ina))
+ ina->x_host =
+ *(union ns_host *)(sc->sc_arpcom.ac_enaddr);
+ else
+ bcopy(ina->x_host.c_host,
+ sc->sc_arpcom.ac_enaddr,
+ sizeof(sc->sc_arpcom.ac_enaddr));
+ /* Set new address. */
+ ieinit(sc);
+ break;
+ }
+#endif /* NS */
default:
ieinit(sc);
break;
diff --git a/sys/arch/sun3/dev/if_le.c b/sys/arch/sun3/dev/if_le.c
index 10d21fcc04e..63d008828e7 100644
--- a/sys/arch/sun3/dev/if_le.c
+++ b/sys/arch/sun3/dev/if_le.c
@@ -1,4 +1,4 @@
-/* $NetBSD: if_le.c,v 1.28 1996/04/22 02:25:54 christos Exp $ */
+/* $NetBSD: if_le.c,v 1.29 1996/05/07 01:32:31 thorpej Exp $ */
/*-
* Copyright (c) 1995 Charles M. Hannum. All rights reserved.
@@ -62,50 +62,39 @@
#include <machine/obio.h>
#include <machine/idprom.h>
-#include <sun3/dev/if_lereg.h>
-#include <sun3/dev/if_levar.h>
#include <dev/ic/am7990reg.h>
-#define LE_NEED_BUF_CONTIG
#include <dev/ic/am7990var.h>
-#define LE_SOFTC(unit) le_cd.cd_devs[unit]
-#define LE_DELAY(x) DELAY(x)
+#include <sun3/dev/if_lereg.h>
+#include <sun3/dev/if_levar.h>
static int le_match __P((struct device *, void *, void *));
static void le_attach __P((struct device *, struct device *, void *));
-int leintr __P((void *));
struct cfattach le_ca = {
sizeof(struct le_softc), le_match, le_attach
};
-struct cfdriver le_cd = {
- NULL, "le", DV_IFNET
-};
+hide void lewrcsr __P((struct am7990_softc *, u_int16_t, u_int16_t));
+hide u_int16_t lerdcsr __P((struct am7990_softc *, u_int16_t));
-integrate void
-lehwinit(sc)
- struct le_softc *sc;
-{
-}
-
-integrate void
+hide void
lewrcsr(sc, port, val)
- struct le_softc *sc;
+ struct am7990_softc *sc;
u_int16_t port, val;
{
- register struct lereg1 *ler1 = sc->sc_r1;
+ register struct lereg1 *ler1 = ((struct le_softc *)sc)->sc_r1;
ler1->ler1_rap = port;
ler1->ler1_rdp = val;
}
-integrate u_int16_t
+hide u_int16_t
lerdcsr(sc, port)
- struct le_softc *sc;
+ struct am7990_softc *sc;
u_int16_t port;
{
- register struct lereg1 *ler1 = sc->sc_r1;
+ register struct lereg1 *ler1 = ((struct le_softc *)sc)->sc_r1;
u_int16_t val;
ler1->ler1_rap = port;
@@ -143,7 +132,8 @@ le_attach(parent, self, aux)
struct device *parent, *self;
void *aux;
{
- struct le_softc *sc = (void *)self;
+ struct le_softc *lesc = (struct le_softc *)self;
+ struct am7990_softc *sc = &lesc->sc_am7990;
struct cfdata *cf = self->dv_cfdata;
struct confargs *ca = aux;
int intpri;
@@ -153,7 +143,7 @@ le_attach(parent, self, aux)
intpri = 3;
printf(" level %d", intpri);
- sc->sc_r1 = (struct lereg1 *)
+ lesc->sc_r1 = (struct lereg1 *)
obio_alloc(ca->ca_paddr, OBIO_AMD_ETHER_SIZE);
sc->sc_memsize = 0x4000; /* 16K */
@@ -169,36 +159,12 @@ le_attach(parent, self, aux)
sc->sc_copyfrombuf = am7990_copyfrombuf_contig;
sc->sc_zerobuf = am7990_zerobuf_contig;
- sc->sc_arpcom.ac_if.if_name = le_cd.cd_name;
- leconfig(sc);
+ sc->sc_rdcsr = lerdcsr;
+ sc->sc_wrcsr = lewrcsr;
+ sc->sc_hwinit = NULL;
- /* Install interrupt handler. */
- isr_add_autovect(leintr, (void *)sc, intpri);
-}
-
-/*
- * Compare two Ether/802 addresses for equality, inlined and
- * unrolled for speed. I'd love to have an inline assembler
- * version of this... XXX: Who wanted that? mycroft?
- * I wrote one, but the following is just as efficient.
- * This expands to 10 short m68k instructions! -gwr
- * Note: use this like bcmp()
- */
-static inline u_short
-ether_cmp(one, two)
- u_char *one, *two;
-{
- register u_short *a = (u_short *) one;
- register u_short *b = (u_short *) two;
- register u_short diff;
+ am7990_config(sc);
- diff = *a++ - *b++;
- diff |= *a++ - *b++;
- diff |= *a++ - *b++;
-
- return (diff);
+ /* Install interrupt handler. */
+ isr_add_autovect(am7990_intr, (void *)sc, intpri);
}
-
-#define ETHER_CMP ether_cmp
-
-#include <dev/ic/am7990.c>
diff --git a/sys/arch/sun3/dev/if_levar.h b/sys/arch/sun3/dev/if_levar.h
index 17fea04312e..1d753e6d10d 100644
--- a/sys/arch/sun3/dev/if_levar.h
+++ b/sys/arch/sun3/dev/if_levar.h
@@ -1,4 +1,4 @@
-/* $NetBSD: if_levar.h,v 1.1 1995/12/10 08:46:08 mycroft Exp $ */
+/* $NetBSD: if_levar.h,v 1.2 1996/05/07 01:32:37 thorpej Exp $ */
/*-
* Copyright (c) 1995 Charles M. Hannum. All rights reserved.
@@ -47,36 +47,7 @@
* This structure contains the output queue for the interface, its address, ...
*/
struct le_softc {
- struct device sc_dev; /* base structure */
- struct arpcom sc_arpcom; /* Ethernet common part */
-
- void (*sc_copytodesc)(); /* Copy to descriptor */
- void (*sc_copyfromdesc)(); /* Copy from descriptor */
-
- void (*sc_copytobuf)(); /* Copy to buffer */
- void (*sc_copyfrombuf)(); /* Copy from buffer */
- void (*sc_zerobuf)(); /* and Zero bytes in buffer */
-
- u_int16_t sc_conf3; /* CSR3 value */
-
- void *sc_mem; /* base address of RAM -- CPU's view */
- u_long sc_addr; /* base address of RAM -- LANCE's view */
- u_long sc_memsize; /* size of RAM */
-
- int sc_nrbuf; /* number of receive buffers */
- int sc_ntbuf; /* number of transmit buffers */
- int sc_last_rd;
- int sc_first_td, sc_last_td, sc_no_td;
-
- int sc_initaddr;
- int sc_rmdaddr;
- int sc_tmdaddr;
- int sc_rbufaddr;
- int sc_tbufaddr;
-
-#ifdef LEDEBUG
- int sc_debug;
-#endif
+ struct am7990_softc sc_am7990; /* glue to MI code */
struct lereg1 *sc_r1; /* LANCE registers */
};
diff --git a/sys/arch/sun3/dev/kd.c b/sys/arch/sun3/dev/kd.c
index 862b831ae1f..6f7c9664570 100644
--- a/sys/arch/sun3/dev/kd.c
+++ b/sys/arch/sun3/dev/kd.c
@@ -1,4 +1,4 @@
-/* $NetBSD: kd.c,v 1.16 1996/04/26 18:36:54 gwr Exp $ */
+/* $NetBSD: kd.c,v 1.17 1996/06/15 14:58:02 gwr Exp $ */
/*
* Copyright (c) 1994, 1995 Gordon W. Ross
@@ -90,12 +90,14 @@ kd_init(unit)
if (unit != 0)
return;
kd = &kd_softc; /* XXX */
- tp = ttymalloc();
- kd->kd_tty = tp;
+ tp = ttymalloc();
tp->t_oproc = kdstart;
tp->t_param = kdparam;
tp->t_dev = makedev(KDMAJOR, unit);
+ tty_attach(tp);
+
+ kd->kd_tty = tp;
return;
}
@@ -329,7 +331,7 @@ kd_later(tpaddr)
s = spltty();
tp->t_state &= ~TS_BUSY;
- (*linesw[tp->t_line].l_start)(tp);
+ (*linesw[tp->t_line].l_start)(tp);
splx(s);
}
diff --git a/sys/arch/sun3/dev/si.c b/sys/arch/sun3/dev/si.c
index 893c5368c3a..0bf52d046bc 100644
--- a/sys/arch/sun3/dev/si.c
+++ b/sys/arch/sun3/dev/si.c
@@ -1,4 +1,4 @@
-/* $NetBSD: si.c,v 1.24 1996/03/26 15:01:10 gwr Exp $ */
+/* $NetBSD: si.c,v 1.25 1996/06/17 23:21:29 gwr Exp $ */
/*
* Copyright (c) 1995 David Jones, Gordon W. Ross
@@ -425,6 +425,10 @@ si_dma_free(ncr_sc)
}
+#define CSR_MASK (SI_CSR_SBC_IP | SI_CSR_DMA_IP | \
+ SI_CSR_DMA_CONFLICT | SI_CSR_DMA_BUS_ERR)
+#define POLL_TIMO 50000 /* X100 = 5 sec. */
+
/*
* Poll (spin-wait) for DMA completion.
* Called right after xx_dma_start(), and
@@ -439,30 +443,36 @@ si_dma_poll(ncr_sc)
struct sci_req *sr = ncr_sc->sc_current;
struct si_dma_handle *dh = sr->sr_dma_hand;
volatile struct si_regs *si = sc->sc_regs;
- int tmo, csr_mask;
+ int tmo;
/* Make sure DMA started successfully. */
if (ncr_sc->sc_state & NCR_ABORTING)
return;
- csr_mask = SI_CSR_SBC_IP | SI_CSR_DMA_IP |
- SI_CSR_DMA_CONFLICT | SI_CSR_DMA_BUS_ERR;
+ /*
+ * XXX: The Sun driver waits for ~SI_CSR_DMA_ACTIVE here
+ * XXX: (on obio) or even worse (on vme) a 10mS. delay!
+ * XXX: I really doubt that is necessary...
+ */
- tmo = 50000; /* X100 = 5 sec. */
+ /* Wait for any "dma complete" or error bits. */
+ tmo = POLL_TIMO;
for (;;) {
- if (si->si_csr & csr_mask)
+ if (si->si_csr & CSR_MASK)
break;
if (--tmo <= 0) {
printf("si: DMA timeout (while polling)\n");
/* Indicate timeout as MI code would. */
sr->sr_flags |= SR_OVERDUE;
- break;
- }
+ break;
+ }
delay(100);
}
+ NCR_TRACE("si_dma_poll: waited %d\n",
+ POLL_TIMO - tmo);
#ifdef DEBUG
- if (si_debug) {
+ if (si_debug & 2) {
printf("si_dma_poll: done, csr=0x%x\n", si->si_csr);
}
#endif
diff --git a/sys/arch/sun3/dev/si_obio.c b/sys/arch/sun3/dev/si_obio.c
index b808b030874..61c073f81a6 100644
--- a/sys/arch/sun3/dev/si_obio.c
+++ b/sys/arch/sun3/dev/si_obio.c
@@ -1,4 +1,4 @@
-/* $NetBSD: si_obio.c,v 1.1 1996/03/26 15:01:12 gwr Exp $ */
+/* $NetBSD: si_obio.c,v 1.2 1996/06/17 23:21:35 gwr Exp $ */
/*
* Copyright (c) 1995 David Jones, Gordon W. Ross
@@ -126,7 +126,8 @@ struct cfattach si_obio_ca = {
};
/* Options. Interesting values are: 1,3,7 */
-int si_obio_options = 3;
+/* XXX: Using 1 for now to mask a (pmap?) bug not yet found... */
+int si_obio_options = 1; /* XXX */
#define SI_ENABLE_DMA 1 /* Use DMA (maybe polled) */
#define SI_DMA_INTR 2 /* DMA completion interrupts */
#define SI_DO_RESELECT 4 /* Allow disconnect/reselect */
@@ -207,14 +208,12 @@ si_obio_attach(parent, self, args)
*/
ncr_sc->sc_pio_out = ncr5380_pio_out;
ncr_sc->sc_pio_in = ncr5380_pio_in;
-
ncr_sc->sc_dma_alloc = si_dma_alloc;
ncr_sc->sc_dma_free = si_dma_free;
- ncr_sc->sc_dma_poll = si_dma_poll;
-
ncr_sc->sc_dma_setup = si_obio_dma_setup;
ncr_sc->sc_dma_start = si_obio_dma_start;
- ncr_sc->sc_dma_eop = si_obio_dma_stop;
+ ncr_sc->sc_dma_poll = si_dma_poll;
+ ncr_sc->sc_dma_eop = si_obio_dma_eop;
ncr_sc->sc_dma_stop = si_obio_dma_stop;
ncr_sc->sc_intr_on = NULL;
ncr_sc->sc_intr_off = NULL;
@@ -281,24 +280,28 @@ si_obio_dma_setup(ncr_sc)
struct ncr5380_softc *ncr_sc;
{
struct si_softc *sc = (struct si_softc *)ncr_sc;
+ struct sci_req *sr = ncr_sc->sc_current;
+ struct si_dma_handle *dh = sr->sr_dma_hand;
volatile struct si_regs *si = sc->sc_regs;
- struct sci_req *sr;
- struct si_dma_handle *dh;
- int send = 0;
- int xlen = 0;
-
- /* Let this work even without a dma hand, for testing... */
- if ((sr = ncr_sc->sc_current) != NULL) {
- if ((dh = sr->sr_dma_hand) != NULL) {
- send = dh->dh_flags & SIDH_OUT;
- xlen = ncr_sc->sc_datalen;
- xlen &= ~1;
- }
- }
+ struct udc_table *cmd;
+ long data_pa, cmd_pa;
+ int xlen;
+
+ /*
+ * Get the DVMA mapping for this segment.
+ * XXX - Should separate allocation and mapin.
+ */
+ data_pa = dvma_kvtopa(dh->dh_dvma, sc->sc_adapter_type);
+ data_pa += (ncr_sc->sc_dataptr - dh->dh_addr);
+ if (data_pa & 1)
+ panic("si_dma_start: bad pa=0x%x", data_pa);
+ xlen = ncr_sc->sc_datalen;
+ sc->sc_reqlen = xlen; /* XXX: or less? */
#ifdef DEBUG
- if (si_debug) {
- printf("si_dma_setup: send=%d xlen=%d\n", send, xlen);
+ if (si_debug & 2) {
+ printf("si_dma_setup: dh=0x%x, pa=0x%x, xlen=%d\n",
+ dh, data_pa, xlen);
}
#endif
@@ -310,7 +313,7 @@ si_obio_dma_setup(ncr_sc)
si->si_csr |= SI_CSR_FIFO_RES;
/* Set direction (send/recv) */
- if (send) {
+ if (dh->dh_flags & SIDH_OUT) {
si->si_csr |= SI_CSR_SEND;
} else {
si->si_csr &= ~SI_CSR_SEND;
@@ -319,77 +322,29 @@ si_obio_dma_setup(ncr_sc)
/* Set the FIFO counter. */
si->fifo_count = xlen;
+ /* Reset the UDC. */
+ si_obio_udc_write(si, UDC_ADR_COMMAND, UDC_CMD_RESET);
+
/*
- * XXX: Reset DMA engine again! Comment from Sprite:
+ * XXX: Reset the FIFO again! Comment from Sprite:
* Go through reset again becuase of the bug on the 3/50
* where bytes occasionally linger in the DMA fifo.
*/
-
- /* Reset the UDC. */
- si_obio_udc_write(si, UDC_ADR_COMMAND, UDC_CMD_RESET);
-
- /* Reset the FIFO */
si->si_csr &= ~SI_CSR_FIFO_RES; /* active low */
si->si_csr |= SI_CSR_FIFO_RES;
#ifdef DEBUG
- if ((si->fifo_count > xlen) || (si->fifo_count < (xlen - 1))) {
+ /* Make sure the extra FIFO reset did not hit the count. */
+ if (si->fifo_count != xlen) {
printf("si_dma_setup: fifo_count=0x%x, xlen=0x%x\n",
si->fifo_count, xlen);
Debugger();
}
#endif
-}
-
-
-void
-si_obio_dma_start(ncr_sc)
- struct ncr5380_softc *ncr_sc;
-{
- struct si_softc *sc = (struct si_softc *)ncr_sc;
- struct sci_req *sr = ncr_sc->sc_current;
- struct si_dma_handle *dh = sr->sr_dma_hand;
- volatile struct si_regs *si = sc->sc_regs;
- struct udc_table *cmd;
- long data_pa, cmd_pa;
- int xlen;
/*
- * Get the DVMA mapping for this segment.
- * XXX - Should separate allocation and mapin.
- */
- data_pa = dvma_kvtopa(dh->dh_dvma, sc->sc_adapter_type);
- data_pa += (ncr_sc->sc_dataptr - dh->dh_addr);
- if (data_pa & 1)
- panic("si_dma_start: bad pa=0x%x", data_pa);
- xlen = ncr_sc->sc_datalen;
- xlen &= ~1;
- sc->sc_reqlen = xlen; /* XXX: or less... */
-
-#ifdef DEBUG
- if (si_debug & 2) {
- printf("si_dma_start: dh=0x%x, pa=0x%x, xlen=%d\n",
- dh, data_pa, xlen);
- }
-#endif
-
- /*
- * Set up the DMA controller.
- * Already set FIFO count in dma_setup.
- */
-
-#ifdef DEBUG
- if ((si->fifo_count > xlen) ||
- (si->fifo_count < (xlen - 1)))
- {
- printf("si_dma_start: fifo_count=0x%x, xlen=0x%x\n",
- si->fifo_count, xlen);
- Debugger();
- }
-#endif
-
- /*
- * The OBIO controller needs a command block.
+ * Set up the DMA controller. The DMA controller on
+ * OBIO needs a command block in DVMA space.
*/
cmd = sc->sc_dmacmd;
cmd->addrh = ((data_pa & 0xFF0000) >> 8) | UDC_ADDR_INFO;
@@ -397,6 +352,8 @@ si_obio_dma_start(ncr_sc)
cmd->count = xlen / 2; /* bytes -> words */
cmd->cmrh = UDC_CMR_HIGH;
if (dh->dh_flags & SIDH_OUT) {
+ if (xlen & 1)
+ cmd->count++;
cmd->cmrl = UDC_CMR_LSEND;
cmd->rsel = UDC_RSEL_SEND;
} else {
@@ -417,7 +374,28 @@ si_obio_dma_start(ncr_sc)
/* Tell the chip to interrupt on error. */
si_obio_udc_write(si, UDC_ADR_COMMAND, UDC_CMD_CIE);
- /* XXX: Move all of the above to _setup? */
+ /* Will do "start chain" command in _dma_start. */
+}
+
+
+void
+si_obio_dma_start(ncr_sc)
+ struct ncr5380_softc *ncr_sc;
+{
+ struct si_softc *sc = (struct si_softc *)ncr_sc;
+ struct sci_req *sr = ncr_sc->sc_current;
+ struct si_dma_handle *dh = sr->sr_dma_hand;
+ volatile struct si_regs *si = sc->sc_regs;
+ int s;
+
+#ifdef DEBUG
+ if (si_debug & 2) {
+ printf("si_dma_start: sr=0x%x\n", sr);
+ }
+#endif
+
+ /* This MAY be time critical (not sure). */
+ s = splhigh();
/* Finally, give the UDC a "start chain" command. */
si_obio_udc_write(si, UDC_ADR_COMMAND, UDC_CMD_STRT_CHN);
@@ -440,6 +418,7 @@ si_obio_dma_start(ncr_sc)
*ncr_sc->sci_irecv = 0; /* start it */
}
+ splx(s);
ncr_sc->sc_state |= NCR_DOINGDMA;
#ifdef DEBUG
@@ -478,11 +457,19 @@ si_obio_dma_stop(ncr_sc)
}
ncr_sc->sc_state &= ~NCR_DOINGDMA;
+ NCR_TRACE("si_dma_stop: top, csr=0x%x\n", si->si_csr);
+
+ /* OK, have either phase mis-match or end of DMA. */
+ /* Set an impossible phase to prevent data movement? */
+ *ncr_sc->sci_tcmd = PHASE_INVALID;
+
+ /* Check for DMA errors. */
if (si->si_csr & (SI_CSR_DMA_CONFLICT | SI_CSR_DMA_BUS_ERR)) {
printf("si: DMA error, csr=0x%x, reset\n", si->si_csr);
sr->sr_xs->error = XS_DRIVER_STUFFUP;
ncr_sc->sc_state |= NCR_ABORTING;
si_reset_adapter(ncr_sc);
+ goto out;
}
/* Note that timeout may have set the error flag. */
@@ -510,11 +497,9 @@ si_obio_dma_stop(ncr_sc)
/*
* Now try to figure out how much actually transferred
- *
* The fifo_count might not reflect how many bytes were
- * actually transferred for VME.
+ * actually transferred.
*/
-
resid = si->fifo_count & 0xFFFF;
ntrans = sc->sc_reqlen - resid;
@@ -569,11 +554,12 @@ out:
si->fifo_count = 0;
si->si_csr &= ~SI_CSR_SEND;
- /* Reset the FIFO */
- si->si_csr &= ~SI_CSR_FIFO_RES; /* active low */
- si->si_csr |= SI_CSR_FIFO_RES;
+ /* Reset the FIFO */
+ si->si_csr &= ~SI_CSR_FIFO_RES; /* active low */
+ si->si_csr |= SI_CSR_FIFO_RES;
/* Put SBIC back in PIO mode. */
+ /* XXX: set tcmd to PHASE_INVALID? */
*ncr_sc->sci_mode &= ~(SCI_MODE_DMA | SCI_MODE_DMA_IE);
*ncr_sc->sci_icmd = 0;
}
diff --git a/sys/arch/sun3/dev/si_vme.c b/sys/arch/sun3/dev/si_vme.c
index 637f8932bcd..d29bc905ee3 100644
--- a/sys/arch/sun3/dev/si_vme.c
+++ b/sys/arch/sun3/dev/si_vme.c
@@ -1,4 +1,4 @@
-/* $NetBSD: si_vme.c,v 1.1 1996/03/26 15:01:13 gwr Exp $ */
+/* $NetBSD: si_vme.c,v 1.2 1996/06/17 23:21:39 gwr Exp $ */
/*
* Copyright (c) 1995 David Jones, Gordon W. Ross
@@ -230,11 +230,10 @@ si_vmes_attach(parent, self, args)
ncr_sc->sc_dma_alloc = si_dma_alloc;
ncr_sc->sc_dma_free = si_dma_free;
- ncr_sc->sc_dma_poll = si_dma_poll;
-
ncr_sc->sc_dma_setup = si_vme_dma_setup;
ncr_sc->sc_dma_start = si_vme_dma_start;
- ncr_sc->sc_dma_eop = si_vme_dma_stop;
+ ncr_sc->sc_dma_poll = si_dma_poll;
+ ncr_sc->sc_dma_eop = si_vme_dma_eop;
ncr_sc->sc_dma_stop = si_vme_dma_stop;
ncr_sc->sc_intr_on = si_vme_intr_on;
ncr_sc->sc_intr_off = si_vme_intr_off;
@@ -272,7 +271,18 @@ si_vme_intr_on(ncr_sc)
struct si_softc *sc = (struct si_softc *)ncr_sc;
volatile struct si_regs *si = sc->sc_regs;
- si_vme_dma_setup(ncr_sc);
+ /* receive mode should be safer */
+ si->si_csr &= ~SI_CSR_SEND;
+
+ /* Clear the count so nothing happens. */
+ si->dma_counth = 0;
+ si->dma_countl = 0;
+
+ /* Clear the start address too. (paranoid?) */
+ si->dma_addrh = 0;
+ si->dma_addrl = 0;
+
+ /* Finally, enable the DMA engine. */
si->si_csr |= SI_CSR_DMA_EN;
}
@@ -298,43 +308,14 @@ si_vme_intr_off(ncr_sc)
* XXX: The VME adapter appears to suppress SBC interrupts
* when the FIFO is not empty or the FIFO count is non-zero!
*
- * On the VME version we just clear the DMA count and address
- * here (to make sure it stays idle) and do the real setup
- * later, in dma_start.
+ * On the VME version, setup the start addres, but clear the
+ * count (to make sure it stays idle) and set that later.
*/
void
si_vme_dma_setup(ncr_sc)
struct ncr5380_softc *ncr_sc;
{
struct si_softc *sc = (struct si_softc *)ncr_sc;
- volatile struct si_regs *si = sc->sc_regs;
-
- /* Reset the FIFO */
- si->si_csr &= ~SI_CSR_FIFO_RES; /* active low */
- si->si_csr |= SI_CSR_FIFO_RES;
-
- /* Set direction (assume recv here) */
- si->si_csr &= ~SI_CSR_SEND;
- /* Assume worst alignment */
- si->si_csr |= SI_CSR_BPCON;
-
- si->dma_addrh = 0;
- si->dma_addrl = 0;
-
- si->dma_counth = 0;
- si->dma_countl = 0;
-
- /* Clear FIFO counter. (also hits dma_count) */
- si->fifo_cnt_hi = 0;
- si->fifo_count = 0;
-}
-
-
-void
-si_vme_dma_start(ncr_sc)
- struct ncr5380_softc *ncr_sc;
-{
- struct si_softc *sc = (struct si_softc *)ncr_sc;
struct sci_req *sr = ncr_sc->sc_current;
struct si_dma_handle *dh = sr->sr_dma_hand;
volatile struct si_regs *si = sc->sc_regs;
@@ -350,22 +331,16 @@ si_vme_dma_start(ncr_sc)
if (data_pa & 1)
panic("si_dma_start: bad pa=0x%x", data_pa);
xlen = ncr_sc->sc_datalen;
- xlen &= ~1;
- sc->sc_reqlen = xlen; /* XXX: or less... */
+ xlen &= ~1; /* XXX: necessary? */
+ sc->sc_reqlen = xlen; /* XXX: or less? */
#ifdef DEBUG
if (si_debug & 2) {
- printf("si_dma_start: dh=0x%x, pa=0x%x, xlen=%d\n",
+ printf("si_dma_setup: dh=0x%x, pa=0x%x, xlen=%d\n",
dh, data_pa, xlen);
}
#endif
- /*
- * Set up the DMA controller.
- */
- si->si_csr &= ~SI_CSR_FIFO_RES; /* active low */
- si->si_csr |= SI_CSR_FIFO_RES;
-
/* Set direction (send/recv) */
if (dh->dh_flags & SIDH_OUT) {
si->si_csr |= SI_CSR_SEND;
@@ -373,31 +348,56 @@ si_vme_dma_start(ncr_sc)
si->si_csr &= ~SI_CSR_SEND;
}
+ /* Reset the FIFO. */
+ si->si_csr &= ~SI_CSR_FIFO_RES; /* active low */
+ si->si_csr |= SI_CSR_FIFO_RES;
+
if (data_pa & 2) {
si->si_csr |= SI_CSR_BPCON;
} else {
si->si_csr &= ~SI_CSR_BPCON;
}
+ /* Load the start address. */
si->dma_addrh = (ushort)(data_pa >> 16);
si->dma_addrl = (ushort)(data_pa & 0xFFFF);
+ /*
+ * Keep the count zero or it may start early!
+ */
+ si->dma_counth = 0;
+ si->dma_countl = 0;
+
+#if 0
+ /* Clear FIFO counter. (also hits dma_count) */
+ si->fifo_cnt_hi = 0;
+ si->fifo_count = 0;
+#endif
+}
+
+
+void
+si_vme_dma_start(ncr_sc)
+ struct ncr5380_softc *ncr_sc;
+{
+ struct si_softc *sc = (struct si_softc *)ncr_sc;
+ struct sci_req *sr = ncr_sc->sc_current;
+ struct si_dma_handle *dh = sr->sr_dma_hand;
+ volatile struct si_regs *si = sc->sc_regs;
+ long data_pa;
+ int s, xlen;
+
+ xlen = sc->sc_reqlen;
+
+ /* This MAY be time critical (not sure). */
+ s = splhigh();
+
si->dma_counth = (ushort)(xlen >> 16);
si->dma_countl = (ushort)(xlen & 0xFFFF);
-#if 1
- /* Set it anyway, even though dma_count hits it? */
+ /* Set it anyway, even though dma_count hits it. */
si->fifo_cnt_hi = (ushort)(xlen >> 16);
si->fifo_count = (ushort)(xlen & 0xFFFF);
-#endif
-
-#ifdef DEBUG
- if (si->fifo_count != xlen) {
- printf("si_dma_start: fifo_count=0x%x, xlen=0x%x\n",
- si->fifo_count, xlen);
- Debugger();
- }
-#endif
/*
* Acknowledge the phase change. (After DMA setup!)
@@ -420,6 +420,7 @@ si_vme_dma_start(ncr_sc)
/* Let'er rip! */
si->si_csr |= SI_CSR_DMA_EN;
+ splx(s);
ncr_sc->sc_state |= NCR_DOINGDMA;
#ifdef DEBUG
@@ -461,17 +462,23 @@ si_vme_dma_stop(ncr_sc)
/* First, halt the DMA engine. */
si->si_csr &= ~SI_CSR_DMA_EN; /* VME only */
+ /* Set an impossible phase to prevent data movement? */
+ *ncr_sc->sci_tcmd = PHASE_INVALID;
+
if (si->si_csr & (SI_CSR_DMA_CONFLICT | SI_CSR_DMA_BUS_ERR)) {
printf("si: DMA error, csr=0x%x, reset\n", si->si_csr);
sr->sr_xs->error = XS_DRIVER_STUFFUP;
ncr_sc->sc_state |= NCR_ABORTING;
si_reset_adapter(ncr_sc);
+ goto out;
}
/* Note that timeout may have set the error flag. */
if (ncr_sc->sc_state & NCR_ABORTING)
goto out;
+ /* XXX: Wait for DMA to actually finish? */
+
/*
* Now try to figure out how much actually transferred
*
diff --git a/sys/arch/sun3/dev/xd.c b/sys/arch/sun3/dev/xd.c
index d3a8f835ecb..d5b8508dd81 100644
--- a/sys/arch/sun3/dev/xd.c
+++ b/sys/arch/sun3/dev/xd.c
@@ -101,8 +101,7 @@
* XDC_HWAIT: add iorq "N" to head of SC's wait queue
*/
#define XDC_HWAIT(SC, N) { \
- (SC)->waithead = ((SC)->waithead == 0) ? \
- (XDC_MAXIOPB - 1) : ((SC)->waithead - 1); \
+ (SC)->waithead = ((SC)->waithead - 1) % XDC_MAXIOPB; \
(SC)->waitq[(SC)->waithead] = (N); \
(SC)->nwait++; \
}
@@ -1434,9 +1433,6 @@ xdc_startbuf(xdcsc, xdsc, bp)
/* Instrumentation. */
disk_busy(&xdsc->sc_dk);
- /* Instrumentation. */
- disk_busy(&xdsc->sc_dk);
-
/* now submit [note that xdc_submit_iorq can never fail on NORM reqs] */
xdc_submit_iorq(xdcsc, rqno, XD_SUB_NORM);
diff --git a/sys/arch/sun3/dev/xy.c b/sys/arch/sun3/dev/xy.c
index 8bea7ab3e06..b359bd5f6c1 100644
--- a/sys/arch/sun3/dev/xy.c
+++ b/sys/arch/sun3/dev/xy.c
@@ -36,7 +36,7 @@
* x y . c x y l o g i c s 4 5 0 / 4 5 1 s m d d r i v e r
*
* author: Chuck Cranor <chuck@ccrc.wustl.edu>
- * id: $NetBSD: xy.c,v 1.5 1996/03/04 20:35:29 chuck Exp $
+ * id: $NetBSD: xy.c,v 1.9 1996/03/17 02:04:10 thorpej Exp $
* started: 14-Sep-95
* references: [1] Xylogics Model 753 User's Manual
* part number: 166-753-001, Revision B, May 21, 1988.
@@ -361,8 +361,8 @@ xycattach(parent, self, aux)
return;
}
}
+ bzero(tmp, pbsz);
xyc->iopbase = tmp;
- bzero(xyc->iopbase, pbsz);
xyc->dvmaiopb = (struct xy_iopb *)
dvma_kvtopa((long) xyc->iopbase, BUS_VME16);
xyc->reqs = (struct xy_iorq *)
@@ -1292,9 +1292,6 @@ xyc_startbuf(xycsc, xysc, bp)
/* Instrumentation. */
disk_busy(&xysc->sc_dk);
- /* Instrumentation. */
- disk_busy(&xysc->sc_dk);
-
return (XY_ERR_AOK);
}
@@ -1632,7 +1629,7 @@ xyc_reset(xycsc, quiet, blastmode, error, xysc)
dvma_mapout(iorq->dbufbase,
iorq->buf->b_bcount);
iorq->xy->xyq.b_actf =
- iorq->buf->b_actf;
+ iorq->buf->b_actf;
disk_unbusy(&iorq->xy->sc_dk,
(iorq->buf->b_bcount -
iorq->buf->b_resid));
diff --git a/sys/arch/sun3/dev/zs.c b/sys/arch/sun3/dev/zs.c
index e70f967a50b..c1f66193975 100644
--- a/sys/arch/sun3/dev/zs.c
+++ b/sys/arch/sun3/dev/zs.c
@@ -1,4 +1,4 @@
-/* $NetBSD: zs.c,v 1.36 1996/04/04 06:26:15 cgd Exp $ */
+/* $NetBSD: zs.c,v 1.38 1996/06/17 15:17:06 gwr Exp $ */
/*
* Copyright (c) 1995 Gordon W. Ross
@@ -56,7 +56,6 @@
#include <machine/autoconf.h>
#include <machine/cpu.h>
-#include <machine/eeprom.h>
#include <machine/isr.h>
#include <machine/obio.h>
#include <machine/mon.h>
@@ -273,7 +272,7 @@ zsc_attach(parent, self, aux)
cs->cs_ops = &zsops_null;
/* Define BAUD rate clock for the MI code. */
- cs->cs_pclk_div16 = PCLK / 16;
+ cs->cs_brg_clk = PCLK / 16;
/* XXX: get defspeed from EEPROM instead? */
cs->cs_defspeed = zs_defspeed[zsc_unit][channel];
@@ -536,33 +535,49 @@ void *zs_conschan;
/*
* This function replaces sys/dev/cninit.c
* Determine which device is the console using
- * the "console" byte from the EEPROM.
+ * the PROM "input source" and "output sink".
*/
void
cninit()
{
+ MachMonRomVector *v;
struct zschan *zc;
struct consdev *cn;
int zsc_unit, channel;
+ char inSource;
- switch (ee_console) {
+ v = romVectorPtr;
+ inSource = *(v->inSource);
- case EE_CONS_TTYA:
- case EE_CONS_TTYB:
+ if (inSource != *(v->outSink)) {
+ mon_printf("cninit: mismatched PROM output selector\n");
+ }
+
+ switch (inSource) {
+
+ case 1: /* ttya */
+ case 2: /* ttyb */
zsc_unit = 1;
- channel = (ee_console & 1);
+ channel = inSource - 1;
cn = &consdev_tty;
cn->cn_dev = makedev(ZSTTY_MAJOR, channel);
cn->cn_pri = CN_REMOTE;
break;
+ case 3: /* ttyc (rewired keyboard connector) */
+ case 4: /* ttyd (rewired mouse connector) */
+ zsc_unit = 0;
+ channel = inSource - 3;
+ cn = &consdev_tty;
+ cn->cn_dev = makedev(ZSTTY_MAJOR, (channel+2));
+ cn->cn_pri = CN_REMOTE;
+ break;
+
default:
- mon_printf("cninit: unknown eeprom console setting\n");
+ mon_printf("cninit: invalid PROM console selector\n");
/* assume keyboard/display */
/* fallthrough */
- case EE_CONS_BW:
- case EE_CONS_COLOR:
- case EE_CONS_P4OPT:
+ case 0: /* keyboard/display */
zsc_unit = 0;
channel = 0;
cn = &consdev_kd;
diff --git a/sys/arch/sun3/dev/zs_kgdb.c b/sys/arch/sun3/dev/zs_kgdb.c
index 3ba576927cf..e6596e28cc3 100644
--- a/sys/arch/sun3/dev/zs_kgdb.c
+++ b/sys/arch/sun3/dev/zs_kgdb.c
@@ -1,3 +1,4 @@
+/* $NetBSD: zs_kgdb.c,v 1.6 1996/06/17 15:40:36 gwr Exp $ */
/*
* Copyright (c) 1994 Gordon W. Ross
@@ -71,9 +72,18 @@
/* The Sun3 provides a 4.9152 MHz clock to the ZS chips. */
#define PCLK (9600 * 512) /* PCLK pin input clock rate */
+#define ZSHARD_PRI 6 /* Wired on the CPU board... */
#define ZS_DELAY() delay(2)
+/* The layout of this is hardware-dependent (padding, order). */
+struct zschan {
+ volatile u_char zc_csr; /* ctrl,status, and indirect access */
+ u_char zc_xxx0;
+ volatile u_char zc_data; /* data */
+ u_char zc_xxx1;
+};
+
extern int kgdb_dev;
extern int kgdb_rate;
@@ -103,6 +113,9 @@ static u_char zs_kgdb_regs[16] = {
ZSWR15_BREAK_IE | ZSWR15_DCD_IE,
};
+/*
+ * This replaces "zs_reset()" in the sparc driver.
+ */
static void
zs_setparam(cs, iena, rate)
struct zs_chanstate *cs;
@@ -118,7 +131,7 @@ zs_setparam(cs, iena, rate)
}
/* Initialize the speed, etc. */
- tconst = BPS_TO_TCONST(cs->cs_pclk_div16, rate);
+ 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;
@@ -126,7 +139,7 @@ zs_setparam(cs, iena, rate)
s = splhigh();
zs_loadchannelregs(cs);
splx(s);
-
+}
/*
* Set up for kgdb; called at boot time before configuration.
@@ -139,11 +152,12 @@ zs_kgdb_init()
volatile struct zschan *zc;
int channel, zsc_unit;
- if (major(kgdb_dev) != ZSMAJOR)
+ if (major(kgdb_dev) != ZSTTY_MAJOR)
return;
- zsc_unit = 1; /* XXX */
- channel = minor(kgdb_dev) & 1;
+ /* Note: (ttya,ttyb) on zsc1, and (ttyc,ttyd) on zsc0 */
+ zsc_unit = 2 - (kgdb_dev & 2);
+ channel = kgdb_dev & 1;
printf("zs_kgdb_init: attaching zstty%d at %d baud\n",
channel, kgdb_rate);
@@ -153,7 +167,7 @@ zs_kgdb_init()
cs.cs_reg_csr = &zc->zc_csr;
cs.cs_reg_data = &zc->zc_data;
cs.cs_channel = channel;
- cs.cs_pclk_div16 = PCLK / 16;
+ cs.cs_brg_clk = PCLK / 16;
/* Now set parameters. (interrupts disabled) */
zs_setparam(&cs, 0, kgdb_rate);
@@ -200,7 +214,7 @@ zs_check_kgdb(cs, dev)
*/
zskgdb()
{
- unit = minor(kgdb_dev);
+ int unit = minor(kgdb_dev);
printf("zstty%d: kgdb interrupt\n", unit);
/* This will trap into the debugger. */
@@ -214,7 +228,7 @@ zskgdb()
int kgdb_input_lost;
-static int
+static void
zs_kgdb_rxint(cs)
register struct zs_chanstate *cs;
{
@@ -236,11 +250,9 @@ zs_kgdb_rxint(cs)
} else {
kgdb_input_lost++;
}
-
- return(0);
}
-static int
+static void
zs_kgdb_txint(cs)
register struct zs_chanstate *cs;
{
@@ -248,10 +260,9 @@ zs_kgdb_txint(cs)
rr0 = zs_read_csr(cs);
zs_write_csr(cs, ZSWR0_RESET_TXINT);
- return (0);
}
-static int
+static void
zs_kgdb_stint(cs)
register struct zs_chanstate *cs;
{
@@ -259,16 +270,13 @@ zs_kgdb_stint(cs)
rr0 = zs_read_csr(cs);
zs_write_csr(cs, ZSWR0_RESET_STATUS);
-
- return (0);
}
-static int
+static void
zs_kgdb_softint(cs)
struct zs_chanstate *cs;
{
printf("zs_kgdb_softint?\n");
- return (0);
}
struct zsops zsops_kgdb = {
diff --git a/sys/arch/sun3/include/autoconf.h b/sys/arch/sun3/include/autoconf.h
index 9b90ac4c081..88b546db3c6 100644
--- a/sys/arch/sun3/include/autoconf.h
+++ b/sys/arch/sun3/include/autoconf.h
@@ -58,7 +58,7 @@ struct confargs {
#define cf_intvec cf_loc[2]
int bus_scan __P((struct device *, void *, void *));
-int bus_print __P((void *, char *));
-int bus_peek __P((int, int, int));
+int bus_print __P((void *, char *));
+int bus_peek __P((int, int, int));
char * bus_mapin __P((int, int, int));
diff --git a/sys/arch/sun3/include/exec.h b/sys/arch/sun3/include/exec.h
index 53310fea489..b28a4ea597d 100644
--- a/sys/arch/sun3/include/exec.h
+++ b/sys/arch/sun3/include/exec.h
@@ -44,11 +44,4 @@ struct relocation_info_m68k {
};
#define relocation_info relocation_info_m68k
-#define ELF_TARG_CLASS ELFCLASS32
-#define ELF_TARG_DATA ELFDATA2MSB
-#define ELF_TARG_MACH EM_68K
-
-#define DO_AOUT /* support a.out */
-#define DO_ELF /* support ELF */
-
#endif /* _LDPGSZ */
diff --git a/sys/arch/sun3/include/kcore.h b/sys/arch/sun3/include/kcore.h
new file mode 100644
index 00000000000..77e95ce93bc
--- /dev/null
+++ b/sys/arch/sun3/include/kcore.h
@@ -0,0 +1,47 @@
+/* $NetBSD: kcore.h,v 1.1 1996/05/05 04:19:31 gwr Exp $ */
+
+/*
+ * Copyright (c) 1996 Leo Weppelman.
+ * 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.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Leo Weppelman.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission
+ *
+ * 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.
+ */
+
+#ifndef _MACHINE_KCORE_H_
+#define _MACHINE_KCORE_H_
+
+/*
+ * In the dump device, there is a kcore_seg_t
+ * followed by one of these. The size will be
+ * padded out appropriately by the kernel.
+ */
+
+typedef struct cpu_kcore_hdr {
+ phys_ram_seg_t ram_segs[4];
+ u_char ksegmap[256];
+} cpu_kcore_hdr_t;
+
+#endif /* _MACHINE_KCORE_H_ */
diff --git a/sys/arch/sun3/include/param.h b/sys/arch/sun3/include/param.h
index 561a62fd55e..befd54ed918 100644
--- a/sys/arch/sun3/include/param.h
+++ b/sys/arch/sun3/include/param.h
@@ -48,11 +48,11 @@
/*
* Machine dependent constants for the Sun3 series.
*/
-#define _MACHINE sun3
-#define MACHINE "sun3"
+#define _MACHINE sun3
+#define MACHINE "sun3"
#define _MACHINE_ARCH m68k
#define MACHINE_ARCH "m68k"
-#define MID_MACHINE MID_M68K
+#define MID_MACHINE MID_M68K
/*
* Round p (pointer or byte index) up to a correctly-aligned value
diff --git a/sys/arch/sun3/include/pcb.h b/sys/arch/sun3/include/pcb.h
index e94da41a646..f2797c5f5e4 100644
--- a/sys/arch/sun3/include/pcb.h
+++ b/sys/arch/sun3/include/pcb.h
@@ -1,4 +1,4 @@
-/* $NetBSD: pcb.h,v 1.8 1994/11/21 21:34:02 gwr Exp $ */
+/* $NetBSD: pcb.h,v 1.9 1996/06/18 16:03:45 gwr Exp $ */
/*
* Copyright (c) 1994 Gordon W. Ross
@@ -48,10 +48,10 @@
/*
* Sun3 process control block
*/
-struct pcb
-{
+struct pcb {
short pcb_flags; /* misc. process flags */
short pcb_ps; /* processor status word */
+ int pcb_mmuctx; /* MMU context number */
int pcb_usp; /* user stack pointer */
int pcb_regs[12]; /* D2-D7, A2-A7 */
caddr_t pcb_onfault; /* for copyin/out faults */
diff --git a/sys/arch/sun3/include/pte.h b/sys/arch/sun3/include/pte.h
index f0bee459629..adc91551c75 100644
--- a/sys/arch/sun3/include/pte.h
+++ b/sys/arch/sun3/include/pte.h
@@ -1,4 +1,4 @@
-/* $NetBSD: pte.h,v 1.9 1995/03/10 02:28:01 gwr Exp $ */
+/* $NetBSD: pte.h,v 1.10 1996/05/05 04:18:28 gwr Exp $ */
/*
* Copyright (c) 1994 Gordon W. Ross
@@ -74,6 +74,8 @@
#define PGT_VME_D16 MAKE_PGTYPE(VME_D16) /* VMEbus 16-bit data */
#define PGT_VME_D32 MAKE_PGTYPE(VME_D32) /* VMEbus 32-bit data */
+#define VA_SEGNUM(x) ((u_int)(x) >> SEGSHIFT)
+
#define VA_PTE_NUM_SHIFT 13
#define VA_PTE_NUM_MASK (0xF << VA_PTE_NUM_SHIFT)
#define VA_PTE_NUM(va) ((va & VA_PTE_NUM_MASK) >> VA_PTE_NUM_SHIFT)
diff --git a/sys/arch/sun3/include/remote-sl.h b/sys/arch/sun3/include/remote-sl.h
new file mode 100644
index 00000000000..4ae37abc504
--- /dev/null
+++ b/sys/arch/sun3/include/remote-sl.h
@@ -0,0 +1,68 @@
+/* $NetBSD: remote-sl.h,v 1.1 1996/06/15 14:34:35 gwr Exp $ */
+
+/*
+ * Copyright (c) 1992, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This software was developed by the Computer Systems Engineering group
+ * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
+ * contributed to Berkeley.
+ *
+ * All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Lawrence Berkeley Laboratory.
+ *
+ * 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 University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University 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 REGENTS 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 REGENTS 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.
+ *
+ * @(#)remote-sl.h 8.1 (Berkeley) 6/11/93
+ */
+
+/*
+ * These definitions are factored out into an include file so
+ * the kernel stub has access to them.
+ */
+#define FRAME_START 0xc1 /* Frame End */
+#define FRAME_END 0xc0 /* Frame End */
+#define FRAME_ESCAPE 0xdb /* Frame Esc */
+#define TRANS_FRAME_START 0xde /* transposed frame start */
+#define TRANS_FRAME_END 0xdc /* transposed frame esc */
+#define TRANS_FRAME_ESCAPE 0xdd /* transposed frame esc */
+
+/*
+ * Message limits. SL_MAXDATA is the maximum number of bytes that can
+ * be read or written. SL_BUFSIZE is the maximum amount of data that
+ * can be passed across the serial link. The actual MTU is two times
+ * the max message (since each byte might be escaped), plus the two
+ * framing bytes. We add two to the message length to account for the
+ * type byte and checksum.
+ */
+#define SL_MAXDATA 62 /* max data that can be read */
+#define SL_RPCSIZE (1 + SL_MAXDATA) /* errno byte + data */
+#define SL_MTU ((2 * (SL_RPCSIZE + 2) + 2))
diff --git a/sys/arch/sun3/stand/installboot/installboot.8 b/sys/arch/sun3/stand/installboot/installboot.8
index d859114b7e8..21cea51f995 100644
--- a/sys/arch/sun3/stand/installboot/installboot.8
+++ b/sys/arch/sun3/stand/installboot/installboot.8
@@ -1,4 +1,4 @@
-.\" $Id: installboot.8,v 1.3 1995/12/14 05:26:56 deraadt Exp $
+.\" $Id: installboot.8,v 1.4 1996/10/11 23:06:41 deraadt Exp $
.\"
.Dd 31 May 1995
.Dt INSTALLBOOT 8
diff --git a/sys/arch/sun3/stand/libsa/Makefile b/sys/arch/sun3/stand/libsa/Makefile
index 88f8d933115..2147f070661 100644
--- a/sys/arch/sun3/stand/libsa/Makefile
+++ b/sys/arch/sun3/stand/libsa/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.9 1995/11/17 23:23:52 gwr Exp $
+# $NetBSD: Makefile,v 1.9.4.1 1996/06/26 20:16:58 jtc Exp $
LIB=sa
@@ -13,7 +13,7 @@ DIR_KERN=$S/lib/libkern
SRC_net= nfs.c rpc.c net.c ether.c arp.c in_cksum.c \
bootparam.c rarp.c
-SRC_sa = alloc.c bcopy.c close.c getfile.c open.c \
+SRC_sa = alloc.c bcopy.c close.c getfile.c memcpy.c open.c \
printf.c read.c strerror.c ufs.c
SRC_kern= ashrdi3.c bcmp.c bzero.c strcmp.c strlen.c
diff --git a/sys/arch/sun3/stand/libsa/dev_disk.c b/sys/arch/sun3/stand/libsa/dev_disk.c
index 2d967f4d0ce..5fd83a61003 100644
--- a/sys/arch/sun3/stand/libsa/dev_disk.c
+++ b/sys/arch/sun3/stand/libsa/dev_disk.c
@@ -48,11 +48,11 @@
#include "dvma.h"
#include "promdev.h"
-
-#define RETRY_COUNT 5
+
+#define RETRY_COUNT 5
extern int debug;
-int disk_opencount;
+int disk_opencount;
struct saioreq disk_ioreq;
int
@@ -66,22 +66,22 @@ disk_open(f, devname)
#ifdef DEBUG_PROM
if (debug)
- printf("disk_open: %s\n", devname);
+ printf("disk_open: %s\n", devname);
#endif
si = &disk_ioreq;
if (disk_opencount == 0) {
- /*
- * Setup our part of the saioreq.
- * (determines what gets opened)
- */
- bp = *romp->bootParam;
- si->si_boottab = bp->bootDevice;
- si->si_ctlr = bp->ctlrNum;
- si->si_unit = bp->unitNum;
- si->si_boff = bp->partNum;
- if ((error = prom_iopen(si)) != 0)
- return (error);
+ /*
+ * Setup our part of the saioreq.
+ * (determines what gets opened)
+ */
+ bp = *romp->bootParam;
+ si->si_boottab = bp->bootDevice;
+ si->si_ctlr = bp->ctlrNum;
+ si->si_unit = bp->unitNum;
+ si->si_boff = bp->partNum;
+ if ((error = prom_iopen(si)) != 0)
+ return (error);
}
disk_opencount++;
@@ -128,7 +128,7 @@ disk_strategy(devdata, flag, dblk, size, buf, rsize)
#ifdef DEBUG_PROM
if (debug > 1)
- printf("disk_strategy: size=%d dblk=%d\n", size, dblk);
+ printf("disk_strategy: size=%d dblk=%d\n", size, dblk);
#endif
dmabuf = dvma_mapin(buf, size);
@@ -140,10 +140,10 @@ disk_strategy(devdata, flag, dblk, size, buf, rsize)
*/
retry = RETRY_COUNT;
do {
- si->si_bn = dblk;
- si->si_ma = dmabuf;
- si->si_cc = size;
- xcnt = (*ops->b_strategy)(si, si_flag);
+ si->si_bn = dblk;
+ si->si_ma = dmabuf;
+ si->si_cc = size;
+ xcnt = (*ops->b_strategy)(si, si_flag);
} while ((xcnt <= 0) && (--retry > 0));
dvma_mapout(dmabuf, size);
diff --git a/sys/arch/sun3/stand/libsa/exec_sun.c b/sys/arch/sun3/stand/libsa/exec_sun.c
index c22e9db71a9..d14ac4000ae 100644
--- a/sys/arch/sun3/stand/libsa/exec_sun.c
+++ b/sys/arch/sun3/stand/libsa/exec_sun.c
@@ -1,4 +1,4 @@
-/* $NetBSD: exec_sun.c,v 1.5 1996/01/29 23:41:06 gwr Exp $ */
+/* $NetBSD: exec_sun.c,v 1.6 1996/06/20 03:59:41 gwr Exp $ */
/*-
* Copyright (c) 1982, 1986, 1990, 1993
@@ -89,12 +89,16 @@ exec_sun(file, loadaddr)
bcopy(&x, cp - sizeof(x), sizeof(x));
/*
- * Read in the text segment.
+ * Read in the text segment. Note:
+ * a.out header part of text in zmagic
*/
printf("%d", x.a_text);
- if (read(io, cp, x.a_text) != x.a_text)
+ cc = x.a_text;
+ if (magic == ZMAGIC)
+ cc -= sizeof(x);
+ if (read(io, cp, cc) != cc)
goto shread;
- cp += x.a_text;
+ cp += cc;
/*
* NMAGIC may have a gap between text and data.
diff --git a/sys/arch/sun3/stand/libsa/netif_sun.c b/sys/arch/sun3/stand/libsa/netif_sun.c
index f1d7753628a..a72d55e9428 100644
--- a/sys/arch/sun3/stand/libsa/netif_sun.c
+++ b/sys/arch/sun3/stand/libsa/netif_sun.c
@@ -404,7 +404,7 @@ netif_get(desc, pkt, maxlen, timo)
/* Have to receive into our own buffer and copy. */
do {
- tick0 = getticks();
+ tick0 = getticks();
do {
rlen = (*sif->sif_poll)(si->si_devdata, dd->rbuf);
if (rlen != 0)
diff --git a/sys/arch/sun3/stand/libsa/panic.c b/sys/arch/sun3/stand/libsa/panic.c
index 97fddd3e5ff..b8841ad1ad3 100644
--- a/sys/arch/sun3/stand/libsa/panic.c
+++ b/sys/arch/sun3/stand/libsa/panic.c
@@ -7,11 +7,11 @@ extern __dead void abort();
__dead void
panic(const char *fmt, ...)
{
- va_list ap;
+ va_list ap;
- va_start(ap, fmt);
+ va_start(ap, fmt);
vprintf(fmt, ap);
- printf("\n");
- va_end(ap);
+ printf("\n");
+ va_end(ap);
abort();
}
diff --git a/sys/arch/sun3/stand/libsa/promdev.c b/sys/arch/sun3/stand/libsa/promdev.c
index 130e4d8cb28..35fe364c1c5 100644
--- a/sys/arch/sun3/stand/libsa/promdev.c
+++ b/sys/arch/sun3/stand/libsa/promdev.c
@@ -77,7 +77,7 @@ prom_iopen(si)
printf("d_localbytes=%d\n", dip->d_localbytes);
printf("d_stdcount=%d\n", dip->d_stdcount);
printf("d_stdaddrs[%d]=%x\n", si->si_ctlr,
- dip->d_stdaddrs[si->si_ctlr]);
+ dip->d_stdaddrs[si->si_ctlr]);
printf("d_devtype=%d\n", dip->d_devtype);
printf("d_maxiobytes=%d\n", dip->d_maxiobytes);
}
@@ -96,7 +96,7 @@ prom_iopen(si)
#ifdef DEBUG_PROM
if (debug)
printf("prom_iopen: devaddr=0x%x pte=0x%x\n",
- si->si_devaddr, get_pte(si->si_devaddr));
+ si->si_devaddr, get_pte(si->si_devaddr));
#endif
}
@@ -109,7 +109,7 @@ prom_iopen(si)
si->si_dmaaddr = (char*) addr;
#ifdef DEBUG_PROM
if (debug)
- printf("prom_iopen: dmaaddr=0x%x\n", si->si_dmaaddr);
+ printf("prom_iopen: dmaaddr=0x%x\n", si->si_dmaaddr);
#endif
}
@@ -122,6 +122,10 @@ prom_iopen(si)
}
/* OK, call the PROM device open routine. */
+#ifdef DEBUG_PROM
+ if (debug)
+ printf("prom_iopen: calling prom open...\n");
+#endif
error = (*ops->b_open)(si);
if (error != 0) {
printf("prom_iopen: \"%s\" error=%d\n",
diff --git a/sys/arch/sun3/stand/netboot/dev_net.c b/sys/arch/sun3/stand/netboot/dev_net.c
index 069b58ab519..e159174c267 100644
--- a/sys/arch/sun3/stand/netboot/dev_net.c
+++ b/sys/arch/sun3/stand/netboot/dev_net.c
@@ -139,8 +139,8 @@ net_open(struct open_file *f, ...)
fail:
netif_close(netdev_sock);
netdev_sock = -1;
- return (error);
- }
+ return (error);
+ }
if (debug)
printf("net_open: NFS mount succeeded\n");
}
diff --git a/sys/arch/sun3/stand/netboot/version.c b/sys/arch/sun3/stand/netboot/version.c
index aa92d773181..d98db932634 100644
--- a/sys/arch/sun3/stand/netboot/version.c
+++ b/sys/arch/sun3/stand/netboot/version.c
@@ -4,4 +4,4 @@
* NOTE ANY CHANGES YOU MAKE TO THE BOOTBLOCKS HERE.
*/
-char *version = "$Revision: 1.3 $";
+char *version = "$Revision: 1.4 $";
diff --git a/sys/arch/sun3/stand/ufsboot/version.c b/sys/arch/sun3/stand/ufsboot/version.c
index 24bd2f33d1e..1f8b884dcd6 100644
--- a/sys/arch/sun3/stand/ufsboot/version.c
+++ b/sys/arch/sun3/stand/ufsboot/version.c
@@ -4,4 +4,4 @@
* NOTE ANY CHANGES YOU MAKE TO THE BOOTBLOCKS HERE.
*/
-char *version = "$Revision: 1.1 $";
+char *version = "$Revision: 1.2 $";
diff --git a/sys/arch/sun3/sun3/conf.c b/sys/arch/sun3/sun3/conf.c
index 7197e571f31..f7e6e088c3d 100644
--- a/sys/arch/sun3/sun3/conf.c
+++ b/sys/arch/sun3/sun3/conf.c
@@ -164,9 +164,6 @@ cdev_decl(bpf);
#include "tun.h"
cdev_decl(tun);
-#include "random.h"
-cdev_decl(random);
-
dev_decl(filedesc,open);
@@ -244,7 +241,6 @@ struct cdevsw cdevsw[] =
cdev_notdef(), /* 69: /dev/audio */
cdev_notdef(), /* 70: open prom */
cdev_notdef(), /* 71: (sg?) */
- cdev_random_init(NRANDOM,random), /* 72: random data source */
};
int nchrdev = sizeof(cdevsw) / sizeof(cdevsw[0]);
diff --git a/sys/arch/sun3/sun3/db_memrw.c b/sys/arch/sun3/sun3/db_memrw.c
index 59db0e08a79..459ce4c5252 100644
--- a/sys/arch/sun3/sun3/db_memrw.c
+++ b/sys/arch/sun3/sun3/db_memrw.c
@@ -1,4 +1,4 @@
-/* $NetBSD: db_memrw.c,v 1.11 1996/02/20 02:42:55 gwr Exp $ */
+/* $NetBSD: db_memrw.c,v 1.12 1996/06/17 15:40:48 gwr Exp $ */
/*
* Copyright (c) 1996 Gordon W. Ross
@@ -29,6 +29,8 @@
/*
* Interface to the debugger for virtual memory read/write.
+ * This file is shared by DDB and KGDB, and must work even
+ * when only KGDB is included (thus no db_printf calls).
*
* To write in the text segment, we have to first make
* the page writable, do the write, then restore the PTE.
@@ -130,7 +132,7 @@ db_write_text(addr, size, data)
#endif
oldpte = get_pte(pgva);
if ((oldpte & PG_VALID) == 0) {
- db_printf(" address 0x%x not a valid page\n", dst);
+ printf(" address 0x%x not a valid page\n", dst);
return;
}
tmppte = oldpte | PG_WRITE | PG_NC;
diff --git a/sys/arch/sun3/sun3/disksubr.c b/sys/arch/sun3/sun3/disksubr.c
index fb78c2014e9..42864e70294 100644
--- a/sys/arch/sun3/sun3/disksubr.c
+++ b/sys/arch/sun3/sun3/disksubr.c
@@ -1,4 +1,4 @@
-/* $NetBSD: disksubr.c,v 1.12 1996/04/26 18:37:58 gwr Exp $ */
+/* $NetBSD: disksubr.c,v 1.13 1996/05/05 06:00:31 gwr Exp $ */
/*
* Copyright (c) 1994, 1995 Gordon W. Ross
@@ -279,15 +279,12 @@ bad:
* additional "device registration" types of work. (?)
* For example, the sparc port uses this to record the
* device node for the PROM-specified boot device.
- *
- * XXX: return value not documented (ignored everywhere)
*/
void
dk_establish(dk, dev)
struct disk *dk;
struct device *dev;
{
- return;
}
/************************************************************************
diff --git a/sys/arch/sun3/sun3/kgdb_proto.h b/sys/arch/sun3/sun3/kgdb_proto.h
new file mode 100644
index 00000000000..c1bd32be99c
--- /dev/null
+++ b/sys/arch/sun3/sun3/kgdb_proto.h
@@ -0,0 +1,74 @@
+/* $NetBSD: kgdb_proto.h,v 1.1 1996/06/15 14:34:37 gwr Exp $ */
+
+/*
+ * Copyright (c) 1992, 1993
+ * The Regents of the University of California. All rights reserved.
+ * Copyright (c) 1995
+ * The President and Fellows of Harvard College. All rights reserved.
+ *
+ * This software was developed by the Computer Systems Engineering group
+ * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
+ * contributed to Berkeley.
+ *
+ * All advertising materials mentioning features or use of this software
+ * must display the following acknowledgements:
+ * This product includes software developed by the University of
+ * California, Lawrence Berkeley Laboratory.
+ *
+ * This product includes software developed by Harvard University.
+ *
+ * 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 University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University 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 REGENTS 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 REGENTS 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.
+ *
+ * @(#)kgdb_proto.h 8.1 (Berkeley) 6/11/93
+ */
+
+/*
+ * Message types.
+ */
+#define KGDB_MEM_R 0x01
+#define KGDB_MEM_W 0x02
+#define KGDB_REG_R 0x03
+#define KGDB_REG_W 0x04
+#define KGDB_CONT 0x05
+#define KGDB_STEP 0x06
+#define KGDB_KILL 0x07
+#define KGDB_SIGNAL 0x08
+#define KGDB_EXEC 0x09
+#define KGDB_HALT 0x0a
+#define KGDB_BOOT 0x0b
+
+#define KGDB_CMD(x) ((x) & 0x0f)
+
+/*
+ * Message flags.
+ */
+#define KGDB_ACK 0x80
+#define KGDB_DELTA 0x40
+#define KGDB_MORE 0x20
+#define KGDB_SEQ 0x10
diff --git a/sys/arch/sun3/sun3/kgdb_stub.c b/sys/arch/sun3/sun3/kgdb_stub.c
new file mode 100644
index 00000000000..875bdeea18b
--- /dev/null
+++ b/sys/arch/sun3/sun3/kgdb_stub.c
@@ -0,0 +1,623 @@
+/* $NetBSD: kgdb_stub.c,v 1.2 1996/06/15 14:47:49 gwr Exp $ */
+
+/*
+ * Copyright (c) 1990, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This software was developed by the Computer Systems Engineering group
+ * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
+ * contributed to Berkeley.
+ *
+ * All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Lawrence Berkeley Laboratories.
+ *
+ * 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 University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University 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 REGENTS 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 REGENTS 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.
+ *
+ * @(#)kgdb_stub.c 8.4 (Berkeley) 1/12/94
+ */
+
+/*
+ * "Stub" to allow remote cpu to debug over a serial line using gdb.
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+
+#include <vm/vm.h>
+#include <vm/vm_extern.h>
+
+#include <machine/control.h>
+#include <machine/cpu.h>
+#include <machine/frame.h>
+#include <machine/psl.h>
+#include <machine/pte.h>
+#include <machine/reg.h>
+#include <machine/trap.h>
+
+#include <sun3/sun3/kgdb_proto.h>
+#include <machine/remote-sl.h>
+
+/* These are in db_memrw.c */
+extern void db_read_bytes __P((vm_offset_t addr, size_t size, char *data));
+extern void db_write_bytes __P((vm_offset_t addr, size_t size, char *data));
+
+#ifndef KGDBDEV
+#define KGDBDEV -1
+#endif
+#ifndef KGDBRATE
+#define KGDBRATE 19200
+#endif
+
+int kgdb_dev = KGDBDEV; /* remote debugging device (-1 if none) */
+int kgdb_rate = KGDBRATE; /* remote debugging baud rate */
+int kgdb_active = 0; /* remote debugging active if != 0 */
+int kgdb_debug_init = 0; /* != 0 waits for remote at system init */
+int kgdb_debug_panic = 0; /* != 0 waits for remote on panic */
+
+static void kgdb_send __P((u_int, u_char *, int));
+static int kgdb_recv __P((u_char *, int *));
+static int computeSignal __P((int));
+int kgdb_trap __P((int, struct trapframe *));
+int kgdb_acc __P((caddr_t, int));
+
+static int (*kgdb_getc) __P((void *));
+static void (*kgdb_putc) __P((void *, int));
+static void *kgdb_ioarg;
+
+#define GETC() ((*kgdb_getc)(kgdb_ioarg))
+#define PUTC(c) ((*kgdb_putc)(kgdb_ioarg, c))
+#define PUTESC(c) do { \
+ if (c == FRAME_END) { \
+ PUTC(FRAME_ESCAPE); \
+ c = TRANS_FRAME_END; \
+ } else if (c == FRAME_ESCAPE) { \
+ PUTC(FRAME_ESCAPE); \
+ c = TRANS_FRAME_ESCAPE; \
+ } else if (c == FRAME_START) { \
+ PUTC(FRAME_ESCAPE); \
+ c = TRANS_FRAME_START; \
+ } \
+ PUTC(c); \
+} while (0)
+
+/*
+ * This is called by the approprite tty driver.
+ * In our case, by dev/zs_kgdb.c:zs_kgdb_init()
+ */
+void
+kgdb_attach(getfn, putfn, ioarg)
+ int (*getfn) __P((void *));
+ void (*putfn) __P((void *, int));
+ void *ioarg;
+{
+
+ kgdb_getc = getfn;
+ kgdb_putc = putfn;
+ kgdb_ioarg = ioarg;
+}
+
+/*
+ * Send a message. The host gets one chance to read it.
+ */
+static void
+kgdb_send(type, bp, len)
+ register u_int type;
+ register u_char *bp;
+ register int len;
+{
+ register u_char csum;
+ register u_char *ep = bp + len;
+
+ PUTC(FRAME_START);
+ PUTESC(type);
+
+ csum = type;
+ while (bp < ep) {
+ type = *bp++;
+ csum += type;
+ PUTESC(type);
+ }
+ csum = -csum;
+ PUTESC(csum);
+ PUTC(FRAME_END);
+}
+
+static int
+kgdb_recv(bp, lenp)
+ u_char *bp;
+ int *lenp;
+{
+ register u_char c, csum;
+ register int escape, len;
+ register int type;
+
+restart:
+ csum = len = escape = 0;
+ type = -1;
+ while (1) {
+ c = GETC();
+ switch (c) {
+
+ case FRAME_ESCAPE:
+ escape = 1;
+ continue;
+
+ case TRANS_FRAME_ESCAPE:
+ if (escape)
+ c = FRAME_ESCAPE;
+ break;
+
+ case TRANS_FRAME_END:
+ if (escape)
+ c = FRAME_END;
+ break;
+
+ case TRANS_FRAME_START:
+ if (escape)
+ c = FRAME_START;
+ break;
+
+ case FRAME_START:
+ goto restart;
+
+ case FRAME_END:
+ if (type < 0 || --len < 0) {
+ csum = len = escape = 0;
+ type = -1;
+ continue;
+ }
+ if (csum != 0)
+ return (0);
+ *lenp = len;
+ return (type);
+ }
+ csum += c;
+ if (type < 0) {
+ type = c;
+ escape = 0;
+ continue;
+ }
+ if (++len > SL_RPCSIZE) {
+ while (GETC() != FRAME_END)
+ continue;
+ return (0);
+ }
+ *bp++ = c;
+ escape = 0;
+ }
+}
+
+/*
+ * Translate a trap number into a unix compatible signal value.
+ * (gdb only understands unix signal numbers).
+ */
+static int
+computeSignal(type)
+ int type;
+{
+ int sigval;
+
+ switch (type) {
+ case T_BUSERR:
+ sigval = SIGBUS;
+ break;
+ case T_ADDRERR:
+ sigval = SIGBUS;
+ break;
+ case T_ILLINST:
+ sigval = SIGILL;
+ break;
+ case T_ZERODIV:
+ sigval = SIGFPE;
+ break;
+ case T_CHKINST:
+ sigval = SIGFPE;
+ break;
+ case T_TRAPVINST:
+ sigval = SIGFPE;
+ break;
+ case T_PRIVINST:
+ sigval = SIGILL;
+ break;
+ case T_TRACE:
+ sigval = SIGTRAP;
+ break;
+ case T_MMUFLT:
+ sigval = SIGSEGV;
+ break;
+ case T_SSIR:
+ sigval = SIGSEGV;
+ break;
+ case T_FMTERR:
+ sigval = SIGILL;
+ break;
+ case T_FPERR:
+ sigval = SIGFPE;
+ break;
+ case T_COPERR:
+ sigval = SIGFPE;
+ break;
+ case T_ASTFLT:
+ sigval = SIGINT;
+ break;
+ case T_TRAP15:
+ sigval = SIGTRAP;
+ break;
+ default:
+ sigval = SIGEMT;
+ break;
+ }
+ return (sigval);
+}
+
+/*
+ * Trap into kgdb to wait for debugger to connect,
+ * noting on the console why nothing else is going on.
+ */
+void
+kgdb_connect(verbose)
+ int verbose;
+{
+
+ if (kgdb_dev < 0 || kgdb_getc == NULL)
+ return;
+ fb_unblank();
+ if (verbose)
+ printf("kgdb waiting...");
+ Debugger(); /* XXX: trap into kgdb */
+ if (verbose)
+ printf("connected.\n");
+}
+
+/*
+ * Decide what to do on panic.
+ * (This is called by panic, like Debugger())
+ */
+void
+kgdb_panic()
+{
+
+ if (kgdb_dev >= 0 && kgdb_getc != NULL &&
+ kgdb_active == 0 && kgdb_debug_panic)
+ {
+ /* XXX: Just call Debugger() instead? */
+ kgdb_connect(1);
+ }
+}
+
+/*
+ * Definitions exported from gdb.
+ */
+#define NUM_REGS 18
+#define REGISTER_BYTES (NUM_REGS * 4)
+#define REGISTER_BYTE(n) ((n) * 4)
+
+#define GDB_SR 16
+#define GDB_PC 17
+
+/*
+ * This little routine exists simply so that bcopy() can be debugged.
+ */
+static void
+kgdb_copy(vsrc, vdst, len)
+ void *vsrc, *vdst;
+ register int len;
+{
+ register char *src = vsrc;
+ register char *dst = vdst;
+
+ while (--len >= 0)
+ *dst++ = *src++;
+}
+
+/* ditto for bzero */
+static void
+kgdb_zero(vptr, len)
+ void *vptr;
+ register int len;
+{
+ register char *ptr = vptr;
+
+ while (--len >= 0)
+ *ptr++ = (char) 0;
+}
+
+/*
+ * Translate the values stored in the kernel regs struct to the format
+ * understood by gdb.
+ *
+ * There is a short pad word between SP (A7) and SR which keeps the
+ * kernel stack long word aligned (note that this is in addition to
+ * the stack adjust short that we treat as the upper half of a longword
+ * SR). We must skip this when copying into and out of gdb.
+ */
+static void
+regs_to_gdb(tf, gdb_regs)
+ struct trapframe *tf;
+ u_long *gdb_regs;
+{
+ kgdb_copy(tf->tf_regs, gdb_regs, 16*4);
+ gdb_regs[GDB_SR] = tf->tf_sr;
+ gdb_regs[GDB_PC] = tf->tf_pc;
+}
+
+/*
+ * Reverse the above.
+ */
+static void
+gdb_to_regs(tf, gdb_regs)
+ struct trapframe *tf;
+ u_long *gdb_regs;
+{
+ kgdb_copy(gdb_regs, tf->tf_regs, 16*4);
+ tf->tf_sr = gdb_regs[GDB_SR];
+ tf->tf_pc = gdb_regs[GDB_PC];
+}
+
+static u_long reg_cache[NUM_REGS];
+static u_char inbuffer[SL_RPCSIZE];
+static u_char outbuffer[SL_RPCSIZE];
+
+/*
+ * This function does all command procesing for interfacing to
+ * a remote gdb.
+ */
+int
+kgdb_trap(type, tf)
+ int type;
+ struct trapframe *tf;
+{
+ register u_long len;
+ caddr_t addr;
+ register u_char *cp;
+ register u_char out, in;
+ register int outlen;
+ int inlen;
+ u_long gdb_regs[NUM_REGS];
+
+ if (kgdb_dev < 0 || kgdb_getc == NULL) {
+ /* not debugging */
+ return (0);
+ }
+ if (kgdb_active == 0) {
+ if (type != T_BREAKPOINT) {
+ /* No debugger active -- let trap handle this. */
+ return (0);
+ }
+
+ /*
+ * If the packet that woke us up isn't an exec packet,
+ * ignore it since there is no active debugger. Also,
+ * we check that it's not an ack to be sure that the
+ * remote side doesn't send back a response after the
+ * local gdb has exited. Otherwise, the local host
+ * could trap into gdb if it's running a gdb kernel too.
+ */
+ in = GETC();
+ /*
+ * If we came in asynchronously through the serial line,
+ * the framing character is eaten by the receive interrupt,
+ * but if we come in through a synchronous trap (i.e., via
+ * kgdb_connect()), we will see the extra character.
+ */
+ if (in == FRAME_START)
+ in = GETC();
+
+ /*
+ * Check that this is a debugger exec message. If so,
+ * slurp up the entire message then ack it, and fall
+ * through to the recv loop.
+ */
+ if (KGDB_CMD(in) != KGDB_EXEC || (in & KGDB_ACK) != 0)
+ return (0);
+ while (GETC() != FRAME_END)
+ continue;
+ /*
+ * Do the printf *before* we ack the message. This way
+ * we won't drop any inbound characters while we're
+ * doing the polling printf.
+ */
+ printf("kgdb started from device %x\n", kgdb_dev);
+ kgdb_send(in | KGDB_ACK, (u_char *)0, 0);
+ kgdb_active = 1;
+ }
+ /*
+ * Stick frame regs into our reg cache then tell remote host
+ * that an exception has occured.
+ */
+ regs_to_gdb(tf, gdb_regs);
+ if (type != T_BREAKPOINT) {
+ /*
+ * XXX - Which is right? The code or the comment? -gwr
+ * Only send an asynchronous SIGNAL message when we hit
+ * a breakpoint. Otherwise, we will drop the incoming
+ * packet while we output this one (and on entry the other
+ * side isn't interested in the SIGNAL type -- if it is,
+ * it will have used a signal packet.)
+ */
+ outbuffer[0] = computeSignal(type);
+ kgdb_send(KGDB_SIGNAL, outbuffer, 1);
+ }
+
+ for (;;) {
+ in = kgdb_recv(inbuffer, &inlen);
+ if (in == 0 || (in & KGDB_ACK))
+ /* Ignore inbound acks and error conditions. */
+ continue;
+
+ out = in | KGDB_ACK;
+ switch (KGDB_CMD(in)) {
+
+ case KGDB_SIGNAL:
+ /*
+ * if this command came from a running gdb,
+ * answer it -- the other guy has no way of
+ * knowing if we're in or out of this loop
+ * when he issues a "remote-signal". (Note
+ * that without the length check, we could
+ * loop here forever if the output line is
+ * looped back or the remote host is echoing.)
+ */
+ if (inlen == 0) {
+ outbuffer[0] = computeSignal(type);
+ kgdb_send(KGDB_SIGNAL, outbuffer, 1);
+ }
+ continue;
+
+ case KGDB_REG_R:
+ case KGDB_REG_R | KGDB_DELTA:
+ cp = outbuffer;
+ outlen = 0;
+ for (len = inbuffer[0]; len < NUM_REGS; ++len) {
+ if (reg_cache[len] != gdb_regs[len] ||
+ (in & KGDB_DELTA) == 0) {
+ if (outlen + 5 > SL_MAXDATA) {
+ out |= KGDB_MORE;
+ break;
+ }
+ cp[outlen] = len;
+ kgdb_copy(&gdb_regs[len],
+ &cp[outlen + 1], 4);
+ reg_cache[len] = gdb_regs[len];
+ outlen += 5;
+ }
+ }
+ break;
+
+ case KGDB_REG_W:
+ case KGDB_REG_W | KGDB_DELTA:
+ cp = inbuffer;
+ for (len = 0; len < inlen; len += 5) {
+ register int j = cp[len];
+
+ kgdb_copy(&cp[len + 1],
+ &gdb_regs[j], 4);
+ reg_cache[j] = gdb_regs[j];
+ }
+ gdb_to_regs(tf, gdb_regs);
+ outlen = 0;
+ break;
+
+ case KGDB_MEM_R:
+ len = inbuffer[0];
+ kgdb_copy(&inbuffer[1], &addr, 4);
+ if (len > SL_MAXDATA) {
+ outlen = 1;
+ outbuffer[0] = E2BIG;
+ } else if (!kgdb_acc(addr, len)) {
+ outlen = 1;
+ outbuffer[0] = EFAULT;
+ } else {
+ outlen = len + 1;
+ outbuffer[0] = 0;
+ db_read_bytes((vm_offset_t)addr, (size_t)len,
+ (char *)&outbuffer[1]);
+ }
+ break;
+
+ case KGDB_MEM_W:
+ len = inlen - 4;
+ kgdb_copy(inbuffer, &addr, 4);
+ outlen = 1;
+ if (!kgdb_acc(addr, len))
+ outbuffer[0] = EFAULT;
+ else {
+ outbuffer[0] = 0;
+ db_write_bytes((vm_offset_t)addr, (size_t)len,
+ (char *)&inbuffer[4]);
+ }
+ break;
+
+ case KGDB_KILL:
+ kgdb_active = 0;
+ printf("kgdb detached\n");
+ /* FALLTHROUGH */
+
+ case KGDB_CONT:
+ kgdb_send(out, 0, 0);
+ tf->tf_sr &=~ PSL_T;
+ goto out;
+
+ case KGDB_STEP:
+ kgdb_send(out, 0, 0);
+ tf->tf_sr |= PSL_T;
+ goto out;
+
+ case KGDB_HALT:
+ kgdb_send(out, 0, 0);
+ sun3_mon_halt();
+ /* NOTREACHED */
+
+ case KGDB_BOOT:
+ kgdb_send(out, 0, 0);
+ sun3_mon_reboot("");
+ /* NOTREACHED */
+
+ case KGDB_EXEC:
+ default:
+ /* Unknown command. Ack with a null message. */
+ outlen = 0;
+ break;
+ }
+ /* Send the reply */
+ kgdb_send(out, outbuffer, outlen);
+ }
+out:
+ return (1);
+}
+
+/*
+ * XXX: Determine if the memory at addr..(addr+len) is valid.
+ * XXX: Should we just use the PTE bits? Why not?
+ * XXX: Better yet, setup a fault handler?
+ */
+kgdb_acc(addr, len)
+ caddr_t addr;
+ int len;
+{
+ vm_offset_t va;
+ int pte, pgoff;
+
+ va = (vm_offset_t) addr;
+ pgoff = va & PGOFSET;
+ va -= pgoff;
+ len += pgoff;
+
+ do {
+ pte = get_pte(va);
+ if ((pte & PG_VALID) == 0)
+ return (0);
+ va += NBPG;
+ len -= NBPG;
+ } while (len > 0);
+
+ return (1);
+}
diff --git a/sys/arch/sun3/sun3/locore.s b/sys/arch/sun3/sun3/locore.s
index b7f384f7d59..c677314e0dd 100644
--- a/sys/arch/sun3/sun3/locore.s
+++ b/sys/arch/sun3/sun3/locore.s
@@ -1,4 +1,4 @@
-/* $NetBSD: locore.s,v 1.38 1996/04/07 05:42:17 gwr Exp $ */
+/* $NetBSD: locore.s,v 1.39 1996/06/17 15:40:52 gwr Exp $ */
/*
* Copyright (c) 1994, 1995 Gordon W. Ross
@@ -530,13 +530,14 @@ _trap15:
jne kbrkpt | yes, kernel breakpoint
jra fault | no, user-mode fault
-kbrkpt: | Kernel-mode breakpoint or trace trap.
- | Save system sp rather than user sp.
+kbrkpt: | Kernel-mode breakpoint or trace trap. (d0=trap_type)
+ | Save the system sp rather than the user sp.
+ movw #PSL_HIGHIPL,sr | lock out interrupts
lea sp@(FR_SIZE),a6 | Save stack pointer
movl a6,sp@(FR_SP) | from before trap
| If we are not on tmpstk switch to it.
- | (allows debugger to frob the stack)
+ | (so debugger can change the stack pointer)
movl a6,d1
cmpl #tmpstk,d1
jls Lbrkpt2 | already on tmpstk
@@ -551,13 +552,39 @@ Lbrkpt1:
bgt Lbrkpt1
Lbrkpt2:
- | Now call the trap handler as usual.
- clrl sp@- | no VA arg
- clrl sp@- | or code arg
- movl d0,sp@- | push trap type
- jbsr _trap | handle trap
- lea sp@(12),sp | pop value args
-
+ | Call the trap handler for the kernel debugger.
+ | Do not call trap() to do it, so that we can
+ | set breakpoints in trap() if we want. We know
+ | the trap type is either T_TRACE or T_BREAKPOINT.
+ | If we have both DDB and KGDB, let KGDB see it first,
+ | because KGDB will just return 0 if not connected.
+ | Save args in d2, a2
+ movl d0,d2 | trap type
+ movl sp,a2 | frame ptr
+#ifdef KGDB
+ | Let KGDB handle it (if connected)
+ movl a2,sp@- | push frame ptr
+ movl d2,sp@- | push trap type
+ jbsr _kgdb_trap | handle the trap
+ addql #8,sp | pop args
+ cmpl #0,d0 | did kgdb handle it
+ jne Lbrkpt3 | yes, done
+#endif
+#ifdef DDB
+ | Let DDB handle it.
+ movl a2,sp@- | push frame ptr
+ movl d2,sp@- | push trap type
+ jbsr _kdb_trap | handle the trap
+ addql #8,sp | pop args
+ cmpl #0,d0 | did ddb handle it
+ jne Lbrkpt3 | yes, done
+#endif
+ | Drop into the PROM temporarily...
+ movl a2,sp@- | push frame ptr
+ movl d2,sp@- | push trap type
+ jbsr _nodb_trap | handle the trap
+ addql #8,sp | pop args
+Lbrkpt3:
| The stack pointer may have been modified, or
| data below it modified (by kgdb push call),
| so push the hardware frame at the current sp
diff --git a/sys/arch/sun3/sun3/pmap.c b/sys/arch/sun3/sun3/pmap.c
index 8395d0e08cc..c6dcd50f671 100644
--- a/sys/arch/sun3/sun3/pmap.c
+++ b/sys/arch/sun3/sun3/pmap.c
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.c,v 1.60 1996/02/28 22:51:05 gwr Exp $ */
+/* $NetBSD: pmap.c,v 1.61 1996/05/05 06:02:31 gwr Exp $ */
/*
* Copyright (c) 1994, 1995 Gordon W. Ross
@@ -3218,6 +3218,55 @@ pmap_prefer(fo, va)
}
/*
+ * Copy the kernel segmap into the passed buffer (256 bytes).
+ */
+void
+pmap_get_ksegmap(vaddr)
+ vm_offset_t vaddr;
+{
+ vm_offset_t va;
+ u_char *cp = (u_char*)vaddr;
+
+ va = KERNBASE;
+ do {
+ *cp = get_segmap(va);
+ cp++;
+ va += NBSG;
+ } while (va < 0x10000000);
+}
+
+/*
+ * Copy the pagemap RAM into the passed buffer (one page)
+ * starting at OFF in the pagemap RAM.
+ */
+void
+pmap_get_pagemap(vaddr, off)
+ vm_offset_t vaddr;
+ int off;
+{
+ vm_offset_t va, va_end;
+ int sme, sme_end; /* SegMap Entry numbers */
+ int *pt;
+
+ pt = (int*)vaddr; /* destination */
+ sme = (off >> 6); /* PMEG to start on */
+ sme_end = sme + 128; /* where to stop */
+ va_end = temp_seg_va + NBSG;
+
+ do {
+ set_segmap(temp_seg_va, sme);
+ va = temp_seg_va;
+ do {
+ *pt++ = get_pte(va);
+ va += NBPG;
+ } while (va < va_end);
+ sme++;
+ } while (sme < sme_end);
+ set_segmap(temp_seg_va, SEGINV);
+}
+
+
+/*
* Helper functions for changing unloaded PMEGs
*/
static int temp_seg_inuse;
diff --git a/sys/arch/sun3/sun3/stub.c b/sys/arch/sun3/sun3/stub.c
index fda67bc9b24..aed10463c2b 100644
--- a/sys/arch/sun3/sun3/stub.c
+++ b/sys/arch/sun3/sun3/stub.c
@@ -1,4 +1,4 @@
-/* $NetBSD: stub.c,v 1.11 1996/03/26 15:16:55 gwr Exp $ */
+/* $NetBSD: stub.c,v 1.12 1996/06/17 15:41:02 gwr Exp $ */
/*
* Copyright (c) 1996 Gordon W. Ross
@@ -44,18 +44,15 @@ void swapgeneric() {}
* XXX: isr.c:netintr() - move to conf.c?
*/
-/* sun3_startup.c */
-#if !defined(DDB) && !defined(KGDB)
/*
* When DDB is included, Debugger() comes from db_interface.c
- * otherwise provide this function. This will just stop in
- * the Sun PROM monitor. (You can look around, or continue.)
+ * otherwise we get the one compiled here.
*/
-void Debugger()
+#ifndef DDB
+void
+Debugger()
{
- sun3_mon_abort();
+ __asm ("trap #15");
}
-#endif /* !DDB && !KGDB */
-
-/* sys_machdep.c */
-/* trap.c */
+#endif /* !DDB */
+
diff --git a/sys/arch/sun3/sun3/sun3_startup.c b/sys/arch/sun3/sun3/sun3_startup.c
index d0ce50b7dc0..fc96feb35ad 100644
--- a/sys/arch/sun3/sun3/sun3_startup.c
+++ b/sys/arch/sun3/sun3/sun3_startup.c
@@ -1,4 +1,4 @@
-/* $NetBSD: sun3_startup.c,v 1.51 1996/03/26 15:16:59 gwr Exp $ */
+/* $NetBSD: sun3_startup.c,v 1.52 1996/05/05 06:02:37 gwr Exp $ */
/*
* Copyright (c) 1994 Gordon W. Ross
@@ -93,6 +93,9 @@ vm_offset_t proc0_user_pa;
struct user *proc0paddr; /* proc[0] pcb address (u-area VA) */
extern struct pcb *curpcb;
+extern vm_offset_t dumppage_pa;
+extern vm_offset_t dumppage_va;
+
/*
* Switch to our own interrupt vector table.
*/
@@ -396,14 +399,16 @@ void sun3_vm_init(kehp)
/*
* Virtual and physical pages for proc[0] u-area (already mapped)
- * XXX - Make these non-cached at their full-time mapping address.
- * XXX - Still need to do that? -gwr
*/
proc0paddr = (struct user *) virtual_avail;
proc0_user_pa = avail_start;
virtual_avail += UPAGES*NBPG;
- avail_start += UPAGES*NBPG;
- /* Make them non-cached. */
+ avail_start += UPAGES*NBPG;
+#if 0
+ /* Make them non-cached.
+ * XXX - Make these non-cached at their full-time mapping address.
+ * XXX - Still need to do that? -gwr
+ */
va = (vm_offset_t) proc0paddr;
while (va < virtual_avail) {
pte = get_pte(va);
@@ -411,6 +416,15 @@ void sun3_vm_init(kehp)
set_pte(va, pte);
va += NBPG;
}
+#endif
+
+ /*
+ * Virtual and physical page used by dumpsys()
+ */
+ dumppage_va = virtual_avail;
+ dumppage_pa = avail_start;
+ virtual_avail += NBPG;
+ avail_start += NBPG;
/*
* XXX - Make sure avail_start is within the low 1M range
@@ -749,34 +763,39 @@ char *str;
/*
* Set the PROM vector handler (for g0, g4, etc.)
* and set boothowto from the PROM arg strings.
+ *
+ * Note, args are always:
+ * argv[0] = boot_device (i.e. "sd(0,0,0)")
+ * argv[1] = options (i.e. "-ds" or NULL)
+ * argv[2] = NULL
*/
void sun3_monitor_hooks()
{
MachMonBootParam *bpp;
+ char **argp;
char *p;
- int i;
if (romp->romvecVersion >= 2)
*romp->vector_cmd = v_handler;
/* Set boothowto flags from PROM args. */
bpp = *romp->bootParam;
- for (i = 0; i < 8; i++) {
- p = bpp->argPtr[i];
+ argp = bpp->argPtr;
- /* Null arg? We're done. */
- if (p == NULL || *p == '\0')
- break;
+ /* Skip argp[0] (the device string) */
+ argp++;
+
+ /* Have options? */
+ if (*argp == NULL)
+ return;
+ p = *argp;
+ if (*p == '-') {
+ /* yes, parse options */
#ifdef DEBUG
- mon_printf("arg[%d]=\"%s\"\n", i, p);
+ mon_printf("boot option: %s\n", p);
#endif
-
- /* Not switches? Skip it. */
- if (*p++ != '-')
- continue;
-
- while (*p) {
- switch (*p++) {
+ for (++p; *p; p++) {
+ switch (*p) {
case 'a':
boothowto |= RB_ASKNAME;
break;
@@ -788,24 +807,18 @@ void sun3_monitor_hooks()
break;
}
}
+ argp++;
}
+
#ifdef DEBUG
- mon_printf("boothowto=0x%x\n", boothowto);
+ /* Have init name? */
+ if (*argp == NULL)
+ return;
+ p = *argp;
+ mon_printf("boot initpath: %s\n", p);
#endif
}
-void set_interrupt_reg(value)
- unsigned int value;
-{
- *interrupt_reg = (unsigned char) value;
-}
-
-unsigned int get_interrupt_reg()
-{
- vm_offset_t pte;
- return (unsigned int) *interrupt_reg;
-}
-
/*
* Find mappings for devices that are needed before autoconfiguration.
* First the obio module finds and records useful PROM mappings, then
diff --git a/sys/arch/sun3/sun3/trap.c b/sys/arch/sun3/sun3/trap.c
index 6c5cbd12cc1..5ea98fda4d4 100644
--- a/sys/arch/sun3/sun3/trap.c
+++ b/sys/arch/sun3/sun3/trap.c
@@ -1,4 +1,4 @@
-/* $NetBSD: trap.c,v 1.56 1996/03/21 23:03:49 gwr Exp $ */
+/* $NetBSD: trap.c,v 1.57 1996/06/17 15:41:05 gwr Exp $ */
/*
* Copyright (c) 1994 Gordon W. Ross
@@ -224,22 +224,26 @@ trap(type, code, v, frame)
p->p_md.md_regs = frame.f_regs;
}
-#ifdef DDB
- if (type == T_TRACE || type == T_BREAKPOINT) {
- (void)splhigh(); /* XXX - return will restore it */
- if (kdb_trap(type, &frame))
- return;
- }
-#endif
-
switch (type) {
default:
dopanic:
printf("trap type=0x%x, code=0x%x, v=0x%x\n", type, code, v);
+ /*
+ * Let the kernel debugger see the trap frame that
+ * caused us to panic. This is a convenience so
+ * one can see registers at the point of failure.
+ */
+ sig = splhigh();
+#ifdef KGDB
+ /* If connected, step or cont returns 1 */
+ if (kgdb_trap(type, &frame))
+ goto kgdb_cont;
+#endif
#ifdef DDB
- if (kdb_trap(type, &frame))
- return;
+ (void) kdb_trap(type, &frame);
#endif
+ kgdb_cont:
+ splx(sig);
if (panicstr) {
printf("trap during panic!\n");
sun3_mon_abort();
@@ -354,12 +358,14 @@ trap(type, code, v, frame)
* HPBSD and HP-UX traps both get mapped by locore.s into T_TRACE.
* SUN 3.x traps get passed through as T_TRAP15 and are not really
* supported yet.
+ *
+ * XXX: We should never get kernel-mode T_TRACE or T_TRAP15
+ * XXX: because locore.s now gives them special treatment.
*/
case T_TRACE: /* kernel trace trap */
- case T_TRAP15: /* SUN trace trap */
+ case T_TRAP15: /* kernel breakpoint */
frame.f_sr &= ~PSL_T;
- sig = SIGTRAP;
- break;
+ return;
case T_TRACE|T_USER: /* user trace trap */
case T_TRAP15|T_USER: /* SUN user trace trap */
@@ -452,6 +458,7 @@ trap(type, code, v, frame)
/* Do not allow faults outside the "managed" space. */
if (va < virtual_avail) {
if (p->p_addr->u_pcb.pcb_onfault) {
+ /* XXX - Can this happen? -gwr */
#ifdef DEBUG
if (mmudebug & MDB_CPFAULT) {
printf("trap: copyfault kernel_map va < avail\n");
@@ -716,3 +723,26 @@ child_return(p)
ktrsysret(p->p_tracep, SYS_fork, 0, 0);
#endif
}
+
+/*
+ * This is used if we hit a kernel breakpoint or trace trap
+ * when there is no debugger installed (or not attached).
+ * Drop into the PROM temporarily...
+ */
+int
+nodb_trap(type, fp)
+ int type;
+ struct frame *fp;
+{
+
+ if ((0 <= type) && (type < trap_types))
+ printf("\r\nKernel %s,", trap_type[type]);
+ else
+ printf("\r\nKernel trap 0x%x,", type);
+ printf(" frame=0x%x\r\n", fp);
+ printf("\r\n*No debugger. Doing PROM abort...\r\n");
+ sun3_mon_abort();
+ /* OK then, just resume... */
+ fp->f_sr &= ~PSL_T;
+ return(1);
+}