]> rtime.felk.cvut.cz Git - l4.git/blobdiff - kernel/fiasco/src/kern/kmem_alloc.cpp
Update
[l4.git] / kernel / fiasco / src / kern / kmem_alloc.cpp
index 31ab9e6620990c94927af15c6ab8fec68665869a..720276bbfd3b3e63a20a3a8e09fb5e4cc99812b0 100644 (file)
@@ -1,7 +1,7 @@
 INTERFACE:
 
 #include <auto_quota.h>
-#include <slist>
+#include <cxx/slist>
 
 #include "spin_lock.h"
 #include "lock_guard.h"
@@ -63,6 +63,10 @@ public:
     _q->free(size);
   }
 
+  template<typename V>
+  Phys_mem_addr::Value to_phys(V v) const
+  { return _a->to_phys(v); }
+
 private:
   Kmem_alloc *_a;
   Q *_q;
@@ -74,7 +78,6 @@ IMPLEMENTATION:
 #include <cassert>
 
 #include "config.h"
-#include "kdb_ke.h"
 #include "kip.h"
 #include "mem_layout.h"
 #include "mem_region.h"
@@ -139,6 +142,22 @@ Kmem_alloc::free(size_t o, void *p)
   unaligned_free(1UL << o, p);
 }
 
+PUBLIC template<typename T> inline
+T *
+Kmem_alloc::alloc_array(unsigned elems)
+{
+  return new (this->unaligned_alloc(sizeof(T) * elems)) T[elems];
+}
+
+PUBLIC template<typename T> inline
+void
+Kmem_alloc::free_array(T *b, unsigned elems)
+{
+  for (unsigned i = 0; i < elems; ++i)
+    b[i].~T();
+  this->unaligned_free(b, sizeof(T) * elems);
+}
+
 PUBLIC 
 void *
 Kmem_alloc::unaligned_alloc(unsigned long size)
@@ -177,26 +196,24 @@ unsigned long
 Kmem_alloc::create_free_map(Kip const *kip, Mem_region_map_base *map)
 {
   unsigned long available_size = 0;
-  Mem_desc const *md = kip->mem_descs();
-  Mem_desc const *const md_end = md + kip->num_mem_descs();
 
-  for (; md < md_end; ++md)
+  for (auto const &md: kip->mem_descs_a())
     {
-      if (!md->valid())
+      if (!md.valid())
        {
-         const_cast<Mem_desc*>(md)->type(Mem_desc::Undefined);
+         const_cast<Mem_desc &>(md).type(Mem_desc::Undefined);
          continue;
        }
 
-      if (md->is_virtual())
+      if (md.is_virtual())
        continue;
 
-      unsigned long s = md->start();
-      unsigned long e = md->end();
+      unsigned long s = md.start();
+      unsigned long e = md.end();
 
       // Sweep out stupid descriptors (that have the end before the start)
 
-      switch (md->type())
+      switch (md.type())
        {
        case Mem_desc::Conventional:
          s = (s + Config::PAGE_SIZE - 1) & ~(Config::PAGE_SIZE - 1);