ast@cs.vu.nl (Andy Tanenbaum) (07/23/88)
: This is a shar archive. Extract with sh, not csh. : This archive ends with exit, so do not worry about trailing junk. : --------------------------- cut here -------------------------- PATH=/bin:/usr/bin:/usr/ucb echo Extracting 'amstat.h' sed 's/^X//' > 'amstat.h' << '+ END-OF-FILE ''amstat.h' Xstruct amstat { X long ams_clfail; X long ams_svfail; X long ams_clcrash; X long ams_rxcl; X long ams_rxsv; X long ams_trans; X long ams_loctrans; X long ams_remtrans; X long ams_getreq; X long ams_putrep; X long ams_naks; X}; + END-OF-FILE amstat.h chmod 'u=rw,g=r,o=r' 'amstat.h' set `wc -c 'amstat.h'` count=$1 case $count in 215) :;; *) echo 'Bad character count in ''amstat.h' >&2 echo 'Count should be 215' >&2 esac echo Extracting 'assert.h' sed 's/^X//' > 'assert.h' << '+ END-OF-FILE ''assert.h' X/**************************************************************************** X * * X * (c) Copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands * X * * X * This product is part of the Amoeba distributed operating system. * X * Permission is hereby granted to use it exclusively for educational * X * and research purposes. It may also be freely duplicated and given * X * to others for educational and research purposes only. All other use * X * requires written permission from the copyright owner. * X * * X * Requests for such permissions may be sent to * X * * X * * X * Dr. Andrew S. Tanenbaum * X * Dept. of Mathematics and Computer Science * X * Vrije Universiteit * X * De Boelelaan 1081 * X * 1081 HV Amsterdam * X * The Netherlands * X * * X/****************************************************************************/ X X#define NDEBUG X#ifdef NDEBUG X#define assert(e) /* NOTHING */ X#define compare(a,t,b) /* NOTHING */ X#else X#ifdef lint X#define assert(e) use(e) X#define compare(a,t,b) use(a, b) X#else lint X#define assert(x) if (!(x)) printf("assertion failed in %s at %d\n", __FILE__, __LINE__) X#define compare(a,t,b) if (!((a) t (b))) \ X printf("comparison failed in %s at %d (%D)\n", \ X __FILE__, __LINE__, a) X/* X#define assert(e) do if (!(e)) badassertion(__FILE__,__LINE__); while (0) X#define compare(a,t,b) do if (!((a) t (b))) \ X badcompare(__FILE__,__LINE__, (long) (a)); \ X while (0) X*/ X#endif lint X#endif NDEBUG + END-OF-FILE assert.h chmod 'u=rw,g=r,o=r' 'assert.h' set `wc -c 'assert.h'` count=$1 case $count in 1621) :;; *) echo 'Bad character count in ''assert.h' >&2 echo 'Count should be 1621' >&2 esac echo Extracting 'byteorder.h' sed 's/^X//' > 'byteorder.h' << '+ END-OF-FILE ''byteorder.h' X/* X * set of macros to do inplace byteorder changes X * The dec_* routines decode a short (_s) or long (_l) from little endian(_le) X * or bigendian(_be) to native format. X * The enc_* are similar for native to net format X */ X X X/* littleendian version for ibm pc */ X X#define dec_s_le(s) /* nothing */ X#define dec_s_be(s) (*(s))=((((*(s))>>8)&0xFF)|(((*(s))&0xFF)<<8)) X X#define dec_l_le(l) /* nothing */ X#define dec_l_be(l) (*(l))=((((*(l))>>24)&0xFF)|(((*(l))>>8)&0xFF00)|(((*(l))<<8)&0xFF0000)|(((*(l))<<24)&0xFF000000)) X X#define enc_s_le(s) /* nothing */ X#define enc_s_be(s) dec_s_be(s) X X#define enc_l_le(l) /* nothing */ X#define enc_l_be(l) dec_l_be(l) + END-OF-FILE byteorder.h chmod 'u=rw,g=r,o=r' 'byteorder.h' set `wc -c 'byteorder.h'` count=$1 case $count in 654) :;; *) echo 'Bad character count in ''byteorder.h' >&2 echo 'Count should be 654' >&2 esac echo Extracting 'conf.c' sed 's/^X//' > 'conf.c' << '+ END-OF-FILE ''conf.c' X#include "../h/type.h" X#include "../h/amoeba.h" X#include "global.h" X#include "conf.h" X X/* X** the following hack is imported from task.c under Amoeba to declare X** a few pointers to the task table X*/ X#define extern X X#include "task.h" X X#undef extern X X/************************************************************************/ X/* TRANS CONFIGURATION */ X/************************************************************************/ X X/* X** various variables used for transactions X*/ X Xport NULLPORT; /* used in trans.c, declared here for compatability */ Xlong ticker; /* bogus global used by trans.c for statistics */ X X#ifndef NONET X Xunshort minloccnt = MINLOCCNT; Xunshort maxloccnt = MAXLOCCNT; X Xunshort retranstime = RETRANSTIME; Xunshort crashtime = CRASHTIME; Xunshort clientcrash = CLIENTCRASH; X Xunshort maxretrans = MAXRETRANS; Xunshort mincrash = MINCRASH; Xunshort maxcrash = MAXCRASH; X X#endif NONET + END-OF-FILE conf.c chmod 'u=rw,g=r,o=r' 'conf.c' set `wc -c 'conf.c'` count=$1 case $count in 902) :;; *) echo 'Bad character count in ''conf.c' >&2 echo 'Count should be 902' >&2 esac echo Extracting 'conf.h' sed 's/^X//' > 'conf.h' << '+ END-OF-FILE ''conf.h' X/* X** constants used for configuring amoeba transactions X*/ X#define MINLOCCNT 5 /* locate message sent every dsec */ X#define MAXLOCCNT 100 /* locate message sent every MAXLOCCNT dsec */ X X#define RETRANSTIME 5 /* retransmission time in dsec */ X#define CRASHTIME 100 /* crash timer in dsec */ X#define CLIENTCRASH 500 /* client must probe within this time */ X X#define MAXRETRANS 10 /* max. number of transmissions */ X#define MINCRASH 5 /* enquiry sent MINCRASH times during recv */ X#define MAXCRASH 10 /* enquiry sent MAXCRASH times during serv */ X X#define NPORTS 16 /* # ports in portcache */ + END-OF-FILE conf.h chmod 'u=rw,g=r,o=r' 'conf.h' set `wc -c 'conf.h'` count=$1 case $count in 610) :;; *) echo 'Bad character count in ''conf.h' >&2 echo 'Count should be 610' >&2 esac echo Extracting 'dp8390.c' sed 's/^X//' > 'dp8390.c' << '+ END-OF-FILE ''dp8390.c' X X#include "../h/const.h" X X#ifndef NONET X X#include "../h/error.h" X#include "../h/type.h" X#include "../h/com.h" X#include "const.h" X#include "internet.h" X#include "etherformat.h" X#include "dp8390.h" X#include "dp8390info.h" X#include "dp8390stat.h" X#include "assert.h" X X/* macros for device I/O */ X#define PIC_enable() port_out(INT_CTL,ENABLE) X X#define input(devaddr, dp_register) \ X inbyte((vir_bytes)&((union dp8390reg *) devaddr)->dp_pg0rd.dp_register) X#define input1(devaddr, dp_register) \ X inbyte((vir_bytes)&((union dp8390reg *) devaddr)->dp_pg1rdwr.dp_register) X#define output(devaddr, dp_register, value) \ X outbyte((vir_bytes)&((union dp8390reg *) devaddr)->dp_pg0wr.dp_register, value) X#define output1(devaddr, dp_register, value) \ X outbyte((vir_bytes)&((union dp8390reg *) devaddr)->dp_pg1rdwr.dp_register, value) X X#define MAX_WAIT 10000 X X#ifdef DPSTAT Xstruct dpstat dpstat; X#endif X Xstatic int (*bufread)(); /* call when packet came in */ Xstatic int (*bufwritten)(); /* call when packet has been written */ X Xstatic disabled; Xstatic phys_bytes curopacket; /* packet being transmitted */ Xstatic phys_bytes Curbuff; /* address of next read buffer to release */ X X Xstatic Xchipinit(myaddr) XEth_addr *myaddr; X{ X register vir_bytes device; X X device = dp8390info.dpi_devaddr; X output(device, dp_cr, CR_PS_P0|CR_DM_ABORT); /* back to main register set */ X output(device, dp_pstart, dp8390info.dpi_pstart); X output(device, dp_pstop, dp8390info.dpi_pstop); X output(device, dp_bnry, dp8390info.dpi_pstart); X output(device, dp_rcr, RCR_MON); X output(device, dp_tcr, TCR_NORMAL); X output(device, dp_dcr, DCR_BYTEWIDE|DCR_8BYTES); X output(device, dp_rbcr0, 0); X output(device, dp_rbcr1, 0); X output(device, dp_isr, 0xFF); X output(device, dp_cr, CR_PS_P1|CR_DM_ABORT); /* switch to register set 1 */ X output1(device, dp_par0, myaddr->e[0]); X output1(device, dp_par1, myaddr->e[1]); X output1(device, dp_par2, myaddr->e[2]); X output1(device, dp_par3, myaddr->e[3]); X output1(device, dp_par4, myaddr->e[4]); X output1(device, dp_par5, myaddr->e[5]); X output1(device, dp_curr, dp8390info.dpi_pstart+1); X output1(device, dp_cr, CR_PS_P0|CR_DM_ABORT); X output(device, dp_rcr, RCR_AB); X input(device, dp_cntr0); X input(device, dp_cntr1); X input(device, dp_cntr2); X X#ifdef TRMTINT X output(device, dp_imr, IMR_TXEE|IMR_PTXE|IMR_PRXE|IMR_CNTE|IMR_OVWE); X#endif X output(device, dp_imr, IMR_PRXE|IMR_CNTE|IMR_OVWE); X output(device, dp_cr, CR_STA|CR_DM_ABORT); /* fire it up */ X} X X/* X * Interrupt handling X */ X Xstatic Xdp_xmit_intr() X#ifdef TRMTINT X{ X register tsr; X X if (curopacket == 0) { X printf("Bogus transmit interrupt\n"); X STINC(ds_btint); X return; X } X tsr = input(dp8390info.dpi_devaddr, dp_tsr); X if (tsr&TSR_PTX) X STINC(ds_written); /* It went OK! */ X if (tsr&TSR_DFR) X STINC(ds_deferred); X if (tsr&TSR_COL) X STINC(ds_collisions); X if (tsr&TSR_ABT) X STINC(ds_xcollisions); X if (tsr&TSR_CRS) { X printf("Ethernet carrier sense lost\n"); X STINC(ds_carlost); X } X if (tsr&TSR_FU) { X printf("Ethernet Fifo Underrun\n"); X STINC(ds_fifo); X } X if (tsr&TSR_CDH) { X printf("Ethernet Heartbeat failure\n"); X STINC(ds_heartbeat); X } X if (tsr&TSR_OWC) { X printf("Ethernet late collision\n"); X STINC(ds_lcol); X } X (*bufwritten)(curopacket); X curopacket = 0; X} X#else X{} X#endif X X Xstatic Xrecvintr() X{ X register vir_bytes device; X register phys_bytes paddr; X struct rcvdheader pkthead; X char pageno, curr, next; X int length; X X device = dp8390info.dpi_devaddr; X pageno=input(device, dp_bnry)+1; X if (pageno == dp8390info.dpi_pstop) X pageno = dp8390info.dpi_pstart; X while (!(disabled)) { X output(device, dp_cr, CR_PS_P1);/* switch to register set 1 */ X curr = input1(device, dp_curr); X output1(device, dp_cr, CR_PS_P0);/* back to main register set */ X if (pageno==curr) X break; X STINC(ds_read); X paddr = dp8390info.dpi_membase+(pageno<<8); X getheader(paddr, &pkthead); X next = pkthead.rp_next; X if (pkthead.rp_status&RSR_PRX) { X if (next < pageno && next > dp8390info.dpi_pstart) { X /* X * We copy end of packet to avoid break. X */ X phys_copy(dp8390info.dpi_membase+ X (dp8390info.dpi_pstart<<8), X dp8390info.dpi_membase+ X (dp8390info.dpi_pstop<<8), X (phys_bytes) (next-dp8390info.dpi_pstart)<<8); X } X length = (pkthead.rp_rbcl&0xFF)|(pkthead.rp_rbch<<8); X Curbuff = paddr + sizeof (pkthead); X disabled = 1; X (*bufread)(Curbuff, length-4); X } X pageno = pkthead.rp_next; Xif (pageno >= dp8390info.dpi_pstop || pageno < dp8390info.dpi_pstart) X printf("page no %x\n", pageno); X assert(pageno >= dp8390info.dpi_pstart); X assert(pageno < dp8390info.dpi_pstop); X } X} X Xstatic Xcntintr() X{ X register vir_bytes device; X int n; X X printf("dp8390: counter overflow\n"); /*DEBUG*/ X device = dp8390info.dpi_devaddr; X n = input(device, dp_cntr0); X STADD(ds_fram, n); X n = input(device, dp_cntr1); X STADD(ds_crc, n); X n =input(device, dp_cntr2); X STADD(ds_lost, n); X} X Xdp8390_int() X{ X register isr; X register vir_bytes device; X X PIC_enable(); X device = dp8390info.dpi_devaddr; X for(isr=input(device, dp_isr); isr&(ISR_OVW|ISR_PRX|ISR_PTX|ISR_CNT); X isr=input(device, dp_isr)) { X if (isr&ISR_OVW) { X printf("OVW, do something\n"); X output(device, dp_isr, ISR_OVW); /* ack */ X } X if (isr&ISR_PTX) { X dp_xmit_intr(); X output(device, dp_isr, ISR_PTX); /* ack */ X } X if (isr&ISR_TXE) { X dp_xmit_intr(); X output(device, dp_isr, ISR_TXE); /* ack */ X } X if (isr&ISR_PRX) { X recvintr(); X output(device, dp_isr, ISR_PRX); /* ack */ X } X if (isr&ISR_CNT) { X cntintr(); X output(device, dp_isr, ISR_CNT); /* ack */ X } X } X} X Xeth_init(etheraddr, br, bw) XEth_addr *etheraddr; Xint (*br)(), (*bw)(); X{ X bufread = br; X bufwritten = bw; X epl_init(); /* activate on board memory */ X chipinit(etheraddr); /* start ethernet controller chip */ X} X X X Xeth_write(bufaddr, bufcnt) Xphys_bytes bufaddr; X{ X int bpageno; X register vir_bytes device; X X device = dp8390info.dpi_devaddr; X/* assert(curopacket==0); */ X assert(((bufaddr-dp8390info.dpi_membase)&0xFF)==0); X assert(bufcnt >= 60); /* magic Ethernet requirement */ X/* assert(bufcnt <= 1514); /* another one */ X bpageno = ((bufaddr-dp8390info.dpi_membase)>>8) & 0xFF; X curopacket = bufaddr; X output(device, dp_tpsr, bpageno); X output(device, dp_tbcr1, bufcnt>>8); X output(device, dp_tbcr0, bufcnt&0xFF); X output(device, dp_cr, CR_TXP); /* there it goes */ X} X Xeth_release(bufaddr) Xphys_bytes bufaddr; X{ X register vir_bytes device; X register phys_bytes paddr; X struct rcvdheader pkthead; X char pageno; X int old_state; X X device = dp8390info.dpi_devaddr; X paddr = bufaddr-sizeof(pkthead); X assert(((paddr-dp8390info.dpi_membase)&0xFF)==0); X getheader(paddr, &pkthead); X pageno = pkthead.rp_next; X if (pageno == dp8390info.dpi_pstart) X pageno = dp8390info.dpi_pstop; X if (bufaddr != Curbuff) X panic("eth_release: bad order", NO_NUM); X output(device, dp_bnry, pageno-1); X disabled = 0; X old_state = lock(); X recvintr(); X restore(old_state); X} X Xphys_bytes Xeth_getbuf() X{ X int t_cnt; X register vir_bytes device; X register tsr; X X device = dp8390info.dpi_devaddr; X X t_cnt = 0; X while (input(device,dp_cr)&CR_TXP) { X if (t_cnt++ > MAX_WAIT) X printf("transmitter frozen\n"); X return (phys_bytes)0; X } X X#ifndef TRMTINT X#ifdef DPSTAT X tsr = input(device, dp_tsr); X if (tsr&TSR_PTX) X STINC(ds_written); /* It went OK! */ X if (tsr&TSR_DFR) X STINC(ds_deferred); X if (tsr&TSR_COL) X STINC(ds_collisions); X if (tsr&TSR_ABT) X STINC(ds_xcollisions); X if (tsr&TSR_CRS) { X printf("Ethernet carrier sense lost\n"); X STINC(ds_carlost); X } X if (tsr&TSR_FU) { X printf("Ethernet Fifo Underrun\n"); X STINC(ds_fifo); X } X if (tsr&TSR_CDH) { X printf("Ethernet Heartbeat failure\n"); X STINC(ds_heartbeat); X } X if (tsr&TSR_OWC) { X printf("Ethernet late collision\n"); X STINC(ds_lcol); X } X#endif X#endif X return dp8390info.dpi_tbuf; /* return pointer to xmit buffer */ X} X X#else NONET X XPUBLIC Xdp8390_int() X{ X} X X#endif NONET X X#ifdef i8088 X XPUBLIC Xeth_stp() X{ X/* called from reboot() (klib88.s) to stop the ethernet */ X#ifndef NONET X output(dp8390info.dpi_devaddr, dp_cr, CR_STP|CR_DM_ABORT); X X#endif X} X X#endif i8088 + END-OF-FILE dp8390.c chmod 'u=rw,g=r,o=r' 'dp8390.c' set `wc -c 'dp8390.c'` count=$1 case $count in 8277) :;; *) echo 'Bad character count in ''dp8390.c' >&2 echo 'Count should be 8277' >&2 esac echo Extracting 'dp8390.h' sed 's/^X//' > 'dp8390.h' << '+ END-OF-FILE ''dp8390.h' X/* X * National Semiconductor DP8390 Network Interface Controller X */ X Xtypedef Xunion dp8390reg { X struct pg0rd { /* Page 0, for reading ------------- */ X char dp_cr; /* Read side of Command Register */ X char dp_clda0; /* Current Local Dma Address 0 */ X char dp_clda1; /* Current Local Dma Address 1 */ X char dp_bnry; /* Boundary Pointer */ X char dp_tsr; /* Transmit Status Register */ X char dp_ncr; /* Number of Collisions Register */ X char dp_fifo; /* Fifo ?? */ X char dp_isr; /* Interrupt Status Register */ X char dp_crda0; /* Current Remote Dma Address 0 */ X char dp_crda1; /* Current Remote Dma Address 1 */ X char dp_dum1; /* unused */ X char dp_dum2; /* unused */ X char dp_rsr; /* Receive Status Register */ X char dp_cntr0; /* Tally Counter 0 */ X char dp_cntr1; /* Tally Counter 1 */ X char dp_cntr2; /* Tally Counter 2 */ X } dp_pg0rd; X struct pg0wr { /* Page 0, for writing ------------- */ X char dp_cr; /* Write side of Command Register */ X char dp_pstart; /* Page Start Register */ X char dp_pstop; /* Page Stop Register */ X char dp_bnry; /* Boundary Pointer */ X char dp_tpsr; /* Transmit Page Start Register */ X char dp_tbcr0; /* Transmit Byte Count Register 0 */ X char dp_tbcr1; /* Transmit Byte Count Register 1 */ X char dp_isr; /* Interrupt Status Register */ X char dp_rsar0; /* Remote Start Address Register 0 */ X char dp_rsar1; /* Remote Start Address Register 1 */ X char dp_rbcr0; /* Remote Byte Count Register 0 */ X char dp_rbcr1; /* Remote Byte Count Register 1 */ X char dp_rcr; /* Receive Configuration Register */ X char dp_tcr; /* Transmit Configuration Register */ X char dp_dcr; /* Data Configuration Register */ X char dp_imr; /* Interrupt Mask Register */ X } dp_pg0wr; X struct pg1rdwr { /* Page 1, read/write -------------- */ X char dp_cr; /* Command Register */ X char dp_par0; /* Physical Address Register 0 */ X char dp_par1; /* Physical Address Register 1 */ X char dp_par2; /* Physical Address Register 2 */ X char dp_par3; /* Physical Address Register 3 */ X char dp_par4; /* Physical Address Register 4 */ X char dp_par5; /* Physical Address Register 5 */ X char dp_curr; /* Current Page Register */ X char dp_mar0; /* Multicast Address Register 0 */ X char dp_mar1; /* Multicast Address Register 1 */ X char dp_mar2; /* Multicast Address Register 2 */ X char dp_mar3; /* Multicast Address Register 3 */ X char dp_mar4; /* Multicast Address Register 4 */ X char dp_mar5; /* Multicast Address Register 5 */ X char dp_mar6; /* Multicast Address Register 6 */ X char dp_mar7; /* Multicast Address Register 7 */ X } dp_pg1rdwr; X} dp8390; X X/* Bits in dp_cr */ X X#define CR_STP 0x01 /* Stop: software reset */ X#define CR_STA 0x02 /* Start: activate NIC */ X#define CR_TXP 0x04 /* Transmit Packet */ X#define CR_DMA 0x38 /* Mask for DMA control */ X# define CR_DM_NOP 0x00 /* DMA: No Operation */ X# define CR_DM_RR 0x08 /* DMA: Remote Read */ X# define CR_DM_RW 0x10 /* DMA: Remote Write */ X# define CR_DM_SP 0x18 /* DMA: Send Packet */ X# define CR_DM_ABORT 0x20 /* DMA: Abort Remote DMA Operation */ X#define CR_PS 0xC0 /* Mask for Page Select */ X# define CR_PS_P0 0x00 /* Register Page 0 */ X# define CR_PS_P1 0x40 /* Register Page 1 */ X# define CR_PS_T0 0x80 /* Test Mode Register Map ?? */ X# define CR_SP_T1 0xC0 /* Test Mode Register Map ?? */ X X/* Bits in dp_isr */ X X#define ISR_PRX 0x01 /* Packet Received with no errors */ X#define ISR_PTX 0x02 /* Packet Transmitted with no errors */ X#define ISR_RXE 0x04 /* Receive Error */ X#define ISR_TXE 0x08 /* Transmit Error */ X#define ISR_OVW 0x10 /* Overwrite Warning */ X#define ISR_CNT 0x20 /* Counter Overflow */ X#define ISR_RDC 0x40 /* Remote DMA Complete */ X#define ISR_RST 0x80 /* Reset Status */ X X/* Bits in dp_imr */ X X#define IMR_PRXE 0x01 /* Packet Received iEnable */ X#define IMR_PTXE 0x02 /* Packet Transmitted iEnable */ X#define IMR_RXEE 0x04 /* Receive Error iEnable */ X#define IMR_TXEE 0x08 /* Transmit Error iEnable */ X#define IMR_OVWE 0x10 /* Overwrite Warning iEnable */ X#define IMR_CNTE 0x20 /* Counter Overflow iEnable */ X#define IMR_RDCE 0x40 /* DMA Complete iEnable */ X X/* Bits in dp_dcr */ X X#define DCR_WTS 0x01 /* Word Transfer Select */ X# define DCR_BYTEWIDE 0x00 /* WTS: byte wide transfers */ X# define DCR_WORDWIDE 0x01 /* WTS: word wide transfers */ X#define DCR_BOS 0x02 /* Byte Order Select */ X# define DCR_LTLENDIAN 0x00 /* BOS: Little Endian */ X# define DCR_BIGENDIAN 0x02 /* BOS: Big Endian */ X#define DCR_LAS 0x04 /* Long Address Select */ X#define DCR_BMS 0x08 /* Burst Mode Select */ X#define DCR_AR 0x10 /* Autoinitialize Remote */ X#define DCR_FTS 0x60 /* Fifo Threshold Select */ X# define DCR_2BYTES 0x00 /* 2 bytes */ X# define DCR_4BYTES 0x40 /* 4 bytes */ X# define DCR_8BYTES 0x20 /* 8 bytes */ X# define DCR_12BYTES 0x60 /* 12 bytes */ X X/* Bits in dp_tcr */ X X#define TCR_CRC 0x01 /* Inhibit CRC */ X#define TCR_ELC 0x06 /* Encoded Loopback Control */ X# define TCR_NORMAL 0x00 /* ELC: Normal Operation */ X# define TCR_INTERNAL 0x02 /* ELC: Internal Loopback */ X# define TCR_0EXTERNAL 0x04 /* ELC: External Loopback LPBK=0 */ X# define TCR_1EXTERNAL 0x06 /* ELC: External Loopback LPBK=1 */ X#define TCR_ATD 0x08 /* Auto Transmit */ X#define TCR_OFST 0x10 /* Collision Offset Enable (be nice) */ X X/* Bits in dp_tsr */ X X#define TSR_PTX 0x01 /* Packet Transmitted (without error)*/ X#define TSR_DFR 0x02 /* Transmit Deferred */ X#define TSR_COL 0x04 /* Transmit Collided */ X#define TSR_ABT 0x08 /* Transmit Aborted */ X#define TSR_CRS 0x10 /* Carrier Sense Lost */ X#define TSR_FU 0x20 /* Fifo Underrun */ X#define TSR_CDH 0x40 /* CD Heartbeat */ X#define TSR_OWC 0x80 /* Out of Window Collision */ X X/* Bits in tp_rcr */ X X#define RCR_SEP 0x01 /* Save Errored Packets */ X#define RCR_AR 0x02 /* Accept Runt Packets */ X#define RCR_AB 0x04 /* Accept Broadcast */ X#define RCR_AM 0x08 /* Accept Multicast */ X#define RCR_PRO 0x10 /* Physical Promiscuous */ X#define RCR_MON 0x20 /* Monitor Mode */ X X/* Bits in dp_rsr */ X X#define RSR_PRX 0x01 /* Packet Received Intact */ X#define RSR_CRC 0x02 /* CRC Error */ X#define RSR_FAE 0x04 /* Frame Alignment Error */ X#define RSR_FO 0x08 /* FIFO Overrun */ X#define RSR_MPA 0x10 /* Missed Packet */ X#define RSR_PHY 0x20 /* Multicast Address Match !! */ X#define RSR_DIS 0x40 /* Receiver Disabled */ X X Xstruct rcvdheader { X char rp_status; /* Copy of rsr */ X char rp_next; /* Pointer to next packet */ X char rp_rbcl; /* Receive Byte Count Low */ X char rp_rbch; /* Receive Byte Count High */ X}; + END-OF-FILE dp8390.h chmod 'u=rw,g=r,o=r' 'dp8390.h' set `wc -c 'dp8390.h'` count=$1 case $count in 8035) :;; *) echo 'Bad character count in ''dp8390.h' >&2 echo 'Count should be 8035' >&2 esac echo Extracting 'dp8390info.h' sed 's/^X//' > 'dp8390info.h' << '+ END-OF-FILE ''dp8390info.h' X/* X * parameters for driver for X * National Semiconductor DP8390 Network Interface Controller X */ X Xextern Xstruct dp8390info { X vir_bytes dpi_devaddr; /* device address */ X char dpi_pstart; /* start of recv ring */ X char dpi_pstop; /* end of recv ring */ X phys_bytes dpi_membase; /* memory address of page 0 */ X phys_bytes dpi_tbuf; /* memory address of transmit buffer */ X} dp8390info; X + END-OF-FILE dp8390info.h chmod 'u=rw,g=r,o=r' 'dp8390info.h' set `wc -c 'dp8390info.h'` count=$1 case $count in 402) :;; *) echo 'Bad character count in ''dp8390info.h' >&2 echo 'Count should be 402' >&2 esac echo Extracting 'dp8390stat.h' sed 's/^X//' > 'dp8390stat.h' << '+ END-OF-FILE ''dp8390stat.h' X#ifdef DPSTAT X/* statistics from dp8390 */ Xstruct dpstat { X long ds_read; /* packets read */ X long ds_written; /* packets written */ X long ds_fram; /* Input framing errors */ X long ds_crc; /* Input CRC errors */ X long ds_lost; /* Packets lost */ X long ds_btint; /* Bogus transmit interrupts */ X long ds_deferred; /* Deferred packets */ X long ds_collisions; /* Packets collided at least once */ X long ds_xcollisions; /* Aborts due to excessive collisions */ X long ds_carlost; /* Carrier sense lost */ X long ds_fifo; /* Fifo underrun */ X long ds_heartbeat; /* Heart beat failure */ X long ds_lcol; /* Late collisions */ X}; X#define STINC(x) dpstat.x++ X#define STADD(x,y) dpstat.x += y X#else X#define STINC(x) /* nothing */ X#define STADD(x,y) /* nothing */ X#endif DPSTAT + END-OF-FILE dp8390stat.h chmod 'u=rw,g=r,o=r' 'dp8390stat.h' set `wc -c 'dp8390stat.h'` count=$1 case $count in 821) :;; *) echo 'Bad character count in ''dp8390stat.h' >&2 echo 'Count should be 821' >&2 esac echo Extracting 'eplinfo.h' sed 's/^X//' > 'eplinfo.h' << '+ END-OF-FILE ''eplinfo.h' X/* X * parameters for initialisation of X * Western Digital Ethercard Plus, or WD8003E X */ X Xextern Xstruct eplinfo { X vir_bytes epi_devaddr; /* device address */ X} eplinfo; X + END-OF-FILE eplinfo.h chmod 'u=rw,g=r,o=r' 'eplinfo.h' set `wc -c 'eplinfo.h'` count=$1 case $count in 181) :;; *) echo 'Bad character count in ''eplinfo.h' >&2 echo 'Count should be 181' >&2 esac echo Extracting 'etherformat.h' sed 's/^X//' > 'etherformat.h' << '+ END-OF-FILE ''etherformat.h' X/* Format of packets on the Ethernet */ X X#define AMOEBAPROTO 0x8145 /* Official Ethernet protocol number */ X X#define ETHERBITS 0x80 /* These addresses on Ethernet */ X Xtypedef struct X{ X char e[6]; X} Eth_addr; X Xtypedef struct X{ X Eth_addr f_dstaddr; X Eth_addr f_srcaddr; X unshort f_proto; X struct pktheader f_ah; X} Framehdr; X Xtypedef struct X{ X Framehdr ep_fr; X char ep_data[1490]; X} Etherpacket; + END-OF-FILE etherformat.h chmod 'u=rw,g=r,o=r' 'etherformat.h' set `wc -c 'etherformat.h'` count=$1 case $count in 404) :;; *) echo 'Bad character count in ''etherformat.h' >&2 echo 'Count should be 404' >&2 esac echo Extracting 'etherplus.c' sed 's/^X//' > 'etherplus.c' << '+ END-OF-FILE ''etherplus.c' X#include "../h/const.h" X#include "../h/type.h" X#include "../h/com.h" X#include "const.h" X#include "dp8390.h" X#include "internet.h" X#include "etherformat.h" X#include "etherplus.h" X#include "dp8390info.h" X#include "eplinfo.h" X#include "assert.h" X X/* macros for device I/O */ X X#define input(devaddr, ep_register) \ X inbyte((vir_bytes)&((struct eplusreg *) devaddr)->ep_register) X#define output(devaddr, ep_register, value) \ X outbyte((vir_bytes)&((struct eplusreg *) devaddr)->ep_register, value) X Xepl_init() { X register vir_bytes device; X register sum; X X device = eplinfo.epi_devaddr; X assert((dp8390info.dpi_membase&0x81FFF)==0x80000); X sum = X input(device, epl_ea5) + X input(device, epl_ea4) + X input(device, epl_ea3) + X input(device, epl_ea2) + X input(device, epl_ea1) + X input(device, epl_ea0) + X input(device, epl_res2) + X input(device, epl_chksum); X if ((sum&0xFF) != 0xFF) X panic("No ethernet board", NO_NUM); X output(device, epl_ctlstatus, CTL_RESET); X output(device, epl_ctlstatus, CTL_MENABLE|((dp8390info.dpi_membase>>13)&CTL_MEMADDR)); X} X X Xetheraddr(eaddr) Eth_addr *eaddr; { X register vir_bytes device; X X device = eplinfo.epi_devaddr; X eaddr->e[0] = input(device, epl_ea0); X eaddr->e[1] = input(device, epl_ea1); X eaddr->e[2] = input(device, epl_ea2); X eaddr->e[3] = input(device, epl_ea3); X eaddr->e[4] = input(device, epl_ea4); X eaddr->e[5] = input(device, epl_ea5); X} + END-OF-FILE etherplus.c chmod 'u=rw,g=r,o=r' 'etherplus.c' set `wc -c 'etherplus.c'` count=$1 case $count in 1390) :;; *) echo 'Bad character count in ''etherplus.c' >&2 echo 'Count should be 1390' >&2 esac echo Extracting 'etherplus.h' sed 's/^X//' > 'etherplus.h' << '+ END-OF-FILE ''etherplus.h' X/* X * Western Digital Ethercard Plus, or WD8003E card X * X * This information seems to be guarded like the crown jewels X */ X Xstruct eplusreg { X char epl_ctlstatus; /* Control(write) and status(read) */ X char epl_res1[7]; X char epl_ea0; /* Most significant eaddr byte */ X char epl_ea1; X char epl_ea2; X char epl_ea3; X char epl_ea4; X char epl_ea5; /* Least significant eaddr byte */ X char epl_res2; X char epl_chksum; /* sum from epl_ea0 upto here is 0xFF */ X dp8390 epl_dp8390; /* NatSemi chip */ X}; X X/* Bits in epl_ctlstatus */ X X#define CTL_RESET 0x80 /* Software Reset */ X#define CTL_MENABLE 0x40 /* Memory Enable */ X#define CTL_MEMADDR 0x3F /* Bits SA18-SA13, SA19 implicit 1 */ X X#define STA_IIJ 0x7 /* Interrupt Indication Jumpers */ + END-OF-FILE etherplus.h chmod 'u=rw,g=r,o=r' 'etherplus.h' set `wc -c 'etherplus.h'` count=$1 case $count in 826) :;; *) echo 'Bad character count in ''etherplus.h' >&2 echo 'Count should be 826' >&2 esac echo Extracting 'exception.h' sed 's/^X//' > 'exception.h' << '+ END-OF-FILE ''exception.h' X#define CRASH ((unshort) 0xFF) + END-OF-FILE exception.h chmod 'u=rw,g=r,o=r' 'exception.h' set `wc -c 'exception.h'` count=$1 case $count in 32) :;; *) echo 'Bad character count in ''exception.h' >&2 echo 'Count should be 32' >&2 esac echo Extracting 'global.h' sed 's/^X//' > 'global.h' << '+ END-OF-FILE ''global.h' X/****************************************************************************/ X/* */ X/* (c) Copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands */ X/* */ X/* This product is part of the Amoeba distributed operating system. */ X/* */ X/* Permission to use, sell, duplicate or disclose this software must be */ X/* obtained in writing. Requests for such permissions may be sent to */ X/* */ X/* */ X/* Dr. Andrew S. Tanenbaum */ X/* Dept. of Mathematics and Computer Science */ X/* Vrije Universiteit */ X/* Postbus 7161 */ X/* 1007 MC Amsterdam */ X/* The Netherlands */ X/* */ X/****************************************************************************/ X X#define KERNEL 0 X#define USER 1 X Xtypedef unshort address; Xtypedef int func; X X#define bufptr vir_bytes X X#define NOWHERE ((address) 0) X#define SOMEWHERE ((address) -1) X#define NILVECTOR ((func (*)()) 0) X X#ifdef lint X#define ABSPTR(t, c) (use(c), (t) 0) X#else X#define ABSPTR(t, c) ((t) (c)) X#endif X X#define bit(b) (1 << (b)) /* simulate type 'bit' */ X X#define lobyte(x) ((unshort) (x) & 0xFF) X#define hibyte(x) ((unshort) (x) >> 8) X#define concat(x, y) ((unshort) (x) << 8 | (unshort) (y) & 0xFF) X X#define sizeoftable(t) (sizeof(t) / sizeof((t)[0])) + END-OF-FILE global.h chmod 'u=rw,g=r,o=r' 'global.h' set `wc -c 'global.h'` count=$1 case $count in 1354) :;; *) echo 'Bad character count in ''global.h' >&2 echo 'Count should be 1354' >&2 esac echo Extracting 'internet.h' sed 's/^X//' > 'internet.h' << '+ END-OF-FILE ''internet.h' X/****************************************************************************/ X/* */ X/* (c) Copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands */ X/* */ X/* This product is part of the Amoeba distributed operating system. */ X/* */ X/* Permission to use, sell, duplicate or disclose this software must be */ X/* obtained in writing. Requests for such permissions may be sent to */ X/* */ X/* */ X/* Dr. Andrew S. Tanenbaum */ X/* Dept. of Mathematics and Computer Science */ X/* Vrije Universiteit */ X/* Postbus 7161 */ X/* 1007 MC Amsterdam */ X/* The Netherlands */ X/* */ X/****************************************************************************/ X X#define PACKETSIZE 1490 /* network packet size - sizeof(framehdr) */ X X#define BROADCAST ((address) 0xFF) X X#define TYPE 0x0F /* message types */ X#define LOCATE 0x01 X#define HERE 0x02 X#define REQUEST 0x03 X#define REPLY 0x04 X#define ACK 0x05 X#define NAK 0x06 X#define ENQUIRY 0x07 X#define ALIVE 0x08 X#define DEAD 0x09 X X#define LAST 0x10 /* flags */ X#define RETRANS 0x20 X Xstruct pktheader { X char ph_dstnode; /* 0: destination node */ X char ph_srcnode; /* 1: source node */ X char ph_dsttask; /* 2: destination task */ X char ph_srctask; /* 3: source task */ X char ph_ident; /* 4: transaction identifier */ X char ph_seq; /* 5: fragment no. */ X unshort ph_size; /* 6: total size of this packet */ X char ph_flags; /* 8: some flags (not used) */ X char ph_type; /* 9: locate, here, data, ack or nak (!= 0) */ X}; X X#define ph_signal ph_seq X X#define NOSEND 0 X#define SEND 1 X X#define DONTKNOW 0 X#define LOCAL 1 X#define GLOBAL 2 X X#define siteaddr(x) lobyte(x) X#define tasknum(x) hibyte(x) X X#define pktfrom(ph) ((unshort) (ph->ph_srctask<<8 | ph->ph_srcnode & 0xFF)) X#define pktto(ph) ((unshort) (ph->ph_dsttask<<8 | ph->ph_dstnode & 0xFF)) + END-OF-FILE internet.h chmod 'u=rw,g=r,o=r' 'internet.h' set `wc -c 'internet.h'` count=$1 case $count in 1958) :;; *) echo 'Bad character count in ''internet.h' >&2 echo 'Count should be 1958' >&2 esac echo Extracting 'makefile' sed 's/^X//' > 'makefile' << '+ END-OF-FILE ''makefile' X# The kernel dir contains xt_wini.c and at_wini.c. Before running make X# you must copy one of these to wini.c, depending on which controller you X# have. If you do not have a hard disk, you MUST choose one of them at random. X# On a PC, cpp and cem are in /lib and will be removed to make space while X# linking the kernel. On an AT, they are in /usr/lib are are not removed. X# This is because they have to be in /lib on a PC; the diskette is too small X# for them to be in /usr/lib. You can change this by editing commands/cc.c. X# X# Normally, MINIX scrolls the screen using the 6845's registers. However, X# on some EGA cards (those that are not IBM compatible), the 6845 is not X# properly emulated. On these machines, it is necessary to scroll in X# software by copying. This is much slower, but it works. The CFLAGS flags are: X# X# -Di8088 - required on an 8088/80286/80386 CPU; forbidden on a 68000 X# -F - run cpp and cem sequentially (used when memory is tight) X# -T. - put temporaries in working directory (when RAM disk is small) X# -DAM_KERNEL - includes code for Amoeba transactions X# -DNONET - single machine, no Ethernet available (requires -DAM_KERNEL) X# -DSTATISTICS - include code to collect Ethernet statistics X# X# Machines wishing to use Amoeba transactions should add -DAM_KERNEL to CFLAGS. X# If there is no ethernet connection then also add -DNONET. The ethernet X# driver included in this distribution is for the Western Digital Ethercard X# Plus. If you want ethernet statistics then add -DSTATISTICS to CFLAGS. X# X# When making a kernel on a machine with limited RAM disk, it may be X# necessary to use -T. or even remove /lib/cem and /lib/cpp during asld. X# XCFLAGS = -DAM_KERNEL -Di8088 -F -I../../kernel -I. XA = ../h XH = ../../h XK = ../../kernel XLIB = /usr/lib X XOBJ = ../../kernel/mpx88.s main.s tty.s floppy.s wini.s system.s proc.s \ X clock.s memory.s printer.s amoeba.s conf.s dp8390.s util.s \ X etherplus.s portcache.s trans.s table.s ../../kernel/klib88.s dmp.s X X XCOBJS = main.s tty.s floppy.s wini.s system.s proc.s clock.s memory.s \ X amoeba.s conf.s dp8390.s util.s etherplus.s portcache.s trans.s \ X printer.s table.s dmp.s X X Xkernel: makefile $(OBJ) $(LIB)/libc.a X @echo "Start linking Kernel." X @asld -o kernel $(OBJ) $(LIB)/libc.a $(LIB)/end.s X @echo "Kernel done. " X Xclean: X rm -f $(COBJS) kernel X Xclock.s: $K/const.h $K/type.h $H/const.h $H/type.h Xclock.s: $H/callnr.h Xclock.s: $H/com.h Xclock.s: $H/error.h Xclock.s: $H/signal.h Xclock.s: $K/glo.h Xclock.s: $K/proc.h Xclock.s: $K/clock.c X $(CC) $(CFLAGS) -c $K/clock.c X Xdmp.s: $K/const.h $K/type.h $H/const.h $H/type.h Xdmp.s: $H/callnr.h Xdmp.s: $H/com.h Xdmp.s: $H/error.h Xdmp.s: $K/glo.h Xdmp.s: $K/proc.h Xdmp.s: $K/dmp.c X $(CC) $(CFLAGS) -c $K/dmp.c X Xfloppy.s: $K/const.h $K/type.h $H/const.h $H/type.h Xfloppy.s: $H/callnr.h Xfloppy.s: $H/com.h Xfloppy.s: $H/error.h Xfloppy.s: $K/glo.h Xfloppy.s: $K/proc.h Xfloppy.s: $K/floppy.c X $(CC) $(CFLAGS) -c $K/floppy.c X Xmain.s: $K/const.h $K/type.h $H/const.h $H/type.h Xmain.s: $H/callnr.h Xmain.s: $H/com.h Xmain.s: $H/error.h Xmain.s: $K/glo.h Xmain.s: $K/proc.h Xmain.s: $K/main.c X $(CC) $(CFLAGS) -c $K/main.c X Xmemory.s: $K/const.h $K/type.h $H/const.h $H/type.h Xmemory.s: $H/callnr.h Xmemory.s: $H/com.h Xmemory.s: $H/error.h Xmemory.s: $K/proc.h Xmemory.s: $K/memory.c X $(CC) $(CFLAGS) -c $K/memory.c X Xprinter.s: $K/const.h $K/type.h $H/const.h $H/type.h Xprinter.s: $H/callnr.h Xprinter.s: $H/com.h Xprinter.s: $H/error.h Xprinter.s: $K/proc.h Xprinter.s: $K/glo.h Xprinter.s: $K/printer.c X $(CC) $(CFLAGS) -c $K/printer.c X Xproc.s: $K/const.h $K/type.h $H/const.h $H/type.h Xproc.s: $H/callnr.h Xproc.s: $H/com.h Xproc.s: $H/error.h Xproc.s: $K/glo.h Xproc.s: $K/proc.h Xproc.s: $K/proc.c X $(CC) $(CFLAGS) -c $K/proc.c X Xsystem.s: $K/const.h $K/type.h $H/const.h $H/type.h Xsystem.s: $H/callnr.h Xsystem.s: $H/com.h Xsystem.s: $H/error.h Xsystem.s: $H/signal.h Xsystem.s: $K/glo.h Xsystem.s: $K/proc.h Xsystem.s: $K/system.c X $(CC) $(CFLAGS) -c $K/system.c X Xtable.s: $K/const.h $K/type.h $H/const.h $H/type.h $H/com.h Xtable.s: $K/glo.h Xtable.s: $K/proc.h Xtable.s: $K/table.c X $(CC) $(CFLAGS) -c $K/table.c X Xtty.s: $K/const.h $K/type.h $H/const.h $H/type.h Xtty.s: $H/callnr.h Xtty.s: $H/com.h Xtty.s: $H/error.h Xtty.s: $H/sgtty.h Xtty.s: $H/signal.h Xtty.s: $K/glo.h Xtty.s: $K/proc.h Xtty.s: $K/tty.c X $(CC) $(CFLAGS) -c $K/tty.c X Xwini.s: $K/const.h $K/type.h $H/const.h $H/type.h Xwini.s: $H/callnr.h Xwini.s: $H/com.h Xwini.s: $H/error.h Xwini.s: $K/proc.h Xwini.s: $K/wini.c X $(CC) $(CFLAGS) -c $K/wini.c X Xamoeba.s: $A/amoeba.h Xamoeba.s: $A/host_os.h Xamoeba.s: $A/amparam.h Xamoeba.s: $H/signal.h Xamoeba.s: $H/type.h Xamoeba.s: ./assert.h Xamoeba.s: ./byteorder.h Xamoeba.s: $K/const.h Xamoeba.s: ./dp8390info.h Xamoeba.s: ./etherformat.h Xamoeba.s: $K/glo.h Xamoeba.s: ./global.h Xamoeba.s: ./internet.h Xamoeba.s: ./mpx.H Xamoeba.s: ./portcache.H Xamoeba.s: $K/proc.h Xamoeba.s: ./task.h Xamoeba.s: ./trans.H Xamoeba.s: $K/type.h Xamoeba.s: amoeba.c Xconf.s: $A/amoeba.h Xconf.s: $A/host_os.h Xconf.s: $H/type.h Xconf.s: ./conf.h Xconf.s: ./global.h Xconf.s: ./mpx.H Xconf.s: ./portcache.H Xconf.s: ./task.h Xconf.s: ./trans.H Xconf.s: conf.c Xdp8390.s: $H/com.h Xdp8390.s: $H/const.h Xdp8390.s: $H/error.h Xdp8390.s: $H/type.h Xdp8390.s: ./assert.h Xdp8390.s: $K/const.h Xdp8390.s: ./dp8390.h Xdp8390.s: ./dp8390info.h Xdp8390.s: ./dp8390stat.h Xdp8390.s: ./etherformat.h Xdp8390.s: ./internet.h Xdp8390.s: dp8390.c Xetherplus.s: $H/com.h Xetherplus.s: $H/const.h Xetherplus.s: $H/type.h Xetherplus.s: ./assert.h Xetherplus.s: $K/const.h Xetherplus.s: ./dp8390.h Xetherplus.s: ./dp8390info.h Xetherplus.s: ./eplinfo.h Xetherplus.s: ./etherformat.h Xetherplus.s: ./etherplus.h Xetherplus.s: ./internet.h Xetherplus.s: etherplus.c Xportcache.s: $A/amoeba.h Xportcache.s: $H/const.h Xportcache.s: $A/host_os.h Xportcache.s: $H/type.h Xportcache.s: ./assert.h Xportcache.s: ./conf.h Xportcache.s: $K/const.h Xportcache.s: ./global.h Xportcache.s: ./internet.h Xportcache.s: ./mpx.H Xportcache.s: ./portcache.H Xportcache.s: ./task.h Xportcache.s: ./trans.H Xportcache.s: portcache.c Xtrans.s: $A/amoeba.h Xtrans.s: $H/const.h Xtrans.s: $A/host_os.h Xtrans.s: $H/type.h Xtrans.s: ./amstat.h Xtrans.s: ./assert.h Xtrans.s: ./byteorder.h Xtrans.s: $K/const.h Xtrans.s: ./exception.h Xtrans.s: ./global.h Xtrans.s: ./internet.h Xtrans.s: ./mpx.H Xtrans.s: ./portcache.H Xtrans.s: ./task.h Xtrans.s: ./trans.H Xtrans.s: trans.c Xutil.s: $H/com.h Xutil.s: $H/const.h Xutil.s: $H/type.h Xutil.s: ./assert.h Xutil.s: $K/const.h Xutil.s: ./dp8390.h Xutil.s: ./dp8390info.h Xutil.s: ./eplinfo.h Xutil.s: $K/proc.h Xutil.s: $K/type.h Xutil.s: util.c + END-OF-FILE makefile chmod 'u=rw,g=r,o=r' 'makefile' set `wc -c 'makefile'` count=$1 case $count in 6567) :;; *) echo 'Bad character count in ''makefile' >&2 echo 'Count should be 6567' >&2 esac echo Extracting 'mpx.H' sed 's/^X//' > 'mpx.H' << '+ END-OF-FILE ''mpx.H' X/****************************************************************************/ X/* */ X/* (c) Copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands */ X/* */ X/* This product is part of the Amoeba distributed operating system. */ X/* */ X/* Permission to use, sell, duplicate or disclose this software must be */ X/* obtained in writing. Requests for such permissions may be sent to */ X/* */ X/* */ X/* Dr. Andrew S. Tanenbaum */ X/* Dept. of Mathematics and Computer Science */ X/* Vrije Universiteit */ X/* Postbus 7161 */ X/* 1007 MC Amsterdam */ X/* The Netherlands */ X/* */ X/****************************************************************************/ X Xstruct mpx { X short MX_active; /* is a transaction in progress */ X unshort MX_flags; /* flags - see below */ X int MX_proc_nr; /* task identifier */ X header MX_hdr; /* storage space for header */ X} tk_mpx; X X#ifdef MPX X X#define mx_flags tk_mpx.MX_flags X#define mx_active tk_mpx.MX_active X#define mx_proc_nr tk_mpx.MX_proc_nr X#define mx_hdr tk_mpx.MX_hdr X X X/* bits in flags: */ X#define RUNNABLE bit(0) /* task is runnable */ X#define NESTED bit(1) /* nested getreq, trans or putrep */ X#define BETWEEN bit(2) /* between getreq and putrep */ X#else X X#define tk_mpx tk_dummy /* other modules must not touch it */ X X#endif + END-OF-FILE mpx.H chmod 'u=rw,g=r,o=r' 'mpx.H' set `wc -c 'mpx.H'` count=$1 case $count in 1427) :;; *) echo 'Bad character count in ''mpx.H' >&2 echo 'Count should be 1427' >&2 esac echo Extracting 'portcache.H' sed 's/^X//' > 'portcache.H' << '+ END-OF-FILE ''portcache.H' X/****************************************************************************/ X/* */ X/* (c) Copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands */ X/* */ X/* This product is part of the Amoeba distributed operating system. */ X/* */ X/* Permission to use, sell, duplicate or disclose this software must be */ X/* obtained in writing. Requests for such permissions may be sent to */ X/* */ X/* */ X/* Dr. Andrew S. Tanenbaum */ X/* Dept. of Mathematics and Computer Science */ X/* Vrije Universiteit */ X/* Postbus 7161 */ X/* 1007 MC Amsterdam */ X/* The Netherlands */ X/* */ X/****************************************************************************/ X Xstruct portcache { X address PE_location; X struct task *PE_link; X} tk_portcache; X X#ifdef PORTCACHE X X#define pe_location tk_portcache.PE_location X#define pe_link tk_portcache.PE_link X X#else X X#define tk_portcache tk_dummy /* other modules must not touch it */ X X#endif X X#define NOWAIT 0 X#define WAIT 1 X X#define LOOK 0 X#define DELETE 1 + END-OF-FILE portcache.H chmod 'u=rw,g=r,o=r' 'portcache.H' set `wc -c 'portcache.H'` count=$1 case $count in 1139) :;; *) echo 'Bad character count in ''portcache.H' >&2 echo 'Count should be 1139' >&2 esac echo Extracting 'portstat.h' sed 's/^X//' > 'portstat.h' << '+ END-OF-FILE ''portstat.h' Xstruct portstat { X long pts_alloc; X long pts_aged; X long pts_full; X long pts_wakeup; X long pts_here; X long pts_lookup; X long pts_flocal; X long pts_fglobal; X long pts_portask; X long pts_portyes; X long pts_locate; X long pts_nolocate; X long pts_relocate; X}; + END-OF-FILE portstat.h chmod 'u=rw,g=r,o=r' 'portstat.h' set `wc -c 'portstat.h'` count=$1 case $count in 255) :;; *) echo 'Bad character count in ''portstat.h' >&2 echo 'Count should be 255' >&2 esac echo Extracting 'task.h' sed 's/^X//' > 'task.h' << '+ END-OF-FILE ''task.h' X/****************************************************************************/ X/* */ X/* (c) Copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands */ X/* */ X/* This product is part of the Amoeba distributed operating system. */ X/* */ X/* Permission to use, sell, duplicate or disclose this software must be */ X/* obtained in writing. Requests for such permissions may be sent to */ X/* */ X/* */ X/* Dr. Andrew S. Tanenbaum */ X/* Dept. of Mathematics and Computer Science */ X/* Vrije Universiteit */ X/* Postbus 7161 */ X/* 1007 MC Amsterdam */ X/* The Netherlands */ X/* */ X/****************************************************************************/ X X#ifdef BUFFERED /* HACK */ X#define BUFSIZE 100 X#define NETBUF ((buffer) -1) X Xtypedef unshort buffer; X#endif X Xstruct task { X X#include "mpx.H" /* mpx module */ X#include "trans.H" /* trans module */ X#include "portcache.H" /* portcache module */ X char *tk_aux; /* auxiliary pointer */ X /* really a hack to make process task more efficient */ X X}; X Xextern struct task *curtask, *uppertask; Xextern unshort ntask; X X#define NILTASK ((struct task *) 0) + END-OF-FILE task.h chmod 'u=rw,g=r,o=r' 'task.h' set `wc -c 'task.h'` count=$1 case $count in 1259) :;; *) echo 'Bad character count in ''task.h' >&2 echo 'Count should be 1259' >&2 esac echo Extracting 'trans.H' sed 's/^X//' > 'trans.H' << '+ END-OF-FILE ''trans.H' X/****************************************************************************/ X/* */ X/* (c) Copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands */ X/* */ X/* This product is part of the Amoeba distributed operating system. */ X/* */ X/* Permission to use, sell, duplicate or disclose this software must be */ X/* obtained in writing. Requests for such permissions may be sent to */ X/* */ X/* */ X/* Dr. Andrew S. Tanenbaum */ X/* Dept. of Mathematics and Computer Science */ X/* Vrije Universiteit */ X/* Postbus 7161 */ X/* 1007 MC Amsterdam */ X/* The Netherlands */ X/* */ X/****************************************************************************/ X Xstruct trans { X char TS_state; /* see below */ X char TS_flags; /* several flags - see below */ X char TS_clident; /* ident number for client */ X char TS_svident; /* ident number for server */ X char TS_ident; /* transaction identifier */ X char TS_seq; /* fragment sequence number */ X char TS_count; /* max. number timer may expire */ X char TS_signal; /* signal being sent to the server */ X unshort TS_addr; /* network address of this task */ X unshort TS_timer; /* timer, decremented every sweep */ X unshort TS_cltim; /* client crash timer */ X address TS_client; /* if serving: who's the client */ X address TS_server; /* if in trans: who's the server */ X port TS_portcache; /* this port was used the last time */ X header *TS_rhdr; /* saved param in getreq or trans */ X header *TS_xhdr; /* saved param in putrep or trans */ X bufptr TS_rbuf; /* receiver buffer */ X bufptr TS_xbuf; /* transmitter buffer */ X unshort TS_rcnt; /* size of rbuf */ X unshort TS_xcnt; /* size of xbuf */ X unshort TS_offset; /* offset in buffer */ X unshort TS_maxloc; /* max. location time in seconds */ X long TS_totloc; /* total location time in ticks */ X long TS_totsvr; /* total server time in ticks */ X#ifdef BUFFERED X address TS_sender; /* task that sent the buffer */ X char *TS_savehdr; /* saved header pointer */ X buffer TS_buffer; /* buffer */ X unshort TS_bufcnt; /* buffer size */ X unshort TS_what; /* REQUEST or REPLY */ X#endif X} tk_trans; X X#ifdef TRANS X X#define ts_state tk_trans.TS_state X#define ts_flags tk_trans.TS_flags X#define ts_clident tk_trans.TS_clident X#define ts_svident tk_trans.TS_svident X#define ts_ident tk_trans.TS_ident X#define ts_seq tk_trans.TS_seq X#define ts_timer tk_trans.TS_timer X#define ts_count tk_trans.TS_count X#define ts_signal tk_trans.TS_signal X#define ts_addr tk_trans.TS_addr X#define ts_cltim tk_trans.TS_cltim X#define ts_client tk_trans.TS_client X#define ts_server tk_trans.TS_server X#define ts_portcache tk_trans.TS_portcache X#define ts_rhdr tk_trans.TS_rhdr X#define ts_xhdr tk_trans.TS_xhdr X#define ts_rbuf tk_trans.TS_rbuf X#define ts_xbuf tk_trans.TS_xbuf X#define ts_rcnt tk_trans.TS_rcnt X#define ts_xcnt tk_trans.TS_xcnt X#define ts_offset tk_trans.TS_offset X#define ts_maxloc tk_trans.TS_maxloc X#define ts_totloc tk_trans.TS_totloc X#define ts_totsvr tk_trans.TS_totsvr X#define ts_sender tk_trans.TS_sender X#define ts_savehdr tk_trans.TS_savehdr X#define ts_buffer tk_trans.TS_buffer X#define ts_bufcnt tk_trans.TS_bufcnt X#define ts_what tk_trans.TS_what X X/* possible values of ts_state */ X#define IDLE 0 X#define SENDING 1 X#define DONE 2 X#define ACKED 3 X#define NACKED 4 X#define FAILED 5 X#define WAITBUF 6 X#define RECEIVING 7 X#define ABORT 8 X#define MEMFAULT 9 X X/* possible flags in ts_flags */ X#define LOCATING bit(0) /* blocked in trans locating a port */ X#define PUTREQ bit(1) /* blocked in trans sending a request */ X#define GETREQ bit(2) /* blocked in getreq */ X#define PUTREP bit(3) /* blocked in putrep */ X#define GETREP bit(4) /* blocked in trans getting a reply */ X#define SERVING bit(5) /* running between getreq and putrep */ X X#else X X#define tk_trans tk_dummy /* other modules must not touch it */ X X#endif + END-OF-FILE trans.H chmod 'u=rw,g=r,o=r' 'trans.H' set `wc -c 'trans.H'` count=$1 case $count in 4005) :;; *) echo 'Bad character count in ''trans.H' >&2 echo 'Count should be 4005' >&2 esac echo Extracting 'util.c' sed 's/^X//' > 'util.c' << '+ END-OF-FILE ''util.c' X#include "../h/const.h" X#include "../h/type.h" X#include "../h/com.h" X#include "const.h" X#include "type.h" X#include "proc.h" X#include "dp8390.h" X#include "assert.h" X#include "dp8390info.h" X#include "eplinfo.h" X X#define PIC_enable() port_out(INT_CTL, ENABLE) X Xextern char get_byte(); X Xstruct eplinfo eplinfo = {0x280}; X Xstruct dp8390info dp8390info = {0x290, 6, 27, 0xC4000, 0xC4000}; X Xinbyte(port) X vir_bytes port; X{ X int value; X X port_in(port, &value); X return value; X} X Xoutbyte(port, value) X vir_bytes port; X int value; X{ X port_out(port, value); X} X Xgetheader(paddr, pkthead) X phys_bytes paddr; X struct rcvdheader *pkthead; X{ X vir_bytes seg; X X assert((paddr&0xFFF0000F)==0L); X seg = paddr>>4; X pkthead->rp_status = get_byte(seg,0); X pkthead->rp_next = get_byte(seg,1); X pkthead->rp_rbcl = get_byte(seg,2); X pkthead->rp_rbch = get_byte(seg,3); X} X X Xshort Xgetbint(paddr) X phys_bytes paddr; X{ X vir_bytes seg,offset; X X seg = paddr >> 4; X offset = paddr & 0xF; X return (((short)get_byte(seg, offset)&0xFF)<<8) + (short)(get_byte(seg, offset+1)&0xFF); X} X X/* Xgetbyte(paddr) Xphys_bytes paddr; X{ X vir_bytes seg; X vir_bytes offset; X X seg = paddr >> 4; X offset = paddr & 0xf; X return get_byte(seg, offset); X} X X Xvp_copy(procnr, seg, vir_addr, phys_addr, count) X int procnr; X int seg; X vir_bytes vir_addr; X phys_bytes phys_addr; X vir_bytes count; X{ X phys_bytes u_phys; X register struct proc *rp; X phys_bytes umap(); X X rp = proc_addr(procnr); X u_phys = umap(rp, seg, vir_addr, count); X assert(u_phys!=0L); X phys_copy(u_phys, phys_addr, (phys_bytes)count); X} X Xpv_copy(phys_addr, procnr, seg, vir_addr, count) X phys_bytes phys_addr; X int procnr; X int seg; X vir_bytes vir_addr; X vir_bytes count; X{ X phys_bytes vir_phys; X register struct proc *rp; X phys_bytes umap(); X X rp = proc_addr(procnr); X vir_phys = umap(rp, seg, vir_addr, count); X assert(vir_phys!=0L); X phys_copy(phys_addr, vir_phys, (phys_bytes)count); X} X*/ + END-OF-FILE util.c chmod 'u=rw,g=r,o=r' 'util.c' set `wc -c 'util.c'` count=$1 case $count in 2063) :;; *) echo 'Bad character count in ''util.c' >&2 echo 'Count should be 2063' >&2 esac exit 0