1*da917039SDavid du Colombier /* 2*da917039SDavid du Colombier * Memory and machine-specific definitions. Used in C and assembler. 3*da917039SDavid du Colombier */ 4*da917039SDavid du Colombier #define KiB 1024u /* Kibi 0x0000000000000400 */ 5*da917039SDavid du Colombier #define MiB 1048576u /* Mebi 0x0000000000100000 */ 6*da917039SDavid du Colombier #define GiB 1073741824u /* Gibi 000000000040000000 */ 7*da917039SDavid du Colombier #define TiB 1099511627776ull /* Tebi 0x0000010000000000 */ 8*da917039SDavid du Colombier #define PiB 1125899906842624ull /* Pebi 0x0004000000000000 */ 9*da917039SDavid du Colombier #define EiB 1152921504606846976ull /* Exbi 0x1000000000000000 */ 10*da917039SDavid du Colombier 11*da917039SDavid du Colombier #define HOWMANY(x, y) (((x)+((y)-1))/(y)) 12*da917039SDavid du Colombier #define ROUNDUP(x, y) (HOWMANY((x), (y))*(y)) 13*da917039SDavid du Colombier #define ROUNDDN(x, y) (((x)/(y))*(y)) 14*da917039SDavid du Colombier #define MIN(a, b) ((a) < (b)? (a): (b)) 15*da917039SDavid du Colombier #define MAX(a, b) ((a) > (b)? (a): (b)) 16*da917039SDavid du Colombier 17*da917039SDavid du Colombier /* 18*da917039SDavid du Colombier * Sizes 19*da917039SDavid du Colombier */ 20*da917039SDavid du Colombier #define BI2BY 8 /* bits per byte */ 21*da917039SDavid du Colombier #define BY2V 8 /* bytes per vlong */ 22*da917039SDavid du Colombier #define BY2SE 4 /* bytes per stack element */ 23*da917039SDavid du Colombier #define BY2WD 4 /* bytes per int */ 24*da917039SDavid du Colombier #define BY2PG 4096 /* bytes per page */ 25*da917039SDavid du Colombier #define PGSHIFT 12 /* log(BY2PG) */ 26*da917039SDavid du Colombier #define PGROUND(s) ROUNDUP(s, BY2PG) 27*da917039SDavid du Colombier #define UTROUND(t) ROUNDUP((t), 0x100000) 28*da917039SDavid du Colombier #define STACKALIGN(sp) ((sp) & ~7) /* bug: assure with alloc */ 29*da917039SDavid du Colombier 30*da917039SDavid du Colombier #define ICACHESIZE 16384 /* 0, 4, 8, 16, or 32 KB */ 31*da917039SDavid du Colombier #define ICACHEWAYSIZE (ICACHESIZE/2) /* 2-way set associative */ 32*da917039SDavid du Colombier #define ICACHELINELOG 5 /* 8 words (4 bytes) per line */ 33*da917039SDavid du Colombier #define ICACHELINESZ (1<<ICACHELINELOG) 34*da917039SDavid du Colombier 35*da917039SDavid du Colombier #define DCACHESIZE 16384 /* 0, 4, 8, 16, or 32 KB */ 36*da917039SDavid du Colombier #define DCACHEWAYSIZE (DCACHESIZE/2) /* 2-way set associative */ 37*da917039SDavid du Colombier #define DCACHELINELOG 5 /* 8 words (4 bytes) per line */ 38*da917039SDavid du Colombier #define DCACHELINESZ (1<<DCACHELINELOG) 39*da917039SDavid du Colombier 40*da917039SDavid du Colombier #define BLOCKALIGN DCACHELINESZ /* for ../port/allocb.c */ 41*da917039SDavid du Colombier 42*da917039SDavid du Colombier #define MAXMACH 1 /* max # cpus system can run */ 43*da917039SDavid du Colombier #define MACHSIZE BY2PG 44*da917039SDavid du Colombier 45*da917039SDavid du Colombier /* 46*da917039SDavid du Colombier * Time 47*da917039SDavid du Colombier */ 48*da917039SDavid du Colombier #define HZ 100 /* clock frequency */ 49*da917039SDavid du Colombier #define MHz 1000000 50*da917039SDavid du Colombier #define TK2SEC(t) ((t)/HZ) /* ticks to seconds */ 51*da917039SDavid du Colombier 52*da917039SDavid du Colombier /* 53*da917039SDavid du Colombier * IBM bit field order 54*da917039SDavid du Colombier * used only to derive bit mask for interrupt vector numbers 55*da917039SDavid du Colombier */ 56*da917039SDavid du Colombier #define IBIT(n) (1UL<<(31-(n))) 57*da917039SDavid du Colombier 58*da917039SDavid du Colombier /* 59*da917039SDavid du Colombier * Bit encodings for Machine State Register (MSR) 60*da917039SDavid du Colombier */ 61*da917039SDavid du Colombier #define MSR_AP 0x02000000 /* auxiliary processor available */ 62*da917039SDavid du Colombier #define MSR_APE 0x00080000 /* APU exception enable */ 63*da917039SDavid du Colombier #define MSR_WE 0x00040000 /* wait state enable */ 64*da917039SDavid du Colombier #define MSR_CE 0x00020000 /* critical interrupt enable */ 65*da917039SDavid du Colombier #define MSR_EE 0x00008000 /* enable external/decrementer interrupts */ 66*da917039SDavid du Colombier #define MSR_PR 0x00004000 /* =1, user mode */ 67*da917039SDavid du Colombier #define MSR_FP 0x00002000 /* floating-point available */ 68*da917039SDavid du Colombier #define MSR_ME 0x00001000 /* enable machine check exceptions */ 69*da917039SDavid du Colombier #define MSR_FE0 0x00000800 /* floating-point exception mode 0 */ 70*da917039SDavid du Colombier #define MSR_DWE 0x00000400 /* debug wait enable */ 71*da917039SDavid du Colombier #define MSR_DE 0x00000200 /* debug interrupts enable */ 72*da917039SDavid du Colombier #define MSR_FE1 0x00000100 /* floating-point exception mode 1 */ 73*da917039SDavid du Colombier #define MSR_IR 0x00000020 /* enable instruction address translation */ 74*da917039SDavid du Colombier #define MSR_DR 0x00000010 /* enable data address translation */ 75*da917039SDavid du Colombier 76*da917039SDavid du Colombier /* state in user mode */ 77*da917039SDavid du Colombier #define UMSR (MSR_PR|MSR_DE|MSR_CE|MSR_EE|MSR_IR|MSR_DR) 78*da917039SDavid du Colombier 79*da917039SDavid du Colombier /* 80*da917039SDavid du Colombier * Exception Syndrome Register (ESR) 81*da917039SDavid du Colombier */ 82*da917039SDavid du Colombier #define ESR_MCI 0x80000000 /* instruction machine check */ 83*da917039SDavid du Colombier #define ESR_PIL 0x08000000 /* program interrupt: illegal instruction */ 84*da917039SDavid du Colombier #define ESR_PPR 0x04000000 /* program interrupt: privileged */ 85*da917039SDavid du Colombier #define ESR_PTR 0x02000000 /* program interrupt: trap with successful compare */ 86*da917039SDavid du Colombier #define ESR_PEU 0x01000000 /* program interrupt: unimplemented APU/FPU operation */ 87*da917039SDavid du Colombier #define ESR_DST 0x00800000 /* data storage interrupt: store fault */ 88*da917039SDavid du Colombier #define ESR_DIZ 0x00400000 /* data/instruction storage interrupt: zone fault */ 89*da917039SDavid du Colombier #define ESR_PFP 0x00080000 /* program interrupt: FPU interrupt occurred */ 90*da917039SDavid du Colombier #define ESR_PAP 0x00040000 /* program interrupt: APU interrupt occurred */ 91*da917039SDavid du Colombier #define ESR_U0F 0x00008000 /* data storage interrupt: u0 fault */ 92*da917039SDavid du Colombier 93*da917039SDavid du Colombier /* 94*da917039SDavid du Colombier * Interrupt vector offsets 95*da917039SDavid du Colombier */ 96*da917039SDavid du Colombier #define INT_RESET 0x0100 /* Critical input interrupt */ 97*da917039SDavid du Colombier #define INT_MCHECK 0x0200 /* Machine check */ 98*da917039SDavid du Colombier #define INT_DSI 0x0300 /* Data storage interrupt */ 99*da917039SDavid du Colombier #define INT_ISI 0x0400 /* Instruction storage interrupt */ 100*da917039SDavid du Colombier #define INT_EI 0x0500 /* External interrupt */ 101*da917039SDavid du Colombier #define INT_ALIGN 0x0600 /* Alignment */ 102*da917039SDavid du Colombier #define INT_PROG 0x0700 /* Program */ 103*da917039SDavid du Colombier #define INT_FPU 0x0800 /* FPU unavailable */ 104*da917039SDavid du Colombier #define INT_DEC 0x0900 /* UNUSED on 405? */ 105*da917039SDavid du Colombier #define INT_SYSCALL 0x0C00 /* System call */ 106*da917039SDavid du Colombier #define INT_TRACE 0x0D00 /* UNUSED on 405? */ 107*da917039SDavid du Colombier #define INT_FPA 0x0E00 /* UNUSED on 405? */ 108*da917039SDavid du Colombier #define INT_APU 0x0F20 /* APU unavailable */ 109*da917039SDavid du Colombier #define INT_PIT 0x1000 /* PIT interrupt */ 110*da917039SDavid du Colombier #define INT_FIT 0x1010 /* FIT interrupt */ 111*da917039SDavid du Colombier #define INT_WDT 0x1020 /* Watchdog timer */ 112*da917039SDavid du Colombier #define INT_DMISS 0x1100 /* Data TLB miss */ 113*da917039SDavid du Colombier #define INT_IMISS 0x1200 /* Instruction TLB miss */ 114*da917039SDavid du Colombier #define INT_DEBUG 0x2000 /* Debug */ 115*da917039SDavid du Colombier 116*da917039SDavid du Colombier /* 117*da917039SDavid du Colombier * Magic registers 118*da917039SDavid du Colombier */ 119*da917039SDavid du Colombier #define MACH 30 /* R30 is m-> */ 120*da917039SDavid du Colombier #define USER 29 /* R29 is up-> */ 121*da917039SDavid du Colombier 122*da917039SDavid du Colombier /* 123*da917039SDavid du Colombier * Virtual MMU 124*da917039SDavid du Colombier */ 125*da917039SDavid du Colombier #define PTEMAPMEM (1024*1024) 126*da917039SDavid du Colombier #define PTEPERTAB (PTEMAPMEM/BY2PG) 127*da917039SDavid du Colombier #define SEGMAPSIZE 1984 128*da917039SDavid du Colombier #define SSEGMAPSIZE 16 129*da917039SDavid du Colombier #define PPN(x) ((x)&~(BY2PG-1)) 130*da917039SDavid du Colombier 131*da917039SDavid du Colombier #define PTEVALID (1<<0) 132*da917039SDavid du Colombier #define PTEWRITE (1<<1) 133*da917039SDavid du Colombier #define PTERONLY (0<<1) 134*da917039SDavid du Colombier #define PTEUNCACHED (1<<2) 135*da917039SDavid du Colombier 136*da917039SDavid du Colombier /* 137*da917039SDavid du Colombier * Physical MMU 138*da917039SDavid du Colombier */ 139*da917039SDavid du Colombier #define NTLB 64 /* number of entries */ 140*da917039SDavid du Colombier #define NTLBPID 256 /* number of hardware pids (0 = global) */ 141*da917039SDavid du Colombier 142*da917039SDavid du Colombier /* TLBHI */ 143*da917039SDavid du Colombier #define TLBEPN(x) ((x) & ~0x3FF) 144*da917039SDavid du Colombier #define TLB1K (0<<7) 145*da917039SDavid du Colombier #define TLB4K (1<<7) 146*da917039SDavid du Colombier #define TLB16K (2<<7) 147*da917039SDavid du Colombier #define TLB64K (3<<7) 148*da917039SDavid du Colombier #define TLB256K (4<<7) 149*da917039SDavid du Colombier #define TLB1MB (5<<7) 150*da917039SDavid du Colombier #define TLB4MB (6<<7) 151*da917039SDavid du Colombier #define TLB16MB (7<<7) 152*da917039SDavid du Colombier #define TLBVALID (1<<6) 153*da917039SDavid du Colombier #define TLBLE (1<<5) /* little-endian */ 154*da917039SDavid du Colombier #define TLBU0 (1<<4) /* user-defined attribute */ 155*da917039SDavid du Colombier 156*da917039SDavid du Colombier /* TLBLO */ 157*da917039SDavid du Colombier #define TLBRPN(x) ((x) & ~0x3FF) 158*da917039SDavid du Colombier #define TLBEX (1<<9) /* execute enable */ 159*da917039SDavid du Colombier #define TLBWR (1<<8) /* write enable */ 160*da917039SDavid du Colombier #define TLBZONE(x) ((x)<<4) 161*da917039SDavid du Colombier #define TLBW (1<<3) /* write-through */ 162*da917039SDavid du Colombier #define TLBI (1<<2) /* cache inhibit */ 163*da917039SDavid du Colombier #define TLBM (1<<1) /* memory coherent */ 164*da917039SDavid du Colombier #define TLBG (1<<0) /* guarded */ 165*da917039SDavid du Colombier 166*da917039SDavid du Colombier /* 167*da917039SDavid du Colombier * software TLB (for quick reload by [id]tlbmiss) 168*da917039SDavid du Colombier */ 169*da917039SDavid du Colombier #define STLBLOG 10 170*da917039SDavid du Colombier #define STLBSIZE (1<<STLBLOG) 171*da917039SDavid du Colombier 172*da917039SDavid du Colombier /* 173*da917039SDavid du Colombier * Address spaces 174*da917039SDavid du Colombier */ 175*da917039SDavid du Colombier #define KSEG0 0x80000000 176*da917039SDavid du Colombier #define KSEG1 0xA0000000 /* uncached alias for KZERO */ 177*da917039SDavid du Colombier #define KSEGM 0xE0000000 /* mask to check segment */ 178*da917039SDavid du Colombier #define KZERO KSEG0 /* base of kernel address space */ 179*da917039SDavid du Colombier #define KTZERO (KZERO+0x4000) /* first address in kernel text */ 180*da917039SDavid du Colombier 181*da917039SDavid du Colombier #define TSTKTOP KZERO /* top of temporary stack */ 182*da917039SDavid du Colombier #define TSTKSIZ 100 183*da917039SDavid du Colombier 184*da917039SDavid du Colombier #define UZERO 0 /* base of user address space */ 185*da917039SDavid du Colombier #define UTZERO (UZERO+BY2PG) /* first address in user text */ 186*da917039SDavid du Colombier #define USTKTOP (TSTKTOP-TSTKSIZ*BY2PG) /* byte just beyond user stack */ 187*da917039SDavid du Colombier 188*da917039SDavid du Colombier #define KSTACK 8192 /* Size of kernel stack */ 189*da917039SDavid du Colombier 190*da917039SDavid du Colombier #define OCMZERO 0x40000000 /* on-chip memory (virtual and physical--see 405EP p 5-1) */ 191*da917039SDavid du Colombier #define USTKSIZE (4*1024*1024) /* size of user stack */ 192*da917039SDavid du Colombier #define UREGSIZE ((8+40)*4) 193*da917039SDavid du Colombier 194*da917039SDavid du Colombier #include "physmem.h" 195*da917039SDavid du Colombier 196*da917039SDavid du Colombier #define getpgcolor(a) 0 /* ../port/page.c */ 197