Data Structures | |
| struct | Context_Control |
| struct | Context_Control_fp |
| struct | CPU_Interrupt_frame |
Defines | |
| #define | _CPU_Context_Get_SP(_context) (_context)->stack_pointer |
| #define | CPU_CONTEXT_FP_SIZE sizeof( Context_Control_fp ) |
| #define | CPU_STACK_MINIMUM_SIZE (1024*4) |
| #define | _CPU_Context_Initialize(_the_context, _stack_base, _size, _isr, _entry_point, _is_fp) |
| #define | _CPU_Context_Fp_start(_base, _offset) ( (void *) _Addresses_Add_offset( (_base), (_offset) ) ) |
Functions | |
| void | _CPU_Context_switch (Context_Control *run, Context_Control *heir) |
| void | _CPU_Context_restore (Context_Control *new_context) |
| void | _CPU_Context_save_fp (Context_Control_fp **fp_context_ptr) |
| void | _CPU_Context_restore_fp (Context_Control_fp **fp_context_ptr) |
Since RTEMS handles integer and floating point contexts separately, this means we have the following 3 context items:
On some processors, it is cost-effective to save only the callee preserved registers during a task context switch. This means that the ISR code needs to save those registers which do not persist across function calls. It is not mandatory to make this distinctions between the caller/callee saves registers for the purpose of minimizing context saved during task switch and on interrupts. If the cost of saving extra registers is minimal, simplicity is the choice. Save the same context on interrupt entry as for tasks in this case.
Additionally, if gdb is to be made aware of RTEMS tasks for this CPU, then care should be used in designing the context area.
On some CPUs with hardware floating point support, the Context_Control_fp structure will not be used or it simply consist of an array of a fixed number of bytes. This is done when the floating point context is dumped by a "FP save context" type instruction and the format is not really defined by the CPU. In this case, there is no need to figure out the exact format -- only the size. Of course, although this is enough information for RTEMS, it is probably not enough for a debugger such as gdb. But that is another problem.
Port Specific Information:
XXX document implementation including references if appropriate
| #define _CPU_Context_Fp_start | ( | _base, | |||
| _offset | ) | ( (void *) _Addresses_Add_offset( (_base), (_offset) ) ) |
The purpose of this macro is to allow the initial pointer into a floating point context area (used to save the floating point context) to be at an arbitrary place in the floating point context area.
This is necessary because some FP units are designed to have their context saved as a stack which grows into lower addresses. Other FP units can be saved by simply moving registers into offsets from the base of the context area. Finally some FP units provide a "dump context" instruction which could fill in from high to low or low to high based on the whim of the CPU designers.
| [in] | _base | is the lowest physical address of the floating point context area |
| [in] | _offset | is the offset into the floating point area |
XXX document implementation including references if appropriate
| #define _CPU_Context_Get_SP | ( | _context | ) | (_context)->stack_pointer |
This macro returns the stack pointer associated with _context.
| [in] | _context | is the thread context area to access |
| #define _CPU_Context_Initialize | ( | _the_context, | |||
| _stack_base, | |||||
| _size, | |||||
| _isr, | |||||
| _entry_point, | |||||
| _is_fp | ) |
Value:
{ \
}
This routine generally does not set any unnecessary register in the context. The state of the "general data" registers is undefined at task start time.
| [in] | _the_context | is the context structure to be initialized |
| [in] | _stack_base | is the lowest physical address of this task's stack |
| [in] | _size | is the size of this task's stack |
| [in] | _isr | is the interrupt disable level |
| [in] | _entry_point | is the thread's entry point. This is always _Thread_Handler |
| [in] | _is_fp | is TRUE if the thread is to be a floating point thread. This is typically only used on CPUs where the FPU may be easily disabled by software such as on the SPARC where the PSR contains an enable FPU bit. |
XXX document implementation including references if appropriate
| #define CPU_CONTEXT_FP_SIZE sizeof( Context_Control_fp ) |
The size of the floating point context area. On some CPUs this will not be a "sizeof" because the format of the floating point area is not defined -- only the size is. This is usually on CPUs with a "floating point save context" instruction.
Port Specific Information:
XXX document implementation including references if appropriate
| #define CPU_STACK_MINIMUM_SIZE (1024*4) |
Should be large enough to run all RTEMS tests. This ensures that a "reasonable" small application should not have any problems.
Port Specific Information:
XXX document implementation including references if appropriate
| void _CPU_Context_restore | ( | Context_Control * | new_context | ) |
This routine is generally used only to restart self in an efficient manner. It may simply be a label in _CPU_Context_switch.
| [in] | new_context | points to the context to be restored. |
XXX document implementation including references if appropriate
| void _CPU_Context_restore_fp | ( | Context_Control_fp ** | fp_context_ptr | ) |
This routine restores the floating point context passed to it.
| [in] | fp_context_ptr | is a pointer to a pointer to a floating point context area to restore |
XXX document implementation including references if appropriate
| void _CPU_Context_save_fp | ( | Context_Control_fp ** | fp_context_ptr | ) |
This routine saves the floating point context passed to it.
| [in] | fp_context_ptr | is a pointer to a pointer to a floating point context area |
XXX document implementation including references if appropriate
| void _CPU_Context_switch | ( | Context_Control * | run, | |
| Context_Control * | heir | |||
| ) |
This routine switches from the run context to the heir context.
| [in] | run | points to the context of the currently executing task |
| [in] | heir | points to the context of the heir task |
XXX document implementation including references if appropriate
1.5.6