Added bitmask macros
[akaros.git] / inc / memlayout.h
1 #ifndef JOS_INC_MEMLAYOUT_H
2 #define JOS_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  *                     |           RO ENVS            | R-/R-  PTSIZE
48  * UTOP,UENVS ------>  +------------------------------+ 0xbec00000
49  * UXSTACKTOP -/       |     User Exception Stack     | RW/RW  PGSIZE
50  *                     +------------------------------+ 0xbebff000
51  *                     |       Empty Memory (*)       | --/--  PGSIZE
52  *    USTACKTOP  --->  +------------------------------+ 0xbebfe000
53  *                     |      Normal User Stack       | RW/RW  PGSIZE
54  *                     +------------------------------+ 0xbebfd000
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.  JOS 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 KSTKSIZE        (8*PGSIZE)              // size of a kernel stack
100 #define ULIM            (KSTACKTOP - PTSIZE) 
101
102 /*
103  * User read-only mappings! Anything below here til UTOP are readonly to user.
104  * They are global pages mapped in at env allocation time.
105  */
106
107 // Same as VPT but read-only for users
108 #define UVPT            (ULIM - PTSIZE)
109 // Read-only copies of the Page structures
110 #define UPAGES          (UVPT - PTSIZE)
111 // Read-only copies of the global env structures
112 #define UENVS           (UPAGES - PTSIZE)
113
114 /*
115  * Top of user VM. User can manipulate VA from UTOP-1 and down!
116  */
117
118 // Top of user-accessible VM
119 #define UTOP            UENVS
120 // Top of one-page user exception stack
121 #define UXSTACKTOP      UTOP
122 // Next page left invalid to guard against exception stack overflow; then:
123 // Top of normal user stack
124 #define USTACKTOP       (UTOP - 2*PGSIZE)
125
126 // Where user programs generally begin
127 #define UTEXT           (2*PTSIZE)
128
129 // Used for temporary page mappings.  Typed 'void*' for convenience
130 #define UTEMP           ((void*) PTSIZE)
131 // Used for temporary page mappings for the user page-fault handler
132 // (should not conflict with other temporary page mappings)
133 #define PFTEMP          (UTEMP + PTSIZE - PGSIZE)
134 // The location of the user-level STABS data structure
135 #define USTABDATA       (PTSIZE / 2)    
136
137
138 #ifndef __ASSEMBLER__
139
140 /*
141  * The page directory entry corresponding to the virtual address range
142  * [VPT, VPT + PTSIZE) points to the page directory itself.  Thus, the page
143  * directory is treated as a page table as well as a page directory.
144  *
145  * One result of treating the page directory as a page table is that all PTEs
146  * can be accessed through a "virtual page table" at virtual address VPT (to
147  * which vpt is set in entry.S).  The PTE for page number N is stored in
148  * vpt[N].  (It's worth drawing a diagram of this!)
149  *
150  * A second consequence is that the contents of the current page directory
151  * will always be available at virtual address (VPT + (VPT >> PGSHIFT)), to
152  * which vpd is set in entry.S.
153  */
154 typedef uint32_t pte_t;
155 typedef uint32_t pde_t;
156
157 extern volatile pte_t vpt[];     // VA of "virtual page table"
158 extern volatile pde_t vpd[];     // VA of current page directory
159
160
161 /*
162  * Page descriptor structures, mapped at UPAGES.
163  * Read/write to the kernel, read-only to user programs.
164  *
165  * Each Page describes one physical page.
166  * You can map a Page * to the corresponding physical address
167  * with page2pa() in kern/pmap.h.
168  */
169 LIST_HEAD(Page_list, Page);
170 typedef LIST_ENTRY(Page) Page_LIST_entry_t;
171
172 struct Page {
173         Page_LIST_entry_t pp_link;      /* free list link */
174
175         // pp_ref is the count of pointers (usually in page table entries)
176         // to this page, for pages allocated using page_alloc.
177         // Pages allocated at boot time using pmap.c's
178         // boot_alloc do not have valid reference count fields.
179
180         uint16_t pp_ref;
181 };
182
183 #endif /* !__ASSEMBLER__ */
184 #endif /* !JOS_INC_MEMLAYOUT_H */