Cleanup JOS references and add typedefs
[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  *                     |           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.  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 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  * Page descriptor structures, mapped at UPAGES.
162  * Read/write to the kernel, read-only to user programs.
163  *
164  * Each Page describes one physical page.
165  * You can map a Page * to the corresponding physical address
166  * with page2pa() in kern/pmap.h.
167  */
168
169 struct Page;
170 typedef struct Page page_t;
171
172 LIST_HEAD(page_list_t, page_t);
173 typedef LIST_ENTRY(page_t) page_list_entry_t;
174
175 struct Page {
176         page_list_entry_t pp_link;      /* free list link */
177
178         // pp_ref is the count of pointers (usually in page table entries)
179         // to this page, for pages allocated using page_alloc.
180         // Pages allocated at boot time using pmap.c's
181         // boot_alloc do not have valid reference count fields.
182
183         uint16_t pp_ref;
184 };
185
186 #endif /* !__ASSEMBLER__ */
187 #endif /* !ROS_INC_MEMLAYOUT_H */