1 INTERFACE [ia32,ux,amd64]:
14 * Insert memory descriptor for the Kmem region and finish the memory
16 * @post no more memory descriptors may be added
18 static void setup_kmem_region (Address kmem_base, Address kmem_size);
25 Kip_init::setup_ux(Kip *)
28 IMPLEMENTATION [ia32,ux,amd64]:
38 /** KIP initialization. */
39 PUBLIC static FIASCO_INIT
41 Kip_init::init_freq(Cpu const &cpu)
43 Kip::k()->frequency_cpu = div32(cpu.frequency(), 1000);
47 namespace KIP_namespace
52 Max_len_version = 512,
54 Size_mem_descs = sizeof(Mword) * 2 * Num_mem_descs,
60 char mem_descs[Size_mem_descs];
63 KIP my_kernel_info_page asm("my_kernel_info_page") __attribute__((section(".kernel_info_page"))) =
66 /* 00/00 */ L4_KERNEL_INFO_MAGIC,
67 Config::Kernel_version_id,
68 (Size_mem_descs + sizeof(Kip)) >> 4,
74 /* 50/A0 */ 0, (sizeof(Kip) << (sizeof(Mword)*4)) | Num_mem_descs, {},
76 /* A0/140 */ 0, 0, 0, 0,
78 /* E0/1C0 */ 0, 0, {},
79 /* F0/1D0 */ {"", 0}, {},
85 PUBLIC static FIASCO_INIT
89 Kip *kinfo = reinterpret_cast<Kip*>(&KIP_namespace::my_kernel_info_page);
92 Kip::init_global_kip(kinfo);
95 Kip::k()->sched_granularity = Config::Scheduler_granularity;
97 setup_user_virtual(kinfo);
102 extern char _boot_sys_start[];
103 extern char _boot_sys_end[];
105 for (auto &md: kinfo->mem_descs_a())
107 if (md.type() != Mem_desc::Reserved || md.is_virtual())
110 if (md.start() == (Address)_boot_sys_start
111 && md.end() == (Address)_boot_sys_end - 1)
112 md.type(Mem_desc::Undefined);
114 if (md.contains(Kmem::kernel_image_start())
115 && md.contains(Kmem::kcode_end()-1))
117 md = Mem_desc(Kmem::kernel_image_start(), Kmem::kcode_end() -1,
124 IMPLEMENTATION [amd64]:
126 PRIVATE static inline NOEXPORT NEEDS["kip.h"]
128 Kip_init::reserve_amd64_hole()
130 enum { Trigger = 0x0000800000000000UL };
131 Kip::k()->add_mem_region(Mem_desc(Trigger, ~Trigger,
132 Mem_desc::Reserved, true));
135 IMPLEMENTATION [!amd64]:
137 PRIVATE static inline NOEXPORT
139 Kip_init::reserve_amd64_hole()
142 IMPLEMENTATION [!ux]:
144 PUBLIC static FIASCO_INIT
146 Kip_init::setup_user_virtual(Kip *kinfo)
148 kinfo->add_mem_region(Mem_desc(0, Mem_layout::User_max,
149 Mem_desc::Conventional, true));