1
0
mirror of https://github.com/openbsd/src.git synced 2026-04-16 18:24:23 +00:00

old files

This commit is contained in:
deraadt
1995-10-18 10:52:37 +00:00
parent 70e96dcb50
commit 628d930b04
18 changed files with 0 additions and 2955 deletions

View File

@@ -1,152 +0,0 @@
$NetBSD: README,v 1.1.1.1 1995/07/25 23:11:53 chuck Exp $
NetBSD/mvme68k port
supported environment:
Motorola makes a number of m68k VME cards. This port
currently only works on the m68030 based VME147 card (diskless only
for now).
requirements:
- VME147 card
- a machine to connect the console to
- network connection
- NFS server (to serve root and swap)
future plans:
- VME147 scsi disk support
- hopefully, support for the VME162 card
how to boot:
Booting NetBSD/mvme68k on a VME147 is somewhat painful because
the ROM doesn't know how to talk to the ethernet chip. I have solved
this problem by downloading a bootstrap into RAM via the console line.
First, you will need a m68k8k NFS mountable /usr and root
directory. NetBSD/sun3 binaries will run fine on the mvme68k system
for the most part (the exception being kvm stuff). These binaries can
be ftp'd from ftp.netbsd.org. You will also need a NetBSD/mvme68k
kernel and related bootstraps. For now these can be obtained from
dworkin.wustl.edu in /dist/netbsd/mvme68k_boot.tar.gz (once I get set
up I will put these plus a snapshot on ftp.netbsd.org).
Put the mvme68k "netbsd" binary in NFS root directory. Put
boot.vme147 in /tftpboot of your NFS server machine. Make a symbolic
link from the hex encoding of your IP address to that file. For
example:
lrwxrwxrwx 1 root 11 Apr 13 17:27 80FCA93F.147 -> boot.vme147
[80FCA93F is the IP address (128.252.169.63) of my vme147.]
Make sure you've got the right info in /etc/ethers and /etc/bootparams
on your server.
Now, bring up your 147. You should have the "bug" prompt:
COLD Start
Onboard RAM start = $00000000, stop = $007FFFFF
147-Bug>
Make sure the "stop" looks ok (if you've got 8MB you should have the
same value as I). Also make sure the clock is ticking:
147-Bug>time
Sunday 5/30/27 16:25:14
147-Bug>time
Sunday 5/30/27 16:25:15
147-Bug>
Looks good. you now need to download "sboot" into RAM. you can
either do that through the console line or through a 2nd serial
connection. I have my 147 connected to a sun4/110 and I access it via
"tip". to load that way do this:
lo 0
~Ccat sboot
go 4000
which will look like this:
147-Bug>
147-Bug>lo 0
~CLocal command? cat sboot
away for 11 seconds
!
147-Bug>g 4000
Effective address: 00004000
sboot: serial line bootstrap program (&end = 5fd8)
>>>
Now, if you want to do it through serial line 1, then connect serial
line one to a machine. At the "147-Bug> " prompt do this "tm
1"... you should then login to what ever machine it is connected to.
Then hit "^A" to escape to Bug. do "lo 1;x=cat sboot" ... then when
that is done you can reconnect "tm 1" and logout. Then do "go 4000"
and you've got ">>> " prompt of sboot.
Once you've got the ">>> " prompt you can do commands such as:
"b" - boot "netbsd" multiuser
"b gennetbsd" - boot "gennetbsd" multiuser
"b -s" - boot "netbsd" single user
"b gennetbsd -s"- boot "gennetbsd" single user
A typical boot looks like this:
>>> b
le0: ethernet address: 8:0:3e:20:cb:87
My ip address is: 128.252.169.63
Server ip address is: 128.252.169.2
3800
Download was a success!
Start @ 0x8000 ...
>> NetBSD netboot [$Revision: 1.1.1.1 $]
boot: client IP address: 128.252.169.63
boot: client name: vme147
root addr=128.252.169.2 path=/export/root/vme147
449744+20348+64444+[29268+29051]=0x90f0b
Start @ 0x88aa ...
Copyright (c) 1982, 1986, 1989, 1991, 1993
The Regents of the University of California. All rights reserved.
NetBSD 1.0A (VME147) #17: Sat Jul 1 00:07:04 CDT 1995
chuck@vme147.ccrc.wustl.edu:/um/netbsd/src/sys/arch/mvme68k/compile/VME147
Motorola MVME147 MC68030 CPU+MMU, ???MHz MC68882 FPU)
real mem = 8388608
avail mem = 6832128
using 102 buffers containing 417792 bytes of memory
mainbus0 (root)
iio0 at mainbus0 addr 0xfffe0000
pcc0 at iio0 offset 0x1000 rev 0 intbvr 0x40
clock0 at iio0 offset 0x7f8 ipl 5
zs0 at iio0 offset 0x3000 ipl 4
le0 at iio0 offset 0x1800 ipl 2 ler2 0x94000 address 08:00:3e:20:cb:87
nfs_boot: using network interface 'le0'
nfs_boot: client_addr=0x80fca93f
nfs_boot: server_addr=0x80fca902
nfs_boot: hostname=vme147
root on dworkin:/export/root/vme147
root time: 0x2ffc6859
WARNING: clock gained 18 days -- CHECK AND RESET THE DATE!
swap on dworkin:/export/swap/vme147
swap size: 0x4000 (blocks)
init: copying out path `/sbin/init' 11
Automatic boot in progress: starting file system checks.
[etc...]
good luck!

View File

@@ -1,51 +0,0 @@
# $NetBSD: VME147,v 1.1.1.1 1995/07/25 23:12:05 chuck Exp $
machine mvme68k m68k
options "M68040" # support for 040
options FPSP # MC68040 floating point support
options "M68030" # support for 030
options FPCOPROC # Support for MC6888[12] (Required)
maxusers 2
# obsolete timezone spec
options TIMEZONE=0, DST=0
options DIAGNOSTIC, DEBUG
#options FFS
options NFSCLIENT
#options NFSSERVER
#options SYSVSHM
options KTRACE
options COMPAT_43
options FIFO
#options MFS
options DEVPAGER, SWAPPAGER, VNODEPAGER
#options MSDOSFS
# Networking options
options INET
options TCP_COMPAT_42 # compatibility with 4.2BSD TCP/IP
#options GATEWAY # IP packet forwarding
#options ISO # OSI networking
#options TPIP
#options EON
options COMPAT_09, COMPAT_10
options COMPAT_SUNOS
config netbsd root on nfs swap on nfs
pseudo-device sl
pseudo-device ppp 2
pseudo-device loop
pseudo-device bpfilter
pseudo-device pty
mainbus0 at root
iio0 at mainbus0
pcc0 at iio0 offset 0x1000
zs0 at iio0 offset 0x3000 ipl 4
clock0 at iio0 offset 0x07f8 ipl 5
le0 at iio0 offset 0x1800 ipl 2

View File

@@ -1,114 +0,0 @@
/* $Id: iio.c,v 1.1.1.1 1995/10/18 08:51:10 deraadt Exp $ */
/*
*
* Copyright (c) 1995 Charles D. Cranor
* 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 Charles D. Cranor.
* 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.
*/
/*
* peripheral channel controller
*/
#include <sys/param.h>
#include <sys/conf.h>
#include <sys/ioctl.h>
#include <sys/proc.h>
#include <sys/user.h>
#include <sys/tty.h>
#include <sys/uio.h>
#include <sys/callout.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/syslog.h>
#include <sys/fcntl.h>
#include <sys/device.h>
#include <machine/cpu.h>
#include <dev/cons.h>
#include <mvme68k/mvme68k/isr.h>
#include <mvme68k/dev/iio.h>
/*
* Configuration routines for the internal I/O bus
*/
void iioattach __P((struct device *, struct device *, void *));
int iiomatch __P((struct device *, void *, void *));
struct iiosoftc {
struct device sc_dev;
};
struct cfdriver iiocd = {
NULL, "iio", iiomatch, iioattach,
DV_DULL, sizeof(struct iiosoftc), 0
};
int
iiomatch(parent, cf, args)
struct device *parent;
void *cf;
void *args;
{
return (1);
}
void
iioattach(parent, self, args)
struct device *parent, *self;
void *args;
{
extern struct cfdata cfdata[];
extern struct cfdriver pcccd;
struct cfdata *cf, *pcccf = NULL;
printf(" addr 0x%x\n", INTIOBASE);
/*
* attach the pcc first!
*/
for (cf = cfdata; pcccf==NULL && cf->cf_driver; cf++) {
if (cf->cf_driver != &pcccd)
continue;
pcccf = cf;
}
if (!pcccf)
panic("no pcc device configured");
config_attach(self, pcccf, NULL, NULL);
while (config_found(self, NULL, NULL))
;
}
void
iio_print(cf)
struct cfdata *cf;
{
printf(" offset 0x%x", cf->cf_loc[0]);
if (cf->cf_loc[1] > 0)
printf(" ipl %d", cf->cf_loc[1]);
}

View File

@@ -1,18 +0,0 @@
/* $NetBSD: iio.h,v 1.1.1.1 1995/07/25 23:12:11 chuck Exp $ */
/* $Id: iio.h,v 1.1.1.1 1995/10/18 08:51:10 deraadt Exp $ */
struct iioargs {
int ic_addr;
int ic_lev;
};
#define IIO_CFLOC_ADDR(cf) (IIOV(INTIOBASE + (cf)->cf_loc[0]))
#define IIO_CFLOC_LEVEL(cf) ((cf)->cf_loc[1])
/*
* for the console we need zs phys addr
*/
#define ZS0_PHYS (INTIOBASE + 0x3000)
#define ZS1_PHYS (INTIOBASE + 0x3800)

View File

@@ -1,367 +0,0 @@
/* $NetBSD: clock.c,v 1.1.1.1 1995/07/25 23:11:56 chuck 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.
*
* @(#)clock.c 8.1 (Berkeley) 6/11/93
*/
#include <sys/param.h>
#include <sys/kernel.h>
#include <sys/device.h>
#include <mvme68k/mvme68k/clockreg.h>
#include <mvme68k/dev/iio.h>
#include <mvme68k/dev/pccreg.h>
#include <machine/psl.h>
#include <machine/cpu.h>
#if defined(GPROF)
#include <sys/gmon.h>
#endif
struct clocksc {
struct device sc_dev;
struct clockreg *sc_creg;
};
struct clockreg *RTCbase = NULL;
u_char clock_lvl;
/*
* autoconf
*/
void clockattach __P((struct device *, struct device *, void *));
int clockmatch __P((struct device *, void *, void *));
struct cfdriver clockcd = {
NULL, "clock", clockmatch, clockattach,
DV_DULL, sizeof(struct clocksc), 0
};
void clockintr __P((void *));
int
clockmatch(parent, vcf, args)
struct device *parent;
void *vcf, *args;
{
struct cfdata *cf = vcf;
return RTCbase == NULL && !badbaddr((caddr_t) IIO_CFLOC_ADDR(cf));
}
void
clockattach(parent, self, args)
struct device *parent, *self;
void *args;
{
iio_print(self->dv_cfdata);
if (RTCbase)
panic("too many clocks configured");
RTCbase = (struct clockreg *) IIO_CFLOC_ADDR(self->dv_cfdata);
clock_lvl = IIO_CFLOC_LEVEL(self->dv_cfdata);
if (clock_lvl != CLOCK_LEVEL)
panic("wrong interrupt level for clock");
pccintr_establish(PCCV_TIMER1, clockintr, clock_lvl, NULL);
clock_lvl = clock_lvl | PCC_IENABLE | PCC_TIMERACK;
printf("\n");
}
/*
* clockintr: ack intr and call hardclock
*/
void
clockintr(arg)
void *arg;
{
sys_pcc->t1_int = clock_lvl;
hardclock(arg);
}
/*
* Set up real-time clock; we don't have a statistics clock at
* present.
*/
cpu_initclocks()
{
register struct clockreg *rtc = RTCbase;
if (rtc == NULL)
panic("clock not configured");
if (hz != 100) {
printf("%d Hz clock not available; using 100 Hz\n", hz);
hz = 100;
}
sys_pcc->t1_pload = PCC_TIMER100HZ;
sys_pcc->t1_cr = PCC_TIMERCLEAR;
sys_pcc->t1_cr = PCC_TIMERSTART;
sys_pcc->t1_int = clock_lvl;
stathz = 0;
}
void
setstatclockrate(newhz)
int newhz;
{
}
void
statintr(fp)
struct clockframe *fp;
{
}
/*
* Return the best possible estimate of the time in the timeval
* to which tvp points. We do this by returning the current time
* plus the amount of time since the last clock interrupt (clock.c:clkread).
*
* Check that this time is no less than any previously-reported time,
* which could happen around the time of a clock adjustment. Just for fun,
* we guarantee that the time will be greater than the value obtained by a
* previous call.
*/
void microtime(tvp)
register struct timeval *tvp;
{
int s = splhigh();
static struct timeval lasttime;
*tvp = time;
tvp->tv_usec;
while (tvp->tv_usec > 1000000) {
tvp->tv_sec++;
tvp->tv_usec -= 1000000;
}
if (tvp->tv_sec == lasttime.tv_sec &&
tvp->tv_usec <= lasttime.tv_usec &&
(tvp->tv_usec = lasttime.tv_usec + 1) > 1000000) {
tvp->tv_sec++;
tvp->tv_usec -= 1000000;
}
lasttime = *tvp;
splx(s);
}
/*
* BCD to decimal and decimal to BCD.
*/
#define FROMBCD(x) (((x) >> 4) * 10 + ((x) & 0xf))
#define TOBCD(x) (((x) / 10 * 16) + ((x) % 10))
#define SECDAY (24 * 60 * 60)
#define SECYR (SECDAY * 365)
#define LEAPYEAR(y) (((y) & 3) == 0)
/*
* This code is defunct after 2068.
* Will Unix still be here then??
*/
const short dayyr[12] =
{ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
static u_long chiptotime(sec, min, hour, day, mon, year)
register int sec, min, hour, day, mon, year;
{
register int days, yr;
sec = FROMBCD(sec);
min = FROMBCD(min);
hour = FROMBCD(hour);
day = FROMBCD(day);
mon = FROMBCD(mon);
year = FROMBCD(year) + YEAR0;
/* simple sanity checks */
if (year < 70 || mon < 1 || mon > 12 || day < 1 || day > 31)
return (0);
days = 0;
for (yr = 70; yr < year; yr++)
days += LEAPYEAR(yr) ? 366 : 365;
days += dayyr[mon - 1] + day - 1;
if (LEAPYEAR(yr) && mon > 2)
days++;
/* now have days since Jan 1, 1970; the rest is easy... */
return (days * SECDAY + hour * 3600 + min * 60 + sec);
}
struct chiptime {
int sec;
int min;
int hour;
int wday;
int day;
int mon;
int year;
};
timetochip(c)
register struct chiptime *c;
{
register int t, t2, t3, now = time.tv_sec;
/* compute the year */
t2 = now / SECDAY;
t3 = (t2 + 2) % 7; /* day of week */
c->wday = TOBCD(t3 + 1);
t = 69;
while (t2 >= 0) { /* whittle off years */
t3 = t2;
t++;
t2 -= LEAPYEAR(t) ? 366 : 365;
}
c->year = t;
/* t3 = month + day; separate */
t = LEAPYEAR(t);
for (t2 = 1; t2 < 12; t2++)
if (t3 < dayyr[t2] + (t && t2 > 1))
break;
/* t2 is month */
c->mon = t2;
c->day = t3 - dayyr[t2 - 1] + 1;
if (t && t2 > 2)
c->day--;
/* the rest is easy */
t = now % SECDAY;
c->hour = t / 3600;
t %= 3600;
c->min = t / 60;
c->sec = t % 60;
c->sec = TOBCD(c->sec);
c->min = TOBCD(c->min);
c->hour = TOBCD(c->hour);
c->day = TOBCD(c->day);
c->mon = TOBCD(c->mon);
c->year = TOBCD(c->year - YEAR0);
}
/*
* Set up the system's time, given a `reasonable' time value.
*/
inittodr(base)
time_t base;
{
register struct clockreg *cl = RTCbase;
int sec, min, hour, day, mon, year;
int badbase = 0, waszero = base == 0;
if (base < 5 * SECYR) {
/*
* If base is 0, assume filesystem time is just unknown
* in stead of preposterous. Don't bark.
*/
if (base != 0)
printf("WARNING: preposterous time in file system\n");
/* not going to use it anyway, if the chip is readable */
base = 21*SECYR + 186*SECDAY + SECDAY/2;
badbase = 1;
}
cl->cl_csr |= CLK_READ; /* enable read (stop time) */
sec = cl->cl_sec;
min = cl->cl_min;
hour = cl->cl_hour;
day = cl->cl_mday;
mon = cl->cl_month;
year = cl->cl_year;
cl->cl_csr &= ~CLK_READ; /* time wears on */
if ((time.tv_sec = chiptotime(sec, min, hour, day, mon, year)) == 0) {
printf("WARNING: bad date in battery clock");
/*
* Believe the time in the file system for lack of
* anything better, resetting the clock.
*/
time.tv_sec = base;
if (!badbase)
resettodr();
} else {
int deltat = time.tv_sec - base;
if (deltat < 0)
deltat = -deltat;
if (waszero || deltat < 2 * SECDAY)
return;
printf("WARNING: clock %s %d days",
time.tv_sec < base ? "lost" : "gained", deltat / SECDAY);
}
printf(" -- CHECK AND RESET THE DATE!\n");
}
/*
* Reset the clock based on the current time.
* Used when the current clock is preposterous, when the time is changed,
* and when rebooting. Do nothing if the time is not yet known, e.g.,
* when crashing during autoconfig.
*/
resettodr()
{
register struct clockreg *cl;
struct chiptime c;
if (!time.tv_sec || (cl = RTCbase) == NULL)
return;
timetochip(&c);
cl->cl_csr |= CLK_WRITE; /* enable write */
cl->cl_sec = c.sec;
cl->cl_min = c.min;
cl->cl_hour = c.hour;
cl->cl_wday = c.wday;
cl->cl_mday = c.day;
cl->cl_month = c.mon;
cl->cl_year = c.year;
cl->cl_csr &= ~CLK_WRITE; /* load them up */
}

