1*1c9d674cSDavid du Colombier /* 2*1c9d674cSDavid du Colombier * Memory and machine-specific definitions. Used in C and assembler. 3*1c9d674cSDavid du Colombier */ 4*1c9d674cSDavid du Colombier #define KiB 1024u /* Kibi 0x0000000000000400 */ 5*1c9d674cSDavid du Colombier #define MiB 1048576u /* Mebi 0x0000000000100000 */ 6*1c9d674cSDavid du Colombier #define GiB 1073741824u /* Gibi 000000000040000000 */ 7*1c9d674cSDavid du Colombier #define TiB 1099511627776ull /* Tebi 0x0000010000000000 */ 8*1c9d674cSDavid du Colombier #define PiB 1125899906842624ull /* Pebi 0x0004000000000000 */ 9*1c9d674cSDavid du Colombier #define EiB 1152921504606846976ull /* Exbi 0x1000000000000000 */ 10*1c9d674cSDavid du Colombier 11*1c9d674cSDavid du Colombier /* 12*1c9d674cSDavid du Colombier * Sizes 13*1c9d674cSDavid du Colombier */ 14*1c9d674cSDavid du Colombier #define BI2BY 8 /* bits per byte */ 15*1c9d674cSDavid du Colombier #define BI2WD 32 /* bits per word */ 16*1c9d674cSDavid du Colombier #define BY2WD 4 /* bytes per word */ 17*1c9d674cSDavid du Colombier #define BY2V 8 /* bytes per vlong */ 18*1c9d674cSDavid du Colombier #define BY2SE 4 /* bytes per stack element */ 19*1c9d674cSDavid du Colombier #define BY2PG 4096 /* bytes per page */ 20*1c9d674cSDavid du Colombier #define PGSHIFT 12 /* log(BY2PG) */ 21*1c9d674cSDavid du Colombier #define STACKALIGN(sp) ((sp) & ~7) /* bug: assure with alloc */ 22*1c9d674cSDavid du Colombier #define SEGALIGN (1024*1024) /* alignment for segments */ 23*1c9d674cSDavid du Colombier #define BY2PTE 8 /* bytes per pte entry */ 24*1c9d674cSDavid du Colombier #define BY2PTEG 64 /* bytes per pte group */ 25*1c9d674cSDavid du Colombier 26*1c9d674cSDavid du Colombier #define ICACHESIZE 32768 /* 0, 4, 8, 16, or 32 KB */ 27*1c9d674cSDavid du Colombier #define ICACHEWAYSIZE (ICACHESIZE/64) /* 64-way set associative */ 28*1c9d674cSDavid du Colombier #define ICACHELINELOG 5 /* 8 words (4 bytes) per line */ 29*1c9d674cSDavid du Colombier #define ICACHELINESZ (1<<ICACHELINELOG) 30*1c9d674cSDavid du Colombier 31*1c9d674cSDavid du Colombier #define DCACHESIZE 32768 /* 0, 4, 8, 16, or 32 KB */ 32*1c9d674cSDavid du Colombier #define DCACHEWAYSIZE (DCACHESIZE/64) /* 64-way set associative */ 33*1c9d674cSDavid du Colombier #define DCACHELINELOG 5 /* 8 words (4 bytes) per line */ 34*1c9d674cSDavid du Colombier #define DCACHELINESZ (1<<DCACHELINELOG) 35*1c9d674cSDavid du Colombier 36*1c9d674cSDavid du Colombier #define BLOCKALIGN DCACHELINESZ /* for ../port/allocb.c */ 37*1c9d674cSDavid du Colombier 38*1c9d674cSDavid du Colombier #define MAXMACH 2 /* max # cpus system can run */ 39*1c9d674cSDavid du Colombier #define MACHSIZE BY2PG /* 16K on BG/L */ 40*1c9d674cSDavid du Colombier 41*1c9d674cSDavid du Colombier /* 42*1c9d674cSDavid du Colombier * Time 43*1c9d674cSDavid du Colombier */ 44*1c9d674cSDavid du Colombier #define HZ 100 /* clock frequency */ 45*1c9d674cSDavid du Colombier #define MHz 1000000 46*1c9d674cSDavid du Colombier #define TK2SEC(t) ((t)/HZ) /* ticks to seconds */ 47*1c9d674cSDavid du Colombier 48*1c9d674cSDavid du Colombier /* 49*1c9d674cSDavid du Colombier * IBM bit field order 50*1c9d674cSDavid du Colombier * used only to derive bit mask for interrupt vector numbers 51*1c9d674cSDavid du Colombier */ 52*1c9d674cSDavid du Colombier #define IBIT(n) (1UL<<(31-(n))) 53*1c9d674cSDavid du Colombier 54*1c9d674cSDavid du Colombier /* 55*1c9d674cSDavid du Colombier * Bit encodings for Machine State Register (MSR) 56*1c9d674cSDavid du Colombier */ 57*1c9d674cSDavid du Colombier #define MSR_AP 0x02000000 /* auxiliary processor available */ 58*1c9d674cSDavid du Colombier #define MSR_APE 0x00080000 /* APU exception enable */ 59*1c9d674cSDavid du Colombier #define MSR_WE 0x00040000 /* wait state enable */ 60*1c9d674cSDavid du Colombier #define MSR_CE 0x00020000 /* critical interrupt enable */ 61*1c9d674cSDavid du Colombier #define MSR_EE 0x00008000 /* enable external/decrementer interrupts */ 62*1c9d674cSDavid du Colombier #define MSR_PR 0x00004000 /* =1, user mode */ 63*1c9d674cSDavid du Colombier #define MSR_FP 0x00002000 /* floating-point available */ 64*1c9d674cSDavid du Colombier #define MSR_ME 0x00001000 /* enable machine check exceptions */ 65*1c9d674cSDavid du Colombier #define MSR_FE0 0x00000800 /* floating-point exception mode 0 */ 66*1c9d674cSDavid du Colombier #define MSR_DWE 0x00000400 /* debug wait enable */ 67*1c9d674cSDavid du Colombier #define MSR_DE 0x00000200 /* debug interrupts enable */ 68*1c9d674cSDavid du Colombier #define MSR_FE1 0x00000100 /* floating-point exception mode 1 */ 69*1c9d674cSDavid du Colombier #define MSR_IS 0x00000020 /* instruction address space */ 70*1c9d674cSDavid du Colombier #define MSR_DS 0x00000010 /* data address space */ 71*1c9d674cSDavid du Colombier 72*1c9d674cSDavid du Colombier /* state in user mode */ 73*1c9d674cSDavid du Colombier #define UMSR (MSR_PR|MSR_CE|MSR_EE|MSR_DE) 74*1c9d674cSDavid du Colombier 75*1c9d674cSDavid du Colombier /* 76*1c9d674cSDavid du Colombier * Exception Syndrome Register (ESR) 77*1c9d674cSDavid du Colombier */ 78*1c9d674cSDavid du Colombier #define ESR_MCI 0x80000000 /* instruction machine check */ 79*1c9d674cSDavid du Colombier #define ESR_PIL 0x08000000 /* program interrupt: illegal instruction */ 80*1c9d674cSDavid du Colombier #define ESR_PPR 0x04000000 /* program interrupt: privileged */ 81*1c9d674cSDavid du Colombier #define ESR_PTR 0x02000000 /* program interrupt: trap with successful compare */ 82*1c9d674cSDavid du Colombier #define ESR_PEU 0x01000000 /* program interrupt: unimplemented APU/FPU operation */ 83*1c9d674cSDavid du Colombier #define ESR_DST 0x00800000 /* data storage interrupt: store fault */ 84*1c9d674cSDavid du Colombier #define ESR_DIZ 0x00400000 /* data/instruction storage interrupt: zone fault */ 85*1c9d674cSDavid du Colombier #define ESR_PFP 0x00080000 /* program interrupt: FPU interrupt occurred */ 86*1c9d674cSDavid du Colombier #define ESR_PAP 0x00040000 /* program interrupt: APU interrupt occurred */ 87*1c9d674cSDavid du Colombier #define ESR_U0F 0x00008000 /* data storage interrupt: u0 fault */ 88*1c9d674cSDavid du Colombier 89*1c9d674cSDavid du Colombier /* 90*1c9d674cSDavid du Colombier * Interrupt vector offsets 91*1c9d674cSDavid du Colombier */ 92*1c9d674cSDavid du Colombier #define INT_CI 0x0100 /* Critical input interrupt */ 93*1c9d674cSDavid du Colombier #define INT_MCHECK 0x0200 /* Machine check */ 94*1c9d674cSDavid du Colombier #define INT_DSI 0x0300 /* Data storage interrupt */ 95*1c9d674cSDavid du Colombier #define INT_ISI 0x0400 /* Instruction storage interrupt */ 96*1c9d674cSDavid du Colombier #define INT_EI 0x0500 /* External interrupt */ 97*1c9d674cSDavid du Colombier #define INT_ALIGN 0x0600 /* Alignment */ 98*1c9d674cSDavid du Colombier #define INT_PROG 0x0700 /* Program */ 99*1c9d674cSDavid du Colombier #define INT_FPU 0x0800 /* FPU unavailable */ 100*1c9d674cSDavid du Colombier #define INT_DEC 0x0900 /* UNUSED on 405? */ 101*1c9d674cSDavid du Colombier #define INT_SYSCALL 0x0C00 /* System call */ 102*1c9d674cSDavid du Colombier #define INT_TRACE 0x0D00 /* UNUSED on 405? */ 103*1c9d674cSDavid du Colombier #define INT_FPA 0x0E00 /* UNUSED on 405? */ 104*1c9d674cSDavid du Colombier #define INT_APU 0x0F20 /* APU unavailable */ 105*1c9d674cSDavid du Colombier #define INT_PIT 0x1000 /* PIT interrupt */ 106*1c9d674cSDavid du Colombier #define INT_FIT 0x1010 /* FIT interrupt */ 107*1c9d674cSDavid du Colombier #define INT_WDT 0x1020 /* Watchdog timer */ 108*1c9d674cSDavid du Colombier #define INT_DMISS 0x1100 /* Data TLB miss */ 109*1c9d674cSDavid du Colombier #define INT_IMISS 0x1200 /* Instruction TLB miss */ 110*1c9d674cSDavid du Colombier #define INT_DEBUG 0x2000 /* Debug */ 111*1c9d674cSDavid du Colombier 112*1c9d674cSDavid du Colombier /* 113*1c9d674cSDavid du Colombier * Magic registers 114*1c9d674cSDavid du Colombier */ 115*1c9d674cSDavid du Colombier #define MACH 30 /* R30 is m-> */ 116*1c9d674cSDavid du Colombier #define USER 29 /* R29 is up-> */ 117*1c9d674cSDavid du Colombier 118*1c9d674cSDavid du Colombier /* 119*1c9d674cSDavid du Colombier * Virtual MMU 120*1c9d674cSDavid du Colombier */ 121*1c9d674cSDavid du Colombier #define PTEMAPMEM (1024*1024) 122*1c9d674cSDavid du Colombier #define PTEPERTAB (PTEMAPMEM/BY2PG) 123*1c9d674cSDavid du Colombier #define SEGMAPSIZE 1984 124*1c9d674cSDavid du Colombier #define SSEGMAPSIZE 16 125*1c9d674cSDavid du Colombier #define PPN(x) ((x)&~(BY2PG-1)) 126*1c9d674cSDavid du Colombier 127*1c9d674cSDavid du Colombier #define PTEVALID (1<<0) 128*1c9d674cSDavid du Colombier #define PTEWRITE (1<<1) 129*1c9d674cSDavid du Colombier #define PTERONLY (0<<1) 130*1c9d674cSDavid du Colombier #define PTEUNCACHED (1<<2) 131*1c9d674cSDavid du Colombier 132*1c9d674cSDavid du Colombier /* 133*1c9d674cSDavid du Colombier * Physical MMU 134*1c9d674cSDavid du Colombier */ 135*1c9d674cSDavid du Colombier #define NTLB 64 /* number of entries */ 136*1c9d674cSDavid du Colombier #define NTLBPID 256 /* number of hardware pids (0 = global) */ 137*1c9d674cSDavid du Colombier 138*1c9d674cSDavid du Colombier /* TLBHI */ 139*1c9d674cSDavid du Colombier #define TLBEPN(x) ((x) & ~0x3FF) 140*1c9d674cSDavid du Colombier #define TLB1K (0<<4) 141*1c9d674cSDavid du Colombier #define TLB4K (1<<4) 142*1c9d674cSDavid du Colombier #define TLB16K (2<<4) 143*1c9d674cSDavid du Colombier #define TLB64K (3<<4) 144*1c9d674cSDavid du Colombier #define TLB256K (4<<4) 145*1c9d674cSDavid du Colombier #define TLB1MB (5<<4) 146*1c9d674cSDavid du Colombier /* 4Mbyte not implemented */ 147*1c9d674cSDavid du Colombier #define TLB16MB (7<<4) 148*1c9d674cSDavid du Colombier /* 32Mbyte not implemented */ 149*1c9d674cSDavid du Colombier #define TLB256MB (9<<4) 150*1c9d674cSDavid du Colombier #define TLBVALID (1<<9) 151*1c9d674cSDavid du Colombier #define TLBTS (1<<8) /* Translation address space */ 152*1c9d674cSDavid du Colombier 153*1c9d674cSDavid du Colombier /* TLBMID */ 154*1c9d674cSDavid du Colombier #define TLBRPN(x) ((x) & ~0x3FF) 155*1c9d674cSDavid du Colombier #define TLBERPN(uv) (((uv)>>32)&0xF) /* with full address as uvlong */ 156*1c9d674cSDavid du Colombier 157*1c9d674cSDavid du Colombier /* TLBLO */ 158*1c9d674cSDavid du Colombier #define TLBU0 (1<<15) /* user definable */ 159*1c9d674cSDavid du Colombier #define TLBU1 (1<<14) /* user definable */ 160*1c9d674cSDavid du Colombier #define TLBU2 (1<<13) /* user definable */ 161*1c9d674cSDavid du Colombier #define TLBU3 (1<<12) /* user definable */ 162*1c9d674cSDavid du Colombier #define TLBW (1<<11) /* write-through? */ 163*1c9d674cSDavid du Colombier #define TLBI (1<<10) /* cache inhibit */ 164*1c9d674cSDavid du Colombier #define TLBM (1<<9) /* memory coherent */ 165*1c9d674cSDavid du Colombier #define TLBG (1<<8) /* guarded */ 166*1c9d674cSDavid du Colombier #define TLBLE (1<<7) /* little endian mode */ 167*1c9d674cSDavid du Colombier #define TLBUX (1<<5) /* user execute enable */ 168*1c9d674cSDavid du Colombier #define TLBUW (1<<4) /* user writable */ 169*1c9d674cSDavid du Colombier #define TLBUR (1<<3) /* user readable */ 170*1c9d674cSDavid du Colombier #define TLBSX (1<<2) /* supervisor execute enable */ 171*1c9d674cSDavid du Colombier #define TLBSW (1<<1) /* supervisor writable */ 172*1c9d674cSDavid du Colombier #define TLBSR (1<<0) /* supervisor readable */ 173*1c9d674cSDavid du Colombier 174*1c9d674cSDavid du Colombier #define TLBWR (TLBSW|TLBSR) 175*1c9d674cSDavid du Colombier 176*1c9d674cSDavid du Colombier /* 177*1c9d674cSDavid du Colombier * software TLB (for quick reload by [id]tlbmiss) 178*1c9d674cSDavid du Colombier */ 179*1c9d674cSDavid du Colombier #define STLBLOG 10 180*1c9d674cSDavid du Colombier #define STLBSIZE (1<<STLBLOG) 181*1c9d674cSDavid du Colombier 182*1c9d674cSDavid du Colombier /* 183*1c9d674cSDavid du Colombier * Address spaces 184*1c9d674cSDavid du Colombier */ 185*1c9d674cSDavid du Colombier #define KSEG0 0x80000000 186*1c9d674cSDavid du Colombier #define KSEG1 0xA0000000 /* uncached alias for KZERO */ 187*1c9d674cSDavid du Colombier #define KSEGM 0xE0000000 /* mask to check segment */ 188*1c9d674cSDavid du Colombier #define KZERO KSEG0 /* base of kernel address space */ 189*1c9d674cSDavid du Colombier #define KTZERO (KZERO+SEGALIGN) /* first address in kernel text */ 190*1c9d674cSDavid du Colombier 191*1c9d674cSDavid du Colombier #define TSTKTOP KZERO /* top of temporary stack */ 192*1c9d674cSDavid du Colombier #define TSTKSIZ 256 /* pages in new stack; limits exec args */ 193*1c9d674cSDavid du Colombier 194*1c9d674cSDavid du Colombier #define UZERO 0 /* base of user address space */ 195*1c9d674cSDavid du Colombier #define UTZERO (UZERO+SEGALIGN) /* first address in user text */ 196*1c9d674cSDavid du Colombier #define UTROUND(t) ROUNDUP((t), SEGALIGN) 197*1c9d674cSDavid du Colombier #define USTKTOP (TSTKTOP-TSTKSIZ*BY2PG) /* byte just beyond user stack */ 198*1c9d674cSDavid du Colombier 199*1c9d674cSDavid du Colombier /* 200*1c9d674cSDavid du Colombier * Where configuration info is left for the loaded programme. 201*1c9d674cSDavid du Colombier * This will turn into a structure as more is done by the boot loader 202*1c9d674cSDavid du Colombier * (e.g. why parse the .ini file twice?). 203*1c9d674cSDavid du Colombier * On the power pc, we can use 0x2100 through 0x4000. 204*1c9d674cSDavid du Colombier */ 205*1c9d674cSDavid du Colombier #define CONFADDR (KZERO+0x2200) /* info passed from boot loader */ 206*1c9d674cSDavid du Colombier #define REBOOTADDR (CONFADDR+BOOTLINELEN+BOOTARGSLEN) /* reboot code - virtual address */ 207*1c9d674cSDavid du Colombier 208*1c9d674cSDavid du Colombier #define BOOTLINE ((char*)CONFADDR) /* from 9load */ 209*1c9d674cSDavid du Colombier #define BOOTLINELEN 64 210*1c9d674cSDavid du Colombier #define BOOTARGS ((char*)(CONFADDR+BOOTLINELEN)) 211*1c9d674cSDavid du Colombier #define BOOTARGSLEN 1024 /* must be enough to hold #ec */ 212*1c9d674cSDavid du Colombier 213*1c9d674cSDavid du Colombier #define KSTACK (16*1024) /* Size of kernel stack (not proc 0's in Mach); 16K on BG/L */ 214*1c9d674cSDavid du Colombier 215*1c9d674cSDavid du Colombier #define USTKSIZE (4*1024*1024) /* size of user stack */ 216*1c9d674cSDavid du Colombier #define UREGSIZE ((8+40)*4) 217*1c9d674cSDavid du Colombier 218*1c9d674cSDavid du Colombier #include "physmem.h" 219*1c9d674cSDavid du Colombier 220*1c9d674cSDavid du Colombier #define getpgcolor(a) 0 /* ../port/page.c */ 221