* cris/sim-main.h (struct _sim_cpu): New member

set_target_thread_data.
	* cris/crisv32f.c (CRIS_TLS_REGISTER): Define.
	* cris/crisv10f.c: Ditto.
	* cris/cris-tmpl.c (MY (set_target_thread_data)): New function.
	(MY (f_specific_init)): Set new _sim_cpu member to new function.
	* cris/traps.c (TARGET_SYS_set_thread_area): Define.
	(cris_break_13_handler) <case TARGET_SYS_set_thread_area>: New
	case.
This commit is contained in:
Hans-Peter Nilsson
2009-01-03 21:00:48 +00:00
parent 2e1566c6da
commit ddf2c97233
6 changed files with 36 additions and 0 deletions

View File

@ -1,5 +1,15 @@
2009-01-03 Hans-Peter Nilsson <hp@axis.com> 2009-01-03 Hans-Peter Nilsson <hp@axis.com>
* cris/sim-main.h (struct _sim_cpu): New member
set_target_thread_data.
* cris/crisv32f.c (CRIS_TLS_REGISTER): Define.
* cris/crisv10f.c: Ditto.
* cris/cris-tmpl.c (MY (set_target_thread_data)): New function.
(MY (f_specific_init)): Set new _sim_cpu member to new function.
* cris/traps.c (TARGET_SYS_set_thread_area): Define.
(cris_break_13_handler) <case TARGET_SYS_set_thread_area>: New
case.
* cris/traps.c (TARGET_SYS_exit_group): Define. * cris/traps.c (TARGET_SYS_exit_group): Define.
(cris_break_13_handler): Handle it like the exit for the last (cris_break_13_handler): Handle it like the exit for the last
thread. thread.

View File

@ -233,6 +233,14 @@ MY (f_model_mark_set_h_gr) (SIM_CPU *current_cpu, ARGBUF *abuf)
} }
#endif #endif
/* Set the thread register contents. */
void
MY (set_target_thread_data) (SIM_CPU *current_cpu, USI val)
{
(CPU (XCONCAT2 (h_sr_v, BASENUM) [CRIS_TLS_REGISTER])) = val;
}
/* Create the context for a thread. */ /* Create the context for a thread. */
void * void *
@ -256,6 +264,7 @@ MY (f_specific_init) (SIM_CPU *current_cpu)
{ {
current_cpu->make_thread_cpu_data = MY (make_thread_cpu_data); current_cpu->make_thread_cpu_data = MY (make_thread_cpu_data);
current_cpu->thread_cpu_data_size = sizeof (current_cpu->cpu_data); current_cpu->thread_cpu_data_size = sizeof (current_cpu->cpu_data);
current_cpu->set_target_thread_data = MY (set_target_thread_data);
#if WITH_HW #if WITH_HW
current_cpu->deliver_interrupt = MY (deliver_interrupt); current_cpu->deliver_interrupt = MY (deliver_interrupt);
#endif #endif

View File

@ -22,6 +22,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */
#define WANT_CPU_CRISV10F #define WANT_CPU_CRISV10F
#define BASENUM 10 #define BASENUM 10
#define CRIS_TLS_REGISTER 14
#include "cris-tmpl.c" #include "cris-tmpl.c"
#if WITH_PROFILE_MODEL_P #if WITH_PROFILE_MODEL_P

View File

@ -28,6 +28,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */
#define SPECIFIC_U_MEM_FN #define SPECIFIC_U_MEM_FN
#define SPECIFIC_U_MOVEM_FN #define SPECIFIC_U_MOVEM_FN
#define BASENUM 32 #define BASENUM 32
#define CRIS_TLS_REGISTER 2
#include "cris-tmpl.c" #include "cris-tmpl.c"
#if WITH_PROFILE_MODEL_P #if WITH_PROFILE_MODEL_P

View File

@ -191,6 +191,9 @@ struct _sim_cpu {
void* (*make_thread_cpu_data) (SIM_CPU *, void *); void* (*make_thread_cpu_data) (SIM_CPU *, void *);
size_t thread_cpu_data_size; size_t thread_cpu_data_size;
/* The register differs, so we dispatch to a CPU-specific function. */
void (*set_target_thread_data) (SIM_CPU *, USI);
/* CPU-model specific parts go here. /* CPU-model specific parts go here.
Note that in files that don't need to access these pieces WANT_CPU_FOO Note that in files that don't need to access these pieces WANT_CPU_FOO
won't be defined and thus these parts won't appear. This is ok in the won't be defined and thus these parts won't appear. This is ok in the

View File

@ -113,6 +113,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */
#define TARGET_SYS_getegid32 202 #define TARGET_SYS_getegid32 202
#define TARGET_SYS_getgid32 200 #define TARGET_SYS_getgid32 200
#define TARGET_SYS_fcntl64 221 #define TARGET_SYS_fcntl64 221
#define TARGET_SYS_set_thread_area 243
#define TARGET_SYS_exit_group 252 #define TARGET_SYS_exit_group 252
#define TARGET_PROT_READ 0x1 #define TARGET_PROT_READ 0x1
@ -3154,6 +3155,17 @@ cris_break_13_handler (SIM_CPU *current_cpu, USI callnum, USI arg1,
retval = -cb_host_to_target_errno (cb, ENOSYS); retval = -cb_host_to_target_errno (cb, ENOSYS);
break; break;
case TARGET_SYS_set_thread_area:
/* Do the same error check as Linux. */
if (arg1 & 255)
{
retval = -cb_host_to_target_errno (cb, EINVAL);
break;
}
(*current_cpu->set_target_thread_data) (current_cpu, arg1);
retval = 0;
break;
unimplemented_syscall: unimplemented_syscall:
default: default:
retval retval