View File

@@ -1,76 +0,0 @@
/* $NetBSD: clockreg.h,v 1.1.1.1 1995/07/25 23:11:56 chuck 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.
*
* @(#)clockreg.h 8.1 (Berkeley) 6/11/93
*/
/*
* Mostek MK48T02 clock.
*/
struct clockreg {
volatile u_char cl_csr; /* control register */
volatile u_char cl_sec; /* seconds (0..59; BCD) */
volatile u_char cl_min; /* minutes (0..59; BCD) */
volatile u_char cl_hour; /* hour (0..23; BCD) */
volatile u_char cl_wday; /* weekday (1..7) */
volatile u_char cl_mday; /* day in month (1..31; BCD) */
volatile u_char cl_month; /* month (1..12; BCD) */
volatile u_char cl_year; /* year (0..99; BCD) */
};
/* bits in cl_csr */
#define CLK_WRITE 0x80 /* want to write */
#define CLK_READ 0x40 /* want to read (freeze clock) */
/*
* Sun chose the year `68' as their base count, so that
* cl_year==0 means 1968.
*/
#define YEAR0 68
/*
* interrupt level for clock
*/
#define CLOCK_LEVEL 5

View File

@@ -1,47 +0,0 @@
/* $NetBSD: isr.h,v 1.1.1.1 1995/07/25 23:11:58 chuck Exp $ */
/*
* Copyright (c) 1982, 1993
* The Regents of the University of California. 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 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.
*
* @(#)isr.h 7.1 (Berkeley) 5/8/90
*/
struct isr {
struct isr *isr_forw;
struct isr *isr_back;
int (*isr_intr)();
int isr_arg;
int isr_ipl;
};
#define NISR 6
#define ISRIPL(x) ((x) - 1)

