From 4f9e39d754d57960bad24e65b5cfca5af8ba59a5 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Sun, 8 Jan 1995 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1995-01-08 --- carrera/clock.c | 11 +- carrera/devether.c | 12 ++ carrera/devrtc.c | 15 +- carrera/trap.c | 5 +- pc/devastar.c | 12 ++ pc/devconfig.c | 12 ++ pc/devether.c | 12 ++ pc/devfloppy.c | 12 ++ pc/devhard.c | 12 ++ pc/devi82365.c | 12 ++ pc/devlpt.c | 12 ++ pc/devrtc.c | 12 ++ pc/devvga.c | 12 ++ port/dev.c | 29 ++++ port/devboot.c | 12 ++ port/devcons.c | 12 ++ port/devdup.c | 12 ++ port/devenv.c | 12 ++ port/devkprof.c | 12 ++ port/devlance.c | 12 ++ port/devmnt.c | 12 ++ port/devmouse.c | 12 ++ port/devns16552.c | 12 ++ port/devpipe.c | 12 ++ port/devproc.c | 12 ++ port/devroot.c | 12 ++ port/devsd.c | 12 ++ port/devsrv.c | 12 ++ port/error.h | 2 +- port/portdat.h | 5 +- port/portfns.h | 2 + port/proc.c | 3 +- port/qio.c | 6 +- port/taslock.c | 29 +++- power/clock.c | 1 - power/dat.h | 2 +- power/devcyc.c | 398 --------------------------------------------- power/devduart.c | 12 ++ power/devrtc.c | 12 ++ power/fns.h | 1 + power/l.s | 10 +- power/mem.h | 2 +- power/trap.c | 1 - 43 files changed, 413 insertions(+), 421 deletions(-) delete mode 100644 power/devcyc.c diff --git a/carrera/clock.c b/carrera/clock.c index 805afc2d33ab5badf9239be5175f05857f9d8914..7e655480160d484ed99486f586c3db6707f3d09f 100644 --- a/carrera/clock.c +++ b/carrera/clock.c @@ -47,6 +47,8 @@ clockinit(void) void clock(Ureg *ur) { + int n; + wrcompare(rdcount()+(m->speed*1000000)/HZ); m->ticks++; @@ -76,8 +78,13 @@ clock(Ureg *ur) if(up == 0 || up->state != Running) return; - if(anyready()) - sched(); + if(anyready()) { + n = up->inlock; + if(n == 0) + sched(); + else + up->inlock = n-1; + } /* user profiling clock */ if(ur->status & KUSER) diff --git a/carrera/devether.c b/carrera/devether.c index 8d5fcb178dee1d877467fd95bf689f4d3a8282b4..35745e50e48dc379a7ef02f275342f7ea024c259 100644 --- a/carrera/devether.c +++ b/carrera/devether.c @@ -691,6 +691,12 @@ etherread(Chan *c, void *buf, long n, ulong offset) return netifread(ether[0], c, buf, n, offset); } +Block* +etherbread(Chan *c, long n, ulong offset) +{ + return devbread(c, n, offset); +} + static int etherloop(Etherpkt *p, long n) { @@ -781,6 +787,12 @@ etherwrite(Chan *c, void *buf, long n, ulong offset) return n; } +long +etherbwrite(Chan *c, Block *bp, ulong offset) +{ + return devbwrite(c, bp, offset); +} + void etherremove(Chan *c) { diff --git a/carrera/devrtc.c b/carrera/devrtc.c index f4180e12eca4e3b419eaa3da5e6c91daa34b4063..688c1ec0f2fc681ea778520f8113d277400e2b4d 100644 --- a/carrera/devrtc.c +++ b/carrera/devrtc.c @@ -24,7 +24,8 @@ struct Rtc QLock rtclock; /* mutex on clock operations */ -enum{ +enum +{ Qrtc = 1, Qnvram, @@ -185,6 +186,12 @@ rtcread(Chan *c, void *buf, long n, ulong offset) return 0; } +Block* +rtcbread(Chan *c, long n, ulong offset) +{ + return devbread(c, n, offset); +} + static void binary2bcd(int reg, uchar val) { @@ -249,6 +256,12 @@ rtcwrite(Chan *c, void *buf, long n, ulong offset) return 0; } +long +rtcbwrite(Chan *c, Block *bp, ulong offset) +{ + return devbwrite(c, bp, offset); +} + void rtcremove(Chan *c) { diff --git a/carrera/trap.c b/carrera/trap.c index a41685f2716e138bf36d74d611ef8ef6a9242315..1f6bcaf59cd3db5c559cfb1710c26f9d171385d3 100644 --- a/carrera/trap.c +++ b/carrera/trap.c @@ -376,9 +376,6 @@ intr(Ureg *ur) case 7: audiosbintr(); break; - case 10: - mpegintr(); - break; case 13: eisadmaintr(); break; @@ -400,7 +397,7 @@ intr(Ureg *ur) } /* preemptive scheduling */ - if(up && up->state == Running && anyhigher()) + if(up && up->state == Running && anyhigher() && up->inlock == 0) sched(); } diff --git a/pc/devastar.c b/pc/devastar.c index 03c2a80102a26518242f02d0a665a5e0dd908181..30c90138518c9b0d1112be8709a2f5585bfe750d 100644 --- a/pc/devastar.c +++ b/pc/devastar.c @@ -709,6 +709,12 @@ astarread(Chan *c, void *buf, long n, ulong offset) return 0; } +Block* +astarbread(Chan *c, long n, ulong offset) +{ + return devbread(c, n, offset); +} + /* * write ISA mapped memory */ @@ -1200,6 +1206,12 @@ astarwrite(Chan *c, void *buf, long n, ulong offset) return 0; } +long +astarbwrite(Chan *c, Block *bp, ulong offset) +{ + return devbwrite(c, bp, offset); +} + void astarcreate(Chan *c, char *name, int omode, ulong perm) { diff --git a/pc/devconfig.c b/pc/devconfig.c index 4bad0f7f71d42ef341801cff41975b4121e034c6..7257d37a73e5ead960b2653ac941af90f3d13a01 100644 --- a/pc/devconfig.c +++ b/pc/devconfig.c @@ -121,6 +121,12 @@ configread(Chan *c, void *buf, long n, ulong offset) return 0; } +Block* +configbread(Chan *c, long n, ulong offset) +{ + return devbread(c, n, offset); +} + long configwrite(Chan *c, void *buf, long n, ulong offset) { @@ -181,6 +187,12 @@ configwrite(Chan *c, void *buf, long n, ulong offset) return 0; } +long +configbwrite(Chan *c, Block *bp, ulong offset) +{ + return devbwrite(c, bp, offset); +} + void configremove(Chan *c) { diff --git a/pc/devether.c b/pc/devether.c index 2446f7506a140b54d0cc128ce43adda52748b752..dc59f7758406b3aa5a705200ba5e003a32982935 100644 --- a/pc/devether.c +++ b/pc/devether.c @@ -82,6 +82,12 @@ etherread(Chan *c, void *buf, long n, ulong offset) return netifread(ether[c->dev], c, buf, n, offset); } +Block* +etherbread(Chan *c, long n, ulong offset) +{ + return devbread(c, n, offset); +} + void etherremove(Chan *c) { @@ -153,6 +159,12 @@ etherwrite(Chan *c, void *buf, long n, ulong offset) return n; } +long +etherbwrite(Chan *c, Block *bp, ulong offset) +{ + return devbwrite(c, bp, offset); +} + static struct { char *type; int (*reset)(Ether*); diff --git a/pc/devfloppy.c b/pc/devfloppy.c index 8d6d04bc3acf61c6e022357b1b0a253c7f634a1b..a4f819de018fd75462be63c1a580a88db362488b 100644 --- a/pc/devfloppy.c +++ b/pc/devfloppy.c @@ -524,6 +524,12 @@ floppyread(Chan *c, void *a, long n, ulong offset) return rv; } +Block* +floppybread(Chan *c, long n, ulong offset) +{ + return devbread(c, n, offset); +} + #define SNCMP(a, b) strncmp(a, b, sizeof(b)-1) long floppywrite(Chan *c, void *a, long n, ulong offset) @@ -589,6 +595,12 @@ floppywrite(Chan *c, void *a, long n, ulong offset) return rv; } +long +floppybwrite(Chan *c, Block *bp, ulong offset) +{ + return devbwrite(c, bp, offset); +} + static void floppykproc(void *a) { diff --git a/pc/devhard.c b/pc/devhard.c index 30f6c690050fc5bb84adb2ee1b2afeaaaaf2d692..e7badace09aad02e4bdaba67a08aaf4ca26bd226 100644 --- a/pc/devhard.c +++ b/pc/devhard.c @@ -371,6 +371,12 @@ hardread(Chan *c, void *a, long n, ulong offset) return rv; } +Block* +hardbread(Chan *c, long n, ulong offset) +{ + return devbread(c, n, offset); +} + long hardwrite(Chan *c, void *a, long n, ulong offset) { @@ -441,6 +447,12 @@ hardwrite(Chan *c, void *a, long n, ulong offset) return rv; } +long +hardbwrite(Chan *c, Block *bp, ulong offset) +{ + return devbwrite(c, bp, offset); +} + /* * did an interrupt happen? */ diff --git a/pc/devi82365.c b/pc/devi82365.c index 1b1ff369bb09caf71e427d1679ae24e4a644b45e..75ca1015b9bef47bf5e5b3d72dfbdec62c886645 100644 --- a/pc/devi82365.c +++ b/pc/devi82365.c @@ -712,6 +712,12 @@ i82365read(Chan *c, void *a, long n, ulong offset) return n; } +Block* +i82365bread(Chan *c, long n, ulong offset) +{ + return devbread(c, n, offset); +} + long pcmwrite(int dev, int attr, void *a, long n, ulong offset) { @@ -764,6 +770,12 @@ i82365write(Chan *c, void *a, long n, ulong offset) return n; } +long +i82365bwrite(Chan *c, Block *bp, ulong offset) +{ + return devbwrite(c, bp, offset); +} + /* * configure the Slot for IO. We assume very heavily that we can read * cofiguration info from the CIS. If not, we won't set up correctly. diff --git a/pc/devlpt.c b/pc/devlpt.c index 853409f83249dc07c51110c832aad429a8179ee8..523e12e1cc93f6bc6943359b05e302d785537baa 100644 --- a/pc/devlpt.c +++ b/pc/devlpt.c @@ -166,6 +166,12 @@ lptread(Chan *c, void *a, long n) return n; } +Block* +lptbread(Chan *c, long n, ulong offset) +{ + return devbread(c, n, offset); +} + long lptwrite(Chan *c, void *a, long n) { @@ -195,6 +201,12 @@ lptwrite(Chan *c, void *a, long n) return n; } +long +lptbwrite(Chan *c, Block *bp, ulong offset) +{ + return devbwrite(c, bp, offset); +} + static void outch(int base, int c) { diff --git a/pc/devrtc.c b/pc/devrtc.c index 99fb56d9b8c7f7cd6fca051e1987d8d726eb17c4..746b49e925d142a7e0a8fa082f6eeceda9255da5 100644 --- a/pc/devrtc.c +++ b/pc/devrtc.c @@ -201,6 +201,12 @@ rtcread(Chan *c, void *buf, long n, ulong offset) return 0; } +Block* +rtcbread(Chan *c, long n, ulong offset) +{ + return devbread(c, n, offset); +} + #define PUTBCD(n,o) bcdclock[o] = (n % 10) | (((n / 10) % 10)<<4) long @@ -276,6 +282,12 @@ rtcwrite(Chan *c, void *buf, long n, ulong offset) return 0; } +long +rtcbwrite(Chan *c, Block *bp, ulong offset) +{ + return devbwrite(c, bp, offset); +} + void rtcremove(Chan *c) { diff --git a/pc/devvga.c b/pc/devvga.c index 23be19254b687678ee4bb52fa90e029b6bb8eb17..e162fb43f6dfbc2c597f5d4dcb0c495af7a40f63 100644 --- a/pc/devvga.c +++ b/pc/devvga.c @@ -244,6 +244,12 @@ vgaread(Chan *c, void *buf, long n, ulong offset) return 0; } +Block* +vgabread(Chan *c, long n, ulong offset) +{ + return devbread(c, n, offset); +} + static void vgactl(char *arg) { @@ -358,6 +364,12 @@ vgawrite(Chan *c, void *buf, long n, ulong offset) return 0; } +long +vgabwrite(Chan *c, Block *bp, ulong offset) +{ + return devbwrite(c, bp, offset); +} + void vgaremove(Chan *c) { diff --git a/port/dev.c b/port/dev.c index 19098574a7cfa220f3d1829778d4ad826788ef4a..6b821ceb35f68b34334853712815c0f77c1d9e65 100644 --- a/port/dev.c +++ b/port/dev.c @@ -232,3 +232,32 @@ Return: c->flag |= COPEN; return c; } + +Block* +devbread(Chan *c, long n, ulong offset) +{ + Block *bp; + + bp = allocb(n); + if(bp == 0) + error(Enomem); + if(waserror()) { + freeb(bp); + nexterror(); + } + bp->wp += devtab[c->type].read(c, bp->wp, n, offset); + poperror(); + return bp; +} + +long +devbwrite(Chan *c, Block *bp, ulong offset) +{ + long n; + + n = devtab[c->type].write(c, bp->rp, BLEN(bp), offset); + freeb(bp); + + return n; +} + diff --git a/port/devboot.c b/port/devboot.c index e13656e8c705bf1a4af8a3a043edf7fdfa03da7b..3d64483a7cd00c95ca6d99e582e7c706cbe999c1 100644 --- a/port/devboot.c +++ b/port/devboot.c @@ -95,6 +95,12 @@ bootread(Chan *c, void *buf, long n, ulong offset) return 0; /* not reached */ } +Block* +bootbread(Chan *c, long n, ulong offset) +{ + return devbread(c, n, offset); +} + long bootwrite(Chan *c, void *buf, long n, ulong offset) { @@ -120,6 +126,12 @@ bootwrite(Chan *c, void *buf, long n, ulong offset) return 0; /* not reached */ } +long +bootbwrite(Chan *c, Block *bp, ulong offset) +{ + return devbwrite(c, bp, offset); +} + void bootremove(Chan *c) { diff --git a/port/devcons.c b/port/devcons.c index 96c6739a8368f80d93547eed158488fbcc4bb7cd..1b53f2ccb4e0c8d3e408080ebdea6f0323bfd8c1 100644 --- a/port/devcons.c +++ b/port/devcons.c @@ -640,6 +640,12 @@ consread(Chan *c, void *buf, long n, ulong offset) return -1; /* never reached */ } +Block* +consbread(Chan *c, long n, ulong offset) +{ + return devbread(c, n, offset); +} + void conslights(char *a, int n) { @@ -825,6 +831,12 @@ conswrite(Chan *c, void *va, long n, ulong offset) return n; } +long +consbwrite(Chan *c, Block *bp, ulong offset) +{ + return devbwrite(c, bp, offset); +} + void consremove(Chan *c) { diff --git a/port/devdup.c b/port/devdup.c index 9e6a28d5619bf576f880a5f79452dc2c4d709cfb..c7a1eda019fb64651280d91adc9e7b2052c8d208 100644 --- a/port/devdup.c +++ b/port/devdup.c @@ -122,6 +122,12 @@ dupread(Chan *c, void *va, long n, ulong offset) return devdirread(c, a, n, (Dirtab *)0, 0L, dupgen); } +Block* +dupbread(Chan *c, long n, ulong offset) +{ + return devbread(c, n, offset); +} + long dupwrite(Chan *c, void *va, long n, ulong offset) { @@ -129,3 +135,9 @@ dupwrite(Chan *c, void *va, long n, ulong offset) panic("dupwrite"); return 0; /* not reached */ } + +long +dupbwrite(Chan *c, Block *bp, ulong offset) +{ + return devbwrite(c, bp, offset); +} diff --git a/port/devenv.c b/port/devenv.c index e9ce28fa588c3c54e842ed8ae87e33351c2066ee..0bd9b76115cb2a3d7a957340efd1558f1c12028b 100644 --- a/port/devenv.c +++ b/port/devenv.c @@ -220,6 +220,12 @@ envread(Chan *c, void *a, long n, ulong offset) return n; } +Block* +envbread(Chan *c, long n, ulong offset) +{ + return devbread(c, n, offset); +} + long envwrite(Chan *c, void *a, long n, ulong offset) { @@ -259,6 +265,12 @@ envwrite(Chan *c, void *a, long n, ulong offset) return n; } +long +envbwrite(Chan *c, Block *bp, ulong offset) +{ + return devbwrite(c, bp, offset); +} + void envcpy(Egrp *to, Egrp *from) { diff --git a/port/devkprof.c b/port/devkprof.c index fe6a7741a8a5952131ad84c817a0638f28af5638..a9340e296c61844d244ff68f2b7da6ad22f3d03a 100644 --- a/port/devkprof.c +++ b/port/devkprof.c @@ -162,6 +162,12 @@ kprofread(Chan *c, void *va, long n, ulong offset) return n; } +Block* +kprofbread(Chan *c, long n, ulong offset) +{ + return devbread(c, n, offset); +} + long kprofwrite(Chan *c, char *a, long n, ulong offset) { @@ -183,6 +189,12 @@ kprofwrite(Chan *c, char *a, long n, ulong offset) return n; } +long +kprofbwrite(Chan *c, Block *bp, ulong offset) +{ + return devbwrite(c, bp, offset); +} + void kproftimer(ulong pc) { diff --git a/port/devlance.c b/port/devlance.c index a36e44cdcff15c01ba40361d503fe45e593d6f2b..e01ae84ebc7e6129bd812ef66dc5e832b66d02b3 100644 --- a/port/devlance.c +++ b/port/devlance.c @@ -425,6 +425,12 @@ lanceread(Chan *c, void *buf, long n, ulong offset) return netifread(&l, c, buf, n, offset); } +Block* +lancebread(Chan *c, long n, ulong offset) +{ + return devbread(c, n, offset); +} + static int isoutbuf(void *x) { @@ -509,6 +515,12 @@ lancewrite(Chan *c, void *buf, long n, ulong offset) return n; } +long +lancebwrite(Chan *c, Block *bp, ulong offset) +{ + return devbwrite(c, bp, offset); +} + void lanceremove(Chan *c) { diff --git a/port/devmnt.c b/port/devmnt.c index c6b4c8bef868fa8ecee7e49778115c93bb9bdec2..ca214e2801d21fcc079e81c3e3103316b9b76579 100644 --- a/port/devmnt.c +++ b/port/devmnt.c @@ -523,6 +523,12 @@ mntread(Chan *c, void *buf, long n, ulong offset) return n; } +Block* +mntbread(Chan *c, long n, ulong offset) +{ + return devbread(c, n, offset); +} + long mntwrite9p(Chan *c, void *buf, long n, ulong offset) { @@ -535,6 +541,12 @@ mntwrite(Chan *c, void *buf, long n, ulong offset) return mntrdwr(Twrite, c, buf, n, offset, 0); } +long +mntbwrite(Chan *c, Block *bp, ulong offset) +{ + return devbwrite(c, bp, offset); +} + long mntrdwr(int type, Chan *c, void *buf, long n, ulong offset, int p9msg) { diff --git a/port/devmouse.c b/port/devmouse.c index 098831817e13dad0b36d831fbf3d440a626673aa..e3f805b7e30f0408e12f288e6aa1dacc7aa2bdb2 100644 --- a/port/devmouse.c +++ b/port/devmouse.c @@ -230,6 +230,12 @@ mouseread(Chan *c, void *va, long n, ulong offset) return 0; } +Block* +mousebread(Chan *c, long n, ulong offset) +{ + return devbread(c, n, offset); +} + long mousewrite(Chan *c, void *va, long n, ulong offset) { @@ -296,6 +302,12 @@ mousewrite(Chan *c, void *va, long n, ulong offset) return -1; } +long +mousebwrite(Chan *c, Block *bp, ulong offset) +{ + return devbwrite(c, bp, offset); +} + void Cursortocursor(Cursor *c) { diff --git a/port/devns16552.c b/port/devns16552.c index 6301efdcf25319597be067c48d8529bff87ee0e6..042fec329b8a1312b2d3c22d699c7a214162c848 100644 --- a/port/devns16552.c +++ b/port/devns16552.c @@ -837,6 +837,12 @@ ns16552read(Chan *c, void *buf, long n, ulong offset) return 0; } +Block* +ns16552bread(Chan *c, long n, ulong offset) +{ + return devbread(c, n, offset); +} + static void ns16552ctl(Uart *p, char *cmd) { @@ -944,6 +950,12 @@ ns16552write(Chan *c, void *buf, long n, ulong offset) } } +long +ns16552bwrite(Chan *c, Block *bp, ulong offset) +{ + return devbwrite(c, bp, offset); +} + void ns16552remove(Chan *c) { diff --git a/port/devpipe.c b/port/devpipe.c index d1857a54e3e9147dce21270e8ad9195e012324de..70cf96fbe05fb36766a8607ca80cbda7abcc74da 100644 --- a/port/devpipe.c +++ b/port/devpipe.c @@ -291,6 +291,12 @@ piperead(Chan *c, void *va, long n, ulong offset) return -1; /* not reached */ } +Block* +pipebread(Chan *c, long n, ulong offset) +{ + return devbread(c, n, offset); +} + /* * a write to a closed pipe causes a note to be sent to * the process. @@ -329,3 +335,9 @@ pipewrite(Chan *c, void *va, long n, ulong offset) poperror(); return n; } + +long +pipebwrite(Chan *c, Block *bp, ulong offset) +{ + return devbwrite(c, bp, offset); +} diff --git a/port/devproc.c b/port/devproc.c index 9813bd97a22f43be4f41429c7bae1ceae6962959..cb7bb53c384fc1fcc97c05ebb3ec651e9f16d131 100644 --- a/port/devproc.c +++ b/port/devproc.c @@ -480,6 +480,12 @@ procread(Chan *c, void *va, long n, ulong offset) return 0; /* not reached */ } +Block* +procbread(Chan *c, long n, ulong offset) +{ + return devbread(c, n, offset); +} + void mntscan(Mntwalk *mw) { @@ -612,6 +618,12 @@ procwrite(Chan *c, void *va, long n, ulong offset) return n; } +long +procbwrite(Chan *c, Block *bp, ulong offset) +{ + return devbwrite(c, bp, offset); +} + Chan * proctext(Chan *c, Proc *p) { diff --git a/port/devroot.c b/port/devroot.c index 791f8ebf71f3432e2df1c99437693a4c48905a79..ad3331649e45b24e241f10bcf1d865fdfd5aa947 100644 --- a/port/devroot.c +++ b/port/devroot.c @@ -211,6 +211,12 @@ rootread(Chan *c, void *buf, long n, ulong offset) return n; } +Block* +rootbread(Chan *c, long n, ulong offset) +{ + return devbread(c, n, offset); +} + long rootwrite(Chan *c, void *buf, long n, ulong offset) { @@ -232,6 +238,12 @@ rootwrite(Chan *c, void *buf, long n, ulong offset) return 0; } +long +rootbwrite(Chan *c, Block *bp, ulong offset) +{ + return devbwrite(c, bp, offset); +} + void rootremove(Chan *c) { diff --git a/port/devsd.c b/port/devsd.c index 45d0d63196a040ad26f1da9e4cca10a3b0800c14..08fd53da88f4e1fbca306693589ce317a607fc28 100644 --- a/port/devsd.c +++ b/port/devsd.c @@ -229,12 +229,24 @@ sdread(Chan *c, void *a, long n, ulong offset) return sdio(c, 0, a, n, offset); } +Block* +sdbread(Chan *c, long n, ulong offset) +{ + return devbread(c, n, offset); +} + long sdwrite(Chan *c, char *a, long n, ulong offset) { return sdio(c, 1, a, n, offset); } +long +sdbwrite(Chan *c, Block *bp, ulong offset) +{ + return devbwrite(c, bp, offset); +} + static void sdrdpart(Disk *d) { diff --git a/port/devsrv.c b/port/devsrv.c index a67551604731c5dfd9d53eec7fb90ef3782a0420..14b17383bdf8ac40d5648cad60b712e1bfa8e126 100644 --- a/port/devsrv.c +++ b/port/devsrv.c @@ -226,6 +226,12 @@ srvread(Chan *c, void *va, long n, ulong offset) return devdirread(c, va, n, 0, 0, srvgen); } +Block* +srvbread(Chan *c, long n, ulong offset) +{ + return devbread(c, n, offset); +} + long srvwrite(Chan *c, void *va, long n, ulong offset) { @@ -265,6 +271,12 @@ srvwrite(Chan *c, void *va, long n, ulong offset) return n; } +long +srvbwrite(Chan *c, Block *bp, ulong offset) +{ + return devbwrite(c, bp, offset); +} + void srvrecover(Chan *old, Chan *new) { diff --git a/port/error.h b/port/error.h index fc1219f98cca0e00b57dd76eec8cd489acd7c205..e38a94b7b08dafde19b30a22554f97e9355f957a 100644 --- a/port/error.h +++ b/port/error.h @@ -52,5 +52,5 @@ extern char Emouseset[]; /* mouse type already set */ extern char Erecover[]; /* failed to recover fd */ extern char Eshort[]; /* i/o count too small */ extern char Enobitstore[]; /* out of screen memory */ -extern char Egreg[]; /* coherency problem */ +extern char Egreg[]; /* ken scheduled it */ extern char Ebadspec[]; /* bad attach specifier */ diff --git a/port/portdat.h b/port/portdat.h index e33273e3d4270b863cdf7923699c910ab35544f0..b5dfd80f1c8af983f07ac26c89c3ab0f6c1291d6 100644 --- a/port/portdat.h +++ b/port/portdat.h @@ -177,7 +177,9 @@ struct Dev void (*create)(Chan*, char*, int, ulong); void (*close)(Chan*); long (*read)(Chan*, void*, long, ulong); + Block* (*bread)(Chan*, long, ulong); long (*write)(Chan*, void*, long, ulong); + long (*bwrite)(Chan*, Block*, ulong); void (*remove)(Chan*); void (*wstat)(Chan*, char*); }; @@ -587,7 +589,8 @@ struct Proc Mach *wired; /* machine this process must run on */ int pri; /* scheduling priority - low is high priority */ short nice; /* time-passing algorithm - low is high priority */ - short yield; /* force one lap in the runq */ + char yield; /* force one lap in the runq */ + char inlock; /* temp hi proirity ~= 2*num of locks set */ void *ureg; /* User registers for notes */ void *dbgreg; /* User registers for devproc */ diff --git a/port/portfns.h b/port/portfns.h index 77c3aafa56be8e43fc68a23e7fc8b73e4f9bbb46..31f6f63468aab97db0f49a0ec25d3cd2d3cadf66 100644 --- a/port/portfns.h +++ b/port/portfns.h @@ -49,6 +49,8 @@ int decref(Ref*); int decrypt(void*, void*, int); void delay(int); Chan* devattach(int, char*); +Block* devbread(Chan*, long, ulong); +long devbwrite(Chan*, Block*, ulong); Chan* devclone(Chan*, Chan*); void devdir(Chan*, Qid, char*, long, char*, long, Dir*); long devdirread(Chan*, char*, long, Dirtab*, int, Devgen*); diff --git a/port/proc.c b/port/proc.c index 35639a1a4c7733179c3e72ec5f09531bf78c5eae..734ea01b58c829886bf8fb3cc4736027908fcc04 100644 --- a/port/proc.c +++ b/port/proc.c @@ -172,7 +172,8 @@ loop: if(p->mach || (p->wired && p->wired != m)) continue; if(bp == 0) { - p->yield = 0; + if(p->yield) + p->yield = 0; bp = p; } else if(p->yield == 0 && p->pri < bp->pri) diff --git a/port/qio.c b/port/qio.c index 28d87ce14b84e9ee4c56ac6d8f879044bd5b76c9..dfe59756a915e220ead95edb14c3b823a7ff81a0 100644 --- a/port/qio.c +++ b/port/qio.c @@ -111,7 +111,7 @@ freeb(Block *b) { /* * drivers which perform non cache coherent DMA manage their - * own buffer pools, so they provide their own free routines. + * own buffer pool and provide their own free routine. */ if(b->free) { b->free(b); @@ -520,8 +520,8 @@ qwrite(Queue *q, void *vp, int len) dowakeup = 0; - if((getstatus()&IE) == 0) - print("qwrite hi %lux\n", getcallerpc(q)); +if((getstatus()&IE) == 0) +print("qwrite hi %lux\n", getcallerpc(q)); if(waserror()){ qunlock(&q->wlock); diff --git a/port/taslock.c b/port/taslock.c index 0e1bd45d6d83eb749e8f3f975e403f603323e2ef..ad282313701c979078730b19ae048bb597a3493e 100644 --- a/port/taslock.c +++ b/port/taslock.c @@ -8,9 +8,28 @@ void lock(Lock *l) { + int n; + + if(up) { + n = up->inlock+2; + up->inlock = n; + if(tas(&l->key) == 0) + return; + + for(;;){ + while(l->key) + if(conf.nproc == 1) { + up->yield = 1; + sched(); + } + up->inlock = n; + if(tas(&l->key) == 0) + return; + } + } + if(tas(&l->key) == 0) return; - for(;;){ while(l->key) ; @@ -52,7 +71,15 @@ canlock(Lock *l) void unlock(Lock *l) { + int n; + l->key = 0; + if(up) { + n = up->inlock-2; + if(n < 0) + n = 0; + up->inlock = n; + } } void diff --git a/power/clock.c b/power/clock.c index 44d3937990eb0ae37fcf5b86e02aa3ed12bb091f..4c865ca970782c07b1a0525d1f9c443db082d348 100644 --- a/power/clock.c +++ b/power/clock.c @@ -80,7 +80,6 @@ clock(Ureg *ur) } return; } - nrun = 0; i = *CLRTIM0; USED(i); diff --git a/power/dat.h b/power/dat.h index db21799aefb14ae8a70bfe625982b478cb3980a7..5871dde70e696a25755be0bec8a181b2ba3461ab 100644 --- a/power/dat.h +++ b/power/dat.h @@ -137,7 +137,7 @@ typedef void KMap; #define kmap(p) (KMap*)((p)->pa|KZERO) #define kunmap(k) #define PPN(x) x - +#define AOUT_MAGIC V_MAGIC || magic==M_MAGIC /* * LANCE CSR3 (bus control bits) */ diff --git a/power/devcyc.c b/power/devcyc.c deleted file mode 100644 index 46204b9ce2e68bb00f8c6dcd5f89486345aa234f..0000000000000000000000000000000000000000 --- a/power/devcyc.c +++ /dev/null @@ -1,398 +0,0 @@ -#include "u.h" -#include "../port/lib.h" -#include "mem.h" -#include "dat.h" -#include "fns.h" -#include "../port/error.h" -#include "devtab.h" - -#include "io.h" -#include "/sys/src/fs/cyc/comm.h" - - -typedef struct Commcyc Commcyc; - -enum -{ - Vmevec= 0xd2, /* vme vector for interrupts */ - Intlevel= 5, /* level to interrupt on */ - Qdir= 0, /* Qid's */ - Qcyc= 1, - Ncyc= 1, -}; - -Dirtab cycdir[]={ - "cyc", {Qcyc}, 0, 0600, -}; - -#define NCYCDIR (sizeof cycdir/sizeof(Dirtab)) - -struct Commcyc -{ - Lock; - QLock buflock; - Lock busy; - Comm *addr; /* address of the device */ - int vec; /* vme interrupt vector */ - int wi; /* where to write next cmd */ - int ri; /* where to read next reply */ - uchar buf[MAXFDATA+MAXMSG]; -}; - -Commcyc cyclone[Ncyc]; - -void cycintr(int); - -#define CYCLONE VMEA24SUP(Comm, 0x10000); - -/* - * Commands - */ - -Cycmsg** -cycsend(Commcyc *h, Cycmsg *m) -{ - Cycmsg **mp; - - lock(h); - mp = (Cycmsg**)&h->addr->reqstq[h->wi]; - *mp = (Cycmsg*)MP2VME(m); - h->wi++; - if(h->wi >= NRQ) - h->wi = 0; - unlock(h); - return mp; -} - -void -cycwait(Cycmsg **mp) -{ - ulong l; - - l = 0; - while(*mp){ - delay(0); /* just a subroutine call; stay off VME */ - if(++l > 10*1000*1000){ - l = 0; - panic("cycsend blocked"); - } - } - return; -} - -/* - * reset all cyclone boards - */ -void -cycreset(void) -{ - int i; - Commcyc *cp; - - for(cp=cyclone,i=0; iaddr = CYCLONE+i; - /* - * Write queue is at end of cyclone memory - */ - cp->vec = Vmevec+i; - setvmevec(cp->vec, cycintr); - } -} - -void -cycinit(void) -{ -} - -/* - * enable the device for interrupts, spec is the device number - */ -Chan* -cycattach(char *spec) -{ - int i; - Chan *c; - - i = strtoul(spec, 0, 0); - if(i >= Ncyc) - error(Ebadarg); - - c = devattach('C', spec); - c->dev = i; - c->qid.path = CHDIR; - c->qid.vers = 0; - return c; -} - -Chan* -cycclone(Chan *c, Chan *nc) -{ - return devclone(c, nc); -} - -int -cycwalk(Chan *c, char *name) -{ - return devwalk(c, name, cycdir, NCYCDIR, devgen); -} - -void -cycstat(Chan *c, char *dp) -{ - devstat(c, dp, cycdir, NCYCDIR, devgen); -} - -Chan* -cycopen(Chan *c, int omode) -{ - Commcyc *cp; - Cycmsg *mp, **cmp; - - if(c->qid.path == CHDIR){ - if(omode != OREAD) - error(Eperm); - }else if(c->qid.path == Qcyc){ - cp = &cyclone[c->dev]; - if(!canlock(&cp->busy)) - error(Einuse); - /* - * Clear communications region - */ - memset(cp->addr->reqstq, 0, NRQ*sizeof(ulong)); - cp->addr->reqstp = 0; - memset(cp->addr->replyq, 0, NRQ*sizeof(ulong)); - cp->addr->replyp = 0; - - /* Set the interrupt vector for the cyclone to pick up */ - cp->addr->vmevec = Vmevec; - - /* - * Issue reset - */ - cp->wi = 0; - cp->ri = 0; - mp = up->kcyc; - mp->cmd = Ureset; - cmp = cycsend(cp, up->kcyc); - cycwait(cmp); - delay(100); - print("reset\n"); - } - c->mode = openmode(omode); - c->flag |= COPEN; - c->offset = 0; - return c; -} - -void -cyccreate(Chan *c, char *name, int omode, ulong perm) -{ - USED(c, name, omode, perm); - error(Eperm); -} - -void -cycclose(Chan *c) -{ - Commcyc *cp; - Cycmsg **cmp; - - cp = &cyclone[c->dev]; - if(c->qid.path != CHDIR){ - up->kcyc->cmd = Ureboot; - cmp = cycsend(cp, up->kcyc); - cycwait(cmp); - unlock(&cp->busy); - } -} - -int -cycmsgintr(Cycmsg *hm) -{ - return hm->intr; -} - -/* - * Read and write use physical addresses if they can, which they usually can. - * Most I/O is from devmnt, which has local buffers. Therefore just check - * that buf is in KSEG0 and is at an even address. - */ - -long -cycread(Chan *c, void *buf, long n, ulong offset) -{ - ulong l, m; - Commcyc *cp; - Cycmsg *mp, **cmp; - - USED(offset); - cp = &cyclone[c->dev]; - switch(c->qid.path & ~CHDIR){ - case Qdir: - return devdirread(c, buf, n, cycdir, NCYCDIR, devgen); - - case Qcyc: - if(n > sizeof cp->buf){ - print("cyclone bufsize %d %d\n", n, sizeof cp->buf); - error(Egreg); - } - if((((ulong)buf)&(KSEGM|3)) == KSEG0){ - /* - * use supplied buffer, no need to lock for reply - */ - - mp = up->kcyc; - mp->cmd = Uread; - mp->param[0] = MP2VME(buf); - mp->param[1] = n; - mp->param[2] = 0; /* reply checksum */ - mp->param[3] = 0xdeadbeef; /* reply count */ - mp->intr = 0; - cycsend(cp, mp); - - while(waserror()) - ; - sleep(&mp->r, cycmsgintr, mp); - poperror(); - - m = mp->param[3]; - if(m==0 || m>n){ - print("devcyc: count 0x%lux 0x%lux\n", m, n); - error(Egreg); - } - } - else{ - /* - * use cyclone buffer. lock the buffer until the reply - */ - mp = up->ucyc; - qlock(&cp->buflock); - mp->cmd = Uread; - mp->param[0] = MP2VME(cp->buf); - mp->param[1] = n; - mp->param[2] = 0; /* reply checksum */ - mp->param[3] = 0; /* reply count */ - mp->intr = 0; - cmp = cycsend(cp, mp); - cycwait(cmp); - l = 100*1000*1000; - do - m = mp->param[3]; - while(m==0 && --l>0); - - if(m==0 || m>n){ - print("devcyc: count %ld %ld\n", m, n); - qunlock(&cp->buflock); - error(Egreg); - } - memmove(buf, cp->buf, m); - qunlock(&cp->buflock); - } - return m; - } - print("devcyc read unk\n"); - error(Egreg); - return 0; -} - -long -cycwrite(Chan *c, void *buf, long n, ulong offset) -{ - Commcyc *cp; - Cycmsg *mp, **cmp; - - USED(offset); - cp = &cyclone[c->dev]; - switch(c->qid.path & ~CHDIR){ - case Qdir: - return devdirread(c, buf, n, cycdir, NCYCDIR, devgen); - - case Qcyc: - if(n > sizeof cp->buf){ - print("cyclone write bufsize\n"); - error(Egreg); - } - if((((ulong)buf)&(KSEGM|3)) == KSEG0){ - /* - * use supplied buffer, no need to lock for reply - */ - mp = up->kcyc; - - mp->cmd = Uwrite; - mp->param[0] = MP2VME(buf); - mp->param[1] = n; - mp->param[2] = 0; - - cmp = cycsend(cp, mp); - cycwait(cmp); - }else{ - /* - * use cyclone buffer. lock the buffer until the reply - */ - mp = up->ucyc; - qlock(&cp->buflock); - memmove(cp->buf, buf, n); - - mp->cmd = Uwrite; - mp->param[0] = MP2VME(cp->buf); - mp->param[1] = n; - mp->param[2] = 0; - - cmp = cycsend(cp, mp); - cycwait(cmp); - qunlock(&cp->buflock); - } - return n; - } - print("cyclone write unk\n"); - error(Egreg); - return 0; -} - -void -cycremove(Chan *c) -{ - USED(c); - error(Eperm); -} - -void -cycwstat(Chan *c, char *dp) -{ - USED(c, dp); - error(Eperm); -} - -void -cycintr(int vec) -{ - Cycmsg *cm; - Commcyc *h; - ulong l, n, *r; - - h = &cyclone[vec - Vmevec]; - if(h&cyclone[Ncyc]){ - print("bad cyclone vec\n"); - return; - } - - r = h->addr->replyq; - - for(;;) { - l = r[h->ri]; - if(l == 0) - break; - - r[h->ri++] = 0; - if(h->ri >= NRQ) - h->ri = 0; - - cm = (Cycmsg*)VME2MP(l); - cm->intr = 1; - n = cm->param[3]; - if(n==0 || n > 10000) - print("cycintr count 0x%lux\n", n); - - wakeup(&cm->r); - } -} diff --git a/power/devduart.c b/power/devduart.c index 896386994c310515fffaa7f39ee5917e2f5966a8..ff35353113cd37746ca25a0dcb13ceccc1ee84ca 100644 --- a/power/devduart.c +++ b/power/devduart.c @@ -615,6 +615,12 @@ duartread(Chan *c, void *buf, long n, ulong offset) return 0; } +Block* +duartbread(Chan *c, long n, ulong offset) +{ + return devbread(c, n, offset); +} + static void duartctl(Uart *p, char *cmd) { @@ -683,6 +689,12 @@ duartwrite(Chan *c, void *va, long n, ulong offset) } } +long +duartbwrite(Chan *c, Block *bp, ulong offset) +{ + return devbwrite(c, bp, offset); +} + void duartremove(Chan *c) { diff --git a/power/devrtc.c b/power/devrtc.c index 4dabd680f1ddba46ed8e9bd71b01099804b83c8e..fdf15512292d1889df17ac39ce65ef8a596e2026 100644 --- a/power/devrtc.c +++ b/power/devrtc.c @@ -165,6 +165,12 @@ rtcread(Chan *c, void *buf, long n, ulong offset) return -1; /* never reached */ } +Block* +rtcbread(Chan *c, long n, ulong offset) +{ + return devbread(c, n, offset); +} + long rtcwrite(Chan *c, void *buf, long n, ulong offset) { @@ -217,6 +223,12 @@ rtcwrite(Chan *c, void *buf, long n, ulong offset) return -1; /* never reached */ } +long +rtcbwrite(Chan *c, Block *bp, ulong offset) +{ + return devbwrite(c, bp, offset); +} + void rtcremove(Chan *c) { diff --git a/power/fns.h b/power/fns.h index 656d93e2ab3dd187f5aa45c80a41ad0eea75513e..62b1e65c4e4a67c63b9cc450f4409a16c06de3f9 100644 --- a/power/fns.h +++ b/power/fns.h @@ -25,6 +25,7 @@ void firmware(int); void flushmmu(void); #define flushpage(s) icflush((void*)(s), BY2PG) void fptrap(Ureg*); +ulong getstatus(void); void gettlb(int, ulong*); ulong gettlbvirt(int); void gotopc(ulong); diff --git a/power/l.s b/power/l.s index 12d736ef9d58251a8407dfc9b4c74042d1c68900..65e525a3007970a9e0a4d7446462d974028959dd 100644 --- a/power/l.s +++ b/power/l.s @@ -101,7 +101,7 @@ TEXT splhi(SB), $0 MOVW R31, 0xC(R(MACH)) /* save PC in m->splpc */ MOVW M(STATUS), R1 - AND $~IEC, R1, R2 + AND $~IE, R1, R2 MOVW R2, M(STATUS) NOOP RET @@ -110,8 +110,8 @@ TEXT splx(SB), $0 MOVW R31, 0xC(R(MACH)) /* save PC in m->splpc */ MOVW M(STATUS), R2 - AND $IEC, R1 - AND $~IEC, R2 + AND $IE, R1 + AND $~IE, R2 OR R2, R1 MOVW R1, M(STATUS) NOOP @@ -120,7 +120,7 @@ TEXT splx(SB), $0 TEXT spllo(SB), $0 MOVW M(STATUS), R1 - OR $IEC, R1, R2 + OR $IE, R1, R2 MOVW R2, M(STATUS) NOOP RET @@ -131,7 +131,7 @@ TEXT muxlock(SB),$0 MOVW 4(FP), R3 /* lk->val */ MOVW M(STATUS), R5 /* splhi */ - AND $~IEC, R5, R4 + AND $~IE, R5, R4 MOVW R4, M(STATUS) MOVW 0(R2),R4 /* grab sbsem */ diff --git a/power/mem.h b/power/mem.h index 43bbf782c6045dbd8507cb41936f25cdb47d92a5..1b5fab0f2eea33c36383c7ba245c703115f0b486 100644 --- a/power/mem.h +++ b/power/mem.h @@ -46,7 +46,7 @@ /* * M(STATUS) bits */ -#define IEC 0x00000001 +#define IE 0x00000001 #define KUC 0x00000002 #define IEP 0x00000004 #define KUP 0x00000008 diff --git a/power/trap.c b/power/trap.c index e5e1abf6fc5df23f7018b6353494f7db9dd69221..899492cb8a47e4180671349ee7f525377c1651c8 100644 --- a/power/trap.c +++ b/power/trap.c @@ -521,7 +521,6 @@ syscall(Ureg *aur) postnote(up, 1, "sys: bad sys call", NDebug); error(Ebadarg); } - up->syscall[up->scallnr]++; if(sp & (BY2WD-1)){ pprint("odd sp in sys call pc %lux sp %lux\n", ur->pc, ur->sp);