1154abd99SDavid du Colombier #define checkmmu(a, b) 2154abd99SDavid du Colombier #define countpagerefs(a, b) 3154abd99SDavid du Colombier 4154abd99SDavid du Colombier #include "../port/portfns.h" 5154abd99SDavid du Colombier 6154abd99SDavid du Colombier extern int led(int, int); 7154abd99SDavid du Colombier extern void ledexit(int); 8154abd99SDavid du Colombier extern void delay(int); 9154abd99SDavid du Colombier extern void _uartputs(char*, int); 10154abd99SDavid du Colombier extern int _uartprint(char*, ...); 11154abd99SDavid du Colombier extern void uartkirkwoodconsole(void); 12154abd99SDavid du Colombier extern void serialputs(char *, int); 13154abd99SDavid du Colombier extern void serialputc(int c); 14154abd99SDavid du Colombier 15154abd99SDavid du Colombier #pragma varargck argpos _uartprint 1 16154abd99SDavid du Colombier 17154abd99SDavid du Colombier extern void archreboot(void); 18154abd99SDavid du Colombier extern void archconfinit(void); 19154abd99SDavid du Colombier extern void archreset(void); 20154abd99SDavid du Colombier extern void barriers(void); 21154abd99SDavid du Colombier extern void cachedinv(void); 22154abd99SDavid du Colombier extern void cachedinvse(void*, int); 23154abd99SDavid du Colombier extern void cachedwb(void); 24154abd99SDavid du Colombier extern void cachedwbinv(void); 25154abd99SDavid du Colombier extern void cachedwbinvse(void*, int); 26154abd99SDavid du Colombier extern void cachedwbse(void*, int); 27154abd99SDavid du Colombier extern void cacheiinv(void); 28154abd99SDavid du Colombier extern void cacheuwbinv(void); 29154abd99SDavid du Colombier extern uintptr cankaddr(uintptr pa); 3056713243SDavid du Colombier extern void clockshutdown(void); 31154abd99SDavid du Colombier int cmpswap(long*, long, long); 32154abd99SDavid du Colombier 3328620197SDavid du Colombier #define coherence barriers 34154abd99SDavid du Colombier 35154abd99SDavid du Colombier extern u32int controlget(void); 36154abd99SDavid du Colombier extern u32int cpctget(void); 37154abd99SDavid du Colombier extern u32int cpidget(void); 38154abd99SDavid du Colombier extern char *cputype2name(char *, int); 3933cde4a6SDavid du Colombier extern ulong cprd(int cp, int op1, int crn, int crm, int op2); 4033cde4a6SDavid du Colombier extern ulong cprdsc(int op1, int crn, int crm, int op2); 41154abd99SDavid du Colombier extern void cpuidprint(void); 4233cde4a6SDavid du Colombier extern void cpwr(int cp, int op1, int crn, int crm, int op2, ulong val); 4333cde4a6SDavid du Colombier extern void cpwrsc(int op1, int crn, int crm, int op2, ulong val); 44154abd99SDavid du Colombier #define cycles(ip) *(ip) = lcycles() 45154abd99SDavid du Colombier extern u32int dacget(void); 46154abd99SDavid du Colombier extern void dacput(u32int); 47154abd99SDavid du Colombier extern u32int farget(void); 48154abd99SDavid du Colombier extern u32int fsrget(void); 49154abd99SDavid du Colombier extern void l1cachesoff(void); 50154abd99SDavid du Colombier extern void l1cacheson(void); 5133cde4a6SDavid du Colombier extern void l2cachecfgoff(void); 52154abd99SDavid du Colombier extern void l2cachecfgon(void); 53154abd99SDavid du Colombier extern void l2cacheon(void); 5480f6c381SDavid du Colombier extern void l2cacheuinv(void); 5580f6c381SDavid du Colombier extern void l2cacheuinvse(void*, int); 5680f6c381SDavid du Colombier extern void l2cacheuwb(void); 5780f6c381SDavid du Colombier extern void l2cacheuwbinv(void); 5880f6c381SDavid du Colombier extern void l2cacheuwbinvse(void*, int); 5980f6c381SDavid du Colombier extern void l2cacheuwbse(void*, int); 60154abd99SDavid du Colombier extern void lastresortprint(char *buf, long bp); 61b649930dSDavid du Colombier extern void mmuidmap(uintptr phys, int mbs); 62154abd99SDavid du Colombier extern void mmuinvalidate(void); /* 'mmu' or 'tlb'? */ 63154abd99SDavid du Colombier extern void mmuinvalidateaddr(u32int); /* 'mmu' or 'tlb'? */ 64154abd99SDavid du Colombier extern u32int pidget(void); 65154abd99SDavid du Colombier extern void pidput(u32int); 66154abd99SDavid du Colombier void procrestore(Proc *); 67154abd99SDavid du Colombier void procsave(Proc*); 68154abd99SDavid du Colombier void procsetup(Proc*); 69154abd99SDavid du Colombier extern void _reset(void); 70154abd99SDavid du Colombier extern void setr13(int, u32int*); 71fcbb35d1SDavid du Colombier extern void syscallfmt(int syscallno, ulong pc, va_list list); 72fcbb35d1SDavid du Colombier extern void sysretfmt(int syscallno, va_list list, long ret, uvlong start, uvlong stop); 737fdb4909SDavid du Colombier extern int tas(void *); 74154abd99SDavid du Colombier extern u32int ttbget(void); 75154abd99SDavid du Colombier extern void ttbput(u32int); 76154abd99SDavid du Colombier 77154abd99SDavid du Colombier extern void intrclear(int sort, int v); 78154abd99SDavid du Colombier extern void intrenable(int sort, int v, void (*f)(Ureg*, void*), void *a, char *name); 79154abd99SDavid du Colombier extern void intrdisable(int sort, int v, void (*f)(Ureg*, void*), void* a, char *name); 80154abd99SDavid du Colombier extern void vectors(void); 81154abd99SDavid du Colombier extern void vtable(void); 82154abd99SDavid du Colombier 83154abd99SDavid du Colombier /* 84154abd99SDavid du Colombier * Things called in main. 85154abd99SDavid du Colombier */ 86154abd99SDavid du Colombier extern void clockinit(void); 87154abd99SDavid du Colombier extern void i8250console(void); 88154abd99SDavid du Colombier extern void links(void); 89154abd99SDavid du Colombier extern void mmuinit(void); 90154abd99SDavid du Colombier extern void touser(uintptr); 91154abd99SDavid du Colombier extern void trapinit(void); 92154abd99SDavid du Colombier 93154abd99SDavid du Colombier extern int fpiarm(Ureg*); 94154abd99SDavid du Colombier extern int fpudevprocio(Proc*, void*, long, uintptr, int); 95154abd99SDavid du Colombier extern void fpuinit(void); 96154abd99SDavid du Colombier extern void fpunoted(void); 97154abd99SDavid du Colombier extern void fpunotify(Ureg*); 98154abd99SDavid du Colombier extern void fpuprocrestore(Proc*); 99154abd99SDavid du Colombier extern void fpuprocsave(Proc*); 100154abd99SDavid du Colombier extern void fpusysprocsetup(Proc*); 101154abd99SDavid du Colombier extern void fpusysrfork(Ureg*); 102b1c4f505SDavid du Colombier extern void fpusysrforkchild(Proc*, Ureg *, Proc*); 103154abd99SDavid du Colombier extern int fpuemu(Ureg*); 104154abd99SDavid du Colombier 105154abd99SDavid du Colombier /* 106154abd99SDavid du Colombier * Miscellaneous machine dependent stuff. 107154abd99SDavid du Colombier */ 108154abd99SDavid du Colombier extern char* getenv(char*, char*, int); 109154abd99SDavid du Colombier char* getconf(char*); 110154abd99SDavid du Colombier uintptr mmukmap(uintptr, uintptr, usize); 111154abd99SDavid du Colombier uintptr mmukunmap(uintptr, uintptr, usize); 112154abd99SDavid du Colombier extern void* mmuuncache(void*, usize); 1130cc6832dSDavid du Colombier #define sdfree(p) free(p) 1140cc6832dSDavid du Colombier #define sdmalloc(n) mallocalign(n, CACHELINESZ, 0, 0) 115154abd99SDavid du Colombier extern void* ucalloc(usize); 1167bb09086SDavid du Colombier extern void* ucallocalign(usize size, int align, int span); 11760d8b353SDavid du Colombier extern Block* ucallocb(int); 118154abd99SDavid du Colombier extern void ucfree(void*); 11960d8b353SDavid du Colombier extern void ucfreeb(Block*); 12060d8b353SDavid du Colombier extern Block* uciallocb(int); 121154abd99SDavid du Colombier 122154abd99SDavid du Colombier /* 123154abd99SDavid du Colombier * Things called from port. 124154abd99SDavid du Colombier */ 125154abd99SDavid du Colombier extern void delay(int); /* only scheddump() */ 126154abd99SDavid du Colombier extern int islo(void); 127154abd99SDavid du Colombier extern void microdelay(int); /* only edf.c */ 128154abd99SDavid du Colombier extern void idlehands(void); 129154abd99SDavid du Colombier extern void setkernur(Ureg*, Proc*); /* only devproc.c */ 130154abd99SDavid du Colombier extern void spldone(void); 131154abd99SDavid du Colombier extern int splfhi(void); 132154abd99SDavid du Colombier extern int splflo(void); 133154abd99SDavid du Colombier extern void sysprocsetup(Proc*); 134*fac6300fSDavid du Colombier extern void validalign(uintptr, unsigned); 135154abd99SDavid du Colombier 136154abd99SDavid du Colombier /* 137154abd99SDavid du Colombier * PCI 138154abd99SDavid du Colombier */ 139154abd99SDavid du Colombier ulong pcibarsize(Pcidev*, int); 140154abd99SDavid du Colombier void pcibussize(Pcidev*, ulong*, ulong*); 141154abd99SDavid du Colombier int pcicfgr8(Pcidev*, int); 142154abd99SDavid du Colombier int pcicfgr16(Pcidev*, int); 143154abd99SDavid du Colombier int pcicfgr32(Pcidev*, int); 144154abd99SDavid du Colombier void pcicfgw8(Pcidev*, int, int); 145154abd99SDavid du Colombier void pcicfgw16(Pcidev*, int, int); 146154abd99SDavid du Colombier void pcicfgw32(Pcidev*, int, int); 147154abd99SDavid du Colombier void pciclrbme(Pcidev*); 148154abd99SDavid du Colombier void pciclrioe(Pcidev*); 149154abd99SDavid du Colombier void pciclrmwi(Pcidev*); 150154abd99SDavid du Colombier int pcigetpms(Pcidev*); 151154abd99SDavid du Colombier void pcihinv(Pcidev*); 152154abd99SDavid du Colombier uchar pciipin(Pcidev*, uchar); 153154abd99SDavid du Colombier Pcidev* pcimatch(Pcidev*, int, int); 154154abd99SDavid du Colombier Pcidev* pcimatchtbdf(int); 155154abd99SDavid du Colombier void pcireset(void); 156154abd99SDavid du Colombier int pciscan(int, Pcidev**); 157154abd99SDavid du Colombier void pcisetbme(Pcidev*); 158154abd99SDavid du Colombier void pcisetioe(Pcidev*); 159154abd99SDavid du Colombier void pcisetmwi(Pcidev*); 160154abd99SDavid du Colombier int pcisetpms(Pcidev*, int); 161154abd99SDavid du Colombier int cas32(void*, u32int, u32int); 162154abd99SDavid du Colombier 163154abd99SDavid du Colombier #define CASU(p, e, n) cas32((p), (u32int)(e), (u32int)(n)) 164154abd99SDavid du Colombier #define CASV(p, e, n) cas32((p), (u32int)(e), (u32int)(n)) 165154abd99SDavid du Colombier #define CASW(addr, exp, new) cas32((addr), (exp), (new)) 166154abd99SDavid du Colombier 167154abd99SDavid du Colombier extern void forkret(void); 168154abd99SDavid du Colombier extern int userureg(Ureg*); 169154abd99SDavid du Colombier void* vmap(uintptr, usize); 170154abd99SDavid du Colombier void vunmap(void*, usize); 171154abd99SDavid du Colombier 172154abd99SDavid du Colombier extern void kexit(Ureg*); 173154abd99SDavid du Colombier 174154abd99SDavid du Colombier #define getpgcolor(a) 0 175154abd99SDavid du Colombier #define kmapinval() 176154abd99SDavid du Colombier 177154abd99SDavid du Colombier #define PTR2UINT(p) ((uintptr)(p)) 178154abd99SDavid du Colombier #define UINT2PTR(i) ((void*)(i)) 179154abd99SDavid du Colombier 180154abd99SDavid du Colombier #define waserror() (up->nerrlab++, setlabel(&up->errlab[up->nerrlab-1])) 181154abd99SDavid du Colombier 182154abd99SDavid du Colombier /* 183a7a38e3eSDavid du Colombier * this low-level printing stuff is ugly, 184a7a38e3eSDavid du Colombier * but there appears to be no other way to 185a7a38e3eSDavid du Colombier * print until after #t is populated. 186a7a38e3eSDavid du Colombier */ 187a7a38e3eSDavid du Colombier #define wave(c) { \ 188a7a38e3eSDavid du Colombier coherence(); \ 189a7a38e3eSDavid du Colombier while ((*(ulong *)(PHYSCONS+4*5) & (1<<5)) == 0) /* (x->lsr&LSRthre)==0? */ \ 190a7a38e3eSDavid du Colombier ; \ 191a7a38e3eSDavid du Colombier *(ulong *)PHYSCONS = (c); \ 192a7a38e3eSDavid du Colombier coherence(); \ 193a7a38e3eSDavid du Colombier } 194a7a38e3eSDavid du Colombier 195a7a38e3eSDavid du Colombier /* 196154abd99SDavid du Colombier * These are not good enough. 197154abd99SDavid du Colombier */ 198154abd99SDavid du Colombier #define KADDR(pa) UINT2PTR(KZERO|((uintptr)(pa))) 199154abd99SDavid du Colombier #define PADDR(va) PTR2UINT(((uintptr)(va)) & ~KSEGM) 200ab6ce076SDavid du Colombier 201ab6ce076SDavid du Colombier #define MASK(v) ((1UL << (v)) - 1) /* mask `v' bits wide */ 202