View File

@@ -1,29 +0,0 @@
void mainbus_attach __P((struct device *, struct device *, void *));
int mainbus_match __P((struct device *, void *, void *));
struct mainbus_softc {
struct device sc_dev;
};
struct cfdriver mainbus_cd = {
NULL, "mainbus_", mainbus_match, mainbus_attach,
DV_DULL, sizeof(struct mainbus_softc), 0
};
int
mainbus_match(parent, cf, args)
struct device *parent;
void *cf;
void *args;
{
return 1;
}
void
mainbus_attach(parent, self, args)
struct device *parent, *self;
void *args;
{
while (config_found(self, NULL, NULL))
;
}

View File

@@ -1,177 +0,0 @@
/* $NetBSD: exec.c,v 1.1.1.1.2.1 1995/10/12 22:47:56 chuck Exp $ */
/*-
* Copyright (c) 1982, 1986, 1990, 1993
* The Regents of the University of California. 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 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.
*
* @(#)boot.c 8.1 (Berkeley) 6/10/93
*/
#include <sys/param.h>
#include <a.out.h>
#include "stand.h"
extern int debug;
/*ARGSUSED*/
int
exec_mvme(file, loadaddr, boothowto)
char *file;
char *loadaddr;
int boothowto;
{
register int io;
struct exec x;
int cc, magic;
void (*entry)();
register char *cp;
register int *ip;
#ifdef DEBUG
printf("exec: file=%s loadaddr=0x%x\n", file, loadaddr);
#endif
io = open(file, 0);
if (io < 0)
return(-1);
/*
* Read in the exec header, and validate it.
*/
if (read(io, (char *)&x, sizeof(x)) != sizeof(x))
goto shread;
if (N_BADMAG(x)) {
errno = EFTYPE;
goto closeout;
}
cp = loadaddr;
magic = N_GETMAGIC(x);
if (magic == ZMAGIC)
cp += sizeof(x);
entry = (void (*)())x.a_entry;
/*
* Leave a copy of the exec header before the text.
* The kernel may use this to verify that the
* symbols were loaded by this boot program.
*/
bcopy(&x, cp - sizeof(x), sizeof(x));
/*
* Read in the text segment.
*/
printf("%d", x.a_text);
if (read(io, cp, x.a_text) != x.a_text)
goto shread;
cp += x.a_text;
/*
* NMAGIC may have a gap between text and data.
*/
if (magic == NMAGIC) {
register int mask = N_PAGSIZ(x) - 1;
while ((int)cp & mask)
*cp++ = 0;
}
/*
* Read in the data segment.
*/
printf("+%d", x.a_data);
if (read(io, cp, x.a_data) != x.a_data)
goto shread;
cp += x.a_data;
/*
* Zero out the BSS section.
* (Kernel doesn't care, but do it anyway.)
*/
printf("+%d", x.a_bss);
cc = x.a_bss;
while ((int)cp & 3) {
*cp++ = 0;
--cc;
}
ip = (int*)cp;
cp += cc;
while ((char*)ip < cp)
*ip++ = 0;
/*
* Read in the symbol table and strings.
* (Always set the symtab size word.)
*/
*ip++ = x.a_syms;
cp = (char*) ip;
if (x.a_syms > 0) {
/* Symbol table and string table length word. */
cc = x.a_syms;
printf("+[%d", cc);
cc += sizeof(int); /* strtab length too */
if (read(io, cp, cc) != cc)
goto shread;
cp += x.a_syms;
ip = (int*)cp; /* points to strtab length */
cp += sizeof(int);
/* String table. Length word includes itself. */
cc = *ip;
printf("+%d]", cc);
cc -= sizeof(int);
if (cc <= 0)
goto shread;
if (read(io, cp, cc) != cc)
goto shread;
cp += cc;
}
printf("=0x%x\n", cp - loadaddr);
close(io);
if (debug) {
printf("Debug mode - enter c to continue\n");
asm(" trap #0");
}
printf("Start @ 0x%x ...\n", (int)entry);
(*entry)(boothowto);
panic("exec returned");
shread:
printf("exec: short read\n");
errno = EIO;
closeout:
close(io);
return(-1);
}

View File

@@ -1,176 +0,0 @@
/* $NetBSD: if_lereg.h,v 1.1.1.1 1995/07/25 23:12:23 chuck Exp $ */
/*-
* Copyright (c) 1982, 1992, 1993
* The Regents of the University of California. 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 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.
*
* @(#)if_lereg.h 8.2 (Berkeley) 10/30/93
*/
#define LEMTU 1518
#define LEMINSIZE 60 /* should be 64 if mode DTCR is set */
#define LERBUF 8
#define LERBUFLOG2 3
#define LE_RLEN (LERBUFLOG2 << 13)
#define LETBUF 1
#define LETBUFLOG2 0
#define LE_TLEN (LETBUFLOG2 << 13)
/* Local Area Network Controller for Ethernet (LANCE) registers */
struct lereg1 {
volatile u_short ler1_rdp; /* register data port */
volatile u_short ler1_rap; /* register address port */
};
/* register addresses */
#define LE_CSR0 0 /* Control and status register */
#define LE_CSR1 1 /* low address of init block */
#define LE_CSR2 2 /* high address of init block */
#define LE_CSR3 3 /* Bus master and control */
/* Control and status register 0 (csr0) */
#define LE_C0_ERR 0x8000 /* error summary */
#define LE_C0_BABL 0x4000 /* transmitter timeout error */
#define LE_C0_CERR 0x2000 /* collision */
#define LE_C0_MISS 0x1000 /* missed a packet */
#define LE_C0_MERR 0x0800 /* memory error */
#define LE_C0_RINT 0x0400 /* receiver interrupt */
#define LE_C0_TINT 0x0200 /* transmitter interrupt */
#define LE_C0_IDON 0x0100 /* initalization done */
#define LE_C0_INTR 0x0080 /* interrupt condition */
#define LE_C0_INEA 0x0040 /* interrupt enable */
#define LE_C0_RXON 0x0020 /* receiver on */
#define LE_C0_TXON 0x0010 /* transmitter on */
#define LE_C0_TDMD 0x0008 /* transmit demand */
#define LE_C0_STOP 0x0004 /* disable all external activity */
#define LE_C0_STRT 0x0002 /* enable external activity */
#define LE_C0_INIT 0x0001 /* begin initalization */
#define LE_C0_BITS \
"\20\20ERR\17BABL\16CERR\15MISS\14MERR\13RINT\
\12TINT\11IDON\10INTR\07INEA\06RXON\05TXON\04TDMD\03STOP\02STRT\01INIT"
/* Control and status register 3 (csr3) */
#define LE_C3_BSWP 0x4 /* byte swap */
#define LE_C3_ACON 0x2 /* ALE control, eh? */
#define LE_C3_BCON 0x1 /* byte control */
/*
* Current size is 13,758 bytes with 8 x 1518 receive buffers and
* 1 x 1518 transmit buffer.
*/
struct lereg2 {
/* initialization block */
volatile u_short ler2_mode; /* mode */
volatile u_char ler2_padr[6]; /* physical address */
#ifdef new_code
volatile u_short ler2_ladrf[4]; /* logical address filter */
#else
volatile u_long ler2_ladrf0; /* logical address filter */
volatile u_long ler2_ladrf1; /* logical address filter */
#endif
volatile u_short ler2_rdra; /* receive descriptor addr */
volatile u_short ler2_rlen; /* rda high and ring size */
volatile u_short ler2_tdra; /* transmit descriptor addr */
volatile u_short ler2_tlen; /* tda high and ring size */
/* receive message descriptors. bits/hadr are byte order dependent. */
struct lermd {
volatile u_short rmd0; /* low address of packet */
volatile u_char rmd1_bits; /* descriptor bits */
volatile u_char rmd1_hadr; /* high address of packet */
volatile short rmd2; /* buffer byte count */
volatile u_short rmd3; /* message byte count */
} ler2_rmd[LERBUF];
/* transmit message descriptors */
struct letmd {
volatile u_short tmd0; /* low address of packet */
volatile u_char tmd1_bits; /* descriptor bits */
volatile u_char tmd1_hadr; /* high address of packet */
volatile short tmd2; /* buffer byte count */
volatile u_short tmd3; /* transmit error bits */
} ler2_tmd[LETBUF];
volatile char ler2_rbuf[LERBUF][LEMTU];
volatile char ler2_tbuf[LETBUF][LEMTU];
};
/* Initialzation block (mode) */
#define LE_MODE_PROM 0x8000 /* promiscuous mode */
/* 0x7f80 reserved, must be zero */
#define LE_MODE_INTL 0x0040 /* internal loopback */
#define LE_MODE_DRTY 0x0020 /* disable retry */
#define LE_MODE_COLL 0x0010 /* force a collision */
#define LE_MODE_DTCR 0x0008 /* disable transmit CRC */
#define LE_MODE_LOOP 0x0004 /* loopback mode */
#define LE_MODE_DTX 0x0002 /* disable transmitter */
#define LE_MODE_DRX 0x0001 /* disable receiver */
#define LE_MODE_NORMAL 0 /* none of the above */
/* Receive message descriptor 1 (rmd1_bits) */
#define LE_R1_OWN 0x80 /* LANCE owns the packet */
#define LE_R1_ERR 0x40 /* error summary */
#define LE_R1_FRAM 0x20 /* framing error */
#define LE_R1_OFLO 0x10 /* overflow error */
#define LE_R1_CRC 0x08 /* CRC error */
#define LE_R1_BUFF 0x04 /* buffer error */
#define LE_R1_STP 0x02 /* start of packet */
#define LE_R1_ENP 0x01 /* end of packet */
#define LE_R1_BITS \
"\20\10OWN\7ERR\6FRAM\5OFLO\4CRC\3BUFF\2STP\1ENP"
/* Transmit message descriptor 1 (tmd1_bits) */
#define LE_T1_OWN 0x80 /* LANCE owns the packet */
#define LE_T1_ERR 0x40 /* error summary */
#define LE_T1_MORE 0x10 /* multiple collisions */
#define LE_T1_ONE 0x08 /* single collision */
#define LE_T1_DEF 0x04 /* defferred transmit */
#define LE_T1_STP 0x02 /* start of packet */
#define LE_T1_ENP 0x01 /* end of packet */
#define LE_T1_BITS \
"\20\10OWN\7ERR\6RES\5MORE\4ONE\3DEF\2STP\1ENP"
/* Transmit message descriptor 3 (tmd3) */
#define LE_T3_BUFF 0x8000 /* buffer error */
#define LE_T3_UFLO 0x4000 /* underflow error */
#define LE_T3_LCOL 0x1000 /* late collision */
#define LE_T3_LCAR 0x0800 /* loss of carrier */
#define LE_T3_RTRY 0x0400 /* retry error */
#define LE_T3_TDR_MASK 0x03ff /* time domain reflectometry counter */
#define LE_XMD2_ONES 0xf000
#define LE_T3_BITS \
"\20\20BUFF\17UFLO\16RES\15LCOL\14LCAR\13RTRY"
#define LE_ADDR_LOW_MASK (0xffff)

