Age | Commit message (Collapse) | Author |
|
In uniprocessor and SMP configurations, the context switch extensions
were called during _Thread_Do_dispatch():
void _Thread_Do_dispatch( Per_CPU_Control *cpu_self, ISR_Level level )
{
Thread_Control *executing;
executing = cpu_self->executing;
...
do {
Thread_Control *heir;
heir = _Thread_Get_heir_and_make_it_executing( cpu_self );
...
_User_extensions_Thread_switch( executing, heir );
...
_Context_Switch( &executing->Registers, &heir->Registers );
...
} while ( cpu_self->dispatch_necessary );
...
}
In uniprocessor configurations, this is fine and the context switch
extensions are called for all thread switches except the very first
thread switch to the initialization thread. However, in SMP
configurations, the context switch may be invalidated and updated in the
low-level _Context_Switch() routine. See:
https://docs.rtems.org/branches/master/c-user/symmetric_multiprocessing_services.html#thread-dispatch-details
In case such an update happens, a thread will execute on the processor
which was not seen in the previous call of the context switch
extensions. This can confuse for example event record consumers which
use events generated by a context switch extension.
Fixing this is not straight forward. The context switch extensions call
must move after the low-level context switch. The problem here is that
we may end up in _Thread_Handler(). Adding the context switch
extensions call to _Thread_Handler() covers now also the thread switch
to the initialization thread. We also have to save the last executing
thread (ancestor) of the processor. Registers or the stack cannot be
used for this purpose. We have to add it to the per-processor
information. Existing extensions may be affected, since now context
switch extensions use the stack of the heir thread. The stack checker
is affected by this.
Calling the thread switch extensions in the low-level context switch is
difficult since at this point an intermediate stack is used which is
only large enough to enable servicing of interrupts.
Update #3885.
|
|
Update #3835.
|
|
If the non-preempt mode for threads is supported depends on the
scheduler implementation. Add
_Scheduler_Is_non_preempt_mode_supported() to indicate this.
Update #3876.
|
|
Test for the proper system condition instead of using the
rtems_configuration_is_smp_enabled() workaround.
Update #3876.
|
|
Move the unified workspace configuration constant out of the
configuration table.
Provide a default definition of the unified workspace constant.
Update #3875.
|
|
Move the idle thread body configuration constant out of the
configuration table.
Provide a default definition of the idle thread body constant.
Update #3875.
|
|
Move the idle thread stack size configuration constant out of the
configuration table.
Add THREAD_IDLE_STACK_SIZE_DEFAULT and use it to provide a default
definition of the idle thread stack size constant.
Update #3875.
|
|
Move the ticks per timeslice configuration constant out of the
configuration table.
Add WATCHDOG_TICKS_PER_TIMESLICE_DEFAULT and use it to provide a default
definition of the watchdog ticks per timeslice constant.
Update #3875.
|
|
Remove DEBUG_WORKSPACE support. There are better ways to trace the
application. See Tracing chapter in the RTEMS User Manual.
Remove superfluous includes. Change format.
|
|
|
|
Allocate new thread queue heads during objects information extend. This
removes an error case and the last dependency on the workspace in
_Thread_Initialize().
Update #3835.
|
|
Update #3835.
|
|
Update #3835.
|
|
Update #3835.
|
|
Return block index in _Objects_Extend_information(). This allows to
customize the objects information extend.
Update #3835.
|
|
This function is simple enough to be inlined.
Update #3835.
|
|
Split up the different objects free methods into separate functions.
This helps to avoid a dependency on the workspace in case no objects or
a static set of objects is configured.
Update #3835.
|
|
Split up the different objects allocation methods into separate
functions. This helps to avoid a dependency on the workspace in case no
objects or a static set of objects is configured.
Change license to BSD-2-Clause according to file histories.
Update #3053.
Update #3835.
|
|
This is a preparation to allow a customization of the objects
information extend.
Update #3835.
|
|
Place idle and MPCI stacks into extra linker sections. This can be
optionally used by applications to control the placement of the stacks.
Update #3835.
|
|
Move thread stack allocation to caller side of _Thread_Initialize().
Update #3835.
|
|
Update #3835.
|
|
Add the Thread_Configuration structure to reduce the parameter count of
_Thread_Initialize(). This makes it easier to add more parameters in
the future. It simplifies the code generation since most architectures
do not have that many registers available for function parameters.
Update #3835.
|
|
This allows the linker garbage collection to perform its work.
Update #3835.
|
|
Use the stack area to allocate the TLS area.
Update #3835.
|
|
Use the stack area to allocate the FP context. This considerably
simplifies the application configuration since the task count no longer
influences the configured work space size. With this change the stack
space size is overestimated since an FP context for each thread is
accounted. Memory constraint applications can use the stack size for
fine tuning.
Update #3835.
|
|
This call is superfluous since _Thread_Initialize() will do this also.
Update #3835.
|
|
Update #3835.
|
|
Remove superfluous Thread_Control::Start::stack member.
Update #3835.
|
|
Update #3835.
|
|
Replace the BSP_DIRTY_MEMORY BSP option with a CONFIGURE_DIRTY_MEMORY
configuration option.
Update #3843.
|
|
Use a dedicate system initialization step to zero the memory used for
the workspace and C program heap.
This avoids dead code in case CONFIGURE_ZERO_WORKSPACE_AUTOMATICALLY is
not configured.
|
|
The work area initialization was done by the BSP through
bsp_work_area_initialize(). This approach predated the system
initialization through the system initialization linker set. The
workspace and C program heap were unconditionally initialized. The aim
is to support RTEMS application configurations which do not need the
workspace and C program heap. In these configurations, the workspace
and C prgram heap should not get initialized.
Change all bsp_work_area_initialize() to implement _Memory_Get()
instead. Move the dirty memory, sbrk(), per-CPU data, workspace, and
malloc() heap initialization into separate system initialization steps.
This makes it also easier to test the individual initialization steps.
This change adds a dependency to _Heap_Extend() to all BSPs. This
dependency will be removed in a follow up change.
Update #3838.
|
|
Update #3838.
|
|
Update #3838.
|
|
Only align per-processor data in SMP configurations.
|
|
Remove THREAD_STATUS_PROXY_BLOCKING and replace it with
STATUS_PROXY_BLOCKING.
|
|
The objects node is statically initialized to one. Clear the node field
before it is set.
Update #3621.
|
|
This function is unused.
Update #3735.
|
|
Update #3735.
|
|
Update #3735.
|
|
Replace the user MPCI configuration table with a system provided
_MPCI_Configuration.
Update #3735.
|
|
Two use cases were envisioned for this.
1) a BSP or application which desires to update a real-time clock
when the RTEMS TOD is set.
2) a paravirtualized BSP can use this to propagate setting the time
in an RTEMS application to the hosting environment. This enables
the entire set of applications in the virtualized environments
to have a single consistent TOD.
|
|
Avoid the use of the workspace and use statically allocated switch
controls for the initial extensions.
|
|
|
|
Support for targets compiled with -fno-pic and -mno-relax
|
|
Determine the next block only once and use it throughout.
|
|
Update #3806.
|
|
|
|
This makes it possible to install higher quality timecounter in
plug-and-play systems and helps to override the clock driver provided
timecounter in some test scenarios.
|