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