1 /*
2 * (c) 2008-2009 Adam Lackorzynski <adam@os.inf.tu-dresden.de>,
3 * Alexander Warg <warg@os.inf.tu-dresden.de>
4 * economic rights: Technische Universität Dresden (Germany)
5 *
6 * This file is part of TUD:OS and distributed under the terms of the
7 * GNU General Public License 2.
8 * Please see the COPYING-GPL-2 file for details.
9 */
10
11 #include "init_mem.h"
12 #include "memmap.h"
13 #include "globals.h"
14
15 #include <l4/cxx/iostream>
16 #include <l4/sys/kip>
17 #include <l4/sys/kdebug.h>
18
19 using L4::Kip::Mem_desc;
20
21 void
init_memory(l4_kernel_info_t * info)22 init_memory(l4_kernel_info_t *info)
23 {
24 if (info->version >> 24 != 0x87 /*KIP_VERSION_FIASCO*/ )
25 {
26 L4::cout << PROG_NAME": is designed to run on FIASCO only\n";
27 enter_kdebug("FATAL");
28 }
29
30 #ifdef ARCH_x86
31 char kip_syscalls = l4_info->kip_sys_calls;
32
33 L4::cout << " Found Fiasco: KIP syscalls: "
34 << (kip_syscalls ? "yes\n" : "no\n");
35 #endif
36
37 iomem.add_free(Region(0, ~0UL, 0, L4_FPAGE_RW));
38
39 Region mismatch = Region::invalid();
40 for (auto const &md: L4::Kip::Mem_desc::all(info))
41 {
42 if (md.is_virtual())
43 continue;
44
45 Mem_desc::Mem_type type = md.type();
46 unsigned long start, end;
47 if (type == Mem_desc::Conventional)
48 {
49 start = l4_round_page(md.start());
50 end = l4_trunc_page(md.end() + 1) - 1;
51 }
52 else
53 {
54 start = l4_trunc_page(md.start());
55 end = l4_round_page(md.end()) - 1;
56 }
57
58 switch (type)
59 {
60 case Mem_desc::Conventional:
61 Mem_man::ram()->add_free(Region(start, end));
62 if (!iomem.reserve(Region(start, end, sigma0_taskno, L4_FPAGE_RW)))
63 mismatch = Region(start, end, sigma0_taskno, L4_FPAGE_RW);
64 continue;
65 case Mem_desc::Reserved:
66 case Mem_desc::Dedicated:
67 if (!iomem.reserve(Region(start, end, sigma0_taskno, L4_FPAGE_RW))
68 || !Mem_man::ram()->reserve(Region(start, end, sigma0_taskno)))
69 mismatch = Region(start, end, sigma0_taskno, L4_FPAGE_RW);
70 break;
71 case Mem_desc::Bootloader:
72 if (!iomem.reserve(Region(start, end, sigma0_taskno, L4_FPAGE_RW))
73 || !Mem_man::ram()->reserve(
74 Region(start, end, root_taskno,
75 (L4_fpage_rights)(md.sub_type()
76 & L4_FPAGE_RIGHTS_MASK))))
77 mismatch = Region(start, end, root_taskno);
78 break;
79 case Mem_desc::Info:
80 case Mem_desc::Arch:
81 case Mem_desc::Shared:
82 iomem.add_free(Region(start, end, 0, L4_FPAGE_RW));
83 if (!Mem_man::ram()->reserve(
84 Region(start, end, sigma0_taskno, L4_FPAGE_RW)))
85 mismatch = Region(start, end, root_taskno);
86 break;
87 default:
88 break;
89 }
90
91 if (mismatch.valid())
92 {
93 L4::cout << PROG_NAME": Could not reserve memory\n"
94 << mismatch << "\n";
95 dump_all();
96 abort();
97 }
98 }
99 }
100