1 INTERFACE [ia32,ux,amd64]:
12 * Insert memory descriptor for the Kmem region and finish the memory
14 * @post no more memory descriptors may be added
16 static void setup_kmem_region (Address kmem_base, Address kmem_size);
19 IMPLEMENTATION [ia32,ux,amd64]:
22 #include "boot_info.h"
31 /** KIP initialization. */
32 PUBLIC static FIASCO_INIT
34 Kip_init::init_freq(Cpu const &cpu)
36 Kip::k()->frequency_cpu = div32(cpu.frequency(), 1000);
40 namespace KIP_namespace
45 Max_len_version = 512,
47 Size_mem_descs = sizeof(Mword) * 2 * Num_mem_descs,
53 char mem_descs[Size_mem_descs];
56 KIP my_kernel_info_page asm("my_kernel_info_page") __attribute__((section(".kernel_info_page"))) =
59 /* 00/00 */ L4_KERNEL_INFO_MAGIC,
60 Config::kernel_version_id,
61 (Size_mem_descs + sizeof(Kip)) >> 4,
63 /* 10/20 */ 0, 0, 0, 0,
67 /* 50/A0 */ 0, (sizeof(Kip) << (sizeof(Mword)*4)) | Num_mem_descs, 0, 0,
73 /* E0/1C0 */ 0, 0, {},
80 PUBLIC static FIASCO_INIT
84 Kip *kinfo = reinterpret_cast<Kip*>(&KIP_namespace::my_kernel_info_page);
85 Kip::init_global_kip(kinfo);
88 Kip::k()->sched_granularity = Config::scheduler_granularity;
95 Mem_desc *md = kinfo->mem_descs();
96 Mem_desc *end = md + kinfo->num_mem_descs();
98 extern char _boot_sys_start[];
99 extern char _boot_sys_end[];
101 for (;md != end; ++md)
103 if (md->type() != Mem_desc::Reserved || md->is_virtual())
106 if (md->start() == (Address)_boot_sys_start
107 && md->end() == (Address)_boot_sys_end - 1)
108 md->type(Mem_desc::Undefined);
110 if (md->contains(Kmem::kernel_image_start())
111 && md->contains(Kmem::kcode_end()-1))
113 *md = Mem_desc(Kmem::kernel_image_start(), Kmem::kcode_end() -1,
120 IMPLEMENTATION [amd64]:
122 PRIVATE static inline NOEXPORT NEEDS["kip.h"]
124 Kip_init::reserve_amd64_hole()
126 enum { Trigger = 0x0000800000000000UL };
127 Kip::k()->add_mem_region(Mem_desc(Trigger, ~Trigger,
128 Mem_desc::Reserved, true));
131 IMPLEMENTATION [!amd64]:
133 PRIVATE static inline NOEXPORT
135 Kip_init::reserve_amd64_hole()
138 IMPLEMENTATION [!ux]:
140 PUBLIC static FIASCO_INIT
142 Kip_init::setup_user_virtual()
144 Kip *kinfo = reinterpret_cast<Kip*>(&KIP_namespace::my_kernel_info_page);
145 kinfo->add_mem_region(Mem_desc(0, Mem_layout::User_max - 1,
146 Mem_desc::Conventional, true));
151 #include "boot_info.h"
152 #include "multiboot.h"
155 PUBLIC static FIASCO_INIT
157 Kip_init::setup_user_virtual()
159 Kip *kinfo = reinterpret_cast<Kip*>(&KIP_namespace::my_kernel_info_page);
160 // start at 64k because on some distributions (like Ubuntu 8.04) it's
161 // not allowed to map below a certain treshold
162 kinfo->add_mem_region(Mem_desc(Boot_info::min_mappable_address(),
163 Mem_layout::User_max - 1,
164 Mem_desc::Conventional, true));
167 PUBLIC static FIASCO_INIT
171 Kip::init_global_kip((Kip*)&KIP_namespace::my_kernel_info_page);
173 Multiboot_module *mbm = reinterpret_cast <Multiboot_module*>
174 (Kmem::phys_to_virt (Boot_info::mbi_virt()->mods_addr));
175 Kip::k()->user_ptr = (unsigned long)(Boot_info::mbi_phys());
176 Mem_desc *m = Kip::k()->mem_descs();
178 // start at 64k because on some distributions (like Ubuntu 8.04) it's
179 // not allowed to map below a certain treshold
180 *(m++) = Mem_desc(Boot_info::min_mappable_address(),
181 ((Boot_info::mbi_virt()->mem_upper + 1024) << 10) - 1,
182 Mem_desc::Conventional);
183 *(m++) = Mem_desc(Kmem::kernel_image_start(), Kmem::kcode_end() - 1,
187 Kip::k()->sigma0_ip = mbm->reserved;
188 if ((Boot_info::sigma0_start() & Config::PAGE_MASK)
189 != ((Boot_info::sigma0_end() + (Config::PAGE_SIZE-1))
190 & Config::PAGE_MASK))
191 *(m++) = Mem_desc(Boot_info::sigma0_start() & Config::PAGE_MASK,
192 ((Boot_info::sigma0_end() + (Config::PAGE_SIZE-1))
193 & Config::PAGE_MASK) - 1,
197 Kip::k()->root_ip = mbm->reserved;
198 if ((Boot_info::root_start() & Config::PAGE_MASK)
199 != ((Boot_info::root_end() + (Config::PAGE_SIZE-1)) & Config::PAGE_MASK))
200 *(m++) = Mem_desc(Boot_info::root_start() & Config::PAGE_MASK,
201 ((Boot_info::root_end() + (Config::PAGE_SIZE-1))
202 & Config::PAGE_MASK) - 1,
203 Mem_desc::Bootloader);
205 unsigned long version_size = 0;
206 for (char const *v = Kip::k()->version_string(); *v; )
208 unsigned l = strlen(v) + 1;
215 Kip::k()->vhw_offset = (Kip::k()->offset_version_strings << 4) + version_size;
217 Kip::k()->vhw()->init();
219 unsigned long mod_start = ~0UL;
220 unsigned long mod_end = 0;
224 if (Boot_info::mbi_virt()->mods_count <= 3)
227 for (unsigned i = 0; i < Boot_info::mbi_virt()->mods_count - 3; ++i)
229 if (mbm[i].mod_start < mod_start)
230 mod_start = mbm[i].mod_start;
232 if (mbm[i].mod_end > mod_end)
233 mod_end = mbm[i].mod_end;
236 mod_start &= ~(Config::PAGE_SIZE - 1);
237 mod_end = (mod_end + Config::PAGE_SIZE -1) & ~(Config::PAGE_SIZE - 1);
239 if (mod_end > mod_start)
240 *(m++) = Mem_desc(mod_start, mod_end - 1, Mem_desc::Bootloader);
242 *(m++) = Mem_desc(Boot_info::mbi_phys(),
243 ((Boot_info::mbi_phys() + Boot_info::mbi_size()
244 + Config::PAGE_SIZE-1) & Config::PAGE_MASK) -1,
245 Mem_desc::Bootloader);