2 * Memory and machine-specific definitions. Used in C and assembler.
4 #define KiB 1024u /* Kibi 0x0000000000000400 */
5 #define MiB 1048576u /* Mebi 0x0000000000100000 */
6 #define GiB 1073741824u /* Gibi 000000000040000000 */
15 #define PGSHIFT 16 /* log(BY2PG) */
16 #define BY2PG (1ULL<<PGSHIFT) /* bytes per page */
17 #define ROUND(s, sz) (((s)+(sz-1))&~(sz-1))
18 #define PGROUND(s) ROUND(s, BY2PG)
20 /* effective virtual address space */
22 #define EVAMASK ((1ULL<<EVASHIFT)-1)
24 #define PTSHIFT (PGSHIFT-3)
25 #define PTLEVELS (((EVASHIFT-PGSHIFT)+PTSHIFT-1)/PTSHIFT)
26 #define PTLX(v, l) ((((v) & EVAMASK) >> (PGSHIFT + (l)*PTSHIFT)) & ((1 << PTSHIFT)-1))
27 #define PGLSZ(l) (1ULL << (PGSHIFT + (l)*PTSHIFT))
29 #define PTL1X(v, l) (L1TABLEX(v, l) | PTLX(v, l))
30 #define L1TABLEX(v, l) (L1TABLE(v, l) << PTSHIFT)
31 #define L1TABLES ((-KSEG0+PGLSZ(2)-1)/PGLSZ(2))
32 #define L1TABLE(v, l) (L1TABLES - ((PTLX(v, 2) % L1TABLES) >> (((l)-1)*PTSHIFT)) + (l)-1)
33 #define L1TOPSIZE (1ULL << (EVASHIFT - PTLEVELS*PTSHIFT))
35 #define MAXMACH 4 /* max # cpus system can run */
36 #define MACHSIZE (8*KiB)
38 #define KSTACK (8*KiB)
39 #define STACKALIGN(sp) ((sp) & ~7) /* bug: assure with alloc */
40 #define TRAPFRAMESIZE (38*8)
42 #define KSEG0 (0xFFFFFFFC00000000ULL)
44 #define KMAP (0xFFFFFFFC00000000ULL)
45 #define KMAPEND (0xFFFFFFFF00000000ULL)
47 #define FRAMEBUFFER (0xFFFFFFFFA0000000ULL|PTEWT)
49 #define VMAP (0xFFFFFFFFB0000000ULL)
51 #define VIRTIO2 (0xFFFFFFFFBC000000ULL) /* 0x7C000000 - 0xFC000000 */
52 #define VIRTIO1 (0xFFFFFFFFBD000000ULL) /* 0x7D000000 - 0xFD000000 */
53 #define VIRTIO (0xFFFFFFFFBE000000ULL) /* 0x7E000000 0x3F000000 0xFE000000 */
54 #define ARMLOCAL (0xFFFFFFFFBF800000ULL) /* - 0x40000000 0xFF800000 */
56 #define VGPIO (0xFFFFFFFFBF900000ULL|PTEUNCACHED) /* virtual gpio for pi3 ACT LED */
58 #define KZERO (0xFFFFFFFFC0000000ULL) /* kernel address space */
60 #define SPINTABLE (KZERO+0xd8)
61 #define CONFADDR (KZERO+0x100)
62 #define REBOOTADDR (0x1c00) /* reboot code - physical address */
63 #define VCBUFFER (KZERO+0x3400) /* videocore mailbox buffer */
65 #define L1 (L1TOP-L1SIZE)
66 #define L1SIZE ((L1TABLES+PTLEVELS-2)*BY2PG)
67 #define L1TOP ((MACHADDR(MAXMACH-1)-L1TOPSIZE)&-BY2PG)
69 #define MACHADDR(n) (KTZERO-((n)+1)*MACHSIZE)
71 #define KTZERO (KZERO+0x80000) /* kernel text start */
73 #define UZERO 0ULL /* user segment */
74 #define UTZERO (UZERO+0x10000) /* user text start */
75 #define USTKTOP ((EVAMASK>>1)-0xFFFF) /* user segment end +1 */
76 #define USTKSIZE (16*1024*1024) /* user stack size */
78 #define BLOCKALIGN 64 /* only used in allocb.c */
83 #define BI2BY 8 /* bits per byte */
86 #define BY2V 8 /* only used in xalloc.c */
88 #define PTEMAPMEM (1024*1024)
89 #define PTEPERTAB (PTEMAPMEM/BY2PG)
90 #define SEGMAPSIZE 8192
91 #define SSEGMAPSIZE 16
92 #define PPN(x) ((x)&~(BY2PG-1))
101 #define CACHE_WB_NA 3
106 #define MA_DEV_nGnRnE 3
107 #define MA_DEV_nGnRE 4
108 #define MA_DEV_nGRE 5
116 #define PTEMA(x) ((x)<<2)
117 #define PTEAP(x) ((x)<<6)
118 #define PTESH(x) ((x)<<8)
120 #define PTEAF (1<<10)
121 #define PTENG (1<<11)
122 #define PTEPXN (1ULL<<53)
123 #define PTEUXN (1ULL<<54)
125 #define PTEKERNEL PTEAP(0)
126 #define PTEUSER PTEAP(1)
127 #define PTEWRITE PTEAP(0)
128 #define PTERONLY PTEAP(2)
129 #define PTENOEXEC (PTEPXN|PTEUXN)
131 #define PTECACHED PTEMA(MA_MEM_WB)
132 #define PTEWT PTEMA(MA_MEM_WT)
133 #define PTEUNCACHED PTEMA(MA_MEM_UC)
134 #define PTEDEVICE PTEMA(MA_DEV_nGnRE)
137 * Physical machine information from here on.
138 * PHYS addresses as seen from the arm cpu.
139 * BUS addresses as seen from the videocore gpu.
143 #define MIN(a, b) ((a) < (b)? (a): (b))
144 #define MAX(a, b) ((a) > (b)? (a): (b))