View File

@@ -1,154 +0,0 @@
/* $NetBSD: machdep.c,v 1.1.1.1 1995/07/25 23:12:22 chuck Exp $ */
#include <sys/param.h>
#include <sys/types.h>
#include <sys/exec.h>
#include <sys/reboot.h>
#include "config.h"
/*
* get_boothowto: boothowto for kernel
*/
static int get_boothowto(cmd_flags)
char *cmd_flags;
{
int result = 0;
if (cmd_flags == NULL) return(0);
while (*cmd_flags) {
switch (*cmd_flags) {
case 's': result |= RB_SINGLE; break;
case 'a': result |= RB_ASKNAME; break;
default: break;
}
cmd_flags++;
}
return(result);
}
/*
* cmd_parse: parse command line
* expected format: "b[oot] [kernel_name] [-flags]"
*/
char *cmd_parse(cmd_buf, howto)
char *cmd_buf;
int *howto;
{
char *cmd_kernel, *cmd_flags;
u_char *cp;
*howto = 0;
cp = cmd_buf+1; /* skip 'b' */
while (*cp && *cp != ' ') cp++; /* skip to end or space */
while (*cp == ' ') cp++; /* skip spaces */
if (*cp == '\0') return(NULL); /* no args */
if (*cp == '-') { /* only flags? */
*howto = get_boothowto(cp);
return(NULL);
}
cmd_kernel = cp; /* got kernel name */
while (*cp && *cp != ' ') cp++; /* skip to end or space */
if (*cp == ' ') *cp++ = 0; /* null terminate kernel */
while (*cp == ' ') cp++; /* skip spaces */
if (*cp == '\0') return(cmd_kernel); /* no flags */
if (*cp != '-') return(cmd_kernel); /* garbage flags */
cmd_flags = cp; /* save flags */
while (*cp && *cp != ' ') cp++; /* skip to end or space */
if (*cp == ' ') *cp++ = 0; /* null terminate flags */
*howto = get_boothowto(cmd_flags);
return(cmd_kernel);
}
/*
* machdep_common_ether: get ethernet address
*/
void machdep_common_ether(ether)
unsigned char *ether;
{
caddr_t addr;
int *ea = (int *) ETHER_ADDR;
int e = *ea;
if (( e & 0x2fffff00 ) == 0x2fffff00)
panic("ERROR: ethernet address not set!\r\n");
ether[0] = 0x08;
ether[1] = 0x00;
ether[2] = 0x3e;
e = e >> 8;
ether[5] = e & 0xff;
e = e >> 8;
ether[4] = e & 0xff;
e = e >> 8;
ether[3] = e;
}
/*
* console i/o
*/
/*
* hardware
*/
struct zs_hw {
volatile u_char ctl;
volatile u_char data;
};
struct zs_hw *zs = (struct zs_hw *)CONS_ZS_ADDR;
/*
* putchar: put char to console
*/
void putchar(char c)
{
if (c == '\n') putchar('\r');
zs->ctl = 0;
while ((zs->ctl & 0x04) == 0) {
zs->ctl = 0;
}
zs->ctl = 8;
zs->ctl = c;
}
/*
* getchar: get char from console
*/
int
getchar()
{
int i;
while (1) {
zs->ctl = 0;
if ((zs->ctl & 0x1) != 0) break;
for (i = 100 ; i > 0 ; i--)
;
}
zs->ctl = 8;
return(zs->ctl);
}
/*
* peekchar
*/
peekchar()
{
zs->ctl = 0;
return(zs->ctl & 0x1);
}

View File

