Splits x86 into 32 and 64 bit (XCC)
[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 /* TODO: sort out multiboot being in src/ (depends on this) */
16 #ifndef EXTPHYSMEM
17 #define EXTPHYSMEM      0x100000
18 #endif
19
20 #define KSTKSHIFT       (PGSHIFT)                       /* KSTKSIZE == PGSIZE */
21 #define KSTKSIZE        (1 << KSTKSHIFT)        /* size of a static kernel stack */
22
23 /*
24  * User read-only mappings! Anything below here til UWLIM are readonly to user.
25  * They are global pages mapped in at env allocation time.
26  */
27
28 // Same as VPT but read-only for users
29 #define UVPT            (ULIM - PTSIZE)
30
31 /*
32  * Top of user VM. User can manipulate VA from UWLIM-1 and down!
33  */
34
35 // Top of user-accessible VM
36 #define UWLIM           (UVPT - PTSIZE)
37 // Read-only, per-process shared info structures
38 #define UINFO           UWLIM
39
40 // Read-write, per-process shared page for sending asynchronous 
41 // syscalls to the kernel
42 #define UDATA    (UWLIM - PTSIZE)
43
44 // Read-write, global page.  Shared by all processes.  Can't be trusted.
45 #define UGDATA   (UDATA - PGSIZE)
46
47 // Top of one-page user exception stack
48 #define UXSTACKTOP      UGDATA
49 /* Limit of what is mmap()/munmap()-able */
50 #define UMAPTOP UXSTACKTOP
51 // Next page left invalid to guard against exception stack overflow; then:
52 // Top of normal user stack
53 #define USTACKTOP       (UXSTACKTOP - 2*PGSIZE)
54 // Maximum stack depth preallocated to 1MB
55 #define USTACK_NUM_PAGES        256
56 // Next page left invalid to guard against stack overflow
57 // Maximum bottom of normal user stack
58 #define USTACKBOT       (USTACKTOP - (USTACK_NUM_PAGES+1)*PGSIZE)
59
60 // Arbitrary boundary between the break and the start of
61 // memory returned by calls to mmap with addr = 0
62 #define BRK_END 0x40000000
63
64 // Where user programs generally begin
65 #define UTEXT           (2*PTSIZE)
66
67 // Used for temporary page mappings.  Typed 'void*' for convenience
68 #define UTEMP           ((void*) PTSIZE)
69 // Used for temporary page mappings for the user page-fault handler
70 // (should not conflict with other temporary page mappings)
71 #define PFTEMP          (UTEMP + PTSIZE - PGSIZE)
72 // The location of the user-level STABS data structure
73 #define USTABDATA       (PTSIZE / 2)
74
75
76 #ifndef __ASSEMBLER__
77
78 /*
79  * The page directory entry corresponding to the virtual address range
80  * [VPT, VPT + PTSIZE) points to the page directory itself.  Thus, the page
81  * directory is treated as a page table as well as a page directory.
82  *
83  * One result of treating the page directory as a page table is that all PTEs
84  * can be accessed through a "virtual page table" at virtual address VPT (to
85  * which vpt is set in entry.S).  The PTE for page number N is stored in
86  * vpt[N].  (It's worth drawing a diagram of this!)
87  *
88  * A second consequence is that the contents of the current page directory
89  * will always be available at virtual address (VPT + (VPT >> PGSHIFT)), to
90  * which vpd is set in entry.S.
91  */
92
93 #ifdef __IVY__
94 #pragma cilnoremove("vpt_lock", "vpd_lock")
95 #endif
96 extern volatile uint32_t vpt_lock;
97 extern volatile uint32_t vpd_lock;
98
99 extern volatile pte_t *vpt; // VA of "virtual page table"
100 extern volatile pde_t *vpd; // VA of current page directory
101
102 #endif /* !__ASSEMBLER__ */
103 #endif /* !ROS_INC_MEMLAYOUT_H */