/* * \brief Vcpus for l4lx support library. * \author Stefan Kalkowski * \date 2011-04-11 */ /* * 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. */ #ifndef _L4LX__VCPU_H_ #define _L4LX__VCPU_H_ /* Genode includes */ #include #include #include #include #include #include namespace Fiasco { #include } namespace L4lx { extern Genode::Foc_cpu_session_client *vcpu_connection(); class Vcpu : public Genode::Thread_base { private: Genode::Lock _lock; L4_CV void (*_func)(void *data); unsigned long _data; Genode::addr_t _vcpu_state; Timer::Connection _timer; unsigned _cpu_nr; public: Vcpu(const char *str, L4_CV void (*func)(void *data), unsigned long *data, Genode::size_t stack_size, Genode::addr_t vcpu_state, unsigned cpu_nr) : Genode::Thread_base(str, stack_size), _lock(Genode::Cancelable_lock::LOCKED), _func(func), _data(data ? *data : 0), _vcpu_state(vcpu_state), _cpu_nr(cpu_nr) { start(); /* set l4linux specific utcb entry: L4X_UTCB_TCR_ID */ l4_utcb_tcr_u(utcb())->user[0] = tid(); /* enable vcpu functionality respectively */ if (_vcpu_state) vcpu_connection()->enable_vcpu(_thread_cap, _vcpu_state); /* set cpu affinity */ set_affinity(_cpu_nr); } void entry() { _lock.lock(); _func(&_data); Genode::sleep_forever(); } void unblock() { _lock.unlock(); } Genode::addr_t sp() { return ((Genode::addr_t)&_context->stack[-4]) & ~0xf; } Genode::addr_t ip() { return (Genode::addr_t)_func; } Fiasco::l4_utcb_t *utcb() { return _context->utcb; }; Timer::Connection* timer() { return &_timer; } void set_affinity(unsigned i) { vcpu_connection()->affinity(_thread_cap, Genode::Affinity::Location(i, 0)); } }; } #endif /* _L4LX__VCPU_H_ */