diff --git a/base-hw/src/core/kernel/scheduler.cc b/base-hw/src/core/kernel/scheduler.cc index beff96021..f0b413a5c 100644 --- a/base-hw/src/core/kernel/scheduler.cc +++ b/base-hw/src/core/kernel/scheduler.cc @@ -38,7 +38,7 @@ void Kernel::Execution_context::_interrupt(unsigned const processor_id) if (timer()->interrupt_id(processor_id) == irq_id) { /* handle scheduling timeout */ - _processor->scheduler()->yield(); + __processor->scheduler()->yield(); timer()->clear_interrupt(processor_id); reset_lap_time(processor_id); } else { @@ -50,3 +50,21 @@ void Kernel::Execution_context::_interrupt(unsigned const processor_id) /* end interrupt request at controller */ pic()->finish_request(); } + + +void Kernel::Execution_context::_schedule() +{ + __processor->scheduler()->insert(this); +} + + +void Kernel::Execution_context::_unschedule() +{ + __processor->scheduler()->remove(this); +} + + +void Kernel::Execution_context::_yield() +{ + __processor->scheduler()->yield(); +} diff --git a/base-hw/src/core/kernel/scheduler.h b/base-hw/src/core/kernel/scheduler.h index fe05fd929..7f999a4f9 100644 --- a/base-hw/src/core/kernel/scheduler.h +++ b/base-hw/src/core/kernel/scheduler.h @@ -297,9 +297,11 @@ class Kernel::Scheduler class Kernel::Execution_context : public Cpu_scheduler::Item { - protected: + private: - Processor * _processor; + Processor * __processor; + + protected: /** * Handle an interrupt exception that occured during execution @@ -308,6 +310,31 @@ class Kernel::Execution_context : public Cpu_scheduler::Item */ void _interrupt(unsigned const processor_id); + /** + * Insert context into the processor scheduling + */ + void _schedule(); + + /** + * Remove context from the processor scheduling + */ + void _unschedule(); + + /** + * Yield currently scheduled processor share of the context + */ + void _yield(); + + + /*************** + ** Accessors ** + ***************/ + + void _processor(Processor * const processor) + { + __processor = processor; + } + public: /** @@ -327,9 +354,14 @@ class Kernel::Execution_context : public Cpu_scheduler::Item /** * Constructor * - * \param p scheduling priority + * \param processor kernel object of targeted processor + * \param priority scheduling priority */ - Execution_context(Priority const p) : Cpu_scheduler::Item(p) { } + Execution_context(Processor * const processor, Priority const priority) + : + Cpu_scheduler::Item(priority), + __processor(processor) + { } /** * Destructor diff --git a/base-hw/src/core/kernel/thread.cc b/base-hw/src/core/kernel/thread.cc index cf7920c46..33427c461 100644 --- a/base-hw/src/core/kernel/thread.cc +++ b/base-hw/src/core/kernel/thread.cc @@ -166,21 +166,21 @@ void Thread::_pause() void Thread::_schedule() { if (_state == SCHEDULED) { return; } - _processor->scheduler()->insert(this); + Execution_context::_schedule(); _state = SCHEDULED; } void Thread::_unschedule(State const s) { - if (_state == SCHEDULED) { _processor->scheduler()->remove(this); } + if (_state == SCHEDULED) { Execution_context::_unschedule(); } _state = s; } Thread::Thread(unsigned const priority, char const * const label) : - Execution_context(priority), + Execution_context(0, priority), Thread_cpu_support(this), _state(AWAITS_START), _pd(0), @@ -201,7 +201,7 @@ Thread::init(Processor * const processor, unsigned const pd_id_arg, assert(_state == AWAITS_START) /* store thread parameters */ - _processor = processor; + Execution_context::_processor(processor); _utcb_phys = utcb_phys; /* join protection domain */ @@ -446,7 +446,7 @@ void Thread::_call_yield_thread() { Thread * const t = Thread::pool()->object(user_arg_1()); if (t) { t->_receive_yielded_cpu(); } - _processor->scheduler()->yield(); + Execution_context::_yield(); } diff --git a/base-hw/src/core/kernel/vm.h b/base-hw/src/core/kernel/vm.h index fcf5c39e0..8fb7b6c99 100644 --- a/base-hw/src/core/kernel/vm.h +++ b/base-hw/src/core/kernel/vm.h @@ -63,21 +63,19 @@ class Kernel::Vm : public Object, Vm(void * const state, Signal_context * const context) : - Execution_context(Priority::MIN), + Execution_context(multiprocessor()->primary(), Priority::MIN), _state((Vm_state * const)state), _context(context) - { - _processor = multiprocessor()->primary(); - } + { } /**************** ** Vm_session ** ****************/ - void run() { _processor->scheduler()->insert(this); } + void run() { Execution_context::_schedule(); } - void pause() { _processor->scheduler()->remove(this); } + void pause() { Execution_context::_unschedule(); } /*********************** @@ -94,7 +92,7 @@ class Kernel::Vm : public Object, case Genode::Cpu_state::DATA_ABORT: _state->dfar = Genode::Cpu::Dfar::read(); default: - _processor->scheduler()->remove(this); + Execution_context::_unschedule(); _context->submit(1); } }