Kernel static mappings grow down, APICs remapped
[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 <ros/common.h>
6 #endif /* not __ASSEMBLER__ */
7
8 #include <ros/arch/mmu.h>
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 /* x86's 32 bit Virtual Memory Map.  Symbols are similar on other archs
16  *
17  * Virtual memory map:                                Permissions
18  *                                                    kernel/user
19  *
20  *    4 Gig -------->  +------------------------------+
21  *                     :              .               :
22  *  KERN_VMAP_TOP      +------------------------------+ 0xfffff000
23  *                     |                              |
24  *                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ RW/--
25  *                     :              .               :
26  *                     :              .               :
27  *                     :              .               :
28  *                     |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| RW/--
29  *                     |                              | RW/--
30  *                     |   Remapped Physical Memory   | RW/--
31  *                     |                              | RW/--
32  *    KERNBASE ----->  +------------------------------+ 0xc0000000
33  *                     |  Cur. Page Table (Kern. RW)  | RW/--  PTSIZE
34  *    VPT          --> +------------------------------+ 0xbfc00000
35  *                     |          Local APIC          | RW/--  PGSIZE
36  *    LAPIC        --> +------------------------------+ 0xbfbff000
37  *                     |            IOAPIC            | RW/--  PGSIZE
38  *    IOAPIC,      --> +------------------------------+ 0xbfbfe000
39  *  KERN_DYN_TOP       |   Kernel Dynamic Mappings    |
40  *                     |              .               |
41  *                     :              .               :
42  *                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ RW/--
43  *                     :                              :
44  *                     |      Invalid Memory (*)      | --/--
45  *    ULIM      ---->  +------------------------------+ 0x80000000      --+
46  *                     |  Cur. Page Table (User R-)   | R-/R-  PTSIZE     |
47  *    UVPT      ---->  +------------------------------+ 0x7fc00000      --+
48  *                     | Unmapped (expandable region) |                   |
49  *                     |                              | R-/R-            PTSIZE
50  *                     |     Per-Process R/O Info     |                   |
51  * UWLIM, UINFO ---->  +------------------------------+ 0x7f800000      --+
52  *                     | Unmapped (expandable region) |                   |
53  *                     |                              | RW/RW            PTSIZE
54  *                     |     Per-Process R/W Data     |                   |
55  *    UDATA     ---->  +------------------------------+ 0x7f400000      --+
56  *    UMAPTOP,         |    Global Shared R/W Data    | RW/RW  PGSIZE
57  * UXSTACKTOP,UGDATA ->+------------------------------+ 0x7f3ff000
58  *                     |     User Exception Stack     | RW/RW  PGSIZE
59  *                     +------------------------------+ 0x7f3fe000
60  *                     |       Empty Memory (*)       | --/--  PGSIZE
61  *    USTACKTOP  --->  +------------------------------+ 0x7f3fd000
62  *                     |      Normal User Stack       | RW/RW  256*PGSIZE (1MB)
63  *                     +------------------------------+ 0x7f2fd000
64  *                     |       Empty Memory (*)       | --/--  PGSIZE
65  *    USTACKBOT  --->  +------------------------------+ 0x7f2fc000
66  *                     |                              |
67  *                     |                              |
68  *                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
69  *                     .                              .
70  *                     .                              .
71  *                     .                              .
72  *                     |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
73  *                     |     Program Data & Heap      |
74  *    UTEXT -------->  +------------------------------+ 0x00800000
75  *    PFTEMP ------->  |       Empty Memory (*)       |        PTSIZE
76  *                     |                              |
77  *    UTEMP -------->  +------------------------------+ 0x00400000      --+
78  *                     |       Empty Memory (*)       |                   |
79  *                     | - - - - - - - - - - - - - - -|                   |
80  *                     |  User STAB Data (optional)   |                 PTSIZE
81  *    USTABDATA ---->  +------------------------------+ 0x00200000        |
82  *                     |       Empty Memory (*)       |                   |
83  *    0 ------------>  +------------------------------+                 --+
84  *
85  * (*) Note: The kernel ensures that "Invalid Memory" (ULIM) is *never*
86  *     mapped.  "Empty Memory" is normally unmapped, but user programs may
87  *     map pages there if desired.  ROS user programs map pages temporarily
88  *     at UTEMP.
89  */
90
91
92 // At IOPHYSMEM (640K) there is a 384K hole for I/O.  From the kernel,
93 // IOPHYSMEM can be addressed at KERNBASE + IOPHYSMEM.  The hole ends
94 // at physical address EXTPHYSMEM.
95 #define IOPHYSMEM       0x0A0000
96 #define VGAPHYSMEM      0x0A0000
97 #define DEVPHYSMEM      0x0C0000
98 #define BIOSPHYSMEM     0x0F0000
99 #define EXTPHYSMEM      0x100000
100
101 #define KSTKSHIFT       (PGSHIFT)                       /* KSTKSIZE == PGSIZE */
102 #define KSTKSIZE        (1 << KSTKSHIFT)        /* size of a static kernel stack */
103
104 /*
105  * User read-only mappings! Anything below here til UWLIM are readonly to user.
106  * They are global pages mapped in at env allocation time.
107  */
108
109 // Same as VPT but read-only for users
110 #define UVPT            (ULIM - PTSIZE)
111
112 /*
113  * Top of user VM. User can manipulate VA from UWLIM-1 and down!
114  */
115
116 // Top of user-accessible VM
117 #define UWLIM           (UVPT - PTSIZE)
118 // Read-only, per-process shared info structures
119 #define UINFO           UWLIM
120
121 // Read-write, per-process shared page for sending asynchronous 
122 // syscalls to the kernel
123 #define UDATA    (UWLIM - PTSIZE)
124
125 // Read-write, global page.  Shared by all processes.  Can't be trusted.
126 #define UGDATA   (UDATA - PGSIZE)
127
128 // Top of one-page user exception stack
129 #define UXSTACKTOP      UGDATA
130 /* Limit of what is mmap()/munmap()-able */
131 #define UMAPTOP UXSTACKTOP
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 // Maximum stack depth preallocated to 1MB
136 #define USTACK_NUM_PAGES        256
137 // Next page left invalid to guard against stack overflow
138 // Maximum bottom of normal user stack
139 #define USTACKBOT       (USTACKTOP - (USTACK_NUM_PAGES+1)*PGSIZE)
140
141 // Arbitrary boundary between the break and the start of
142 // memory returned by calls to mmap with addr = 0
143 #define BRK_END 0x40000000
144
145 // Where user programs generally begin
146 #define UTEXT           (2*PTSIZE)
147
148 // Used for temporary page mappings.  Typed 'void*' for convenience
149 #define UTEMP           ((void*) PTSIZE)
150 // Used for temporary page mappings for the user page-fault handler
151 // (should not conflict with other temporary page mappings)
152 #define PFTEMP          (UTEMP + PTSIZE - PGSIZE)
153 // The location of the user-level STABS data structure
154 #define USTABDATA       (PTSIZE / 2)
155
156
157 #ifndef __ASSEMBLER__
158
159 /*
160  * The page directory entry corresponding to the virtual address range
161  * [VPT, VPT + PTSIZE) points to the page directory itself.  Thus, the page
162  * directory is treated as a page table as well as a page directory.
163  *
164  * One result of treating the page directory as a page table is that all PTEs
165  * can be accessed through a "virtual page table" at virtual address VPT (to
166  * which vpt is set in entry.S).  The PTE for page number N is stored in
167  * vpt[N].  (It's worth drawing a diagram of this!)
168  *
169  * A second consequence is that the contents of the current page directory
170  * will always be available at virtual address (VPT + (VPT >> PGSHIFT)), to
171  * which vpd is set in entry.S.
172  */
173
174 #ifdef __IVY__
175 #pragma cilnoremove("vpt_lock", "vpd_lock")
176 #endif
177 extern volatile uint32_t vpt_lock;
178 extern volatile uint32_t vpd_lock;
179
180 extern volatile pte_t SLOCKED(&vpt_lock) (COUNT(PTSIZE) SREADONLY vpt)[]; // VA of "virtual page table"
181 extern volatile pde_t SLOCKED(&vpd_lock) (COUNT(PTSIZE) SREADONLY vpd)[]; // VA of current page directory
182
183 #endif /* !__ASSEMBLER__ */
184 #endif /* !ROS_INC_MEMLAYOUT_H */