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