11c9d674cSDavid du Colombier #define checkmmu(a, b) 21c9d674cSDavid du Colombier #define countpagerefs(a, b) 31c9d674cSDavid du Colombier 41c9d674cSDavid du Colombier #include "../port/portfns.h" 51c9d674cSDavid du Colombier 61c9d674cSDavid du Colombier typedef struct Dma Dma; 71c9d674cSDavid du Colombier typedef struct Ether Ether; 81c9d674cSDavid du Colombier #pragma incomplete Dma 91c9d674cSDavid du Colombier 101c9d674cSDavid du Colombier void addconf(char*, char*); 11*cce710d3SDavid du Colombier long adec(long*); 12*cce710d3SDavid du Colombier long ainc(long*); 131c9d674cSDavid du Colombier void archetherspeed(int, int); 141c9d674cSDavid du Colombier void archinit(void); 151c9d674cSDavid du Colombier uint archmiiport(int); 161c9d674cSDavid du Colombier void archreboot(void); 171c9d674cSDavid du Colombier void archreset(void); 181c9d674cSDavid du Colombier ulong archuartclock(int, int); 191c9d674cSDavid du Colombier void barriers(void); 201c9d674cSDavid du Colombier uintptr cankaddr(uintptr pa); 211c9d674cSDavid du Colombier Block* clallocb(void); 221c9d674cSDavid du Colombier void clockinit(void); 231c9d674cSDavid du Colombier void clockintr(Ureg*); 241c9d674cSDavid du Colombier void clrmchk(void); 251c9d674cSDavid du Colombier int cmpswap(long*, long, long); 261c9d674cSDavid du Colombier #define coherence() mbar() 271c9d674cSDavid du Colombier char *cputype2name(char *, int); 281c9d674cSDavid du Colombier void cpuidprint(void); 291c9d674cSDavid du Colombier void critintrvec(void); 301c9d674cSDavid du Colombier #define cycles(ip) *(ip) = lcycles() 311c9d674cSDavid du Colombier void dcbi(uintptr, usize); 321c9d674cSDavid du Colombier void dcbst(uintptr, usize); 331c9d674cSDavid du Colombier void dcflush(uintptr, usize); 341c9d674cSDavid du Colombier void dcrcompile(void); 351c9d674cSDavid du Colombier long decref(Ref*); 361c9d674cSDavid du Colombier void delay(int); 371c9d674cSDavid du Colombier void dtlbmiss(void); 381c9d674cSDavid du Colombier void dump(void *, int); 391c9d674cSDavid du Colombier void dumpmal(void); 401c9d674cSDavid du Colombier void dumpregs(Ureg*); 411c9d674cSDavid du Colombier void delayloopinit(void); 421c9d674cSDavid du Colombier Dev* devtabget(int, int); 431c9d674cSDavid du Colombier void devtabinit(void); 441c9d674cSDavid du Colombier void devtabreset(void); 451c9d674cSDavid du Colombier long devtabread(Chan*, void*, long, vlong); 461c9d674cSDavid du Colombier void devtabshutdown(void); 471c9d674cSDavid du Colombier void dump(void *, int); 481c9d674cSDavid du Colombier void eieio(void); 491c9d674cSDavid du Colombier void etherclock(void); 501c9d674cSDavid du Colombier void fifoinit(Ether *); 511c9d674cSDavid du Colombier void firmware(int); 521c9d674cSDavid du Colombier int fpipower(Ureg*); 531c9d674cSDavid du Colombier int fpuavail(Ureg*); 541c9d674cSDavid du Colombier int fpudevprocio(Proc*, void*, long, uintptr, int); 551c9d674cSDavid du Colombier int fpuemu(Ureg*); 561c9d674cSDavid du Colombier void fpuinit(void); 571c9d674cSDavid du Colombier void fpunoted(void); 581c9d674cSDavid du Colombier void fpunotify(Ureg*); 591c9d674cSDavid du Colombier void fpuprocresetore(Proc*); 601c9d674cSDavid du Colombier #define fpuprocresetore(p) USED(p) 611c9d674cSDavid du Colombier void fpuprocsave(Proc*); 621c9d674cSDavid du Colombier #define fpuprocsave(p) USED(p) 631c9d674cSDavid du Colombier void fpusysprocsetup(Proc*); 641c9d674cSDavid du Colombier void fpusysrfork(Ureg*); 651c9d674cSDavid du Colombier void fpusysrforkchild(Proc*, Ureg*, Proc*); 661c9d674cSDavid du Colombier void fputrap(Ureg*, int); 671c9d674cSDavid du Colombier char* getconf(char*); 681c9d674cSDavid du Colombier u32int getccr0(void); 691c9d674cSDavid du Colombier u32int getdar(void); 701c9d674cSDavid du Colombier u32int getdcr(int); 711c9d674cSDavid du Colombier u32int getdear(void); 721c9d674cSDavid du Colombier u32int getdec(void); 731c9d674cSDavid du Colombier u32int getesr(void); 741c9d674cSDavid du Colombier u32int getmcsr(void); 751c9d674cSDavid du Colombier u32int getmsr(void); 761c9d674cSDavid du Colombier u32int getpid(void); 771c9d674cSDavid du Colombier u32int getpir(void); 781c9d674cSDavid du Colombier u32int getpit(void); 791c9d674cSDavid du Colombier u32int getpvr(void); 801c9d674cSDavid du Colombier u32int getstid(void); 811c9d674cSDavid du Colombier u32int gettbl(void); 821c9d674cSDavid du Colombier u32int gettsr(void); 831c9d674cSDavid du Colombier void gotopc(uintptr); 841c9d674cSDavid du Colombier int gotsecuremem(void); 851c9d674cSDavid du Colombier int havetimer(void); 861c9d674cSDavid du Colombier void iccci(void); 871c9d674cSDavid du Colombier void icflush(uintptr, usize); 881c9d674cSDavid du Colombier void idlehands(void); 891c9d674cSDavid du Colombier int inb(int); 901c9d674cSDavid du Colombier long incref(Ref*); 911c9d674cSDavid du Colombier void insb(int, void*, int); 921c9d674cSDavid du Colombier ushort ins(int); 931c9d674cSDavid du Colombier void inss(int, void*, int); 941c9d674cSDavid du Colombier ulong inl(int); 951c9d674cSDavid du Colombier void insl(int, void*, int); 961c9d674cSDavid du Colombier void intr(Ureg*); 971c9d674cSDavid du Colombier void intrdisable(int, void (*)(Ureg*, void*), void*, int, char*); 981c9d674cSDavid du Colombier void intrfmtcounts(char *s, char *se); 991c9d674cSDavid du Colombier void intrinit(void); 1001c9d674cSDavid du Colombier void intrshutdown(void); 1011c9d674cSDavid du Colombier int ioalloc(int, int, int, char*); 1021c9d674cSDavid du Colombier void iofree(int); 1031c9d674cSDavid du Colombier void ioinit(void); 1041c9d674cSDavid du Colombier int iprint(char*, ...); 1051c9d674cSDavid du Colombier void isync(void); 1061c9d674cSDavid du Colombier void itlbmiss(void); 1071c9d674cSDavid du Colombier void kexit(Ureg*); 1081c9d674cSDavid du Colombier void* kmapphys(uintptr, uintptr, ulong, ulong, ulong); 1091c9d674cSDavid du Colombier uchar lightbitoff(int); 1101c9d674cSDavid du Colombier uchar lightbiton(int); 1111c9d674cSDavid du Colombier uchar lightstate(int); 1121c9d674cSDavid du Colombier void links(void); 1131c9d674cSDavid du Colombier void malinit(void); 1141c9d674cSDavid du Colombier void mbar(void); 1151c9d674cSDavid du Colombier void meminit(void); 1161c9d674cSDavid du Colombier void mmuinit(void); 1171c9d674cSDavid du Colombier void* mmucacheinhib(void*, ulong); 1181c9d674cSDavid du Colombier ulong mmumapsize(ulong); 1191c9d674cSDavid du Colombier void mutateproc(void *); 1201c9d674cSDavid du Colombier int mutatetrigger(void); 1211c9d674cSDavid du Colombier int newmmupid(void); 1221c9d674cSDavid du Colombier int notify(Ureg*); 1231c9d674cSDavid du Colombier void outb(int, int); 1241c9d674cSDavid du Colombier void outsb(int, void*, int); 1251c9d674cSDavid du Colombier void outs(int, ushort); 1261c9d674cSDavid du Colombier void outss(int, void*, int); 1271c9d674cSDavid du Colombier void outl(int, ulong); 1281c9d674cSDavid du Colombier void outsl(int, void*, int); 1291c9d674cSDavid du Colombier u32int pidget(void); 1301c9d674cSDavid du Colombier void pidput(u32int); 1311c9d674cSDavid du Colombier vlong pokeaddr(uintptr addr, uint, uint); 1321c9d674cSDavid du Colombier void ppc405console(void); 1331c9d674cSDavid du Colombier vlong probeaddr(uintptr addr); 1341c9d674cSDavid du Colombier #define procrestore(p) 1351c9d674cSDavid du Colombier void procsave(Proc*); 1361c9d674cSDavid du Colombier void procsetup(Proc*); 1371c9d674cSDavid du Colombier void putdbsr(ulong); 1381c9d674cSDavid du Colombier void putdcr(int, u32int); 1391c9d674cSDavid du Colombier void putdec(ulong); 1401c9d674cSDavid du Colombier void putesr(ulong); 1411c9d674cSDavid du Colombier void putevpr(ulong); 1421c9d674cSDavid du Colombier void putmcsr(u32int); 1431c9d674cSDavid du Colombier void putmsr(u32int); 1441c9d674cSDavid du Colombier void putpid(u32int); 1451c9d674cSDavid du Colombier void putpit(u32int); 1461c9d674cSDavid du Colombier void putsdr1(u32int); 1471c9d674cSDavid du Colombier void puttcr(u32int); 1481c9d674cSDavid du Colombier void puttsr(u32int); 1491c9d674cSDavid du Colombier ulong qtmborder(void); 1501c9d674cSDavid du Colombier void qtmclock(void); 1511c9d674cSDavid du Colombier void qtmerr(void); 1521c9d674cSDavid du Colombier void qtmerrs(char *); 1531c9d674cSDavid du Colombier void qtminit(void); 1541c9d674cSDavid du Colombier void shutdown(int ispanic); 1551c9d674cSDavid du Colombier void spldone(void); 1561c9d674cSDavid du Colombier int splhi(void); 1571c9d674cSDavid du Colombier int spllo(void); 1581c9d674cSDavid du Colombier void splx(int); 1591c9d674cSDavid du Colombier void splxpc(int); 1601c9d674cSDavid du Colombier void startcpu(int); 1611c9d674cSDavid du Colombier u32int stidget(void); 1621c9d674cSDavid du Colombier u32int stidput(u32int); 1631c9d674cSDavid du Colombier void sync(void); 1641c9d674cSDavid du Colombier void syscall(Ureg*); 1651c9d674cSDavid du Colombier uintptr sysexecstack(uintptr, int); 1661c9d674cSDavid du Colombier void sysprocsetup(Proc*); 1671c9d674cSDavid du Colombier #define tas tas32 1681c9d674cSDavid du Colombier void temactransmit(Ether *); 1691c9d674cSDavid du Colombier void touser(uintptr); 1701c9d674cSDavid du Colombier void trapinit(void); 1711c9d674cSDavid du Colombier void trapcritvec(void); 1721c9d674cSDavid du Colombier void trapvec(void); 1731c9d674cSDavid du Colombier void trapmvec(void); 1741c9d674cSDavid du Colombier void tlbdump(char *s); 1751c9d674cSDavid du Colombier u32int tlbrehi(int); 1761c9d674cSDavid du Colombier u32int tlbrelo(int); 1771c9d674cSDavid du Colombier u32int tlbremd(int); 1781c9d674cSDavid du Colombier int tlbsxcc(uintptr); 1791c9d674cSDavid du Colombier void tlbwrx(int, u32int, u32int, u32int); 1801c9d674cSDavid du Colombier void uartliteconsole(void); 1811c9d674cSDavid du Colombier void uartlputc(int); 1821c9d674cSDavid du Colombier void uartlputs(char *s); 1831c9d674cSDavid du Colombier void uncinit(void); 1841c9d674cSDavid du Colombier void uncinitwait(void); 1851c9d674cSDavid du Colombier #define userureg(ur) (((ur)->status & MSR_PR) != 0) 186f80d550dSDavid du Colombier void validalign(uintptr, unsigned); 1871c9d674cSDavid du Colombier void verifyproc(Proc *); 1881c9d674cSDavid du Colombier void verifymach(Mach *); 1891c9d674cSDavid du Colombier #define waserror() (up->nerrlab++, setlabel(&up->errlab[up->nerrlab-1])) 1901c9d674cSDavid du Colombier void watchreset(void); 1911c9d674cSDavid du Colombier void whackether(Ether *); 1921c9d674cSDavid du Colombier void writeconf(void); 1931c9d674cSDavid du Colombier 1941c9d674cSDavid du Colombier /* 1951c9d674cSDavid du Colombier * dma.c 1961c9d674cSDavid du Colombier */ 1971c9d674cSDavid du Colombier void dma0init(void); 1981c9d674cSDavid du Colombier void dmainit(void); 1991c9d674cSDavid du Colombier int dmastart(int, void *dest, void *src, ulong len, ulong flags, void (*f)(int)); 2001c9d674cSDavid du Colombier void dmawait(int); 2011c9d674cSDavid du Colombier 2021c9d674cSDavid du Colombier /* 2031c9d674cSDavid du Colombier * intr.c 2041c9d674cSDavid du Colombier */ 2051c9d674cSDavid du Colombier void intrack(ulong); 2061c9d674cSDavid du Colombier void intrenable(ulong bit, int (*func)(ulong), char *); 2071c9d674cSDavid du Colombier void intrinit(void); 2081c9d674cSDavid du Colombier 2091c9d674cSDavid du Colombier int cas32(void*, u32int, u32int); 2101c9d674cSDavid du Colombier int tas32(void*); 2111c9d674cSDavid du Colombier 2121c9d674cSDavid du Colombier #define CASU(p, e, n) cas32((p), (u32int)(e), (u32int)(n)) 2131c9d674cSDavid du Colombier #define CASV(p, e, n) cas32((p), (u32int)(e), (u32int)(n)) 2141c9d674cSDavid du Colombier #define CASW(addr, exp, new) cas32((addr), (exp), (new)) 2151c9d674cSDavid du Colombier #define TAS(addr) tas32(addr) 2161c9d674cSDavid du Colombier 2171c9d674cSDavid du Colombier void forkret(void); 2181c9d674cSDavid du Colombier 2191c9d674cSDavid du Colombier #define PTR2UINT(p) ((uintptr)(p)) 2201c9d674cSDavid du Colombier #define UINT2PTR(i) ((void*)(i)) 2211c9d674cSDavid du Colombier 2221c9d674cSDavid du Colombier #define isphys(a) (((ulong)(a)&KSEGM)!=KSEG0 && ((ulong)(a)&KSEGM)!=KSEG1) 2231c9d674cSDavid du Colombier #define KADDR(a) ((void*)((ulong)(a) | KZERO)) 2241c9d674cSDavid du Colombier #define PADDR(a) (isphys(a)? (ulong)(a): ((ulong)(a) & ~KSEGM)) 2251c9d674cSDavid du Colombier 2261c9d674cSDavid du Colombier /* 2271c9d674cSDavid du Colombier * this low-level printing stuff is ugly, 2281c9d674cSDavid du Colombier * but there appears to be no other way to 2291c9d674cSDavid du Colombier * print until after #t is populated. 2301c9d674cSDavid du Colombier */ 2311c9d674cSDavid du Colombier 2321c9d674cSDavid du Colombier #define wave(c) { \ 2331c9d674cSDavid du Colombier barriers(); \ 2341c9d674cSDavid du Colombier *(ulong *)Uartlite = (c); \ 2351c9d674cSDavid du Colombier barriers(); \ 2361c9d674cSDavid du Colombier } 237