@@ -1,531 +0,0 @@
/* $NetBSD: netif.c,v 1.1.1.1.2.1 1995/10/12 22:47:57 chuck Exp $ */
/*
* Copyright (c) 1995 Gordon W. Ross
* 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. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
* 4. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by Gordon W. Ross
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/param.h>
#include <sys/socket.h>
#include <string.h>
#include <time.h>
#include <net/if.h>
#include <netinet/in.h>
#include <netinet/if_ether.h>
#include <netinet/in_systm.h>
#include "stand.h"
#include "net.h"
#include "netif.h"
#include "config.h"
static struct netif netif_prom;
void machdep_common_ether __P((u_char *));
#ifdef NETIF_DEBUG
int netif_debug;
#endif
struct iodesc sockets[SOPEN_MAX];
struct iodesc *
socktodesc(sock)
int sock;
{
if (sock != 0) {
return(NULL);
}
return (sockets);
}
int
netif_open(machdep_hint)
void *machdep_hint;
{
struct saioreq *si;
struct iodesc *io;
int error;
/* find a free socket */
io = sockets;
if (io->io_netif) {
#ifdef DEBUG
printf("netif_open: device busy\n");
#endif
return (-1);
}
bzero(io, sizeof(*io));
if ((netif_prom.devdata = le_init(io)) == NULL) {
printf("le_init failed\n");
return(-1);
}
io->io_netif = &netif_prom;
return(0);
}
int
netif_close(fd)
int fd;
{
struct iodesc *io;
struct netif *ni;
if (fd != 0) {
errno = EBADF;
return(-1);
}
io = sockets;
ni = io->io_netif;
if (ni != NULL) {
le_end(ni);
ni->devdata = NULL;
io->io_netif = NULL;
}
return(0);
}
/*
* Send a packet. The ether header is already there.
* Return the length sent (or -1 on error).
*/
int
netif_put(desc, pkt, len)
struct iodesc *desc;
void *pkt;
size_t len;
{
#ifdef NETIF_DEBUG
if (netif_debug) {
struct ether_header *eh;
printf("netif_put: desc=0x%x pkt=0x%x len=%d\n",
desc, pkt, len);
eh = pkt;
printf("dst: %s ", ether_sprintf(eh->ether_dhost));
printf("src: %s ", ether_sprintf(eh->ether_shost));
printf("type: 0x%x\n", eh->ether_type & 0xFFFF);
}
#endif
return(le_put(desc, pkt, len));
}
/*
* Receive a packet, including the ether header.
* Return the total length received (or -1 on error).
*/
int
netif_get(desc, pkt, maxlen, timo)
struct iodesc *desc;
void *pkt;
size_t maxlen;
time_t timo;
{
struct saioreq *si;
struct saif *sif;
char *dmabuf;
int tick0, tmo_ticks;
int len;
#ifdef NETIF_DEBUG
if (netif_debug)
printf("netif_get: pkt=0x%x, maxlen=%d, tmo=%d\n",
pkt, maxlen, timo);
#endif
len = le_get(desc, pkt, maxlen, timo);
#ifdef NETIF_DEBUG
if (netif_debug) {
struct ether_header *eh = pkt;
printf("dst: %s ", ether_sprintf(eh->ether_dhost));
printf("src: %s ", ether_sprintf(eh->ether_shost));
printf("type: 0x%x\n", eh->ether_type & 0xFFFF);
}
#endif
return len;
}
/* the rest of this file imported from le_poll.c */
/*
* Copyright (c) 1993 Adam Glass
* 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 Adam Glass.
* 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 Adam Glass ``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.
*/
#include "if_lereg.h"
struct {
struct lereg1 *sc_r1; /* LANCE registers */
struct lereg2 *sc_r2; /* RAM */
int next_rmd;
int next_tmd;
} le_softc;
int le_debug = 0;
/*
* init le device. return 0 on failure, 1 if ok.
*/
void *
le_init(io)
struct iodesc *io;
{
u_long *eram = (u_long *) ERAM_ADDR;
if (le_debug)
printf("le: le_init called\n");
machdep_common_ether(io->myea);
bzero(&le_softc, sizeof(le_softc));
le_softc.sc_r1 = (struct lereg1 *) LANCE_REG_ADDR;
le_softc.sc_r2 = (struct lereg2 *) (*eram - (1024*1024));
le_reset(io->io_netif, io->myea);
return(&le_softc);
}
/*
* close device
* XXX le_softc
*/
void le_end(nif)
struct netif *nif;
{
struct lereg1 *ler1 = le_softc.sc_r1;
if (le_debug)
printf("le: le_end called\n");
ler1->ler1_rap = LE_CSR0;
ler1->ler1_rdp = LE_C0_STOP;
}
/*
* reset device
* XXX le_softc
*/
void le_reset(nif, myea)
struct netif *nif;
u_char *myea;
{
struct lereg1 *ler1 = le_softc.sc_r1;
struct lereg2 *ler2 = le_softc.sc_r2;
unsigned int a;
int timo = 100000, stat, i;
if (le_debug)
printf("le: le_reset called\n");
ler1->ler1_rap = LE_CSR0;
ler1->ler1_rdp = LE_C0_STOP; /* do nothing until we are finished */
bzero(ler2, sizeof(*ler2));
ler2->ler2_mode = LE_MODE_NORMAL;
ler2->ler2_padr[0] = myea[1];
ler2->ler2_padr[1] = myea[0];
ler2->ler2_padr[2] = myea[3];
ler2->ler2_padr[3] = myea[2];
ler2->ler2_padr[4] = myea[5];
ler2->ler2_padr[5] = myea[4];
ler2->ler2_ladrf0 = 0;
ler2->ler2_ladrf1 = 0;
a = (u_int)ler2->ler2_rmd;
ler2->ler2_rlen = LE_RLEN | (a >> 16);
ler2->ler2_rdra = a & LE_ADDR_LOW_MASK;
a = (u_int)ler2->ler2_tmd;
ler2->ler2_tlen = LE_TLEN | (a >> 16);
ler2->ler2_tdra = a & LE_ADDR_LOW_MASK;
ler1->ler1_rap = LE_CSR1;
a = (u_int)ler2;
ler1->ler1_rdp = a & LE_ADDR_LOW_MASK;
ler1->ler1_rap = LE_CSR2;
ler1->ler1_rdp = a >> 16;
for (i = 0; i < LERBUF; i++) {
a = (u_int)&ler2->ler2_rbuf[i];
ler2->ler2_rmd[i].rmd0 = a & LE_ADDR_LOW_MASK;
ler2->ler2_rmd[i].rmd1_bits = LE_R1_OWN;
ler2->ler2_rmd[i].rmd1_hadr = a >> 16;
ler2->ler2_rmd[i].rmd2 = -LEMTU;
ler2->ler2_rmd[i].rmd3 = 0;
}
for (i = 0; i < LETBUF; i++) {
a = (u_int)&ler2->ler2_tbuf[i];
ler2->ler2_tmd[i].tmd0 = a & LE_ADDR_LOW_MASK;
ler2->ler2_tmd[i].tmd1_bits = 0;
ler2->ler2_tmd[i].tmd1_hadr = a >> 16;
ler2->ler2_tmd[i].tmd2 = 0;
ler2->ler2_tmd[i].tmd3 = 0;
}
ler1->ler1_rap = LE_CSR3;
ler1->ler1_rdp = LE_C3_BSWP;
ler1->ler1_rap = LE_CSR0;
ler1->ler1_rdp = LE_C0_INIT;
do {
if (--timo == 0) {
printf("le: init timeout, stat = 0x%x\n", stat);
break;
}
stat = ler1->ler1_rdp;
} while ((stat & LE_C0_IDON) == 0);
ler1->ler1_rdp = LE_C0_IDON;
le_softc.next_rmd = 0;
le_softc.next_tmd = 0;
ler1->ler1_rap = LE_CSR0;
ler1->ler1_rdp = LE_C0_STRT;
}
/*
* le_error
* XXX le_softc
*/
void le_error(nif, str, vler1)
struct netif *nif;
char *str;
volatile void *vler1;
{
volatile struct lereg1 *ler1 = vler1;
/* ler1->ler1_rap = LE_CSRO done in caller */
if (ler1->ler1_rdp & LE_C0_BABL)
panic("le: been babbling, found by '%s'\n", str);
if (ler1->ler1_rdp & LE_C0_CERR) {
ler1->ler1_rdp = LE_C0_CERR;
}
if (ler1->ler1_rdp & LE_C0_MISS) {
ler1->ler1_rdp = LE_C0_MISS;
}
if (ler1->ler1_rdp & LE_C0_MERR) {
printf("le: memory error in '%s'\n", str);
panic("memory error");
}
}
/*
* put a packet
* XXX le_softc
*/
int le_put(desc, pkt, len)
struct iodesc *desc;
void *pkt;
int len;
{
volatile struct lereg1 *ler1 = le_softc.sc_r1;
volatile struct lereg2 *ler2 = le_softc.sc_r2;
volatile struct letmd *tmd;
int timo = 100000, stat, i;
unsigned int a;
ler1->ler1_rap = LE_CSR0;
if (ler1->ler1_rdp & LE_C0_ERR)
le_error(desc->io_netif, "le_put(way before xmit)", ler1);
tmd = &ler2->ler2_tmd[le_softc.next_tmd];
while(tmd->tmd1_bits & LE_T1_OWN) {
printf("le: output buffer busy\n");
}
bcopy(pkt, ler2->ler2_tbuf[le_softc.next_tmd], len);
if (len < 64)
tmd->tmd2 = -64;
else
tmd->tmd2 = -len;
tmd->tmd3 = 0;
if (ler1->ler1_rdp & LE_C0_ERR)
le_error(desc->io_netif, "le_put(before xmit)", ler1);
tmd->tmd1_bits = LE_T1_STP | LE_T1_ENP | LE_T1_OWN;
a = (u_int)&ler2->ler2_tbuf[le_softc.next_tmd];
tmd->tmd0 = a & LE_ADDR_LOW_MASK;
tmd->tmd1_hadr = a >> 16;
ler1->ler1_rdp = LE_C0_TDMD;
if (ler1->ler1_rdp & LE_C0_ERR)
le_error(desc->io_netif, "le_put(after xmit)", ler1);
do {
if (--timo == 0) {
printf("le: transmit timeout, stat = 0x%x\n", stat);
if (ler1->ler1_rdp & LE_C0_ERR)
le_error(desc->io_netif, "le_put(timeout)", ler1);
break;
}
stat = ler1->ler1_rdp;
} while ((stat & LE_C0_TINT) == 0);
ler1->ler1_rdp = LE_C0_TINT;
if (ler1->ler1_rdp & LE_C0_ERR) {
if ((ler1->ler1_rdp & (LE_C0_BABL|LE_C0_CERR|LE_C0_MISS|LE_C0_MERR)) !=
LE_C0_CERR)
printf("le_put: xmit error, buf %d\n", le_softc.next_tmd);
le_error(desc->io_netif, "le_put(xmit error)", ler1);
}
le_softc.next_tmd = 0;
/* (le_softc.next_tmd == (LETBUF - 1)) ? 0 : le_softc.next_tmd + 1;*/
if (tmd->tmd1_bits & LE_T1_ERR) {
printf("le: transmit error, error = 0x%x\n", tmd->tmd3);
return -1;
}
if (le_debug) {
printf("le: le_put() successful: sent %d\n", len);
printf("le: le_put(): tmd1_bits: %x tmd3: %x\n",
(unsigned int) tmd->tmd1_bits,
(unsigned int) tmd->tmd3);
}
return len;
}
/*
* le_get
*/
int le_get(desc, pkt, len, timeout)
struct iodesc *desc;
void *pkt;
int len;
time_t timeout;
{
time_t t;
int cc;
t = getsecs();
cc = 0;
while (((getsecs() - t) < timeout) && !cc) {
cc = le_poll(desc, pkt, len);
}
return cc;
}
/*
* le_poll
* XXX softc
*/
int le_poll(desc, pkt, len)
struct iodesc *desc;
void *pkt;
int len;
{
struct lereg1 *ler1 = le_softc.sc_r1;
struct lereg2 *ler2 = le_softc.sc_r2;
unsigned int a;
int length;
struct lermd *rmd;
ler1->ler1_rap = LE_CSR0;
if ((ler1->ler1_rdp & LE_C0_RINT) != 0)
ler1->ler1_rdp = LE_C0_RINT;
rmd = &ler2->ler2_rmd[le_softc.next_rmd];
if (rmd->rmd1_bits & LE_R1_OWN) {
return(0);
}
if (ler1->ler1_rdp & LE_C0_ERR)
le_error(desc->io_netif, "le_poll", ler1);
if (rmd->rmd1_bits & LE_R1_ERR) {
printf("le_poll: rmd status 0x%x\n", rmd->rmd1_bits);
length = 0;
goto cleanup;
}
if ((rmd->rmd1_bits & (LE_R1_STP|LE_R1_ENP)) != (LE_R1_STP|LE_R1_ENP))
panic("le_poll: chained packet\n");
length = rmd->rmd3;
if (length >= LEMTU) {
length = 0;
panic("csr0 when bad things happen: %x\n", ler1->ler1_rdp);
goto cleanup;
}
if (!length) goto cleanup;
length -= 4;
if (length > 0) {
/*
* if buffer is smaller than the packet truncate it.
* (is this wise?)
*/
if (length > len)
length = len;
bcopy((void *)&ler2->ler2_rbuf[le_softc.next_rmd], pkt, length);
}
cleanup:
a = (u_int)&ler2->ler2_rbuf[le_softc.next_rmd];
rmd->rmd0 = a & LE_ADDR_LOW_MASK;
rmd->rmd1_hadr = a >> 16;
rmd->rmd2 = -LEMTU;
le_softc.next_rmd =
(le_softc.next_rmd == (LERBUF - 1)) ? 0 : (le_softc.next_rmd + 1);
rmd->rmd1_bits = LE_R1_OWN;
return length;
}

