]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/bootstrap/server/src/init_kip_v2.cc
update
[l4.git] / l4 / pkg / bootstrap / server / src / init_kip_v2.cc
1 /**
2  * \file
3  */
4 /*
5  * (c) 2008-2009 Adam Lackorzynski <adam@os.inf.tu-dresden.de>,
6  *               Alexander Warg <warg@os.inf.tu-dresden.de>
7  *     economic rights: Technische Universität Dresden (Germany)
8  *
9  * This file is part of TUD:OS and distributed under the terms of the
10  * GNU General Public License 2.
11  * Please see the COPYING-GPL-2 file for details.
12  */
13
14 #include <stdio.h>
15 #include <string.h>
16 #include <l4/sys/kip.h>
17 #include <l4/util/l4_macros.h>
18 #include "panic.h"
19
20 #include "macros.h"
21 #include "init_kip.h"
22 #include "region.h"
23 #include "startup.h"
24 #include <l4/sys/kip>
25
26 using L4::Kip::Mem_desc;
27
28 extern unsigned char _stack;
29
30 /**
31  * setup Kernel Info Page
32  */
33 void
34 init_kip_v2(void *_l4i, boot_info_t *bi, l4util_mb_info_t *mbi,
35             Region_list *ram, Region_list *regions)
36 {
37   l4_kernel_info_t *l4i = (l4_kernel_info_t *)_l4i;
38
39   unsigned char l4_api = l4i->version >> 24;
40
41   if (l4_api != 0x87 /*VERSION_FIASCO*/)
42     panic("cannot load kernels other than Fiasco");
43
44   Mem_desc *md = Mem_desc::first(_l4i);
45   for (Region const* c = ram->begin(); c != ram->end(); ++c)
46     (md++)->set(c->begin(), c->end(), Mem_desc::Conventional);
47
48   for (Region const *c = regions->begin(); c != regions->end(); ++c)
49     {
50       Mem_desc::Mem_type type = Mem_desc::Reserved;
51       unsigned char sub_type = 0;
52       switch (c->type())
53         {
54         case Region::No_mem:
55         case Region::Ram:
56         case Region::Boot:
57           continue;
58         case Region::Kernel:
59           type = Mem_desc::Reserved;
60           break;
61         case Region::Sigma0:
62           type = Mem_desc::Dedicated;
63           break;
64         case Region::Root:
65           type = Mem_desc::Bootloader;
66           break;
67         case Region::Arch:
68           type = Mem_desc::Arch;
69           sub_type = c->sub_type();
70           break;
71         }
72       (md++)->set(c->begin(), c->end() - 1, type, sub_type);
73     }
74
75   l4i->user_ptr = (unsigned long)mbi;
76
77   /* set up sigma0 info */
78   l4i->sigma0_esp = bi->sigma0_stack;
79   l4i->sigma0_eip          = bi->sigma0_start;
80   printf("  Sigma0 config    ip:"l4_addr_fmt" sp:"l4_addr_fmt"\n",
81          l4i->sigma0_eip, l4i->sigma0_esp);
82
83   /* set up roottask info */
84   //l4i->root_esp = (l4_umword_t) &_stack;
85   l4i->root_eip          = bi->roottask_start;
86   printf("  Roottask config  ip:"l4_addr_fmt" sp:"l4_addr_fmt"\n",
87          l4i->root_eip, l4i->root_esp);
88
89   /* Platform info */
90   strncpy(l4i->platform_info.name, PLATFORM_TYPE,
91           sizeof(l4i->platform_info.name));
92   l4i->platform_info.name[sizeof(l4i->platform_info.name) - 1] = 0;
93 }