/* * \brief Pager implementations that are specific for the HW-core * \author Martin Stein * \date 2012-03-29 */ /* * Copyright (C) 2012-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 /* core includes*/ #include #include #include using namespace Genode; /************* ** Mapping ** *************/ Mapping::Mapping(addr_t const va, addr_t const pa, Cache_attribute const c, bool const io, unsigned const sl2, bool const w) : virt_address(va), phys_address(pa), cacheable(c), io_mem(io), size_log2(sl2), writable(w) { } Mapping::Mapping() : virt_address(0), phys_address(0), cacheable(CACHED), io_mem(0), size_log2(0), writable(0) { } void Mapping::prepare_map_operation() { } /*************** ** Ipc_pager ** ***************/ addr_t Ipc_pager::fault_ip() const { return _fault.ip; } addr_t Ipc_pager::fault_addr() const { return _fault.addr; } bool Ipc_pager::is_write_fault() const { return _fault.writes; } void Ipc_pager::set_reply_mapping(Mapping m) { _mapping = m; } /****************** ** Pager_object ** ******************/ Thread_capability Pager_object::thread_cap() const { return _thread_cap; } void Pager_object::thread_cap(Thread_capability const & c) { _thread_cap = c; } void Pager_object::wake_up() { using Object = Kernel_object; Kernel::ack_signal(Object::_cap.dst()); } void Pager_object::start_paging(Kernel::Signal_receiver * receiver) { using Object = Kernel_object; using Entry = Object_pool::Entry; create(receiver, (unsigned long)this); Entry::cap(Object::_cap); } void Pager_object::exception_handler(Signal_context_capability) { } void Pager_object::unresolved_page_fault_occurred() { Platform_thread * const pt = (Platform_thread *)badge(); if (pt && pt->pd()) PERR("%s -> %s: unresolved pagefault at ip=%lx sp=%lx fault address=%lx", pt->pd()->label(), pt->label(), pt->kernel_object()->ip, pt->kernel_object()->sp, pt->kernel_object()->fault_addr()); } Pager_object::Pager_object(unsigned const badge, Affinity::Location) : Object_pool::Entry(Kernel_object::_cap), _badge(badge) { } /********************** ** Pager_entrypoint ** **********************/ void Pager_entrypoint::dissolve(Pager_object * const o) { remove(o); } Pager_entrypoint::Pager_entrypoint(Rpc_cap_factory &) : Thread("pager_ep"), Kernel_object(true) { start(); } Pager_capability Pager_entrypoint::manage(Pager_object * const o) { o->start_paging(kernel_object()); insert(o); return reinterpret_cap_cast(o->cap()); }