View File

@@ -1,22 +0,0 @@
#include "iodesc.h"
struct netif {
void *devdata;
};
ssize_t netif_get __P((struct iodesc *, void *, size_t, time_t));
ssize_t netif_put __P((struct iodesc *, void *, size_t));
int netif_open __P((void *));
int netif_close __P((int));
struct iodesc *socktodesc __P((int));
void le_end __P((struct netif *));
void le_error __P((struct netif *, char *, volatile void *));
int le_get __P((struct iodesc *, void *, int, time_t));
void *le_init __P((struct iodesc *));
int le_poll __P((struct iodesc *, void *, int));
int le_put __P((struct iodesc *, void *, int));
void le_reset __P((struct netif *, u_char *));

View File

@@ -1,139 +0,0 @@
/*
*
* Copyright (c) 1995 Charles D. Cranor and Seth Widoff
* 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 Charles D. Cranor
* and Seth Widoff.
* 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.
*/
/*
* console i/o
*/
#include "sboot.h"
/*
* hardware
*/
struct zs_hw {
volatile u_char ctl;
volatile u_char data;
};
struct zs_hw *zs = (struct zs_hw *)CONS_ZS_ADDR;
/*
* consinit: init console
*/
consinit()
{
register int mark = time();
register int rr1;
while (1) {
if (time() > mark + 5) break;
zs->ctl = 1; rr1 = zs->ctl;
zs->ctl = 0;
if ((rr1 & 0x1) == 1 && (zs->ctl & 0x4) == 4) break; /* zs_drain! */
}
zs->ctl = 9; zs->ctl = 0x00; /* clear interrupt */
zs->ctl = 4; zs->ctl = 0x44; /* 16x clk, 1 stop bit */
zs->ctl = 5; zs->ctl = 0xea; /* DTR on, 8 bit xmit, xmit on, RTS on */
zs->ctl = 3; zs->ctl = 0xc1; /* 8 bit recv, auto cd_cts, recv on */
zs->ctl = 1; zs->ctl = 0x00; /* no intrs */
zs->ctl = 2; zs->ctl = 0x00; /* no vector */
zs->ctl = 10; zs->ctl = 0x00; /* */
zs->ctl = 11; zs->ctl = 0x50; /* clocking options */
zs->ctl = 12; zs->ctl = 0x0e; /* 9600 baud, part 1 */
zs->ctl = 13; zs->ctl = 0x00; /* 9600 baud, part 2 */
zs->ctl = 14; zs->ctl = 0x03; /* more clocking options */
zs->ctl = 15; zs->ctl = 0x00; /* clear intrs */
}
/*
* putchar: put char to console
*/
void putchar(char c)
{
if (c == '\n') putchar('\r'); /* avoid the need for \r\n in printf */
zs->ctl = 0;
while ((zs->ctl & 0x04) == 0) {
zs->ctl = 0;
}
zs->ctl = 8;
zs->ctl = c;
}
/*
* cngetc: get 1 char from console
*/
char cngetc ()
{
zs->ctl = 0;
while ((zs->ctl & 0x1) == 0) {
zs->ctl = 0;
}
zs->ctl = 8;
return zs->ctl;
}
/*
* puts: put string to console
*/
void puts ( char * str )
{
while ( *str != '\0' ) {
putchar(*str);
str++;
}
}
/*
* ngets: get string from console
*/
void ngets ( char * str, int size )
{
int i = 0;
while ( (i < size - 1) && (str[i] = cngetc()) != '\r') {
if ( str[i] == '\b' || str[i] == 0x7F ) {
if ( i == 0) continue;
i--;
puts("\b \b");
continue;
}
putchar(str[i]);
i++;
}
puts("\n");
str[i] = '\0';
}

View File

