Rearranged arch-specific directory hierarchy
[akaros.git] / kern / include / ros / memlayout.h
1 #ifndef ROS_INC_MEMLAYOUT_H
2 #define ROS_INC_MEMLAYOUT_H
3
4 #ifndef __ASSEMBLER__
5 #include <arch/types.h>
6 #include <arch/mmu.h>
7 #endif /* not __ASSEMBLER__ */
8
9 /*
10  * This file contains definitions for memory management in our OS,
11  * which are relevant to both the kernel and user-mode software.
12  */
13
14 /*
15  * Virtual memory map:                                Permissions
16  *                                                    kernel/user
17  *
18  *    4 Gig -------->  +------------------------------+
19  *                     |                              | RW/--
20  *                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
21  *                     :              .               :
22  *                     :              .               :
23  *                     :              .               :
24  *                     |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| RW/--
25  *                     |                              | RW/--
26  *                     |   Remapped Physical Memory   | RW/--
27  *                     |                              | RW/--
28  *    KERNBASE ----->  +------------------------------+ 0xc0000000
29  *                     |  Cur. Page Table (Kern. RW)  | RW/--  PTSIZE
30  *    VPT,KSTACKTOP--> +------------------------------+ 0xbfc00000      --+
31  *                     |         Kernel Stack         | RW/--  KSTKSIZE   |
32  *                     | - - - - - - - - - - - - - - -|                 PTSIZE
33  *                     |      Invalid Memory (*)      | --/--             |
34  *    ULIM     ------> +------------------------------+ 0xbf800000      --+
35  *                     |  Cur. Page Table (User R-)   | R-/R-  PTSIZE
36  *    UVPT      ---->  +------------------------------+ 0xbf400000
37  *                     |          RO PAGES            | R-/R-  PTSIZE
38  *    UPAGES    ---->  +------------------------------+ 0xbf000000      --+
39  *                     |  Unmapped (future expansion) | --/--             |
40  *                     +------------------------------+ 0xbec01000      PTSIZE
41  *                     |     Per-Process R/O Info     | R-/R-  PGSIZE     |
42  * UTOP, UINFO  ---->  +------------------------------+ 0xbec00000      --+
43  *                     |      Global Shared Page      | RW/RW  PGSIZE     |
44  *      UGDATA  ---->  +------------------------------+ 0xbebff000        |
45  *                     |  Unmapped (future expansion) | --/--             |
46  *                     +------------------------------+ 0xbe801000      PTSIZE
47  *                     |     Per-Process R/W Data     | RW/RW  PGSIZE     |
48  * UDATA,UXSTACKTOP--> +------------------------------+ 0xbe800000      --+
49  *                     |     User Exception Stack     | RW/RW  PGSIZE
50  *                     +------------------------------+ 0xbe7ff000
51  *                     |       Empty Memory (*)       | --/--  PGSIZE
52  *    USTACKTOP  --->  +------------------------------+ 0xbe7fe000
53  *                     |      Normal User Stack       | RW/RW  PGSIZE
54  *                     +------------------------------+ 0xbe7fd000
55  *                     |                              |
56  *                     |                              |
57  *                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
58  *                     .                              .
59  *                     .                              .
60  *                     .                              .
61  *                     |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
62  *                     |     Program Data & Heap      |
63  *    UTEXT -------->  +------------------------------+ 0x00800000
64  *    PFTEMP ------->  |       Empty Memory (*)       |        PTSIZE
65  *                     |                              |
66  *    UTEMP -------->  +------------------------------+ 0x00400000      --+
67  *                     |       Empty Memory (*)       |                   |
68  *                     | - - - - - - - - - - - - - - -|                   |
69  *                     |  User STAB Data (optional)   |                 PTSIZE
70  *    USTABDATA ---->  +------------------------------+ 0x00200000        |
71  *                     |       Empty Memory (*)       |                   |
72  *    0 ------------>  +------------------------------+                 --+
73  *
74  * (*) Note: The kernel ensures that "Invalid Memory" (ULIM) is *never*
75  *     mapped.  "Empty Memory" is normally unmapped, but user programs may
76  *     map pages there if desired.  ROS user programs map pages temporarily
77  *     at UTEMP.
78  */
79
80
81 // All physical memory mapped at this address
82 #define KERNBASE        0xC0000000
83
84 // At IOPHYSMEM (640K) there is a 384K hole for I/O.  From the kernel,
85 // IOPHYSMEM can be addressed at KERNBASE + IOPHYSMEM.  The hole ends
86 // at physical address EXTPHYSMEM.
87 #define IOPHYSMEM       0x0A0000
88 #define VGAPHYSMEM      0x0A0000
89 #define DEVPHYSMEM      0x0C0000
90 #define BIOSPHYSMEM     0x0F0000
91 #define EXTPHYSMEM      0x100000
92
93 // Virtual page table.  Entry PDX(VPT) in the PD contains a pointer to
94 // the page directory itself, thereby turning the PD into a page table,
95 // which maps all the PTEs containing the page mappings for the entire
96 // virtual address space into that 4 Meg region starting at VPT.
97 #define VPT             (KERNBASE - PTSIZE)
98 #define KSTACKTOP       VPT
99 #define KSTKSHIFT       (PGSHIFT+3)             // KSTKSIZE == 8*PGSIZE
100 #define KSTKSIZE        (1 << KSTKSHIFT)        // size of a kernel stack
101 #define ULIM            (KSTACKTOP - PTSIZE)
102
103 /*
104  * User read-only mappings! Anything below here til UTOP are readonly to user.
105  * They are global pages mapped in at env allocation time.
106  */
107
108 // Same as VPT but read-only for users
109 #define UVPT            (ULIM - PTSIZE)
110 // Read-only copies of the Page structures
111 #define UPAGES          (UVPT - PTSIZE)
112 // Read-only, per-process shared info structures
113 #define UINFO           (UPAGES - PTSIZE)
114 #define UINFO_PAGES 1
115
116 /*
117  * Top of user VM. User can manipulate VA from UTOP-1 and down!
118  */
119
120 // Top of user-accessible VM
121 #define UTOP            UINFO
122
123 // Read-write, global page.  Shared by all processes.  Can't be trusted.
124 #define UGDATA          (UTOP - PGSIZE)
125
126 // Read-write, per-process shared data structures
127 #define UDATA           (UTOP - PTSIZE)
128 #define UDATA_PAGES 1
129
130 // Top of one-page user exception stack
131 #define UXSTACKTOP      UDATA
132 // Next page left invalid to guard against exception stack overflow; then:
133 // Top of normal user stack
134 #define USTACKTOP       (UXSTACKTOP - 2*PGSIZE)
135
136 // Where user programs generally begin
137 #define UTEXT           (2*PTSIZE)
138
139 // Used for temporary page mappings.  Typed 'void*' for convenience
140 #define UTEMP           ((void*) PTSIZE)
141 // Used for temporary page mappings for the user page-fault handler
142 // (should not conflict with other temporary page mappings)
143 #define PFTEMP          (UTEMP + PTSIZE - PGSIZE)
144 // The location of the user-level STABS data structure
145 #define USTABDATA       (PTSIZE / 2)
146
147
148 #ifndef __ASSEMBLER__
149
150 /*
151  * The page directory entry corresponding to the virtual address range
152  * [VPT, VPT + PTSIZE) points to the page directory itself.  Thus, the page
153  * directory is treated as a page table as well as a page directory.
154  *
155  * One result of treating the page directory as a page table is that all PTEs
156  * can be accessed through a "virtual page table" at virtual address VPT (to
157  * which vpt is set in entry.S).  The PTE for page number N is stored in
158  * vpt[N].  (It's worth drawing a diagram of this!)
159  *
160  * A second consequence is that the contents of the current page directory
161  * will always be available at virtual address (VPT + (VPT >> PGSHIFT)), to
162  * which vpd is set in entry.S.
163  */
164 typedef uint32_t pte_t;
165 typedef uint32_t pde_t;
166
167 extern volatile pte_t vpt[];     // VA of "virtual page table"
168 extern volatile pde_t vpd[];     // VA of current page directory
169
170 #endif /* !__ASSEMBLER__ */
171 #endif /* !ROS_INC_MEMLAYOUT_H */