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:
Joel Sherrill
2007-11-02 13:35:02 +00:00
parent 7cb1d6eaaf
commit 48816d7d7a
5 changed files with 52 additions and 2 deletions

View File

@@ -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>
* libmisc/cpuuse/cpuusagereport.c, rtems/src/ratemonreportstatistics.c:

View File

@@ -1,7 +1,7 @@
/*
* SPARC Dependent Source
*
* COPYRIGHT (c) 1989-1999.
* COPYRIGHT (c) 1989-2007.
* On-Line Applications Research Corporation (OAR).
*
* 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->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

View File

@@ -790,6 +790,25 @@ void _CPU_Context_Initialize(
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
* executing task.

View File

@@ -68,6 +68,22 @@ SCORE_EXTERN volatile boolean _Context_Switch_necessary;
#define _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
*

View File

@@ -75,6 +75,13 @@ void _Thread_Handler( void )
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
* inline asm here