forked from Imagelibrary/rtems
2007-11-02 Joel Sherrill <joel.sherrill@OARcorp.com>
* score/cpu/sparc/cpu.c, score/cpu/sparc/rtems/score/cpu.h, score/include/rtems/score/context.h, score/src/threadhandler.c: Fix stack so gdb backtrace does not print corrupted frame message after _Thread_Handler. Daniel Hellstrom <daniel@gaisler.com> provided the SPARC implementation and I made it more general.
This commit is contained in:
@@ -1,3 +1,11 @@
|
|||||||
|
2007-11-02 Joel Sherrill <joel.sherrill@OARcorp.com>
|
||||||
|
|
||||||
|
* score/cpu/sparc/cpu.c, score/cpu/sparc/rtems/score/cpu.h,
|
||||||
|
score/include/rtems/score/context.h, score/src/threadhandler.c: Fix
|
||||||
|
stack so gdb backtrace does not print corrupted frame message after
|
||||||
|
_Thread_Handler. Daniel Hellstrom <daniel@gaisler.com> provided the
|
||||||
|
SPARC implementation and I made it more general.
|
||||||
|
|
||||||
2007-10-26 Glenn Humphrey <glenn.humphrey@OARcorp.com>
|
2007-10-26 Glenn Humphrey <glenn.humphrey@OARcorp.com>
|
||||||
|
|
||||||
* libmisc/cpuuse/cpuusagereport.c, rtems/src/ratemonreportstatistics.c:
|
* libmisc/cpuuse/cpuusagereport.c, rtems/src/ratemonreportstatistics.c:
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* SPARC Dependent Source
|
* SPARC Dependent Source
|
||||||
*
|
*
|
||||||
* COPYRIGHT (c) 1989-1999.
|
* COPYRIGHT (c) 1989-2007.
|
||||||
* On-Line Applications Research Corporation (OAR).
|
* On-Line Applications Research Corporation (OAR).
|
||||||
*
|
*
|
||||||
* The license and distribution terms for this file may be
|
* The license and distribution terms for this file may be
|
||||||
@@ -301,7 +301,7 @@ void _CPU_Context_Initialize(
|
|||||||
|
|
||||||
the_context->o7 = ((uint32_t ) entry_point) - 8;
|
the_context->o7 = ((uint32_t ) entry_point) - 8;
|
||||||
the_context->o6_sp = stack_high - CPU_MINIMUM_STACK_FRAME_SIZE;
|
the_context->o6_sp = stack_high - CPU_MINIMUM_STACK_FRAME_SIZE;
|
||||||
the_context->i6_fp = stack_high;
|
the_context->i6_fp = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Build the PSR for the task. Most everything can be 0 and the
|
* Build the PSR for the task. Most everything can be 0 and the
|
||||||
|
|||||||
@@ -790,6 +790,25 @@ void _CPU_Context_Initialize(
|
|||||||
boolean is_fp
|
boolean is_fp
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This macro is invoked from _Thread_Handler to do whatever CPU
|
||||||
|
* specific magic is required that must be done in the context of
|
||||||
|
* the thread when it starts.
|
||||||
|
*
|
||||||
|
* On the SPARC, this is setting the frame pointer so GDB is happy.
|
||||||
|
* Make GDB stop unwinding at _Thread_Handler, previous register window
|
||||||
|
* Frame pointer is 0 and calling address must be a function with starting
|
||||||
|
* with a SAVE instruction. If return address is leaf-function (no SAVE)
|
||||||
|
* GDB will not look at prev reg window fp.
|
||||||
|
*
|
||||||
|
* _Thread_Handler is known to start with SAVE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define _CPU_Context_Initialization_at_thread_begin() \
|
||||||
|
do { \
|
||||||
|
asm volatile ("set _Thread_Handler,%%i7\n"::); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This routine is responsible for somehow restarting the currently
|
* This routine is responsible for somehow restarting the currently
|
||||||
* executing task.
|
* executing task.
|
||||||
|
|||||||
@@ -68,6 +68,22 @@ SCORE_EXTERN volatile boolean _Context_Switch_necessary;
|
|||||||
#define _Context_Initialize(_the_context, _stack, _size, _isr, _entry, _is_fp) \
|
#define _Context_Initialize(_the_context, _stack, _size, _isr, _entry, _is_fp) \
|
||||||
_CPU_Context_Initialize( _the_context, _stack, _size, _isr, _entry, _is_fp )
|
_CPU_Context_Initialize( _the_context, _stack, _size, _isr, _entry, _is_fp )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This macro is invoked from _Thread_Handler to do whatever CPU
|
||||||
|
* specific magic is required that must be done in the context of
|
||||||
|
* the thread when it starts.
|
||||||
|
*
|
||||||
|
* If the CPU architecture does not require any magic, then this
|
||||||
|
* macro is empty.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined(_CPU_Context_Initialization_at_thread_begin)
|
||||||
|
#define _Context_Initialization_at_thread_begin() \
|
||||||
|
_CPU_Context_Initialization_at_thread_begin()
|
||||||
|
#else
|
||||||
|
#define _Context_Initialization_at_thread_begin()
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Perform Context Switch
|
* @brief Perform Context Switch
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -75,6 +75,13 @@ void _Thread_Handler( void )
|
|||||||
|
|
||||||
executing = _Thread_Executing;
|
executing = _Thread_Executing;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Some CPUs need to tinker with the call frame or registers when the
|
||||||
|
* thread actually begins to execute for the first time. This is a
|
||||||
|
* hook point where the port gets a shot at doing whatever it requires.
|
||||||
|
*/
|
||||||
|
_Context_Initialization_at_thread_begin();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* have to put level into a register for those cpu's that use
|
* have to put level into a register for those cpu's that use
|
||||||
* inline asm here
|
* inline asm here
|
||||||
|
|||||||
Reference in New Issue
Block a user