The _CPU_Context_switch performs a normal non-FP context switch from the context of the current executing thread to the context of the heir thread.
void _CPU_Context_switch( Context_Control *run, Context_Control *heir );
This routine begins by saving the current state of the
CPU (i.e. the context) in the context area at run
.
Then the routine should load the CPU context pointed to
by heir
. Loading the new context will cause a
branch to its task code, so the task that invoked
_CPU_Context_switch
will not run for a while.
When, eventually, a context switch is made to load
context from *run
again, this task will resume
and _CPU_Context_switch
will return to its caller.
Care should be exercise when writing this routine. All
registers assumed to be preserved across subroutine calls
must be preserved. These registers may be saved in
the task's context area or on its stack. However, the
stack pointer and address to resume executing the task
at must be included in the context (normally the subroutine
return address to the caller of _Thread_Dispatch
.
The decision of where to store the task's context is based
on numerous factors including the capabilities of
the CPU architecture itself and simplicity as well
as external considerations such as debuggers wishing
to examine a task's context. In this case, it is
often simpler to save all data in the context area.
Also there may be special considerations when loading the stack pointers or interrupt level of the incoming task. Independent of CPU specific considerations, if some context is saved on the task stack, then the porter must ensure that the stack pointer is adjusted BEFORE to make room for this context information before the information is written. Otherwise, an interrupt could occur writing over the context data. The following is an example of an INCORRECT sequence:
save part of context beyond current top of stack interrupt pushes context -- overwriting written context interrupt returns adjust stack pointer
Copyright © 1988-2008 OAR Corporation