]> rtime.felk.cvut.cz Git - l4.git/blobdiff - l4/pkg/l4re-core/sigma0/server/src/io_backend.cc
Update
[l4.git] / l4 / pkg / l4re-core / sigma0 / server / src / io_backend.cc
diff --git a/l4/pkg/l4re-core/sigma0/server/src/io_backend.cc b/l4/pkg/l4re-core/sigma0/server/src/io_backend.cc
new file mode 100644 (file)
index 0000000..260f3cc
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * (c) 2004-2009 Adam Lackorzynski <adam@os.inf.tu-dresden.de>,
+ *               Alexander Warg <warg@os.inf.tu-dresden.de>
+ *     economic rights: Technische Universität Dresden (Germany)
+ *
+ * This file is part of TUD:OS and distributed under the terms of the
+ * GNU General Public License 2.
+ * Please see the COPYING-GPL-2 file for details.
+ */
+
+#include <l4/cxx/basic_ostream>
+#include <l4/sys/vcon>
+#include <l4/util/atomic.h>
+#include <stddef.h>
+
+inline void *operator new (size_t, void *p) { return p; }
+
+namespace L4 {
+
+  class LogIOBackend : public IOBackend
+  {
+  public:
+    LogIOBackend();
+  protected:
+    void write(char const *str, unsigned len);
+  };
+
+  LogIOBackend::LogIOBackend()
+  {}
+
+  void LogIOBackend::write(char const *str, unsigned len)
+  {
+    l4_msg_regs_t store;
+    l4_msg_regs_t *mr = l4_utcb_mr();
+    unsigned l = len;
+    L4::Cap<L4::Vcon> log(L4_BASE_LOG_CAP);
+
+    __builtin_memcpy(&store, mr, sizeof(store));
+
+    while (len)
+      {
+       l = len;
+       if (l > L4_VCON_WRITE_SIZE)
+         l = L4_VCON_WRITE_SIZE;
+       log->write(str, l);
+       len -= l;
+        str += l;
+      }
+
+    __builtin_memcpy(mr, &store, sizeof(store));
+  }
+
+  typedef char Fake_iobackend[sizeof(LogIOBackend)]
+    __attribute__((aligned(__alignof__(LogIOBackend))));
+  typedef char Fake_ostream[sizeof(BasicOStream)]
+    __attribute__((aligned(__alignof__(BasicOStream))));
+
+  Fake_ostream cout;
+  Fake_ostream cerr;
+
+  static Fake_iobackend _iob;
+
+  void iostream_init();
+
+  void iostream_init()
+  {
+    static l4_umword_t _initialized;
+    if (l4util_xchg(&_initialized, 1) == 0)
+      {
+       LogIOBackend *iob = new (&_iob) LogIOBackend();
+       new (&cerr) BasicOStream(iob);
+       new (&cout) BasicOStream(iob);
+      }
+  }
+};