@@ -1,320 +0,0 @@
/* $NetBSD: le_poll.c,v 1.1.1.1 1995/07/25 23:12:31 chuck Exp $ */
/*
* Copyright (c) 1993 Adam Glass
* 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 Adam Glass.
* 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 Adam Glass ``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.
*/
#include "sboot.h"
#include "if_lereg.h"
struct {
struct lereg1 *sc_r1; /* LANCE registers */
struct lereg2 *sc_r2; /* RAM */
int next_rmd;
int next_tmd;
} le_softc;
void le_error(str, ler1)
char *str;
struct lereg1 *ler1;
{
/* ler1->ler1_rap = LE_CSRO done in caller */
if (ler1->ler1_rdp & LE_C0_BABL) {
printf("le0: been babbling, found by '%s'\n", str);
callrom();
}
if (ler1->ler1_rdp & LE_C0_CERR) {
ler1->ler1_rdp = LE_C0_CERR;
}
if (ler1->ler1_rdp & LE_C0_MISS) {
ler1->ler1_rdp = LE_C0_MISS;
}
if (ler1->ler1_rdp & LE_C0_MERR) {
printf("le0: memory error in '%s'\n", str);
callrom();
}
}
void le_reset(myea)
u_char *myea;
{
struct lereg1 *ler1 = le_softc.sc_r1;
struct lereg2 *ler2 = le_softc.sc_r2;
unsigned int a;
int timo = 100000, stat, i;
ler1->ler1_rap = LE_CSR0;
ler1->ler1_rdp = LE_C0_STOP; /* do nothing until we are finished */
bzero(ler2, sizeof(*ler2));
ler2->ler2_mode = LE_MODE_NORMAL;
ler2->ler2_padr[0] = myea[1];
ler2->ler2_padr[1] = myea[0];
ler2->ler2_padr[2] = myea[3];
ler2->ler2_padr[3] = myea[2];
ler2->ler2_padr[4] = myea[5];
ler2->ler2_padr[5] = myea[4];
ler2->ler2_ladrf0 = 0;
ler2->ler2_ladrf1 = 0;
a = (u_int)ler2->ler2_rmd;
ler2->ler2_rlen = LE_RLEN | (a >> 16);
ler2->ler2_rdra = a & LE_ADDR_LOW_MASK;
a = (u_int)ler2->ler2_tmd;
ler2->ler2_tlen = LE_TLEN | (a >> 16);
ler2->ler2_tdra = a & LE_ADDR_LOW_MASK;
ler1->ler1_rap = LE_CSR1;
a = (u_int)ler2;
ler1->ler1_rdp = a & LE_ADDR_LOW_MASK;
ler1->ler1_rap = LE_CSR2;
ler1->ler1_rdp = a >> 16;
for (i = 0; i < LERBUF; i++) {
a = (u_int)&ler2->ler2_rbuf[i];
ler2->ler2_rmd[i].rmd0 = a & LE_ADDR_LOW_MASK;
ler2->ler2_rmd[i].rmd1_bits = LE_R1_OWN;
ler2->ler2_rmd[i].rmd1_hadr = a >> 16;
ler2->ler2_rmd[i].rmd2 = -LEMTU;
ler2->ler2_rmd[i].rmd3 = 0;
}
for (i = 0; i < LETBUF; i++) {
a = (u_int)&ler2->ler2_tbuf[i];
ler2->ler2_tmd[i].tmd0 = a & LE_ADDR_LOW_MASK;
ler2->ler2_tmd[i].tmd1_bits = 0;
ler2->ler2_tmd[i].tmd1_hadr = a >> 16;
ler2->ler2_tmd[i].tmd2 = 0;
ler2->ler2_tmd[i].tmd3 = 0;
}
ler1->ler1_rap = LE_CSR3;
ler1->ler1_rdp = LE_C3_BSWP;
ler1->ler1_rap = LE_CSR0;
ler1->ler1_rdp = LE_C0_INIT;
do {
if (--timo == 0) {
printf("le0: init timeout, stat = 0x%x\n", stat);
break;
}
stat = ler1->ler1_rdp;
} while ((stat & LE_C0_IDON) == 0);
ler1->ler1_rdp = LE_C0_IDON;
le_softc.next_rmd = 0;
le_softc.next_tmd = 0;
ler1->ler1_rap = LE_CSR0;
ler1->ler1_rdp = LE_C0_STRT;
}
int le_poll(pkt, len)
void *pkt;
int len;
{
struct lereg1 *ler1 = le_softc.sc_r1;
struct lereg2 *ler2 = le_softc.sc_r2;
unsigned int a;
int length;
struct lermd *rmd;
ler1->ler1_rap = LE_CSR0;
if ((ler1->ler1_rdp & LE_C0_RINT) != 0)
ler1->ler1_rdp = LE_C0_RINT;
rmd = &ler2->ler2_rmd[le_softc.next_rmd];
if (rmd->rmd1_bits & LE_R1_OWN) {
return(0);
}
if (ler1->ler1_rdp & LE_C0_ERR)
le_error("le_poll", ler1);
if (rmd->rmd1_bits & LE_R1_ERR) {
printf("le0_poll: rmd status 0x%x\n", rmd->rmd1_bits);
length = 0;
goto cleanup;
}
if ((rmd->rmd1_bits & (LE_R1_STP|LE_R1_ENP)) != (LE_R1_STP|LE_R1_ENP)) {
printf("le_poll: chained packet\n");
callrom();
}
length = rmd->rmd3;
if (length >= LEMTU) {
length = 0;
printf("csr0 when bad things happen: %x\n", ler1->ler1_rdp);
callrom();
goto cleanup;
}
if (!length) goto cleanup;
length -= 4;
if (length > 0)
bcopy((char *)&ler2->ler2_rbuf[le_softc.next_rmd], pkt, length);
cleanup:
a = (u_int)&ler2->ler2_rbuf[le_softc.next_rmd];
rmd->rmd0 = a & LE_ADDR_LOW_MASK;
rmd->rmd1_hadr = a >> 16;
rmd->rmd2 = -LEMTU;
le_softc.next_rmd =
(le_softc.next_rmd == (LERBUF - 1)) ? 0 : (le_softc.next_rmd + 1);
rmd->rmd1_bits = LE_R1_OWN;
return length;
}
int le_put(pkt, len)
u_char *pkt;
size_t len;
{
struct lereg1 *ler1 = le_softc.sc_r1;
struct lereg2 *ler2 = le_softc.sc_r2;
struct letmd *tmd;
int timo = 100000, stat, i;
unsigned int a;
ler1->ler1_rap = LE_CSR0;
if (ler1->ler1_rdp & LE_C0_ERR)
le_error("le_put(way before xmit)", ler1);
tmd = &ler2->ler2_tmd[le_softc.next_tmd];
while(tmd->tmd1_bits & LE_T1_OWN) {
printf("le0: output buffer busy\n");
}
bcopy(pkt, (char *)ler2->ler2_tbuf[le_softc.next_tmd], len);
if (len < 64)
tmd->tmd2 = -64;
else
tmd->tmd2 = -len;
tmd->tmd3 = 0;
if (ler1->ler1_rdp & LE_C0_ERR)
le_error("le_put(before xmit)", ler1);
tmd->tmd1_bits = LE_T1_STP | LE_T1_ENP | LE_T1_OWN;
a = (u_int)&ler2->ler2_tbuf[le_softc.next_tmd];
tmd->tmd0 = a & LE_ADDR_LOW_MASK;
tmd->tmd1_hadr = a >> 16;
ler1->ler1_rdp = LE_C0_TDMD;
if (ler1->ler1_rdp & LE_C0_ERR)
le_error("le_put(after xmit)", ler1);
do {
if (--timo == 0) {
printf("le0: transmit timeout, stat = 0x%x\n",
stat);
if (ler1->ler1_rdp & LE_C0_ERR)
le_error("le_put(timeout)", ler1);
break;
}
stat = ler1->ler1_rdp;
} while ((stat & LE_C0_TINT) == 0);
ler1->ler1_rdp = LE_C0_TINT;
if (ler1->ler1_rdp & LE_C0_ERR) {
if ((ler1->ler1_rdp & (LE_C0_BABL|LE_C0_CERR|LE_C0_MISS|LE_C0_MERR)) !=
LE_C0_CERR)
printf("le_put: xmit error, buf %d\n", le_softc.next_tmd);
le_error("le_put(xmit error)", ler1);
}
le_softc.next_tmd = 0;
/* (le_softc.next_tmd == (LETBUF - 1)) ? 0 : le_softc.next_tmd + 1;*/
if (tmd->tmd1_bits & LE_T1_ERR) {
printf("le0: transmit error, error = 0x%x\n",
tmd->tmd3);
return -1;
}
return len;
}
int le_get(pkt, len, timeout)
u_char *pkt;
size_t len;
u_long timeout;
{
int cc;
int now, then;
int stopat = time() + timeout;
then = 0;
cc = 0;
while ((now = time()) < stopat && !cc) {
cc = le_poll(pkt, len);
if (then != now) {
#ifdef LE_DEBUG
printf("%d \r", stopat - now);
#endif
then = now;
}
if (cc && (pkt[0] != myea[0] || pkt[1] != myea[1] ||
pkt[2] != myea[2] || pkt[3] != myea[3] ||
pkt[4] != myea[4] || pkt[5] != myea[5])) {
cc = 0; /* ignore broadcast / multicast */
#ifdef LE_DEBUG
printf("reject (%d sec left)\n", stopat - now);
#endif
}
}
#ifdef LE_DEBUG
printf("\n");
#endif
return cc;
}
void le_init()
{
caddr_t addr;
int *ea = (int *) LANCE_ADDR;
u_long *eram = (u_long *) ERAM_ADDR;
u_long e = *ea;
if (( e & 0x2fffff00 ) == 0x2fffff00) {
printf("ERROR: ethernet address not set! Use LSAD.\n");
callrom();
}
myea[0] = 0x08;
myea[1] = 0x00;
myea[2] = 0x3e;
e = e >> 8;
myea[5] = e & 0xff;
e = e >> 8;
myea[4] = e & 0xff;
e = e >> 8;
myea[3] = e;
printf("le0: ethernet address: %x:%x:%x:%x:%x:%x\n",
myea[0], myea[1], myea[2], myea[3], myea[4], myea[5]);
bzero(&le_softc, sizeof(le_softc));
le_softc.sc_r1 = (struct lereg1 *) LANCE_REG_ADDR;
le_softc.sc_r2 = (struct lereg2 *)(*eram - (1024*1024));
le_reset(myea);
}
void le_end()
{
struct lereg1 *ler1 = le_softc.sc_r1;
ler1->ler1_rap = LE_CSR0;
ler1->ler1_rdp = LE_C0_STOP;
}

View File

