/* * \brief Environment expected by the Vancouver code * \author Norman Feske * \date 2011-11-18 */ /* * Copyright (C) 2011-2013 Genode Labs GmbH * * This file is part of the Genode OS framework, which is distributed * under the terms of the GNU General Public License version 2. */ /* Genode includes */ #include #include #include #include /* VMM utils */ #include /* NOVA userland includes */ #include #include enum { verbose_memory_leak = false }; Genode::Lock *printf_lock() { static Genode::Lock inst; return &inst; } typedef Vmm::Utcb_guard::Utcb_backup Utcb_backup; static Utcb_backup utcb_backup; void Logging::printf(const char *format, ...) { va_list list; va_start(list, format); Genode::Lock::Guard guard(*printf_lock()); utcb_backup = *(Utcb_backup *)Genode::Thread_base::myself()->utcb(); Genode::printf("VMM: "); Genode::vprintf(format, list); *(Utcb_backup *)Genode::Thread_base::myself()->utcb() = utcb_backup; va_end(list); } void Logging::vprintf(const char *format, va_list &ap) { Genode::Lock::Guard guard(*printf_lock()); utcb_backup = *(Utcb_backup *)Genode::Thread_base::myself()->utcb(); Genode::printf("VMM: "); Genode::printf(format); PWRN("Logging::vprintf not implemented"); *(Utcb_backup *)Genode::Thread_base::myself()->utcb() = utcb_backup; } void Logging::panic(const char *format, ...) { va_list list; va_start(list, format); Genode::printf("\nVMM PANIC! "); Genode::vprintf(format, list); Genode::printf("\n"); va_end(list); for (;;) Genode::sleep_forever(); } static void *heap_alloc(size_t size) { void *res = Genode::env()->heap()->alloc(size); if (res) return res; PERR("out of memory"); Genode::sleep_forever(); } static void heap_free(void * ptr) { if (Genode::env()->heap()->need_size_for_free()) { PWRN("leaking memory"); return; } Genode::env()->heap()->free(ptr, 0); } void *operator new[](size_t size) { void * addr = heap_alloc(size); if (addr) Genode::memset(addr, 0, size); return addr; } void *operator new[](size_t size, Aligned const alignment) { size_t align = alignment.alignment; void *res = heap_alloc(size + align); if (res) Genode::memset(res, 0, size + align); void *aligned_res = (void *)(((Genode::addr_t)res & ~(align - 1)) + align); return aligned_res; } void *operator new (size_t size) { void * addr = heap_alloc(size); if (addr) Genode::memset(addr, 0, size); return addr; } void operator delete[](void *ptr) { if (verbose_memory_leak) PWRN("delete[] not implemented"); } void operator delete (void * ptr) { heap_free(ptr); } void do_exit(char const *msg) { Genode::printf("*** "); Genode::printf(msg); Genode::printf("\n"); Genode::sleep_forever(); } char __param_table_start; char __param_table_end; /* parameter support */ #include Genode::Fifo &Parameter::all_parameters() { static Genode::Fifo _all_parameters; return _all_parameters; } // EOF