Removed the old pfault, fork() uses VMRs
[akaros.git] / kern / arch / sparc / mmu.h
1 #ifndef ROS_INC_MMU_H
2 #define ROS_INC_MMU_H
3
4 /*
5  * This file contains definitions for the SRMMU.
6  */
7
8 #include <ros/arch/mmu.h>
9
10 /*
11  *
12  *      Part 1.  Paging data structures and constants.
13  *
14  */
15
16 // A linear address 'la' has a four-part structure as follows:
17 //
18 // +--------8--------+------6------+------6------+-----------12----------+
19 // |  L1 Page Table  |    L2 PT    |    L3 PT    |  Offset within Page   |
20 // |      Index      |    Index    |    Index    |                       |
21 // +-----------------+-------------+-------------+-----------------------+
22 //  \--- L1X(la) --/  \- L2X(la) -/ \- L3X(la) -/ \----- PGOFF(la) -----/
23 //  \----------- PPN(la) -----------------------/
24 //
25 // The L1X, L2X, L3X, PGOFF, and PPN macros decompose linear addresses
26 // as shown.  To construct a linear address la from L1X(la), L2X(la),
27 // and PGOFF(la), use PGADDR(L1X(la), L2X(la), L3X(la), PGOFF(la)).
28
29 // page number field of address
30 #define LA2PPN(la)      (((uintptr_t) (la)) >> L3PGSHIFT)
31
32 // page number field of PPN
33 #define PTE2PPN(pte)    (((uintptr_t) (pte)) >> 8)
34
35 // index into L1 PT
36 #define L1X(la)         ((((uintptr_t) (la)) >> L1PGSHIFT) & 0xFF)
37
38 // index into L2 PT
39 #define L2X(la)         ((((uintptr_t) (la)) >> L2PGSHIFT) & 0x3F)
40
41 // index into L3 PT
42 #define L3X(la)         ((((uintptr_t) (la)) >> L3PGSHIFT) & 0x3F)
43
44 // offset in page
45 #define PGOFF(la)       (((uintptr_t) (la)) & 0xFFF)
46
47 // construct linear address from indexes and offset
48 #define PGADDR(l1, l2, l3, o) ((void*SNT) ((l1) << L1PGSHIFT | (l2) << L2PGSHIFT | (l3) << L3PGSHIFT | (o)))
49
50 // construct PTE from PPN and flags
51 #define PTE(ppn, flags) ((ppn) << 8 | (flags))
52
53 // construct PTD from physical address
54 #define PTD(pa) ((pa) >> 4 | PTE_PTD)
55
56 // Number of L1 page tables (contexts) the MMU can store at any time
57 #define NCONTEXTS       8
58 #define CONTEXT_TABLE_PAD 8 // we require NCONTEXTS+CONTEXT_TBALE_PAD % 16 == 0
59
60 // Page directory and page table constants.
61 #define NL3ENTRIES      64              // # entries in an L3 page table
62 #define NL2ENTRIES      64              // # entries in an L2 page table
63 #define NL1ENTRIES      256             // # entries in an L1 page table
64
65 // Page table/directory entry flags.
66 #define PTE_PTD         0x001   // Entry is a Page Table Descriptor
67 #define PTE_PTE         0x002   // Entry is a Page Table Entry
68 #define PTE_ACC         0x01C   // Access modes (aka permissions, see below)
69 #define PTE_R           0x020   // Referenced
70 #define PTE_M           0x040   // Modified
71 #define PTE_C           0x080   // Cacheable
72
73 // commly used access modes
74 #define PTE_KERN_RW     (7 << 2)                // Kernel Read/Write
75 #define PTE_KERN_RO     (6 << 2)                // Kernel Read-Only
76 #define PTE_USER_RW     (3 << 2)                // Kernel/User Read/Write
77 #define PTE_USER_RO     (2 << 2)                // Kernel/User Read-Only
78
79 // x86 equivalencies
80 #define PTE_P           PTE_PTE                 // present <=> PTE
81 #define PTE_PERM        PTE_ACC                 // perms <=> ACC
82 #define NPDENTRIES      NL1ENTRIES              // to calculate size of pgdir
83 #define PDX(la)         L1X(la)                 // for env stuff
84
85 // +-----+-------------------+
86 // |     |   Allowed Access  |
87 // | ACC +------+------------+
88 // |     | User | Supervisor |
89 // +-----+------+------------+
90 // |  0  |  R-- |  R--       |
91 // |  1  |  RW- |  RW-       |
92 // |  2  |  R-X |  R-X       |
93 // |  3  |  RWX |  RWX       |
94 // |  4  |  --X |  --X       |
95 // |  5  |  R-- |  RW-       |
96 // |  6  |  --- |  R-X       |
97 // |  7  |  --- |  RWX       |
98 // +-----+------+------------+
99
100 // address in page table entry
101 #define PTE_ADDR(pte)   (((physaddr_t) (pte) & ~0xFF) << 4)
102
103 // address in page table descriptor
104 #define PTD_ADDR(ptd)   (((physaddr_t) (ptd) & ~0x3) << 4)
105
106 // MMU Control Register flags
107 #define MMU_CR_E        0x00000001      // Protection Enable
108 #define MMU_CR_NF       0x00000002      // No Fault mode
109 #define MMU_CR_PSO      0x00000080      // Partial Store Order (TSO disabled)
110
111 // MMU Fault Status Register flags
112 #define MMU_FSR_USER    0x00000020      // Fault caused by user-space access
113 #define MMU_FSR_EX      0x00000040      // Fault occured in instruction-space
114 #define MMU_FSR_WR      0x00000080      // Fault caused by a store
115
116 // MMU Register Addresses
117 #define MMU_REG_CTRL    0x00000000      // MMU Control Register
118 #define MMU_REG_CTXTBL  0x00000100      // MMU Context Table Pointer Register
119 #define MMU_REG_CTX     0x00000200      // MMU Context Register
120 #define MMU_REG_FSR     0x00000300      // MMU Fault Status Register
121 #define MMU_REG_FAR     0x00000400      // MMU Fault Address Register
122
123 // we must guarantee that for any PTE, exactly one of the following is true
124 #define PAGE_PRESENT(pte) ((pte) & PTE_P)
125 #define PAGE_UNMAPPED(pte) ((pte) == 0)
126 #define PAGE_PAGED_OUT(pte) (!PAGE_PRESENT(pte) && !PAGE_UNMAPPED(pte))
127
128 #endif /* !ROS_INC_MMU_H */