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 /* 34 * cachedwb seems like overkill, but just calling barriers isn't enough. 35 */ 36 #define coherence cachedwb 37 // #define coherence barriers 38 39 extern u32int controlget(void); 40 extern u32int cpctget(void); 41 extern u32int cpidget(void); 42 extern char *cputype2name(char *, int); 43 extern void cpuidprint(void); 44 #define cycles(ip) *(ip) = lcycles() 45 extern u32int dacget(void); 46 extern void dacput(u32int); 47 extern void dcflushall(void); 48 extern u32int farget(void); 49 extern u32int fsrget(void); 50 extern void icflushall(void); 51 extern void l1cachesoff(void); 52 extern void l1cacheson(void); 53 extern void l2cachecfgon(void); 54 extern void l2cacheon(void); 55 extern void lastresortprint(char *buf, long bp); 56 extern void mmuinvalidate(void); /* 'mmu' or 'tlb'? */ 57 extern void mmuinvalidateaddr(u32int); /* 'mmu' or 'tlb'? */ 58 extern u32int pidget(void); 59 extern void pidput(u32int); 60 void procrestore(Proc *); 61 void procsave(Proc*); 62 void procsetup(Proc*); 63 extern void _reset(void); 64 extern void setr13(int, u32int*); 65 #define tas _tas 66 extern int _tas(void *); 67 extern u32int ttbget(void); 68 extern void ttbput(u32int); 69 70 Dev* devtabget(int, int); 71 void devtabinit(void); 72 void devtabreset(void); 73 long devtabread(Chan*, void*, long, vlong); 74 void devtabshutdown(void); 75 76 extern void intrclear(int sort, int v); 77 extern void intrenable(int sort, int v, void (*f)(Ureg*, void*), void *a, char *name); 78 extern void intrdisable(int sort, int v, void (*f)(Ureg*, void*), void* a, char *name); 79 extern void vectors(void); 80 extern void vtable(void); 81 82 /* 83 * Things called in main. 84 */ 85 extern void clockinit(void); 86 extern void i8250console(void); 87 extern void links(void); 88 extern void mmuinit(void); 89 extern void touser(uintptr); 90 extern void trapinit(void); 91 92 extern int fpiarm(Ureg*); 93 extern int fpudevprocio(Proc*, void*, long, uintptr, int); 94 extern void fpuinit(void); 95 extern void fpunoted(void); 96 extern void fpunotify(Ureg*); 97 extern void fpuprocrestore(Proc*); 98 extern void fpuprocsave(Proc*); 99 extern void fpusysprocsetup(Proc*); 100 extern void fpusysrfork(Ureg*); 101 extern void fpusysrforkchild(Proc*, Proc*); 102 extern int fpuemu(Ureg*); 103 104 /* 105 * Miscellaneous machine dependent stuff. 106 */ 107 extern char* getenv(char*, char*, int); 108 char* getconf(char*); 109 uintptr mmukmap(uintptr, uintptr, usize); 110 uintptr mmukunmap(uintptr, uintptr, usize); 111 extern void* mmuuncache(void*, usize); 112 extern void* ucalloc(usize); 113 extern void ucfree(void*); 114 115 /* 116 * Things called from port. 117 */ 118 extern void delay(int); /* only scheddump() */ 119 extern int islo(void); 120 extern void microdelay(int); /* only edf.c */ 121 extern void evenaddr(uintptr); 122 extern void idlehands(void); 123 extern void setkernur(Ureg*, Proc*); /* only devproc.c */ 124 extern void spldone(void); 125 extern int splfhi(void); 126 extern int splflo(void); 127 extern void sysprocsetup(Proc*); 128 129 /* 130 * PCI 131 */ 132 ulong pcibarsize(Pcidev*, int); 133 void pcibussize(Pcidev*, ulong*, ulong*); 134 int pcicfgr8(Pcidev*, int); 135 int pcicfgr16(Pcidev*, int); 136 int pcicfgr32(Pcidev*, int); 137 void pcicfgw8(Pcidev*, int, int); 138 void pcicfgw16(Pcidev*, int, int); 139 void pcicfgw32(Pcidev*, int, int); 140 void pciclrbme(Pcidev*); 141 void pciclrioe(Pcidev*); 142 void pciclrmwi(Pcidev*); 143 int pcigetpms(Pcidev*); 144 void pcihinv(Pcidev*); 145 uchar pciipin(Pcidev*, uchar); 146 Pcidev* pcimatch(Pcidev*, int, int); 147 Pcidev* pcimatchtbdf(int); 148 void pcireset(void); 149 int pciscan(int, Pcidev**); 150 void pcisetbme(Pcidev*); 151 void pcisetioe(Pcidev*); 152 void pcisetmwi(Pcidev*); 153 int pcisetpms(Pcidev*, int); 154 int cas32(void*, u32int, u32int); 155 int tas32(void*); 156 157 #define CASU(p, e, n) cas32((p), (u32int)(e), (u32int)(n)) 158 #define CASV(p, e, n) cas32((p), (u32int)(e), (u32int)(n)) 159 #define CASW(addr, exp, new) cas32((addr), (exp), (new)) 160 #define TAS(addr) tas32(addr) 161 162 extern void forkret(void); 163 extern int userureg(Ureg*); 164 void* vmap(uintptr, usize); 165 void vunmap(void*, usize); 166 167 extern void kexit(Ureg*); 168 169 #define getpgcolor(a) 0 170 #define kmapinval() 171 172 #define PTR2UINT(p) ((uintptr)(p)) 173 #define UINT2PTR(i) ((void*)(i)) 174 175 #define waserror() (up->nerrlab++, setlabel(&up->errlab[up->nerrlab-1])) 176 177 /* 178 * These are not good enough. 179 */ 180 #define KADDR(pa) UINT2PTR(KZERO|((uintptr)(pa))) 181 #define PADDR(va) PTR2UINT(((uintptr)(va)) & ~KSEGM) 182