Kmsg debug routine
[akaros.git] / kern / arch / sparc / ros / mmu.h
1 /* Contains macros and constants for the kernel VM mapping, page tables,
2  * definitions for the SRMMU, etc. */
3
4 #ifndef ROS_INC_ARCH_MMU_H
5 #define ROS_INC_ARCH_MMU_H
6
7 /* **************************************** */
8 /* Kernel Virtual Memory Mapping  (not really an MMU thing) */
9
10 // All physical memory mapped at this address
11 #define KERNBASE        0x80000000
12 #define KERN_LOAD_ADDR  KERNBASE
13 #define ULIM            0x70000000
14
15 /* All arches must define this, which is the lower limit of their static
16  * mappings, and where the dynamic mappings will start. */
17 #define KERN_DYN_TOP    KERNBASE
18
19 // Use this if needed in annotations
20 #define IVY_KERNBASE (0x8000U << 16)
21
22 #define L3PGSHIFT   12
23 #define L3PGSIZE    (1<<L3PGSHIFT)
24
25 #define L2PGSHIFT   (12+6)
26 #define L2PGSIZE    (1<<L2PGSHIFT)
27
28 #define L1PGSHIFT   (12+6+6)
29 #define L1PGSIZE    (1<<L1PGSHIFT)
30
31 #define PGSHIFT L3PGSHIFT
32 #define PGSIZE (1 << PGSHIFT)
33 #define PTSIZE L1PGSIZE
34
35 #define NOVPT
36
37 #ifndef __ASSEMBLER__
38 typedef unsigned long pte_t;
39 typedef unsigned long pde_t;
40 #endif
41
42 /* **************************************** */
43 /* Page table constants, macros, etc */
44
45 // A linear address 'la' has a four-part structure as follows:
46 //
47 // +--------8--------+------6------+------6------+-----------12----------+
48 // |  L1 Page Table  |    L2 PT    |    L3 PT    |  Offset within Page   |
49 // |      Index      |    Index    |    Index    |                       |
50 // +-----------------+-------------+-------------+-----------------------+
51 //  \--- L1X(la) --/  \- L2X(la) -/ \- L3X(la) -/ \----- PGOFF(la) -----/
52 //  \----------- PPN(la) -----------------------/
53 //
54 // The L1X, L2X, L3X, PGOFF, and PPN macros decompose linear addresses
55 // as shown.  To construct a linear address la from L1X(la), L2X(la),
56 // and PGOFF(la), use PGADDR(L1X(la), L2X(la), L3X(la), PGOFF(la)).
57
58 // page number field of address
59 #define LA2PPN(la)      (((uintptr_t) (la)) >> L3PGSHIFT)
60
61 // page number field of PPN
62 #define PTE2PPN(pte)    (((uintptr_t) (pte)) >> 8)
63
64 // index into L1 PT
65 #define L1X(la)         ((((uintptr_t) (la)) >> L1PGSHIFT) & 0xFF)
66
67 // index into L2 PT
68 #define L2X(la)         ((((uintptr_t) (la)) >> L2PGSHIFT) & 0x3F)
69
70 // index into L3 PT
71 #define L3X(la)         ((((uintptr_t) (la)) >> L3PGSHIFT) & 0x3F)
72
73 // offset in page
74 #define PGOFF(la)       (((uintptr_t) (la)) & 0xFFF)
75
76 // construct linear address from indexes and offset
77 #define PGADDR(l1, l2, l3, o) ((void*SNT) ((l1) << L1PGSHIFT | (l2) << L2PGSHIFT | (l3) << L3PGSHIFT | (o)))
78
79 // construct PTE from PPN and flags
80 #define PTE(ppn, flags) ((ppn) << 8 | (flags))
81
82 // construct PTD from physical address
83 #define PTD(pa) ((pa) >> 4 | PTE_PTD)
84
85 // Number of L1 page tables (contexts) the MMU can store at any time
86 #define NCONTEXTS       8
87 #define CONTEXT_TABLE_PAD 8 // we require NCONTEXTS+CONTEXT_TBALE_PAD % 16 == 0
88
89 // Page directory and page table constants.
90 #define NL3ENTRIES      64              // # entries in an L3 page table
91 #define NL2ENTRIES      64              // # entries in an L2 page table
92 #define NL1ENTRIES      256             // # entries in an L1 page table
93
94 // Page table/directory entry flags.
95 #define PTE_PTD         0x001   // Entry is a Page Table Descriptor
96 #define PTE_PTE         0x002   // Entry is a Page Table Entry
97 #define PTE_ACC         0x01C   // Access modes (aka permissions, see below)
98 #define PTE_R           0x020   // Referenced
99 #define PTE_M           0x040   // Modified
100 #define PTE_C           0x080   // Cacheable
101
102 // commly used access modes
103 #define PTE_KERN_RW     (7 << 2)                // Kernel Read/Write
104 #define PTE_KERN_RO     (6 << 2)                // Kernel Read-Only
105 #define PTE_USER_RW     (3 << 2)                // Kernel/User Read/Write
106 #define PTE_USER_RO     (2 << 2)                // Kernel/User Read-Only
107
108 // x86 equivalencies
109 #define PTE_P           PTE_PTE                 // present <=> PTE
110 #define PTE_PERM        PTE_ACC                 // perms <=> ACC
111 #define NPDENTRIES      NL1ENTRIES              // to calculate size of pgdir
112 #define PDX(la)         L1X(la)                 // for env stuff
113
114 // +-----+-------------------+
115 // |     |   Allowed Access  |
116 // | ACC +------+------------+
117 // |     | User | Supervisor |
118 // +-----+------+------------+
119 // |  0  |  R-- |  R--       |
120 // |  1  |  RW- |  RW-       |
121 // |  2  |  R-X |  R-X       |
122 // |  3  |  RWX |  RWX       |
123 // |  4  |  --X |  --X       |
124 // |  5  |  R-- |  RW-       |
125 // |  6  |  --- |  R-X       |
126 // |  7  |  --- |  RWX       |
127 // +-----+------+------------+
128
129 // address in page table entry
130 #define PTE_ADDR(pte)   (((physaddr_t) (pte) & ~0xFF) << 4)
131
132 // address in page table descriptor
133 #define PTD_ADDR(ptd)   (((physaddr_t) (ptd) & ~0x3) << 4)
134
135 // MMU Control Register flags
136 #define MMU_CR_E        0x00000001      // Protection Enable
137 #define MMU_CR_NF       0x00000002      // No Fault mode
138 #define MMU_CR_PSO      0x00000080      // Partial Store Order (TSO disabled)
139
140 // MMU Fault Status Register flags
141 #define MMU_FSR_USER    0x00000020      // Fault caused by user-space access
142 #define MMU_FSR_EX      0x00000040      // Fault occured in instruction-space
143 #define MMU_FSR_WR      0x00000080      // Fault caused by a store
144
145 // MMU Register Addresses
146 #define MMU_REG_CTRL    0x00000000      // MMU Control Register
147 #define MMU_REG_CTXTBL  0x00000100      // MMU Context Table Pointer Register
148 #define MMU_REG_CTX     0x00000200      // MMU Context Register
149 #define MMU_REG_FSR     0x00000300      // MMU Fault Status Register
150 #define MMU_REG_FAR     0x00000400      // MMU Fault Address Register
151
152 // we must guarantee that for any PTE, exactly one of the following is true
153 #define PAGE_PRESENT(pte) ((pte) & PTE_P)
154 #define PAGE_UNMAPPED(pte) ((pte) == 0)
155 #define PAGE_PAGED_OUT(pte) (!PAGE_PRESENT(pte) && !PAGE_UNMAPPED(pte))
156
157 #endif /* ROS_INC_ARCH_MMU_H */