5 EXTENSION class Mem_layout
11 Host_as_size = Config::Host_as_size,
14 Host_as_base = 0xc0000000, // Base for AS calculations
15 Host_as_offset = Host_as_base - Host_as_size,
18 static Address pmem_size;
21 static Address physmem_offs asm ("PHYSMEM_OFFS");
24 INTERFACE[ux-!context_4k]:
26 EXTENSION class Mem_layout
30 /** Virtual memory layout for 2KB kernel thread context. */
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,
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,
51 INTERFACE[ux-context_4k]:
53 EXTENSION class Mem_layout
57 /** Virtual memory layout for 4KB kernel thread context. */
60 Vmem_start = 0x20000000,
61 Caps_start = 0x28000000,
62 Caps_end = 0x2f000000,
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,
79 #include "template_math.h"
81 EXTENSION class Mem_layout
85 /** Virtuel memory layout -- user address space. */
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
100 /** Physical memory layout. */
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
112 Kernel_end_frame = Sigstack_cpu0_end_frame,
117 Utcb_ptr_page = Physmem + Utcb_ptr_frame,
118 utcb_ptr_align = Tl_math::Ld<sizeof(void*)>::Res,
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");
125 static Address const kernel_trampoline_page;
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);
138 Mem_layout::user_utcb_ptr(unsigned cpu)
140 // Allocate each CPUs utcb ptr in a different cacheline to avoid
142 return reinterpret_cast<User<Utcb>::Ptr*>(Utcb_ptr_page + (cpu << utcb_ptr_align))[0];
148 Mem_layout::kphys_base (Address base)
150 physmem_offs = (Address)Physmem - base;
155 Mem_layout::pmem_to_phys (void *addr)
157 return (unsigned long)addr - Physmem;
162 Mem_layout::pmem_to_phys (Address addr)
164 return addr - Physmem;
169 Mem_layout::phys_to_pmem (Address addr)
171 return addr + Physmem;
176 Mem_layout::in_pmem (Address addr)
178 return (addr >= Physmem) && (addr < Physmem_end);