From c00efe1f293379b5c994b1dcaeded98bb79792fb Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Tue, 25 Oct 1994 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1994-10-25 --- carrera/fns.h | 2 ++ carrera/io.h | 1 + carrera/trap.c | 23 ++++++++++++++++++++++- port/devns16552.c | 2 +- 4 files changed, 26 insertions(+), 2 deletions(-) diff --git a/carrera/fns.h b/carrera/fns.h index 2ce8eb5a8cc9df5cb1a0628970526fbb5ae7f764..216569fb7a79186f52efbd54c47a837d4709a7e2 100644 --- a/carrera/fns.h +++ b/carrera/fns.h @@ -85,6 +85,7 @@ long* reg(Ureg*, int); void restfpregs(FPsave*, ulong); void screeninit(void); void screenputs(char*, int); +void seteisadma(int, void(*)(void)); long syscall(Ureg*); void syslog(char*, int); void sysloginit(void); @@ -141,3 +142,4 @@ Block* iallocb(int); void* ifroute(ulong); ulong ifunroute(ulong); void parseip(char*, char*); +void mpegintr(void); diff --git a/carrera/io.h b/carrera/io.h index 8aac77e4a16316cd4598d19329457fc9f90e9b0c..0f3c03a5f424496f5a61fd52208e4fbca6089ca7 100644 --- a/carrera/io.h +++ b/carrera/io.h @@ -48,6 +48,7 @@ enum Eisamphys = 0x91000000, Eisavgaphys = Eisamphys+0xA0000, Eisamvirt = 0xE0300000, /* Second 1M page entry from Intctl */ + Eisadmaintr = 0x40a, Intctlphys = 0xF0000000, Intctlvirt = 0xE0200000, Uart1int = (1<<9), diff --git a/carrera/trap.c b/carrera/trap.c index dd476e49f9996ae7ec4e6aa47dcac72b69926aa5..f5901e1f096e49c380643a036b85f9a93c561670 100644 --- a/carrera/trap.c +++ b/carrera/trap.c @@ -57,6 +57,7 @@ char *fpcause[] = }; char *fpexcname(Ureg*, ulong, char*); #define FPEXPMASK (0x3f<<12) /* Floating exception bits in fcr31 */ +void (*eisadma[8])(void); /* Eisa dma chain vectors */ char *regname[]={ @@ -283,9 +284,21 @@ trap(Ureg *ur) } } +void +seteisadma(int ch, void (*func)(void)) +{ + if(ch < 0 || ch > 7) + panic("seteisadma"); + if(eisadma[ch] != 0) + print("EISA dma%d: intr used twice"); + + eisadma[ch] = func; +} + void intr(Ureg *ur) { + int i; static uchar devint; ulong cause = ur->cause; ulong isr, vec; @@ -351,8 +364,16 @@ intr(Ureg *ur) case 7: audiosbintr(); break; + case 10: + mpegintr(); + break; case 13: - audiodmaintr(); + isr = EISAINB(Eisadmaintr) & ~(1<<4); + for(i = 0; i < 8; i++) { + if(isr & 1) + eisadma[i](); + isr >>= 1; + } break; } cause &= ~INTR4; diff --git a/port/devns16552.c b/port/devns16552.c index ee67050a107f64509940bf3133fb98cc87d214c0..42f5b573546c5150b0027522f225119ad443031c 100644 --- a/port/devns16552.c +++ b/port/devns16552.c @@ -400,7 +400,7 @@ ns16552kick(Uart *p) if(p->cts && p->blocked == 0){ n = 0; while((uartrdreg(p, Lstat) & Outready) == 0){ - if(++n > 10000){ + if(++n > 100000){ print("stuck serial line\n"); break; }