* cris/sim-main.h (struct _sim_cpu): New member
authorHans-Peter Nilsson <hp@axis.com>
Sat, 3 Jan 2009 21:00:48 +0000 (21:00 +0000)
committerHans-Peter Nilsson <hp@axis.com>
Sat, 3 Jan 2009 21:00:48 +0000 (21:00 +0000)
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.

sim/ChangeLog
sim/cris/cris-tmpl.c
sim/cris/crisv10f.c
sim/cris/crisv32f.c
sim/cris/sim-main.h
sim/cris/traps.c

index 100adb980427a7a7be5109f7d1e412667fb7a200..067d2ec0746da649afaafcb63254c0a842d2312e 100644 (file)
@@ -1,5 +1,15 @@
 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_break_13_handler): Handle it like the exit for the last
        thread.
index fe46bf0640dcb37b1c9df549dfde5100dbe68ae8..a4c232cae4d7109fd73f08d6891297bdd3db55a4 100644 (file)
@@ -233,6 +233,14 @@ MY (f_model_mark_set_h_gr) (SIM_CPU *current_cpu, ARGBUF *abuf)
 }
 #endif
 \f
+/* 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.  */
 
 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->thread_cpu_data_size = sizeof (current_cpu->cpu_data);
+  current_cpu->set_target_thread_data = MY (set_target_thread_data);
 #if WITH_HW
   current_cpu->deliver_interrupt = MY (deliver_interrupt);
 #endif
index 3a4e94f0935a8035f6c00f2340b66c9ba0afc443..e500cbffb9bdd6f970b445842d0a2efc6159fa0e 100644 (file)
@@ -22,6 +22,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 #define WANT_CPU_CRISV10F
 
 #define BASENUM 10
+#define CRIS_TLS_REGISTER 14
 #include "cris-tmpl.c"
 
 #if WITH_PROFILE_MODEL_P
index bc66be600d18870f273f44ab81e2f54bb3e476c1..8078717246e1416e3cb108b0508d6c998673c487 100644 (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_MOVEM_FN
 #define BASENUM 32
+#define CRIS_TLS_REGISTER 2
 #include "cris-tmpl.c"
 
 #if WITH_PROFILE_MODEL_P
index 576050a5826da17ae0607a24e215d351d7335699..a39ae17b64ca5ceb02ee65db9363c9253dde5bf7 100644 (file)
@@ -191,6 +191,9 @@ struct _sim_cpu {
   void* (*make_thread_cpu_data) (SIM_CPU *, void *);
   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.
      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
index 081273fac78541215ac18c4d8b9a428dc5d89ab4..aa3b90afefbce4fd922ea07eb73bff43e26197bc 100644 (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_getgid32 200
 #define TARGET_SYS_fcntl64 221
+#define TARGET_SYS_set_thread_area 243
 #define TARGET_SYS_exit_group 252
 
 #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);
          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:
        default:
          retval