]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/ux/mem_layout-ux.cpp
3c4822618ef2669292ecfe21d1352d2795e2218c
[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     Caps_start         = 0x58000000,
37     Caps_end           = 0x5f000000,
38     Idt                = 0x5f001000,
39     Tbuf_status_page   = 0x5f002000,  ///< % 4KB   for jdb_tbuf
40     Io_map_area_start  = 0x5f003000,
41     Io_map_area_end    = 0x5f006000,
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     Caps_start         = 0x28000000,
62     Caps_end           = 0x2f000000,
63     Idt                = 0x2f001000,
64     Tbuf_status_page   = 0x2f002000,  ///< % 4KB   for jdb_tbuf
65     Io_map_area_start  = 0x2f003000,
66     Io_map_area_end    = 0x2f006000,
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 #include "template_math.h"
80
81 EXTENSION class Mem_layout
82 {
83 public:
84
85   /** Virtuel memory layout -- user address space. */
86   enum
87   {
88     User_max           = 0xc0000000 - Host_as_offset,
89     Tbuf_ubuffer_area  = 0xbfd00000 - Host_as_offset,  ///< % 1MB   size 2MB
90     Utcb_addr          = 0xbff00000 - Host_as_offset,  ///< % 4KB   UTCB map address
91     Utcb_ptr_page_user = 0xbfff0000 - Host_as_offset,  ///< % 4KB
92     Trampoline_page    = 0xbfff1000 - Host_as_offset,  ///< % 4KB
93     Kip_auto_map       = 0xbfff2000 - Host_as_offset,  ///< % 4KB
94     Tbuf_ustatus_page  = 0xbfff3000 - Host_as_offset,  ///< % 4KB
95     Space_index        = 0xc0000000,  ///< % 4MB   v2
96     Kip_index          = 0xc0800000,  ///< % 4MB
97     Syscalls           = 0xeacff000,  ///< % 4KB   syscall page
98   };
99
100   /** Physical memory layout. */
101   enum
102   {
103     Kernel_start_frame        = 0x1000, // Frame 0 special-cased by roottask
104     Trampoline_frame          = 0x2000, // Trampoline Page
105     Utcb_ptr_frame            = 0x3000, // UTCB pointer page
106     Sigstack_cpu0_start_frame = 0x4000, // Kernel Signal Altstack Start
107     Multiboot_frame           = 0x10000, // Multiboot info + modules
108     Sigstack_log2_size        = 15,     // 32kb signal stack size
109     Sigstack_size             = 1 << Sigstack_log2_size,
110     Sigstack_cpu0_end_frame   = Sigstack_cpu0_start_frame // Kernel Signal Altstack End
111                                 + Sigstack_size,
112     Kernel_end_frame          = Sigstack_cpu0_end_frame,
113   };
114
115   enum
116   {
117     Utcb_ptr_page      = Physmem + Utcb_ptr_frame,
118     utcb_ptr_align     = Tl_math::Ld<sizeof(void*)>::Res,
119   };
120
121   /// reflect symbols in linker script
122   static const char task_sighandler_start  asm ("_task_sighandler_start");
123   static const char task_sighandler_end    asm ("_task_sighandler_end");
124
125   static Address const kernel_trampoline_page;
126 };
127
128 IMPLEMENTATION[ux]:
129
130 Address Mem_layout::physmem_offs;
131 Address Mem_layout::pmem_size;
132 Address const Mem_layout::kernel_trampoline_page =
133               phys_to_pmem (Trampoline_frame);
134
135
136 PUBLIC static inline
137 User<Utcb>::Ptr &
138 Mem_layout::user_utcb_ptr(unsigned cpu)
139 {
140   // Allocate each CPUs utcb ptr in a different cacheline to avoid
141   // false sharing.
142   return reinterpret_cast<User<Utcb>::Ptr*>(Utcb_ptr_page + (cpu << utcb_ptr_align))[0];
143 }
144
145
146 PUBLIC static inline
147 void
148 Mem_layout::kphys_base (Address base)
149 {
150   physmem_offs = (Address)Physmem - base;
151 }
152
153 PUBLIC static inline
154 Address
155 Mem_layout::pmem_to_phys (void *addr)
156 {
157   return (unsigned long)addr - Physmem;
158 }
159
160 PUBLIC static inline
161 Address
162 Mem_layout::pmem_to_phys (Address addr)
163 {
164   return addr - Physmem;
165 }
166
167 PUBLIC static inline
168 Address
169 Mem_layout::phys_to_pmem (Address addr)
170 {
171   return addr + Physmem;
172 }
173
174 PUBLIC static inline
175 Mword
176 Mem_layout::in_pmem (Address addr)
177 {
178   return (addr >= Physmem) && (addr < Physmem_end);
179 }