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