1 #define checkmmu(a, b) 2 #define countpagerefs(a, b) 3 4 #include "../port/portfns.h" 5 6 extern int led(int, int); 7 extern void ledexit(int); 8 extern void delay(int); 9 extern void _uartputs(char*, int); 10 extern int _uartprint(char*, ...); 11 extern void uartkirkwoodconsole(void); 12 extern void serialputs(char *, int); 13 extern void serialputc(int c); 14 15 #pragma varargck argpos _uartprint 1 16 17 extern void archreboot(void); 18 extern void archconfinit(void); 19 extern void archreset(void); 20 extern void barriers(void); 21 extern void cachedinv(void); 22 extern void cachedinvse(void*, int); 23 extern void cachedwb(void); 24 extern void cachedwbinv(void); 25 extern void cachedwbinvse(void*, int); 26 extern void cachedwbse(void*, int); 27 extern void cacheiinv(void); 28 extern void cacheuwbinv(void); 29 extern uintptr cankaddr(uintptr pa); 30 extern void clockshutdown(void); 31 int cmpswap(long*, long, long); 32 33 #define coherence barriers 34 35 extern u32int controlget(void); 36 extern u32int cpctget(void); 37 extern u32int cpidget(void); 38 extern char *cputype2name(char *, int); 39 extern ulong cprd(int cp, int op1, int crn, int crm, int op2); 40 extern ulong cprdsc(int op1, int crn, int crm, int op2); 41 extern void cpuidprint(void); 42 extern void cpwr(int cp, int op1, int crn, int crm, int op2, ulong val); 43 extern void cpwrsc(int op1, int crn, int crm, int op2, ulong val); 44 #define cycles(ip) *(ip) = lcycles() 45 extern u32int dacget(void); 46 extern void dacput(u32int); 47 extern u32int farget(void); 48 extern u32int fsrget(void); 49 extern void l1cachesoff(void); 50 extern void l1cacheson(void); 51 extern void l2cachecfgoff(void); 52 extern void l2cachecfgon(void); 53 extern void l2cacheon(void); 54 extern void l2cacheuinv(void); 55 extern void l2cacheuinvse(void*, int); 56 extern void l2cacheuwb(void); 57 extern void l2cacheuwbinv(void); 58 extern void l2cacheuwbinvse(void*, int); 59 extern void l2cacheuwbse(void*, int); 60 extern void lastresortprint(char *buf, long bp); 61 extern void mmuidmap(uintptr phys, int mbs); 62 extern void mmuinvalidate(void); /* 'mmu' or 'tlb'? */ 63 extern void mmuinvalidateaddr(u32int); /* 'mmu' or 'tlb'? */ 64 extern u32int pidget(void); 65 extern void pidput(u32int); 66 void procrestore(Proc *); 67 void procsave(Proc*); 68 void procsetup(Proc*); 69 extern void _reset(void); 70 extern void setr13(int, u32int*); 71 extern void syscallfmt(int syscallno, ulong pc, va_list list); 72 extern void sysretfmt(int syscallno, va_list list, long ret, uvlong start, uvlong stop); 73 extern int tas(void *); 74 extern u32int ttbget(void); 75 extern void ttbput(u32int); 76 77 extern void intrclear(int sort, int v); 78 extern void intrenable(int sort, int v, void (*f)(Ureg*, void*), void *a, char *name); 79 extern void intrdisable(int sort, int v, void (*f)(Ureg*, void*), void* a, char *name); 80 extern void vectors(void); 81 extern void vtable(void); 82 83 /* 84 * Things called in main. 85 */ 86 extern void clockinit(void); 87 extern void i8250console(void); 88 extern void links(void); 89 extern void mmuinit(void); 90 extern void touser(uintptr); 91 extern void trapinit(void); 92 93 extern int fpiarm(Ureg*); 94 extern int fpudevprocio(Proc*, void*, long, uintptr, int); 95 extern void fpuinit(void); 96 extern void fpunoted(void); 97 extern void fpunotify(Ureg*); 98 extern void fpuprocrestore(Proc*); 99 extern void fpuprocsave(Proc*); 100 extern void fpusysprocsetup(Proc*); 101 extern void fpusysrfork(Ureg*); 102 extern void fpusysrforkchild(Proc*, Ureg *, Proc*); 103 extern int fpuemu(Ureg*); 104 105 /* 106 * Miscellaneous machine dependent stuff. 107 */ 108 extern char* getenv(char*, char*, int); 109 char* getconf(char*); 110 uintptr mmukmap(uintptr, uintptr, usize); 111 uintptr mmukunmap(uintptr, uintptr, usize); 112 extern void* mmuuncache(void*, usize); 113 #define sdfree(p) free(p) 114 #define sdmalloc(n) mallocalign(n, CACHELINESZ, 0, 0) 115 extern void* ucalloc(usize); 116 extern void* ucallocalign(usize size, int align, int span); 117 extern Block* ucallocb(int); 118 extern void ucfree(void*); 119 extern void ucfreeb(Block*); 120 extern Block* uciallocb(int); 121 122 /* 123 * Things called from port. 124 */ 125 extern void delay(int); /* only scheddump() */ 126 extern int islo(void); 127 extern void microdelay(int); /* only edf.c */ 128 extern void idlehands(void); 129 extern void setkernur(Ureg*, Proc*); /* only devproc.c */ 130 extern void spldone(void); 131 extern int splfhi(void); 132 extern int splflo(void); 133 extern void sysprocsetup(Proc*); 134 extern void validalign(uintptr, unsigned); 135 136 /* 137 * PCI 138 */ 139 ulong pcibarsize(Pcidev*, int); 140 void pcibussize(Pcidev*, ulong*, ulong*); 141 int pcicfgr8(Pcidev*, int); 142 int pcicfgr16(Pcidev*, int); 143 int pcicfgr32(Pcidev*, int); 144 void pcicfgw8(Pcidev*, int, int); 145 void pcicfgw16(Pcidev*, int, int); 146 void pcicfgw32(Pcidev*, int, int); 147 void pciclrbme(Pcidev*); 148 void pciclrioe(Pcidev*); 149 void pciclrmwi(Pcidev*); 150 int pcigetpms(Pcidev*); 151 void pcihinv(Pcidev*); 152 uchar pciipin(Pcidev*, uchar); 153 Pcidev* pcimatch(Pcidev*, int, int); 154 Pcidev* pcimatchtbdf(int); 155 void pcireset(void); 156 int pciscan(int, Pcidev**); 157 void pcisetbme(Pcidev*); 158 void pcisetioe(Pcidev*); 159 void pcisetmwi(Pcidev*); 160 int pcisetpms(Pcidev*, int); 161 int cas32(void*, u32int, u32int); 162 163 #define CASU(p, e, n) cas32((p), (u32int)(e), (u32int)(n)) 164 #define CASV(p, e, n) cas32((p), (u32int)(e), (u32int)(n)) 165 #define CASW(addr, exp, new) cas32((addr), (exp), (new)) 166 167 extern void forkret(void); 168 extern int userureg(Ureg*); 169 void* vmap(uintptr, usize); 170 void vunmap(void*, usize); 171 172 extern void kexit(Ureg*); 173 174 #define getpgcolor(a) 0 175 #define kmapinval() 176 177 #define PTR2UINT(p) ((uintptr)(p)) 178 #define UINT2PTR(i) ((void*)(i)) 179 180 #define waserror() (up->nerrlab++, setlabel(&up->errlab[up->nerrlab-1])) 181 182 /* 183 * this low-level printing stuff is ugly, 184 * but there appears to be no other way to 185 * print until after #t is populated. 186 */ 187 #define wave(c) { \ 188 coherence(); \ 189 while ((*(ulong *)(PHYSCONS+4*5) & (1<<5)) == 0) /* (x->lsr&LSRthre)==0? */ \ 190 ; \ 191 *(ulong *)PHYSCONS = (c); \ 192 coherence(); \ 193 } 194 195 /* 196 * These are not good enough. 197 */ 198 #define KADDR(pa) UINT2PTR(KZERO|((uintptr)(pa))) 199 #define PADDR(va) PTR2UINT(((uintptr)(va)) & ~KSEGM) 200 201 #define MASK(v) ((1UL << (v)) - 1) /* mask `v' bits wide */ 202