]> git.lizzy.rs Git - plan9front.git/blob - sys/src/9/bcm64/mem.h
bcm64: set XN bits for kernel device mappings
[plan9front.git] / sys / src / 9 / bcm64 / mem.h
1 /*
2  * Memory and machine-specific definitions.  Used in C and assembler.
3  */
4 #define KiB             1024u                   /* Kibi 0x0000000000000400 */
5 #define MiB             1048576u                /* Mebi 0x0000000000100000 */
6 #define GiB             1073741824u             /* Gibi 000000000040000000 */
7
8 /*
9  * Sizes:
10  *      L0      L1      L2      L3
11  *      4K      2M      1G      512G
12  *      16K     32M     64G     128T
13  *      64K     512M    4T      -
14  */
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)
19
20 /* effective virtual address space */
21 #define EVASHIFT        34
22 #define EVAMASK         ((1ULL<<EVASHIFT)-1)
23
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))
28
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))
34
35 #define MAXMACH         4                       /* max # cpus system can run */
36 #define MACHSIZE        (8*KiB)
37
38 #define KSTACK          (8*KiB)
39 #define STACKALIGN(sp)  ((sp) & ~7)             /* bug: assure with alloc */
40 #define TRAPFRAMESIZE   (38*8)
41
42 #define KSEG0           (0xFFFFFFFF00000000ULL)
43 #define FRAMEBUFFER     (0xFFFFFFFF00000000ULL|PTEWT)
44 #define VGPIO           0                       /* virtual gpio for pi3 ACT LED */
45
46 #define VIRTPCI         (0xFFFFFFFF80000000ULL) /* virtual pcie mmio */
47
48 #define VIRTIO2         (0xFFFFFFFFBC000000ULL) /* 0x7C000000   -               0xFC000000 */
49 #define VIRTIO1         (0xFFFFFFFFBD000000ULL) /* 0x7D000000   -               0xFD000000 */
50 #define VIRTIO          (0xFFFFFFFFBE000000ULL) /* 0x7E000000   0x3F000000      0xFE000000 */
51 #define ARMLOCAL        (0xFFFFFFFFBF800000ULL) /* -            0x40000000      0xFF800000 */
52
53 #define KZERO           (0xFFFFFFFFC0000000ULL) /* kernel address space */
54
55 #define SPINTABLE       (KZERO+0xd8)
56 #define CONFADDR        (KZERO+0x100)
57 #define VECTORSEL2      (0x1000)
58 #define REBOOTADDR      (0x1c00)                /* reboot code - physical address */
59 #define VCBUFFER        (KZERO+0x3400)          /* videocore mailbox buffer */
60
61 #define L1              (L1TOP-L1SIZE)
62 #define L1SIZE          ((L1TABLES+PTLEVELS-2)*BY2PG)
63 #define L1TOP           ((MACHADDR(MAXMACH-1)-L1TOPSIZE)&-BY2PG)
64
65 #define MACHADDR(n)     (KTZERO-((n)+1)*MACHSIZE)
66
67 #define KTZERO          (KZERO+0x80000)         /* kernel text start */
68
69 #define UZERO           0ULL                    /* user segment */
70 #define UTZERO          (UZERO+0x10000)         /* user text start */
71 #define USTKTOP         ((EVAMASK>>1)-0xFFFF)   /* user segment end +1 */
72 #define USTKSIZE        (16*1024*1024)          /* user stack size */
73
74 #define BLOCKALIGN      64                      /* only used in allocb.c */
75
76 /*
77  * Sizes
78  */
79 #define BI2BY           8                       /* bits per byte */
80 #define BY2SE           4
81 #define BY2WD           8
82 #define BY2V            8                       /* only used in xalloc.c */
83
84 #define PTEMAPMEM       (1024*1024)
85 #define PTEPERTAB       (PTEMAPMEM/BY2PG)
86 #define SEGMAPSIZE      1984
87 #define SSEGMAPSIZE     16
88 #define PPN(x)          ((x)&~(BY2PG-1))
89
90 #define SHARE_NONE      0
91 #define SHARE_OUTER     2
92 #define SHARE_INNER     3
93
94 #define CACHE_UC        0
95 #define CACHE_WB        1
96 #define CACHE_WT        2
97 #define CACHE_WB_NA     3
98
99 #define MA_MEM_WB       0
100 #define MA_MEM_WT       1
101 #define MA_MEM_UC       2
102 #define MA_DEV_nGnRnE   3
103 #define MA_DEV_nGnRE    4
104 #define MA_DEV_nGRE     5
105 #define MA_DEV_GRE      6
106
107 #define PTEVALID        1
108 #define PTEBLOCK        0
109 #define PTETABLE        2
110 #define PTEPAGE         2
111
112 #define PTEMA(x)        ((x)<<2)
113 #define PTEAP(x)        ((x)<<6)
114 #define PTESH(x)        ((x)<<8)
115
116 #define PTEAF           (1<<10)
117 #define PTENG           (1<<11)
118 #define PTEPXN          (1ULL<<53)
119 #define PTEUXN          (1ULL<<54)
120
121 #define PTEKERNEL       PTEAP(0)
122 #define PTEUSER         PTEAP(1)
123 #define PTEWRITE        PTEAP(0)
124 #define PTERONLY        PTEAP(2)
125
126 #define PTEWT           PTEMA(MA_MEM_WT)
127 #define PTEUNCACHED     PTEMA(MA_MEM_UC)
128 #define PTEDEVICE       PTEMA(MA_DEV_nGnRE)
129
130 /*
131  * Physical machine information from here on.
132  *      PHYS addresses as seen from the arm cpu.
133  *      BUS  addresses as seen from the videocore gpu.
134  */
135 #define PHYSDRAM        0
136
137 #define MIN(a, b)       ((a) < (b)? (a): (b))
138 #define MAX(a, b)       ((a) > (b)? (a): (b))