]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/ux/mem_layout-ux.cpp
db9bbae0857a8013afe5bfee8569d1dcedb458da
[l4.git] / kernel / fiasco / src / kern / ux / mem_layout-ux.cpp
1 INTERFACE[ux]:
2
3 #include "config.h"
4
5 EXTENSION class Mem_layout
6 {
7 public:
8
9   enum
10   {
11     Host_as_size       = Config::Host_as_size,
12
13     // keep those
14     Host_as_base       = 0xc0000000, // Base for AS calculations
15     Host_as_offset     = Host_as_base - Host_as_size,
16   };
17
18   static Address pmem_size;
19
20 private:
21   static Address physmem_offs asm ("PHYSMEM_OFFS");
22 };
23
24 INTERFACE[ux-!context_4k]:
25
26 EXTENSION class Mem_layout
27 {
28 public:
29
30   /** Virtual memory layout for 2KB kernel thread context. */
31   enum
32   {
33     Vmem_start         = 0x20000000,
34     Glibc_mmap_start   = 0x40000000,  ///<         fixed, Linux kernel spec.
35     Glibc_mmap_end     = 0x50000000,  ///<         hoping that is enough
36     Slabs_start        = 0x50000000,  ///<         multipage slabs
37     Slabs_end          = 0x58000000,
38     Caps_start         = 0x58000000,
39     Caps_end           = 0x5f000000,
40     Idt                = 0x5f001000,
41     Tbuf_status_page   = 0x5f002000,  ///< % 4KB   for jdb_tbuf
42     Tbuf_buffer_area   = 0x5f200000,  ///< % 2MB   tracebuffer
43     Io_bitmap          = 0x5f800000,  ///< % 4MB   dummy
44     _Free_1            = 0x5fc00000,  ///< % 4MB   dummy
45     Vmem_end           = 0x60000000,
46     Physmem            = Vmem_end,    ///< % 4MB   physical memory
47     Physmem_end        = 0xa0000000 - Host_as_offset,
48   };
49 };
50
51 INTERFACE[ux-context_4k]:
52
53 EXTENSION class Mem_layout
54 {
55 public:
56
57   /** Virtual memory layout for 4KB kernel thread context. */
58   enum
59   {
60     Vmem_start         = 0x20000000,
61     Slabs_start        = 0x20000000,  ///<         multipage slabs
62     Slabs_end          = 0x28000000,
63     Caps_start         = 0x28000000,
64     Caps_end           = 0x2f000000,
65     Idt                = 0x2f001000,
66     Tbuf_status_page   = 0x2f002000,  ///< % 4KB   for jdb_tbuf
67     Tbuf_buffer_area   = 0x2f200000,  ///< % 2MB   tracebuffer
68     Io_bitmap          = 0x2f800000,  ///< % 4MB   dummy
69     Glibc_mmap_start   = 0x40000000,  ///<         fixed, Linux kernel spec.
70     Glibc_mmap_end     = 0x50000000,  ///<         hoping that is enough
71     Vmem_end           = 0x90000000,
72     Physmem            = Vmem_end,    ///< % 4MB   physical memory
73     Physmem_end        = 0xb0000000 - Host_as_offset,
74   };
75 };
76
77 INTERFACE[ux]:
78
79 EXTENSION class Mem_layout
80 {
81 public:
82
83   /** Virtuel memory layout -- user address space. */
84   enum
85   {
86     User_max           = 0xc0000000 - Host_as_offset,
87     Tbuf_ubuffer_area  = 0xbfd00000 - Host_as_offset,  ///< % 1MB   size 2MB
88     Utcb_addr          = 0xbff00000 - Host_as_offset,  ///< % 4KB   UTCB map address
89     Utcb_ptr_page_user = 0xbfff0000 - Host_as_offset,  ///< % 4KB
90     Trampoline_page    = 0xbfff1000 - Host_as_offset,  ///< % 4KB
91     Kip_auto_map       = 0xbfff2000 - Host_as_offset,  ///< % 4KB
92     Tbuf_ustatus_page  = 0xbfff3000 - Host_as_offset,  ///< % 4KB
93     Space_index        = 0xc0000000,  ///< % 4MB   v2
94     Kip_index          = 0xc0800000,  ///< % 4MB
95     Syscalls           = 0xeacff000,  ///< % 4KB   syscall page
96   };
97
98   /** Physical memory layout. */
99   enum
100   {
101     Kernel_start_frame        = 0x1000, // Frame 0 special-cased by roottask
102     Trampoline_frame          = 0x2000, // Trampoline Page
103     Utcb_ptr_frame            = 0x3000, // UTCB pointer page
104     Sigstack_cpu0_start_frame = 0x4000, // Kernel Signal Altstack Start
105     Multiboot_frame           = 0x10000, // Multiboot info + modules
106     Sigstack_log2_size        = 15,     // 32kb signal stack size
107     Sigstack_size             = 1 << Sigstack_log2_size,
108     Sigstack_cpu0_end_frame   = Sigstack_cpu0_start_frame // Kernel Signal Altstack End
109                                 + Sigstack_size,
110     Kernel_end_frame          = Sigstack_cpu0_end_frame,
111   };
112
113   enum
114   {
115     Utcb_ptr_page      = Physmem + Utcb_ptr_frame
116   };
117
118   /// reflect symbols in linker script
119   static const char task_sighandler_start  asm ("_task_sighandler_start");
120   static const char task_sighandler_end    asm ("_task_sighandler_end");
121
122   static Address const kernel_trampoline_page;
123 };
124
125 IMPLEMENTATION[ux]:
126
127 Address Mem_layout::physmem_offs;
128 Address Mem_layout::pmem_size;
129 Address const Mem_layout::kernel_trampoline_page =
130               phys_to_pmem (Trampoline_frame);
131
132
133 PUBLIC static inline
134 void
135 Mem_layout::kphys_base (Address base)
136 {
137   physmem_offs = (Address)Physmem - base;
138 }
139
140 PUBLIC static inline
141 Address
142 Mem_layout::pmem_to_phys (void *addr)
143 {
144   return (unsigned long)addr - Physmem;
145 }
146
147 PUBLIC static inline
148 Address
149 Mem_layout::pmem_to_phys (Address addr)
150 {
151   return addr - Physmem;
152 }
153
154 PUBLIC static inline
155 Address
156 Mem_layout::phys_to_pmem (Address addr)
157 {
158   return addr + Physmem;
159 }
160
161 PUBLIC static inline
162 Mword
163 Mem_layout::in_pmem (Address addr)
164 {
165   return (addr >= Physmem) && (addr < Physmem_end);
166 }