@@ -1,348 +0,0 @@
/* $NetBSD: libc_sa.c,v 1.1.1.1 1995/07/25 23:12:33 chuck Exp $ */
/*-
* Copyright (c) 1990 The Regents of the University of California.
* All rights reserved.
*
* This code is derived from software contributed to Berkeley by
* Chris Torek.
*
* 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.
*/
#include "sboot.h"
/*
* sizeof(word) MUST BE A POWER OF TWO
* SO THAT wmask BELOW IS ALL ONES
*/
typedef int word; /* "word" used for optimal copy speed */
#define wsize sizeof(word)
#define wmask (wsize - 1)
/*
* Copy a block of memory, handling overlap.
* This is the routine that actually implements
* (the portable versions of) bcopy, memcpy, and memmove.
*/
void
bcopy(src0, dst0, length)
void *dst0;
const void *src0;
register size_t length;
{
register char *dst = dst0;
register const char *src = src0;
register size_t t;
if (length == 0 || dst == src) /* nothing to do */
goto done;
/*
* Macros: loop-t-times; and loop-t-times, t>0
*/
#define TLOOP(s) if (t) TLOOP1(s)
#define TLOOP1(s) do { s; } while (--t)
if ((unsigned long)dst < (unsigned long)src) {
/*
* Copy forward.
*/
t = (long)src; /* only need low bits */
if ((t | (long)dst) & wmask) {
/*
* Try to align operands. This cannot be done
* unless the low bits match.
*/
if ((t ^ (long)dst) & wmask || length < wsize)
t = length;
else
t = wsize - (t & wmask);
length -= t;
TLOOP1(*dst++ = *src++);
}
/*
* Copy whole words, then mop up any trailing bytes.
*/
t = length / wsize;
TLOOP(*(word *)dst = *(word *)src; src += wsize; dst += wsize);
t = length & wmask;
TLOOP(*dst++ = *src++);
} else {
/*
* Copy backwards. Otherwise essentially the same.
* Alignment works as before, except that it takes
* (t&wmask) bytes to align, not wsize-(t&wmask).
*/
src += length;
dst += length;
t = (long)src;
if ((t | (long)dst) & wmask) {
if ((t ^ (long)dst) & wmask || length <= wsize)
t = length;
else
t &= wmask;
length -= t;
TLOOP1(*--dst = *--src);
}
t = length / wsize;
TLOOP(src -= wsize; dst -= wsize; *(word *)dst = *(word *)src);
t = length & wmask;
TLOOP(*--dst = *--src);
}
done:
return;
}
/*-
* Copyright (c) 1990 The Regents of the University of California.
* All rights reserved.
*
* This code is derived from software contributed to Berkeley by
* Chris Torek.
*
* 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.
*/
void *
bzero(dst, n)
void *dst;
register size_t n;
{
if (n != 0) {
register char *d = dst;
do
*d++ = 0;
while (--n != 0);
}
return (dst);
}
/* $NetBSD: libc_sa.c,v 1.1.1.1 1995/07/25 23:12:33 chuck Exp $ */
/*-
* Copyright (c) 1991 The Regents of the University of California.
* 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 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.
*
* @(#)printf.c 5.6 (Berkeley) 5/25/91
*/
/*
* Scaled down version of printf(3).
*
* One additional format:
*
* The format %b is supported to decode error registers.
* Its usage is:
*
* printf("reg=%b\n", regval, "<base><arg>*");
*
* where <base> is the output base expressed as a control character, e.g.
* \10 gives octal; \20 gives hex. Each arg is a sequence of characters,
* the first of which gives the bit number to be inspected (origin 1), and
* the next characters (up to a control character, i.e. a character <= 32),
* give the name of the register. Thus:
*
* printf("reg=%b\n", 3, "\10\2BITTWO\1BITONE\n");
*
* would produce output:
*
* reg=3<BITTWO,BITONE>
*/
/*
* Note that stdarg.h and the ANSI style va_start macro is used for both
* ANSI and traditional C compilers.
*/
#define _KERNEL
#include <machine/stdarg.h>
#undef _KERNEL
static void
kprintn(ul, base)
unsigned long ul;
int base;
{
/* hold a long in base 8 */
char *p, buf[(sizeof(long) * 8 / 3) + 1];
p = buf;
do {
*p++ = "0123456789abcdef"[ul % base];
} while (ul /= base);
do {
putchar(*--p);
} while (p > buf);
}
void
#if __STDC__
printf(const char *fmt, ...)
#else
printf(fmt /* , va_alist */)
char *fmt;
#endif
{
register char *p;
register int ch, n;
unsigned long ul;
int lflag, set;
va_list ap;
va_start(ap, fmt);
for (;;) {
while ((ch = *fmt++) != '%') {
if (ch == '\0')
return;
putchar(ch);
}
lflag = 0;
reswitch: switch (ch = *fmt++) {
case 'l':
lflag = 1;
goto reswitch;
case 'b':
ul = va_arg(ap, int);
p = va_arg(ap, char *);
kprintn(ul, *p++);
if (!ul)
break;
for (set = 0; n = *p++;) {
if (ul & (1 << (n - 1))) {
putchar(set ? ',' : '<');
for (; (n = *p) > ' '; ++p)
putchar(n);
set = 1;
} else
for (; *p > ' '; ++p);
}
if (set)
putchar('>');
break;
case 'c':
ch = va_arg(ap, int);
putchar(ch & 0x7f);
break;
case 's':
p = va_arg(ap, char *);
while (ch = *p++)
putchar(ch);
break;
case 'd':
ul = lflag ?
va_arg(ap, long) : va_arg(ap, int);
if ((long)ul < 0) {
putchar('-');
ul = -(long)ul;
}
kprintn(ul, 10);
break;
case 'o':
ul = lflag ?
va_arg(ap, u_long) : va_arg(ap, u_int);
kprintn(ul, 8);
break;
case 'u':
ul = lflag ?
va_arg(ap, u_long) : va_arg(ap, u_int);
kprintn(ul, 10);
break;
case 'x':
ul = lflag ?
va_arg(ap, u_long) : va_arg(ap, u_int);
kprintn(ul, 16);
break;
default:
putchar('%');
if (lflag)
putchar('l');
putchar(ch);
}
}
va_end(ap);
}

View File

@@ -1,187 +0,0 @@
| $NetBSD: oc_cksum.s,v 1.1.1.1 1995/07/25 23:12:31 chuck Exp $
| Copyright (c) 1988 Regents of the University of California.
| 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 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.
|
| @(#)oc_cksum.s 7.2 (Berkeley) 11/3/90
|
|
| oc_cksum: ones complement 16 bit checksum for MC68020.
|
| oc_cksum (buffer, count, strtval)
|
| Do a 16 bit one's complement sum of 'count' bytes from 'buffer'.
| 'strtval' is the starting value of the sum (usually zero).
|
| It simplifies life in in_cksum if strtval can be >= 2^16.
| This routine will work as long as strtval is < 2^31.
|
| Performance
| -----------
| This routine is intended for MC 68020s but should also work
| for 68030s. It (deliberately) doesn't worry about the alignment
| of the buffer so will only work on a 68010 if the buffer is
| aligned on an even address. (Also, a routine written to use
| 68010 "loop mode" would almost certainly be faster than this
| code on a 68010).
|
| We don't worry about alignment because this routine is frequently
| called with small counts: 20 bytes for IP header checksums and 40
| bytes for TCP ack checksums. For these small counts, testing for
| bad alignment adds ~10% to the per-call cost. Since, by the nature
| of the kernel's allocator, the data we're called with is almost
| always longword aligned, there is no benefit to this added cost
| and we're better off letting the loop take a big performance hit
| in the rare cases where we're handed an unaligned buffer.
|
| Loop unrolling constants of 2, 4, 8, 16, 32 and 64 times were
| tested on random data on four different types of processors (see
| list below -- 64 was the largest unrolling because anything more
| overflows the 68020 Icache). On all the processors, the
| throughput asymptote was located between 8 and 16 (closer to 8).
| However, 16 was substantially better than 8 for small counts.
| (It's clear why this happens for a count of 40: unroll-8 pays a
| loop branch cost and unroll-16 doesn't. But the tests also showed
| that 16 was better than 8 for a count of 20. It's not obvious to
| me why.) So, since 16 was good for both large and small counts,
| the loop below is unrolled 16 times.
|
| The processors tested and their average time to checksum 1024 bytes
| of random data were:
| Sun 3/50 (15MHz) 190 us/KB
| Sun 3/180 (16.6MHz) 175 us/KB
| Sun 3/60 (20MHz) 134 us/KB
| Sun 3/280 (25MHz) 95 us/KB
|
| The cost of calling this routine was typically 10% of the per-
| kilobyte cost. E.g., checksumming zero bytes on a 3/60 cost 9us
| and each additional byte cost 125ns. With the high fixed cost,
| it would clearly be a gain to "inline" this routine -- the
| subroutine call adds 400% overhead to an IP header checksum.
| However, in absolute terms, inlining would only gain 10us per
| packet -- a 1% effect for a 1ms ethernet packet. This is not
| enough gain to be worth the effort.
#include <m68k/asm.h>
.text
.text; .even; .globl _oc_cksum; _oc_cksum:
movl sp@(4),a0 | get buffer ptr
movl sp@(8),d1 | get byte count
movl sp@(12),d0 | get starting value
movl d2,sp@- | free a reg
| test for possible 1, 2 or 3 bytes of excess at end
| of buffer. The usual case is no excess (the usual
| case is header checksums) so we give that the faster
| 'not taken' leg of the compare. (We do the excess
| first because we're about the trash the low order
| bits of the count in d1.)
btst #0,d1
jne L5 | if one or three bytes excess
btst #1,d1
jne L7 | if two bytes excess
L1:
movl d1,d2
lsrl #6,d1 | make cnt into # of 64 byte chunks
andl #0x3c,d2 | then find fractions of a chunk
negl d2
andb #0xf,cc | clear X
jmp pc@(L3-.-2:b,d2)
L2:
movl a0@+,d2
addxl d2,d0
movl a0@+,d2
addxl d2,d0
movl a0@+,d2
addxl d2,d0
movl a0@+,d2
addxl d2,d0
movl a0@+,d2
addxl d2,d0
movl a0@+,d2
addxl d2,d0
movl a0@+,d2
addxl d2,d0
movl a0@+,d2
addxl d2,d0
movl a0@+,d2
addxl d2,d0
movl a0@+,d2
addxl d2,d0
movl a0@+,d2
addxl d2,d0
movl a0@+,d2
addxl d2,d0
movl a0@+,d2
addxl d2,d0
movl a0@+,d2
addxl d2,d0
movl a0@+,d2
addxl d2,d0
movl a0@+,d2
addxl d2,d0
L3:
dbra d1,L2 | (NB- dbra doesn't affect X)
movl d0,d1 | fold 32 bit sum to 16 bits
swap d1 | (NB- swap doesn't affect X)
addxw d1,d0
jcc L4
addw #1,d0
L4:
andl #0xffff,d0
movl sp@+,d2
rts
L5: | deal with 1 or 3 excess bytes at the end of the buffer.
btst #1,d1
jeq L6 | if 1 excess
| 3 bytes excess
clrl d2
movw a0@(-3,d1:l),d2 | add in last full word then drop
addl d2,d0 | through to pick up last byte
L6: | 1 byte excess
clrl d2
movb a0@(-1,d1:l),d2
lsll #8,d2
addl d2,d0
jra L1
L7: | 2 bytes excess
clrl d2
movw a0@(-2,d1:l),d2
addl d2,d0
jra L1

View File

@@ -1,47 +0,0 @@
/*
*
* Copyright (c) 1995 Charles D. Cranor
* 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 Charles D. Cranor.
* 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.
*/
/*
* start: at address 0x4000, load at 0xa000 (so put stack at 0x9ff0)
* note this file is named "AAstart" so that it gets linked FIRST
*/
.text
.globl start
start:
movb #0,_reboot
jra Ldoit
restart:
movb #1,_reboot | fall through
Ldoit:
movl #0x00006ff0,sp
jsr _sboot