## diffname gnot/devport.c 1991/0110 ## diff -e /dev/null /n/bootesdump/1991/0110/sys/src/9/68020/devport.c 0a #include "u.h" #include "lib.h" #include "mem.h" #include "dat.h" #include "fns.h" #include "io.h" #include "errno.h" #include "devtab.h" #include "port.h" enum { Qdir, Qdata, }; Dirtab portdir[]={ "data", {Qdata}, 0, 0600, }; #define NPORT (sizeof portdir/sizeof(Dirtab)) int portprobe(char *what, int select, int addr, int rw, long val) { int time; if (!conf.portispaged) return 0; P_qlock(select); switch (rw) { case -1: val = *(uchar *)(PORT+addr); break; case -2: val = *(ushort *)(PORT+addr); break; case -4: val = *(long *)(PORT+addr); break; case 1: *(uchar *)(PORT+addr) = val; break; case 2: *(ushort *)(PORT+addr) = val; break; case 4: *(long *)(PORT+addr) = val; break; default: panic("portprobe"); } time = PORTSELECT & 0x1f; P_qunlock(select); if (what) { print("%s at %d, %d", what, select, addr); print("%s", time & 0x10 ? " -- NOT FOUND\n" : "\n"); } if (time & 0x10) return -1; return val; } void portreset(void) { portpage.select = -1; lock(&portpage); unlock(&portpage); } void portinit(void) {} Chan * portattach(char *param) { return devattach('x', param); } Chan * portclone(Chan *c, Chan *nc) { return devclone(c, nc); } int portwalk(Chan *c, char *name) { return devwalk(c, name, portdir, NPORT, devgen); } void portstat(Chan *c, char *db) { devstat(c, db, portdir, NPORT, devgen); } Chan * portopen(Chan *c, int omode) { return devopen(c, omode, portdir, NPORT, devgen); } void portcreate(Chan *c, char *name, int omode, ulong perm) { error(Eperm); } void portclose(Chan *c) {} long portread(Chan *c, char *a, long n) { long s, k; if (n == 0) return 0; switch ((int)(c->qid.path & ~CHDIR)) { case Qdir: return devdirread(c, a, n, portdir, NPORT, devgen); case Qdata: if (!conf.portispaged || (s = c->offset >> PORTSHIFT) > 0xff) s = -1; k = c->offset % PORTSIZE; P_qlock(s); switch ((int)n) { case 1: *a = PORT[k]; break; case 2: *(short *)a = *(short *)(PORT+k); break; case 4: *(long *)a = *(long *)(PORT+k); break; default: P_qunlock(s); error(Ebadarg); } P_qunlock(s); break; default: panic("portread"); } return n; } long portwrite(Chan *c, char *a, long n) { long s, k; if (n == 0) return 0; switch ((int)c->qid.path) { case Qdata: if (!conf.portispaged || (s = c->offset >> PORTSHIFT) > 0xff) s = -1; k = c->offset % PORTSIZE; P_qlock(s); switch ((int)n) { case 1: PORT[k] = *a; break; case 2: *(short *)(PORT+k) = *(short *)a; break; case 4: *(long *)(PORT+k) = *(long *)a; break; default: P_qunlock(s); error(Ebadarg); } P_qunlock(s); break; default: panic("portwrite"); } return n; } void portremove(Chan *c) { error(Eperm); } void portwstat(Chan *c, char *dp) { error(Eperm); } #define Nportservice 8 int (*portservice[Nportservice])(void); Portpage portpage; Lock intrlock; void addportintr(int (*f)(void)) { int s = splhi(); int (**p)(void); lock(&intrlock); for (p=portservice; *p; p++) if (*p == f) goto out; if (p >= &portservice[Nportservice-1]) panic("addportintr"); *p = f; out: unlock(&intrlock); splx(s); } void devportintr(void) { int (**p)(void); int i = 0; for (p=portservice; *p; p++) i |= (**p)(); if (!i) /*putstring("spurious portintr\n");*/ panic("portintr"); if (portpage.select >= 0) PORTSELECT = portpage.select; } . ## diffname gnot/devport.c 1991/0115 ## diff -e /n/bootesdump/1991/0110/sys/src/9/68020/devport.c /n/bootesdump/1991/0115/sys/src/9/68020/devport.c 11,12d ## diffname gnot/devport.c 1991/0411 ## diff -e /n/bootesdump/1991/0201/sys/src/9/68020/devport.c /n/bootesdump/1991/0411/sys/src/9/gnot/devport.c 151c k = offset % PORTSIZE; . 149c if (!conf.portispaged || (s = offset >> PORTSHIFT) > 0xff) . 142c portwrite(Chan *c, char *a, long n, ulong offset) . 120c k = offset % PORTSIZE; . 118c if (!conf.portispaged || (s = offset >> PORTSHIFT) > 0xff) . 109c portread(Chan *c, char *a, long n, ulong offset) . ## diffname gnot/devport.c 1991/0419 ## diff -e /n/bootesdump/1991/0411/sys/src/9/gnot/devport.c /n/bootesdump/1991/0419/sys/src/9/gnot/devport.c 85a Chan* portclwalk(Chan *c, char *name) { return devclwalk(c, name); } . ## diffname gnot/devport.c 1991/0427 ## diff -e /n/bootesdump/1991/0419/sys/src/9/gnot/devport.c /n/bootesdump/1991/0427/sys/src/9/gnot/devport.c 86,91d ## diffname gnot/devport.c 1991/1112 ## diff -e /n/bootesdump/1991/0427/sys/src/9/gnot/devport.c /n/bootesdump/1991/1112/sys/src/9/gnot/devport.c 17c "data", {Qdata}, 0, 0666, . ## diffname gnot/devport.c 1992/0111 ## diff -e /n/bootesdump/1991/1112/sys/src/9/gnot/devport.c /n/bootesdump/1992/0111/sys/src/9/gnot/devport.c 7c #include "../port/error.h" . ## diffname gnot/devport.c 1992/0225 ## diff -e /n/bootesdump/1992/0111/sys/src/9/gnot/devport.c /n/bootesdump/1992/0225/sys/src/9/gnot/devport.c 133a break; case Qrom: if(offset >= ROMSIZE) return 0; if(offset+n > ROMSIZE) n = ROMSIZE - offset; memmove(a, ((char*)ROMADDR)+offset, n); return n; . 17a "rom", {Qrom}, ROMSIZE, 0444, . 13a Qrom . 10a #define ROMADDR 0x40000000 #define ROMSIZE ((256*1024)/8) . ## diffname gnot/devport.c 1992/0321 ## diff -e /n/bootesdump/1992/0225/sys/src/9/gnot/devport.c /n/bootesdump/1992/0321/sys/src/9/gnot/devport.c 2c #include "../port/lib.h" . ## diffname gnot/devport.c 1992/0621 ## diff -e /n/bootesdump/1992/0321/sys/src/9/gnot/devport.c /n/bootesdump/1992/0621/sys/src/9/gnot/devport.c 232d 226a . 224c int (**p)(void); int i = 0; . 208a . 197,203d 193a USED(c, dp); . 187a USED(c); . 172c *(long *)(PORT+k) = *(long *)a; break; . 170c *(short *)(PORT+k) = *(short *)a; break; . 111c { } . 71c { } . 46c *(long *)(PORT+addr) = val; break; . 44c *(ushort *)(PORT+addr) = val; break; . 42c *(uchar *)(PORT+addr) = val; break; . 40c val = *(long *)(PORT+addr); break; . 38c val = *(ushort *)(PORT+addr); break; . 36c val = *(uchar *)(PORT+addr); break; . 26a #define Nportservice 8 static int (*portservice[Nportservice])(void); static Portpage portpage; static Lock intrlock; . 14c #define P_oper(sel, inst) (P_qlock(sel), inst, P_qunlock(sel)) #define P_qlock(sel) (sel >= 0 ? (qlock(&portpage), \ PORTSELECT = portpage.select = sel) : -1) #define P_qunlock(sel) (sel >= 0 ? (qunlock(&portpage),0) : -1) #define P_read(sel, addr, val, type) P_oper(sel, val = *(type *)(PORT+addr)) #define P_write(sel, addr, val, type) P_oper(sel, *(type *)(PORT+addr) = val) enum { . ## diffname gnot/devport.c 1992/0711 ## diff -e /n/bootesdump/1992/0621/sys/src/9/gnot/devport.c /n/bootesdump/1992/0711/sys/src/9/gnot/devport.c 131a USED(c); . 125a USED(c, name, omode, perm); . ## diffname gnot/devport.c 1992/0808 ## diff -e /n/bootesdump/1992/0711/sys/src/9/gnot/devport.c /n/bootesdump/1992/0808/sys/src/9/gnot/devport.c 37c Portpage portpage; . ## diffname gnot/devport.c 1992/0916 ## diff -e /n/bootesdump/1992/0808/sys/src/9/gnot/devport.c /n/bootesdump/1992/0916/sys/src/9/gnot/devport.c 14,17c #define P_qlock(sel) if(sel >= 0){\ qlock(&portpage);\ PORTSELECT = portpage.select = sel;\ }else #define P_qunlock(sel) if(sel >= 0){\ qunlock(&portpage);\ }else #define P_oper(sel, inst) P_qlock(sel); inst; P_qunlock(sel) . ## diffname gnot/devport.c 1993/0501 # deleted ## diff -e /n/bootesdump/1992/0916/sys/src/9/gnot/devport.c /n/fornaxdump/1993/0501/sys/src/brazil/gnot/devport.c 1,262d