#include "initcalls.h"
#include "types.h"
+#include "kip.h"
class Cpu;
+
class Kip_init
{
public:
static void setup_kmem_region (Address kmem_base, Address kmem_size);
};
+IMPLEMENTATION [!ux]:
+
+PRIVATE static inline
+void
+Kip_init::setup_ux(Kip *)
+{}
+
IMPLEMENTATION [ia32,ux,amd64]:
#include <cstring>
#include "config.h"
#include "cpu.h"
#include "div32.h"
-#include "kip.h"
#include "kmem.h"
#include "panic.h"
{
{
/* 00/00 */ L4_KERNEL_INFO_MAGIC,
- Config::kernel_version_id,
+ Config::Kernel_version_id,
(Size_mem_descs + sizeof(Kip)) >> 4,
{}, 0, {},
- /* 10/20 */ 0, 0, 0, 0,
+ /* 10/20 */ 0, {},
/* 20/40 */ 0, 0, {},
/* 30/60 */ 0, 0, {},
/* 40/80 */ 0, 0, {},
- /* 50/A0 */ 0, (sizeof(Kip) << (sizeof(Mword)*4)) | Num_mem_descs, 0, 0,
- /* 60/C0 */ 0, 0, {},
- /* A0/140 */ 0, 0,
- /* B0/160 */ 0, 0, 0,
- /* C0/180 */ {},
- /* D0/1A0 */ {},
+ /* 50/A0 */ 0, (sizeof(Kip) << (sizeof(Mword)*4)) | Num_mem_descs, {},
+ /* 60/C0 */ {},
+ /* A0/140 */ 0, 0, 0, 0,
+ /* B0/160 */ {},
/* E0/1C0 */ 0, 0, {},
- /* F0/1D0 */ { },
+ /* F0/1D0 */ {"", 0}, {},
},
{}
};
void Kip_init::init()
{
Kip *kinfo = reinterpret_cast<Kip*>(&KIP_namespace::my_kernel_info_page);
+ setup_ux(kinfo);
+
Kip::init_global_kip(kinfo);
Kip::k()->clock = 0;
- Kip::k()->sched_granularity = Config::scheduler_granularity;
+ Kip::k()->sched_granularity = Config::Scheduler_granularity;
- setup_user_virtual();
+ setup_user_virtual(kinfo);
reserve_amd64_hole();
PUBLIC static FIASCO_INIT
void
-Kip_init::setup_user_virtual()
+Kip_init::setup_user_virtual(Kip *kinfo)
{
- Kip *kinfo = reinterpret_cast<Kip*>(&KIP_namespace::my_kernel_info_page);
kinfo->add_mem_region(Mem_desc(0, Mem_layout::User_max - 1,
Mem_desc::Conventional, true));
}
-
-IMPLEMENTATION [ux]:
-
-#include "boot_info.h"
-#include "multiboot.h"
-#include <cstring>
-
-PUBLIC static FIASCO_INIT
-void
-Kip_init::setup_user_virtual()
-{
- Kip *kinfo = reinterpret_cast<Kip*>(&KIP_namespace::my_kernel_info_page);
- // start at 64k because on some distributions (like Ubuntu 8.04) it's
- // not allowed to map below a certain treshold
- kinfo->add_mem_region(Mem_desc(Boot_info::min_mappable_address(),
- Mem_layout::User_max - 1,
- Mem_desc::Conventional, true));
-}
-
-PUBLIC static FIASCO_INIT
-void
-Kip_init::setup_ux()
-{
- Kip::init_global_kip((Kip*)&KIP_namespace::my_kernel_info_page);
-
- Multiboot_module *mbm = reinterpret_cast <Multiboot_module*>
- (Kmem::phys_to_virt (Boot_info::mbi_virt()->mods_addr));
- Kip::k()->user_ptr = (unsigned long)(Boot_info::mbi_phys());
- Mem_desc *m = Kip::k()->mem_descs();
-
- // start at 64k because on some distributions (like Ubuntu 8.04) it's
- // not allowed to map below a certain treshold
- *(m++) = Mem_desc(Boot_info::min_mappable_address(),
- ((Boot_info::mbi_virt()->mem_upper + 1024) << 10) - 1,
- Mem_desc::Conventional);
- *(m++) = Mem_desc(Kmem::kernel_image_start(), Kmem::kcode_end() - 1,
- Mem_desc::Reserved);
-
- mbm++;
- Kip::k()->sigma0_ip = mbm->reserved;
- if ((Boot_info::sigma0_start() & Config::PAGE_MASK)
- != ((Boot_info::sigma0_end() + (Config::PAGE_SIZE-1))
- & Config::PAGE_MASK))
- *(m++) = Mem_desc(Boot_info::sigma0_start() & Config::PAGE_MASK,
- ((Boot_info::sigma0_end() + (Config::PAGE_SIZE-1))
- & Config::PAGE_MASK) - 1,
- Mem_desc::Reserved);
-
- mbm++;
- Kip::k()->root_ip = mbm->reserved;
- if ((Boot_info::root_start() & Config::PAGE_MASK)
- != ((Boot_info::root_end() + (Config::PAGE_SIZE-1)) & Config::PAGE_MASK))
- *(m++) = Mem_desc(Boot_info::root_start() & Config::PAGE_MASK,
- ((Boot_info::root_end() + (Config::PAGE_SIZE-1))
- & Config::PAGE_MASK) - 1,
- Mem_desc::Bootloader);
-
- unsigned long version_size = 0;
- for (char const *v = Kip::k()->version_string(); *v; )
- {
- unsigned l = strlen(v) + 1;
- v += l;
- version_size += l;
- }
-
- version_size += 2;
-
- Kip::k()->vhw_offset = (Kip::k()->offset_version_strings << 4) + version_size;
-
- Kip::k()->vhw()->init();
-
- unsigned long mod_start = ~0UL;
- unsigned long mod_end = 0;
-
- mbm++;
-
- if (Boot_info::mbi_virt()->mods_count <= 3)
- return;
-
- for (unsigned i = 0; i < Boot_info::mbi_virt()->mods_count - 3; ++i)
- {
- if (mbm[i].mod_start < mod_start)
- mod_start = mbm[i].mod_start;
-
- if (mbm[i].mod_end > mod_end)
- mod_end = mbm[i].mod_end;
- }
-
- mod_start &= ~(Config::PAGE_SIZE - 1);
- mod_end = (mod_end + Config::PAGE_SIZE -1) & ~(Config::PAGE_SIZE - 1);
-
- if (mod_end > mod_start)
- *(m++) = Mem_desc(mod_start, mod_end - 1, Mem_desc::Bootloader);
-
- *(m++) = Mem_desc(Boot_info::mbi_phys(),
- ((Boot_info::mbi_phys() + Boot_info::mbi_size()
- + Config::PAGE_SIZE-1) & Config::PAGE_MASK) -1,
- Mem_desc::Bootloader);
-}