tizen 2.4 release
[external/binutils.git] / sim / cris / traps.c
1 /* CRIS exception, interrupt, and trap (EIT) support
2    Copyright (C) 2004-2014 Free Software Foundation, Inc.
3    Contributed by Axis Communications.
4
5 This file is part of the GNU simulators.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19
20 #include "sim-main.h"
21 #include "sim-options.h"
22 #include "bfd.h"
23 /* FIXME: get rid of targ-vals.h usage everywhere else.  */
24
25 #include <stdarg.h>
26 #ifdef HAVE_ERRNO_H
27 #include <errno.h>
28 #endif
29 #ifdef HAVE_UNISTD_H
30 #include <unistd.h>
31 #endif
32 #ifdef HAVE_FCNTL_H
33 #include <fcntl.h>
34 #endif
35 #ifdef HAVE_SYS_PARAM_H
36 #include <sys/param.h>
37 #endif
38 #ifdef HAVE_SYS_STAT_H
39 #include <sys/stat.h>
40 #endif
41 /* For PATH_MAX, originally. */
42 #ifdef HAVE_LIMITS_H
43 #include <limits.h>
44 #endif
45
46 /* From ld/sysdep.h.  */
47 #ifdef PATH_MAX
48 # define SIM_PATHMAX PATH_MAX
49 #else
50 # ifdef MAXPATHLEN
51 #  define SIM_PATHMAX MAXPATHLEN
52 # else
53 #  define SIM_PATHMAX 1024
54 # endif
55 #endif
56
57 /* The verbatim values are from asm-cris/unistd.h.  */
58
59 #define TARGET_SYS_exit 1
60 #define TARGET_SYS_read 3
61 #define TARGET_SYS_write 4
62 #define TARGET_SYS_open 5
63 #define TARGET_SYS_close 6
64 #define TARGET_SYS_unlink 10
65 #define TARGET_SYS_time 13
66 #define TARGET_SYS_lseek 19
67 #define TARGET_SYS_getpid 20
68 #define TARGET_SYS_access 33
69 #define TARGET_SYS_kill 37
70 #define TARGET_SYS_rename 38
71 #define TARGET_SYS_pipe 42
72 #define TARGET_SYS_brk 45
73 #define TARGET_SYS_ioctl 54
74 #define TARGET_SYS_fcntl 55
75 #define TARGET_SYS_getppid 64
76 #define TARGET_SYS_setrlimit 75
77 #define TARGET_SYS_gettimeofday  78
78 #define TARGET_SYS_readlink 85
79 #define TARGET_SYS_munmap 91
80 #define TARGET_SYS_truncate 92
81 #define TARGET_SYS_ftruncate 93
82 #define TARGET_SYS_socketcall 102
83 #define TARGET_SYS_stat 106
84 #define TARGET_SYS_fstat 108
85 #define TARGET_SYS_wait4 114
86 #define TARGET_SYS_sigreturn 119
87 #define TARGET_SYS_clone 120
88 #define TARGET_SYS_uname 122
89 #define TARGET_SYS_mprotect 125
90 #define TARGET_SYS_llseek 140
91 #define TARGET_SYS_writev 146
92 #define TARGET_SYS__sysctl 149
93 #define TARGET_SYS_sched_setparam 154
94 #define TARGET_SYS_sched_getparam 155
95 #define TARGET_SYS_sched_setscheduler 156
96 #define TARGET_SYS_sched_getscheduler 157
97 #define TARGET_SYS_sched_yield 158
98 #define TARGET_SYS_sched_get_priority_max 159
99 #define TARGET_SYS_sched_get_priority_min 160
100 #define TARGET_SYS_mremap 163
101 #define TARGET_SYS_poll 168
102 #define TARGET_SYS_rt_sigaction 174
103 #define TARGET_SYS_rt_sigprocmask 175
104 #define TARGET_SYS_rt_sigsuspend 179
105 #define TARGET_SYS_getcwd 183
106 #define TARGET_SYS_ugetrlimit 191
107 #define TARGET_SYS_mmap2 192
108 #define TARGET_SYS_stat64 195
109 #define TARGET_SYS_lstat64 196
110 #define TARGET_SYS_fstat64 197
111 #define TARGET_SYS_geteuid32 201
112 #define TARGET_SYS_getuid32 199
113 #define TARGET_SYS_getegid32 202
114 #define TARGET_SYS_getgid32 200
115 #define TARGET_SYS_fcntl64 221
116 #define TARGET_SYS_set_thread_area 243
117 #define TARGET_SYS_exit_group 252
118
119 #define TARGET_PROT_READ        0x1
120 #define TARGET_PROT_WRITE       0x2
121 #define TARGET_PROT_EXEC        0x4
122 #define TARGET_PROT_NONE        0x0
123
124 #define TARGET_MAP_SHARED       0x01
125 #define TARGET_MAP_PRIVATE      0x02
126 #define TARGET_MAP_TYPE         0x0f
127 #define TARGET_MAP_FIXED        0x10
128 #define TARGET_MAP_ANONYMOUS    0x20
129 #define TARGET_MAP_DENYWRITE    0x800
130
131 #define TARGET_CTL_KERN         1
132 #define TARGET_CTL_VM           2
133 #define TARGET_CTL_NET          3
134 #define TARGET_CTL_PROC         4
135 #define TARGET_CTL_FS           5
136 #define TARGET_CTL_DEBUG        6
137 #define TARGET_CTL_DEV          7
138 #define TARGET_CTL_BUS          8
139 #define TARGET_CTL_ABI          9
140
141 #define TARGET_CTL_KERN_VERSION 4
142
143 /* linux/mman.h */
144 #define TARGET_MREMAP_MAYMOVE  1
145 #define TARGET_MREMAP_FIXED    2
146
147 #define TARGET_TCGETS 0x5401
148
149 #define TARGET_UTSNAME "#7 Thu Jan 1 00:00:00 MET 2009"
150
151 /* Seconds since 1970-01-01 to the above date + 10 minutes;
152    'date -d "Thu Jan 1 00:00:10 MET 2009" +%s'.  */
153 #define TARGET_EPOCH 1230764410
154
155 /* Milliseconds since start of run.  We use the number of syscalls to
156    avoid introducing noise in the execution time.  */
157 #define TARGET_TIME_MS(cpu) ((cpu)->syscalls)
158
159 /* Seconds as in time(2).  */
160 #define TARGET_TIME(cpu) (TARGET_EPOCH + TARGET_TIME_MS (cpu) / 1000)
161
162 #define TARGET_SCHED_OTHER 0
163
164 #define TARGET_RLIMIT_STACK 3
165 #define TARGET_RLIMIT_NOFILE 7
166
167 #define SIM_TARGET_MAX_THREADS 64
168 #define SIM_MAX_ALLOC_CHUNK (512*1024*1024)
169
170 /* From linux/sched.h.  */
171 #define TARGET_CSIGNAL 0x000000ff
172 #define TARGET_CLONE_VM 0x00000100
173 #define TARGET_CLONE_FS 0x00000200
174 #define TARGET_CLONE_FILES 0x00000400
175 #define TARGET_CLONE_SIGHAND 0x00000800
176 #define TARGET_CLONE_PID 0x00001000
177 #define TARGET_CLONE_PTRACE 0x00002000
178 #define TARGET_CLONE_VFORK 0x00004000
179 #define TARGET_CLONE_PARENT 0x00008000
180 #define TARGET_CLONE_THREAD 0x00010000
181 #define TARGET_CLONE_SIGNAL (TARGET_CLONE_SIGHAND | TARGET_CLONE_THREAD)
182
183 /* From asm-cris/poll.h.  */
184 #define TARGET_POLLIN 1
185
186 /* From asm-cris/signal.h.  */
187 #define TARGET_SIG_BLOCK 0
188 #define TARGET_SIG_UNBLOCK 1
189 #define TARGET_SIG_SETMASK 2
190
191 #define TARGET_SIG_DFL 0
192 #define TARGET_SIG_IGN 1
193 #define TARGET_SIG_ERR ((USI)-1)
194
195 #define TARGET_SIGHUP 1
196 #define TARGET_SIGINT 2
197 #define TARGET_SIGQUIT 3
198 #define TARGET_SIGILL 4
199 #define TARGET_SIGTRAP 5
200 #define TARGET_SIGABRT 6
201 #define TARGET_SIGIOT 6
202 #define TARGET_SIGBUS 7
203 #define TARGET_SIGFPE 8
204 #define TARGET_SIGKILL 9
205 #define TARGET_SIGUSR1 10
206 #define TARGET_SIGSEGV 11
207 #define TARGET_SIGUSR2 12
208 #define TARGET_SIGPIPE 13
209 #define TARGET_SIGALRM 14
210 #define TARGET_SIGTERM 15
211 #define TARGET_SIGSTKFLT 16
212 #define TARGET_SIGCHLD 17
213 #define TARGET_SIGCONT 18
214 #define TARGET_SIGSTOP 19
215 #define TARGET_SIGTSTP 20
216 #define TARGET_SIGTTIN 21
217 #define TARGET_SIGTTOU 22
218 #define TARGET_SIGURG 23
219 #define TARGET_SIGXCPU 24
220 #define TARGET_SIGXFSZ 25
221 #define TARGET_SIGVTALRM 26
222 #define TARGET_SIGPROF 27
223 #define TARGET_SIGWINCH 28
224 #define TARGET_SIGIO 29
225 #define TARGET_SIGPOLL SIGIO
226 /* Actually commented out in the kernel header.  */
227 #define TARGET_SIGLOST 29
228 #define TARGET_SIGPWR 30
229 #define TARGET_SIGSYS 31
230
231 /* From include/asm-cris/signal.h.  */
232 #define TARGET_SA_NOCLDSTOP 0x00000001
233 #define TARGET_SA_NOCLDWAIT 0x00000002 /* not supported yet */
234 #define TARGET_SA_SIGINFO 0x00000004
235 #define TARGET_SA_ONSTACK 0x08000000
236 #define TARGET_SA_RESTART 0x10000000
237 #define TARGET_SA_NODEFER 0x40000000
238 #define TARGET_SA_RESETHAND 0x80000000
239 #define TARGET_SA_INTERRUPT 0x20000000 /* dummy -- ignored */
240 #define TARGET_SA_RESTORER 0x04000000
241
242 /* From linux/wait.h.  */
243 #define TARGET_WNOHANG 1
244 #define TARGET_WUNTRACED 2
245 #define TARGET___WNOTHREAD 0x20000000
246 #define TARGET___WALL 0x40000000
247 #define TARGET___WCLONE 0x80000000
248
249 /* From linux/limits.h. */
250 #define TARGET_PIPE_BUF 4096
251
252 /* From unistd.h.  */
253 #define TARGET_R_OK 4
254 #define TARGET_W_OK 2
255 #define TARGET_X_OK 1
256 #define TARGET_F_OK 0
257
258 static const char stat_map[] =
259 "st_dev,2:space,10:space,4:st_mode,4:st_nlink,4:st_uid,4"
260 ":st_gid,4:st_rdev,2:space,10:st_size,8:st_blksize,4:st_blocks,4"
261 ":space,4:st_atime,4:space,4:st_mtime,4:space,4:st_ctime,4:space,4"
262 ":st_ino,8";
263
264 static const CB_TARGET_DEFS_MAP syscall_map[] =
265 {
266   { CB_SYS_open, TARGET_SYS_open },
267   { CB_SYS_close, TARGET_SYS_close },
268   { CB_SYS_read, TARGET_SYS_read },
269   { CB_SYS_write, TARGET_SYS_write },
270   { CB_SYS_lseek, TARGET_SYS_lseek },
271   { CB_SYS_unlink, TARGET_SYS_unlink },
272   { CB_SYS_getpid, TARGET_SYS_getpid },
273   { CB_SYS_fstat, TARGET_SYS_fstat64 },
274   { CB_SYS_lstat, TARGET_SYS_lstat64 },
275   { CB_SYS_stat, TARGET_SYS_stat64 },
276   { CB_SYS_pipe, TARGET_SYS_pipe },
277   { CB_SYS_rename, TARGET_SYS_rename },
278   { CB_SYS_truncate, TARGET_SYS_truncate },
279   { CB_SYS_ftruncate, TARGET_SYS_ftruncate },
280   { 0, -1 }
281 };
282
283 /* An older, 32-bit-only stat mapping.  */
284 static const char stat32_map[] =
285 "st_dev,2:space,2:st_ino,4:st_mode,2:st_nlink,2:st_uid,2"
286 ":st_gid,2:st_rdev,2:space,2:st_size,4:st_blksize,4:st_blocks,4"
287 ":st_atime,4:space,4:st_mtime,4:space,4:st_ctime,4:space,12";
288
289 /* Map for calls using the 32-bit struct stat.  Primarily used by the
290    newlib Linux mapping.  */
291 static const CB_TARGET_DEFS_MAP syscall_stat32_map[] =
292 {
293   { CB_SYS_fstat, TARGET_SYS_fstat },
294   { CB_SYS_stat, TARGET_SYS_stat },
295   { 0, -1 }
296 };
297
298 /* Giving the true value for the running sim process will lead to
299    non-time-invariant behavior.  */
300 #define TARGET_PID 42
301
302 /* Unfortunately, we don't get this from cris.cpu at the moment, and if
303    we did, we'd still don't get a register number with the "16" offset.  */
304 #define TARGET_SRP_REGNUM (16+11)
305
306 /* Extracted by applying
307    awk '/^#define/ { printf "#ifdef %s\n  { %s, %s },\n#endif\n", $2, $2, $3;}'
308    on .../include/asm/errno.h in a GNU/Linux/CRIS installation and
309    adjusting the synonyms.  */
310
311 static const CB_TARGET_DEFS_MAP errno_map[] =
312 {
313 #ifdef EPERM
314   { EPERM, 1 },
315 #endif
316 #ifdef ENOENT
317   { ENOENT, 2 },
318 #endif
319 #ifdef ESRCH
320   { ESRCH, 3 },
321 #endif
322 #ifdef EINTR
323   { EINTR, 4 },
324 #endif
325 #ifdef EIO
326   { EIO, 5 },
327 #endif
328 #ifdef ENXIO
329   { ENXIO, 6 },
330 #endif
331 #ifdef E2BIG
332   { E2BIG, 7 },
333 #endif
334 #ifdef ENOEXEC
335   { ENOEXEC, 8 },
336 #endif
337 #ifdef EBADF
338   { EBADF, 9 },
339 #endif
340 #ifdef ECHILD
341   { ECHILD, 10 },
342 #endif
343 #ifdef EAGAIN
344   { EAGAIN, 11 },
345 #endif
346 #ifdef ENOMEM
347   { ENOMEM, 12 },
348 #endif
349 #ifdef EACCES
350   { EACCES, 13 },
351 #endif
352 #ifdef EFAULT
353   { EFAULT, 14 },
354 #endif
355 #ifdef ENOTBLK
356   { ENOTBLK, 15 },
357 #endif
358 #ifdef EBUSY
359   { EBUSY, 16 },
360 #endif
361 #ifdef EEXIST
362   { EEXIST, 17 },
363 #endif
364 #ifdef EXDEV
365   { EXDEV, 18 },
366 #endif
367 #ifdef ENODEV
368   { ENODEV, 19 },
369 #endif
370 #ifdef ENOTDIR
371   { ENOTDIR, 20 },
372 #endif
373 #ifdef EISDIR
374   { EISDIR, 21 },
375 #endif
376 #ifdef EINVAL
377   { EINVAL, 22 },
378 #endif
379 #ifdef ENFILE
380   { ENFILE, 23 },
381 #endif
382 #ifdef EMFILE
383   { EMFILE, 24 },
384 #endif
385 #ifdef ENOTTY
386   { ENOTTY, 25 },
387 #endif
388 #ifdef ETXTBSY
389   { ETXTBSY, 26 },
390 #endif
391 #ifdef EFBIG
392   { EFBIG, 27 },
393 #endif
394 #ifdef ENOSPC
395   { ENOSPC, 28 },
396 #endif
397 #ifdef ESPIPE
398   { ESPIPE, 29 },
399 #endif
400 #ifdef EROFS
401   { EROFS, 30 },
402 #endif
403 #ifdef EMLINK
404   { EMLINK, 31 },
405 #endif
406 #ifdef EPIPE
407   { EPIPE, 32 },
408 #endif
409 #ifdef EDOM
410   { EDOM, 33 },
411 #endif
412 #ifdef ERANGE
413   { ERANGE, 34 },
414 #endif
415 #ifdef EDEADLK
416   { EDEADLK, 35 },
417 #endif
418 #ifdef ENAMETOOLONG
419   { ENAMETOOLONG, 36 },
420 #endif
421 #ifdef ENOLCK
422   { ENOLCK, 37 },
423 #endif
424 #ifdef ENOSYS
425   { ENOSYS, 38 },
426 #endif
427 #ifdef ENOTEMPTY
428   { ENOTEMPTY, 39 },
429 #endif
430 #ifdef ELOOP
431   { ELOOP, 40 },
432 #endif
433 #ifdef EWOULDBLOCK
434   { EWOULDBLOCK, 11 },
435 #endif
436 #ifdef ENOMSG
437   { ENOMSG, 42 },
438 #endif
439 #ifdef EIDRM
440   { EIDRM, 43 },
441 #endif
442 #ifdef ECHRNG
443   { ECHRNG, 44 },
444 #endif
445 #ifdef EL2NSYNC
446   { EL2NSYNC, 45 },
447 #endif
448 #ifdef EL3HLT
449   { EL3HLT, 46 },
450 #endif
451 #ifdef EL3RST
452   { EL3RST, 47 },
453 #endif
454 #ifdef ELNRNG
455   { ELNRNG, 48 },
456 #endif
457 #ifdef EUNATCH
458   { EUNATCH, 49 },
459 #endif
460 #ifdef ENOCSI
461   { ENOCSI, 50 },
462 #endif
463 #ifdef EL2HLT
464   { EL2HLT, 51 },
465 #endif
466 #ifdef EBADE
467   { EBADE, 52 },
468 #endif
469 #ifdef EBADR
470   { EBADR, 53 },
471 #endif
472 #ifdef EXFULL
473   { EXFULL, 54 },
474 #endif
475 #ifdef ENOANO
476   { ENOANO, 55 },
477 #endif
478 #ifdef EBADRQC
479   { EBADRQC, 56 },
480 #endif
481 #ifdef EBADSLT
482   { EBADSLT, 57 },
483 #endif
484 #ifdef EDEADLOCK
485   { EDEADLOCK, 35 },
486 #endif
487 #ifdef EBFONT
488   { EBFONT, 59 },
489 #endif
490 #ifdef ENOSTR
491   { ENOSTR, 60 },
492 #endif
493 #ifdef ENODATA
494   { ENODATA, 61 },
495 #endif
496 #ifdef ETIME
497   { ETIME, 62 },
498 #endif
499 #ifdef ENOSR
500   { ENOSR, 63 },
501 #endif
502 #ifdef ENONET
503   { ENONET, 64 },
504 #endif
505 #ifdef ENOPKG
506   { ENOPKG, 65 },
507 #endif
508 #ifdef EREMOTE
509   { EREMOTE, 66 },
510 #endif
511 #ifdef ENOLINK
512   { ENOLINK, 67 },
513 #endif
514 #ifdef EADV
515   { EADV, 68 },
516 #endif
517 #ifdef ESRMNT
518   { ESRMNT, 69 },
519 #endif
520 #ifdef ECOMM
521   { ECOMM, 70 },
522 #endif
523 #ifdef EPROTO
524   { EPROTO, 71 },
525 #endif
526 #ifdef EMULTIHOP
527   { EMULTIHOP, 72 },
528 #endif
529 #ifdef EDOTDOT
530   { EDOTDOT, 73 },
531 #endif
532 #ifdef EBADMSG
533   { EBADMSG, 74 },
534 #endif
535 #ifdef EOVERFLOW
536   { EOVERFLOW, 75 },
537 #endif
538 #ifdef ENOTUNIQ
539   { ENOTUNIQ, 76 },
540 #endif
541 #ifdef EBADFD
542   { EBADFD, 77 },
543 #endif
544 #ifdef EREMCHG
545   { EREMCHG, 78 },
546 #endif
547 #ifdef ELIBACC
548   { ELIBACC, 79 },
549 #endif
550 #ifdef ELIBBAD
551   { ELIBBAD, 80 },
552 #endif
553 #ifdef ELIBSCN
554   { ELIBSCN, 81 },
555 #endif
556 #ifdef ELIBMAX
557   { ELIBMAX, 82 },
558 #endif
559 #ifdef ELIBEXEC
560   { ELIBEXEC, 83 },
561 #endif
562 #ifdef EILSEQ
563   { EILSEQ, 84 },
564 #endif
565 #ifdef ERESTART
566   { ERESTART, 85 },
567 #endif
568 #ifdef ESTRPIPE
569   { ESTRPIPE, 86 },
570 #endif
571 #ifdef EUSERS
572   { EUSERS, 87 },
573 #endif
574 #ifdef ENOTSOCK
575   { ENOTSOCK, 88 },
576 #endif
577 #ifdef EDESTADDRREQ
578   { EDESTADDRREQ, 89 },
579 #endif
580 #ifdef EMSGSIZE
581   { EMSGSIZE, 90 },
582 #endif
583 #ifdef EPROTOTYPE
584   { EPROTOTYPE, 91 },
585 #endif
586 #ifdef ENOPROTOOPT
587   { ENOPROTOOPT, 92 },
588 #endif
589 #ifdef EPROTONOSUPPORT
590   { EPROTONOSUPPORT, 93 },
591 #endif
592 #ifdef ESOCKTNOSUPPORT
593   { ESOCKTNOSUPPORT, 94 },
594 #endif
595 #ifdef EOPNOTSUPP
596   { EOPNOTSUPP, 95 },
597 #endif
598 #ifdef EPFNOSUPPORT
599   { EPFNOSUPPORT, 96 },
600 #endif
601 #ifdef EAFNOSUPPORT
602   { EAFNOSUPPORT, 97 },
603 #endif
604 #ifdef EADDRINUSE
605   { EADDRINUSE, 98 },
606 #endif
607 #ifdef EADDRNOTAVAIL
608   { EADDRNOTAVAIL, 99 },
609 #endif
610 #ifdef ENETDOWN
611   { ENETDOWN, 100 },
612 #endif
613 #ifdef ENETUNREACH
614   { ENETUNREACH, 101 },
615 #endif
616 #ifdef ENETRESET
617   { ENETRESET, 102 },
618 #endif
619 #ifdef ECONNABORTED
620   { ECONNABORTED, 103 },
621 #endif
622 #ifdef ECONNRESET
623   { ECONNRESET, 104 },
624 #endif
625 #ifdef ENOBUFS
626   { ENOBUFS, 105 },
627 #endif
628 #ifdef EISCONN
629   { EISCONN, 106 },
630 #endif
631 #ifdef ENOTCONN
632   { ENOTCONN, 107 },
633 #endif
634 #ifdef ESHUTDOWN
635   { ESHUTDOWN, 108 },
636 #endif
637 #ifdef ETOOMANYREFS
638   { ETOOMANYREFS, 109 },
639 #endif
640 #ifdef ETIMEDOUT
641   { ETIMEDOUT, 110 },
642 #endif
643 #ifdef ECONNREFUSED
644   { ECONNREFUSED, 111 },
645 #endif
646 #ifdef EHOSTDOWN
647   { EHOSTDOWN, 112 },
648 #endif
649 #ifdef EHOSTUNREACH
650   { EHOSTUNREACH, 113 },
651 #endif
652 #ifdef EALREADY
653   { EALREADY, 114 },
654 #endif
655 #ifdef EINPROGRESS
656   { EINPROGRESS, 115 },
657 #endif
658 #ifdef ESTALE
659   { ESTALE, 116 },
660 #endif
661 #ifdef EUCLEAN
662   { EUCLEAN, 117 },
663 #endif
664 #ifdef ENOTNAM
665   { ENOTNAM, 118 },
666 #endif
667 #ifdef ENAVAIL
668   { ENAVAIL, 119 },
669 #endif
670 #ifdef EISNAM
671   { EISNAM, 120 },
672 #endif
673 #ifdef EREMOTEIO
674   { EREMOTEIO, 121 },
675 #endif
676 #ifdef EDQUOT
677   { EDQUOT, 122 },
678 #endif
679 #ifdef ENOMEDIUM
680   { ENOMEDIUM, 123 },
681 #endif
682 #ifdef EMEDIUMTYPE
683   { EMEDIUMTYPE, 124 },
684 #endif
685   { 0, -1 }
686 };
687
688 /* Extracted by applying
689    perl -ne 'if ($_ =~ /^#define/) { split;
690      printf "#ifdef $_[1]\n  { %s, 0x%x },\n#endif\n",
691              $_[1], $_[2] =~ /^0/ ? oct($_[2]) : $_[2];}'
692    on pertinent parts of .../include/asm/fcntl.h in a GNU/Linux/CRIS
693    installation and removing synonyms and unnecessary items.  Don't
694    forget the end-marker.  */
695
696 /* These we treat specially, as they're used in the fcntl F_GETFL
697    syscall.  For consistency, open_map is also manually edited to use
698    these macros.  */
699 #define TARGET_O_ACCMODE 0x3
700 #define TARGET_O_RDONLY 0x0
701 #define TARGET_O_WRONLY 0x1
702
703 static const CB_TARGET_DEFS_MAP open_map[] = {
704 #ifdef O_ACCMODE
705   { O_ACCMODE, TARGET_O_ACCMODE },
706 #endif
707 #ifdef O_RDONLY
708   { O_RDONLY, TARGET_O_RDONLY },
709 #endif
710 #ifdef O_WRONLY
711   { O_WRONLY, TARGET_O_WRONLY },
712 #endif
713 #ifdef O_RDWR
714   { O_RDWR, 0x2 },
715 #endif
716 #ifdef O_CREAT
717   { O_CREAT, 0x40 },
718 #endif
719 #ifdef O_EXCL
720   { O_EXCL, 0x80 },
721 #endif
722 #ifdef O_NOCTTY
723   { O_NOCTTY, 0x100 },
724 #endif
725 #ifdef O_TRUNC
726   { O_TRUNC, 0x200 },
727 #endif
728 #ifdef O_APPEND
729   { O_APPEND, 0x400 },
730 #endif
731 #ifdef O_NONBLOCK
732   { O_NONBLOCK, 0x800 },
733 #endif
734 #ifdef O_NDELAY
735   { O_NDELAY, 0x0 },
736 #endif
737 #ifdef O_SYNC
738   { O_SYNC, 0x1000 },
739 #endif
740 #ifdef FASYNC
741   { FASYNC, 0x2000 },
742 #endif
743 #ifdef O_DIRECT
744   { O_DIRECT, 0x4000 },
745 #endif
746 #ifdef O_LARGEFILE
747   { O_LARGEFILE, 0x8000 },
748 #endif
749 #ifdef O_DIRECTORY
750   { O_DIRECTORY, 0x10000 },
751 #endif
752 #ifdef O_NOFOLLOW
753   { O_NOFOLLOW, 0x20000 },
754 #endif
755   { -1, -1 }
756 };
757
758 /* Let's be less drastic and more traceable.  FIXME: mark as noreturn.  */
759 #define abort()                                                 \
760   sim_io_error (sd, "simulator unhandled condition at %s:%d",   \
761                 __FUNCTION__, __LINE__)
762
763 /* Needed for the cris_pipe_nonempty and cris_pipe_empty syscalls.  */
764 static SIM_CPU *current_cpu_for_cb_callback;
765
766 static int syscall_read_mem (host_callback *, struct cb_syscall *,
767                              unsigned long, char *, int);
768 static int syscall_write_mem (host_callback *, struct cb_syscall *,
769                               unsigned long, const char *, int);
770 static USI create_map (SIM_DESC, struct cris_sim_mmapped_page **,
771                        USI addr, USI len);
772 static USI unmap_pages (SIM_DESC, struct cris_sim_mmapped_page **,
773                        USI addr, USI len);
774 static USI is_mapped (SIM_DESC, struct cris_sim_mmapped_page **,
775                        USI addr, USI len);
776 static void dump_statistics (SIM_CPU *current_cpu);
777 static void make_first_thread (SIM_CPU *current_cpu);
778
779 /* Read/write functions for system call interface.  */
780
781 static int
782 syscall_read_mem (host_callback *cb ATTRIBUTE_UNUSED,
783                   struct cb_syscall *sc,
784                   unsigned long taddr, char *buf, int bytes)
785 {
786   SIM_DESC sd = (SIM_DESC) sc->p1;
787   SIM_CPU *cpu = (SIM_CPU *) sc->p2;
788
789   return sim_core_read_buffer (sd, cpu, read_map, buf, taddr, bytes);
790 }
791
792 static int
793 syscall_write_mem (host_callback *cb ATTRIBUTE_UNUSED,
794                    struct cb_syscall *sc,
795                    unsigned long taddr, const char *buf, int bytes)
796 {
797   SIM_DESC sd = (SIM_DESC) sc->p1;
798   SIM_CPU *cpu = (SIM_CPU *) sc->p2;
799
800   return sim_core_write_buffer (sd, cpu, write_map, buf, taddr, bytes);
801 }
802
803 /* When we risk running self-modified code (as in trampolines), this is
804    called from special-case insns.  The silicon CRIS CPU:s have enough
805    cache snooping implemented making this a simulator-only issue.  Tests:
806    gcc.c-torture/execute/931002-1.c execution, -O3 -g
807    gcc.c-torture/execute/931002-1.c execution, -O3 -fomit-frame-pointer.  */
808
809 void
810 cris_flush_simulator_decode_cache (SIM_CPU *current_cpu,
811                                    USI pc ATTRIBUTE_UNUSED)
812 {
813   SIM_DESC sd = CPU_STATE (current_cpu);
814
815 #if WITH_SCACHE
816   if (USING_SCACHE_P (sd))
817     scache_flush_cpu (current_cpu);
818 #endif
819 }
820
821 /* Output statistics at the end of a run.  */
822 static void
823 dump_statistics (SIM_CPU *current_cpu)
824 {
825   SIM_DESC sd = CPU_STATE (current_cpu);
826   CRIS_MISC_PROFILE *profp
827     = CPU_CRIS_MISC_PROFILE (current_cpu);
828   unsigned64 total = profp->basic_cycle_count;
829   const char *textmsg = "Basic clock cycles, total @: %llu\n";
830
831   /* The --cris-stats={basic|unaligned|schedulable|all} counts affect
832      what's included in the "total" count only.  */
833   switch (CPU_CRIS_MISC_PROFILE (current_cpu)->flags
834           & FLAG_CRIS_MISC_PROFILE_ALL)
835     {
836     case FLAG_CRIS_MISC_PROFILE_SIMPLE:
837       break;
838
839     case (FLAG_CRIS_MISC_PROFILE_UNALIGNED | FLAG_CRIS_MISC_PROFILE_SIMPLE):
840       textmsg
841         = "Clock cycles including stall cycles for unaligned accesses @: %llu\n";
842       total += profp->unaligned_mem_dword_count;
843       break;
844
845     case (FLAG_CRIS_MISC_PROFILE_SCHEDULABLE | FLAG_CRIS_MISC_PROFILE_SIMPLE):
846       textmsg = "Schedulable clock cycles, total @: %llu\n";
847       total
848         += (profp->memsrc_stall_count
849             + profp->memraw_stall_count
850             + profp->movemsrc_stall_count
851             + profp->movemdst_stall_count
852             + profp->mulsrc_stall_count
853             + profp->jumpsrc_stall_count
854             + profp->unaligned_mem_dword_count);
855       break;
856
857     case FLAG_CRIS_MISC_PROFILE_ALL:
858       textmsg = "All accounted clock cycles, total @: %llu\n";
859       total
860         += (profp->memsrc_stall_count
861             + profp->memraw_stall_count
862             + profp->movemsrc_stall_count
863             + profp->movemdst_stall_count
864             + profp->movemaddr_stall_count
865             + profp->mulsrc_stall_count
866             + profp->jumpsrc_stall_count
867             + profp->branch_stall_count
868             + profp->jumptarget_stall_count
869             + profp->unaligned_mem_dword_count);
870       break;
871
872     default:
873       abort ();
874
875       sim_io_eprintf (sd,
876                       "Internal inconsistency at %s:%d",
877                       __FILE__, __LINE__);
878       sim_engine_halt (sd, current_cpu, NULL, 0,
879                        sim_stopped, SIM_SIGILL);
880     }
881
882   /* Historically, these messages have gone to stderr, so we'll keep it
883      that way.  It's also easier to then tell it from normal program
884      output.  FIXME: Add redirect option like "run -e file".  */
885   sim_io_eprintf (sd, textmsg, total);
886
887   /* For v32, unaligned_mem_dword_count should always be 0.  For
888      v10, memsrc_stall_count should always be 0.  */
889   sim_io_eprintf (sd, "Memory source stall cycles: %llu\n",
890                   (unsigned long long) (profp->memsrc_stall_count
891                                         + profp->unaligned_mem_dword_count));
892   sim_io_eprintf (sd, "Memory read-after-write stall cycles: %llu\n",
893                   (unsigned long long) profp->memraw_stall_count);
894   sim_io_eprintf (sd, "Movem source stall cycles: %llu\n",
895                   (unsigned long long) profp->movemsrc_stall_count);
896   sim_io_eprintf (sd, "Movem destination stall cycles: %llu\n",
897                   (unsigned long long) profp->movemdst_stall_count);
898   sim_io_eprintf (sd, "Movem address stall cycles: %llu\n",
899                   (unsigned long long) profp->movemaddr_stall_count);
900   sim_io_eprintf (sd, "Multiplication source stall cycles: %llu\n",
901                   (unsigned long long) profp->mulsrc_stall_count);
902   sim_io_eprintf (sd, "Jump source stall cycles: %llu\n",
903                   (unsigned long long) profp->jumpsrc_stall_count);
904   sim_io_eprintf (sd, "Branch misprediction stall cycles: %llu\n",
905                   (unsigned long long) profp->branch_stall_count);
906   sim_io_eprintf (sd, "Jump target stall cycles: %llu\n",
907                   (unsigned long long) profp->jumptarget_stall_count);
908 }
909
910 /* Check whether any part of [addr .. addr + len - 1] is already mapped.
911    Return 1 if a overlap detected, 0 otherwise.  */
912
913 static USI
914 is_mapped (SIM_DESC sd ATTRIBUTE_UNUSED,
915            struct cris_sim_mmapped_page **rootp,
916            USI addr, USI len)
917 {
918   struct cris_sim_mmapped_page *mapp;
919
920   if (len == 0 || (len & 8191))
921     abort ();
922
923   /* Iterate over the reverse-address sorted pages until we find a page in
924      or lower than the checked area.  */
925   for (mapp = *rootp; mapp != NULL && mapp->addr >= addr; mapp = mapp->prev)
926     if (mapp->addr < addr + len && mapp->addr >= addr)
927       return 1;
928
929   return 0;
930 }
931
932 /* Check whether any part of [addr .. addr + len - 1] is *un*mapped.
933    Return 1 if the whole area is mapped, 0 otherwise.  */
934
935 static USI
936 is_mapped_only (SIM_DESC sd ATTRIBUTE_UNUSED,
937                 struct cris_sim_mmapped_page **rootp,
938                 USI addr, USI len)
939 {
940   struct cris_sim_mmapped_page *mapp;
941
942   if (len == 0 || (len & 8191))
943     abort ();
944
945   /* Iterate over the reverse-address sorted pages until we find a page
946      lower than the checked area.  */
947   for (mapp = *rootp; mapp != NULL && mapp->addr >= addr; mapp = mapp->prev)
948     if (addr == mapp->addr && len == 8192)
949       return 1;
950     else if (addr + len > mapp->addr)
951       len -= 8192;
952
953   return 0;
954 }
955
956 /* Debug helper; to be run from gdb.  */
957
958 void
959 cris_dump_map (SIM_CPU *current_cpu)
960 {
961   struct cris_sim_mmapped_page *mapp;
962   USI start, end;
963
964   for (mapp = current_cpu->highest_mmapped_page,
965          start = mapp == NULL ? 0 : mapp->addr + 8192,
966          end = mapp == NULL ? 0 : mapp->addr + 8191;
967        mapp != NULL;
968        mapp = mapp->prev)
969     {
970       if (mapp->addr != start - 8192)
971         {
972           sim_io_eprintf (CPU_STATE (current_cpu), "0x%x..0x%x\n", start, end);
973           end = mapp->addr + 8191;
974         }
975
976       start = mapp->addr;
977     }
978
979   if (current_cpu->highest_mmapped_page != NULL)
980     sim_io_eprintf (CPU_STATE (current_cpu), "0x%x..0x%x\n", start, end);
981 }
982
983 /* Create mmapped memory.  ADDR is -1 if any address will do.  Caller
984    must make sure that the address isn't already mapped.  */
985
986 static USI
987 create_map (SIM_DESC sd, struct cris_sim_mmapped_page **rootp, USI addr,
988             USI len)
989 {
990   struct cris_sim_mmapped_page *mapp;
991   struct cris_sim_mmapped_page **higher_prevp = rootp;
992   USI new_addr = 0x40000000;
993
994   if (addr != (USI) -1)
995     new_addr = addr;
996   else if (*rootp && rootp[0]->addr >= new_addr)
997     new_addr = rootp[0]->addr + 8192;
998
999   if (len != 8192)
1000     {
1001       USI page_addr;
1002
1003       if (len & 8191)
1004         /* Which is better: return an error for this, or just round it up?  */
1005         abort ();
1006
1007       /* Do a recursive call for each page in the request.  */
1008       for (page_addr = new_addr; len != 0; page_addr += 8192, len -= 8192)
1009         if (create_map (sd, rootp, page_addr, 8192) >= (USI) -8191)
1010           abort ();
1011
1012       return new_addr;
1013     }
1014
1015   for (mapp = *rootp;
1016        mapp != NULL && mapp->addr > new_addr;
1017        mapp = mapp->prev)
1018     higher_prevp = &mapp->prev;
1019
1020   /* Assert for consistency that we don't create duplicate maps.  */
1021   if (is_mapped (sd, rootp, new_addr, len))
1022     abort ();
1023
1024   /* Allocate the new page, on the next higher page from the last one
1025      allocated, and link in the new descriptor before previous ones.  */
1026   mapp = malloc (sizeof (*mapp));
1027
1028   if (mapp == NULL)
1029     return (USI) -ENOMEM;
1030
1031   sim_core_attach (sd, NULL, 0, access_read_write_exec, 0,
1032                    new_addr, len,
1033                    0, NULL, NULL);
1034
1035   mapp->addr = new_addr;
1036   mapp->prev = *higher_prevp;
1037   *higher_prevp = mapp;
1038
1039   return new_addr;
1040 }
1041
1042 /* Unmap one or more pages.  */
1043
1044 static USI
1045 unmap_pages (SIM_DESC sd, struct cris_sim_mmapped_page **rootp, USI addr,
1046             USI len)
1047 {
1048   struct cris_sim_mmapped_page *mapp;
1049   struct cris_sim_mmapped_page **higher_prevp = rootp;
1050
1051   if (len != 8192)
1052     {
1053       USI page_addr;
1054       int ret = 0;
1055
1056       if (len & 8191)
1057         /* Which is better: return an error for this, or just round it up?  */
1058         abort ();
1059
1060       /* Loop backwards to make each call is O(1) over the number of pages
1061          allocated, if we're unmapping from the high end of the pages.  */
1062       for (page_addr = addr + len - 8192;
1063            page_addr > addr;
1064            page_addr -= 8192)
1065         if (unmap_pages (sd, rootp, page_addr, 8192))
1066           ret = EINVAL;
1067
1068       if (unmap_pages (sd, rootp, addr, 8192))
1069         ret = EINVAL;
1070
1071       return ret;
1072     }
1073
1074   for (mapp = *rootp; mapp != NULL && mapp->addr > addr; mapp = mapp->prev)
1075     higher_prevp = &mapp->prev;
1076
1077   if (mapp == NULL || mapp->addr != addr)
1078     return EINVAL;
1079
1080   *higher_prevp = mapp->prev;
1081   sim_core_detach (sd, NULL, 0, 0, addr);
1082   free (mapp);
1083   return 0;
1084 }
1085
1086 /* The semantic code invokes this for illegal (unrecognized) instructions.  */
1087
1088 SEM_PC
1089 sim_engine_invalid_insn (SIM_CPU *current_cpu, IADDR cia, SEM_PC vpc)
1090 {
1091   SIM_DESC sd = CPU_STATE (current_cpu);
1092
1093   sim_engine_halt (sd, current_cpu, NULL, cia, sim_stopped, SIM_SIGILL);
1094   return vpc;
1095 }
1096
1097 /* Handlers from the CGEN description that should not be called.  */
1098
1099 USI
1100 cris_bmod_handler (SIM_CPU *current_cpu ATTRIBUTE_UNUSED,
1101                    UINT srcreg ATTRIBUTE_UNUSED,
1102                    USI dstreg ATTRIBUTE_UNUSED)
1103 {
1104   SIM_DESC sd = CPU_STATE (current_cpu);
1105   abort ();
1106 }
1107
1108 void
1109 h_supr_set_handler (SIM_CPU *current_cpu ATTRIBUTE_UNUSED,
1110                     UINT index ATTRIBUTE_UNUSED,
1111                     USI page ATTRIBUTE_UNUSED,
1112                     USI newval ATTRIBUTE_UNUSED)
1113 {
1114   SIM_DESC sd = CPU_STATE (current_cpu);
1115   abort ();
1116 }
1117
1118 USI
1119 h_supr_get_handler (SIM_CPU *current_cpu ATTRIBUTE_UNUSED,
1120                     UINT index ATTRIBUTE_UNUSED,
1121                     USI page ATTRIBUTE_UNUSED)
1122 {
1123   SIM_DESC sd = CPU_STATE (current_cpu);
1124   abort ();
1125 }
1126
1127 /* Swap one context for another.  */
1128
1129 static void
1130 schedule (SIM_CPU *current_cpu, int next)
1131 {
1132   /* Need to mark context-switches in the trace output.  */
1133   if ((CPU_CRIS_MISC_PROFILE (current_cpu)->flags
1134        & FLAG_CRIS_MISC_PROFILE_XSIM_TRACE))
1135     cris_trace_printf (CPU_STATE (current_cpu), current_cpu,
1136                        "\t#:%d\n", next);
1137
1138   /* Copy the current context (if there is one) to its slot.  */
1139   if (current_cpu->thread_data[current_cpu->threadno].cpu_context)
1140     memcpy (current_cpu->thread_data[current_cpu->threadno].cpu_context,
1141             &current_cpu->cpu_data_placeholder,
1142             current_cpu->thread_cpu_data_size);
1143
1144   /* Copy the new context from its slot.  */
1145   memcpy (&current_cpu->cpu_data_placeholder,
1146           current_cpu->thread_data[next].cpu_context,
1147           current_cpu->thread_cpu_data_size);
1148
1149   /* Update needed stuff to indicate the new context.  */
1150   current_cpu->threadno = next;
1151
1152   /* Handle pending signals.  */
1153   if (current_cpu->thread_data[next].sigpending
1154       /* We don't run nested signal handlers.  This means that pause(2)
1155          and sigsuspend(2) do not work in sighandlers, but that
1156          shouldn't be too hard a restriction.  It also greatly
1157          simplifies the code.  */
1158       && current_cpu->thread_data[next].cpu_context_atsignal == NULL)
1159   {
1160     int sig;
1161
1162     /* See if there's really a pending, non-blocked handler.  We don't
1163        queue signals, so just use the first one in ascending order.  */
1164     for (sig = 0; sig < 64; sig++)
1165       if (current_cpu->thread_data[next].sigdata[sig].pending
1166           && !current_cpu->thread_data[next].sigdata[sig].blocked)
1167       {
1168         bfd_byte regbuf[4];
1169         USI sp;
1170         int i;
1171         USI blocked;
1172         USI pc = sim_pc_get (current_cpu);
1173
1174         /* It's simpler to save the CPU context inside the simulator
1175            than on the stack.  */
1176         current_cpu->thread_data[next].cpu_context_atsignal
1177           = (*current_cpu
1178              ->make_thread_cpu_data) (current_cpu,
1179                                       current_cpu->thread_data[next]
1180                                       .cpu_context);
1181
1182         (*CPU_REG_FETCH (current_cpu)) (current_cpu, H_GR_SP, regbuf, 4);
1183         sp = bfd_getl32 (regbuf);
1184
1185         /* Make sure we have an aligned stack.  */
1186         sp &= ~3;
1187
1188         /* Make room for the signal frame, aligned.  FIXME: Check that
1189            the memory exists, map it in if absent.  (BTW, should also
1190            implement on-access automatic stack allocation).  */
1191         sp -= 20;
1192
1193         /* This isn't the same signal frame as the kernel uses, because
1194            we don't want to bother getting all registers on and off the
1195            stack.  */
1196
1197         /* First, we store the currently blocked signals.  */
1198         blocked = 0;
1199         for (i = 0; i < 32; i++)
1200           blocked
1201             |= current_cpu->thread_data[next].sigdata[i + 1].blocked << i;
1202         sim_core_write_aligned_4 (current_cpu, pc, 0, sp, blocked);
1203         blocked = 0;
1204         for (i = 0; i < 31; i++)
1205           blocked
1206             |= current_cpu->thread_data[next].sigdata[i + 33].blocked << i;
1207         sim_core_write_aligned_4 (current_cpu, pc, 0, sp + 4, blocked);
1208
1209         /* Then, the actual instructions.  This is CPU-specific, but we
1210            use instructions from the common subset for v10 and v32 which
1211            should be safe for the time being but could be parametrized
1212            if need be.  */
1213         /* MOVU.W [PC+],R9.  */
1214         sim_core_write_aligned_2 (current_cpu, pc, 0, sp + 8, 0x9c5f);
1215         /* .WORD TARGET_SYS_sigreturn.  */
1216         sim_core_write_aligned_2 (current_cpu, pc, 0, sp + 10,
1217                                   TARGET_SYS_sigreturn);
1218         /* BREAK 13.  */
1219         sim_core_write_aligned_2 (current_cpu, pc, 0, sp + 12, 0xe93d);
1220
1221         /* NOP (on v32; it's SETF on v10, but is the correct compatible
1222            instruction.  Still, it doesn't matter because v10 has no
1223            delay slot for BREAK so it will not be executed).  */
1224         sim_core_write_aligned_2 (current_cpu, pc, 0, sp + 16, 0x05b0);
1225
1226         /* Modify registers to hold the right values for the sighandler
1227            context: updated stackpointer and return address pointing to
1228            the sigreturn stub.  */
1229         bfd_putl32 (sp, regbuf);
1230         (*CPU_REG_STORE (current_cpu)) (current_cpu, H_GR_SP, regbuf, 4);
1231         bfd_putl32 (sp + 8, regbuf);
1232         (*CPU_REG_STORE (current_cpu)) (current_cpu, TARGET_SRP_REGNUM,
1233                                         regbuf, 4);
1234
1235         current_cpu->thread_data[next].sigdata[sig].pending = 0;
1236
1237         /* Block this signal (for the duration of the sighandler).  */
1238         current_cpu->thread_data[next].sigdata[sig].blocked = 1;
1239
1240         sim_pc_set (current_cpu, current_cpu->sighandler[sig]);
1241         bfd_putl32 (sig, regbuf);
1242         (*CPU_REG_STORE (current_cpu)) (current_cpu, H_GR_R10,
1243                                         regbuf, 4);
1244
1245         /* We ignore a SA_SIGINFO flag in the sigaction call; the code I
1246            needed all this for, specifies a SA_SIGINFO call but treats it
1247            like an ordinary sighandler; only the signal number argument is
1248            inspected.  To make future need to implement SA_SIGINFO
1249            correctly possible, we set the siginfo argument register to a
1250            magic (hopefully non-address) number.  (NB: then, you should
1251            just need to pass the siginfo argument; it seems you probably
1252            don't need to implement the specific rt_sigreturn.)  */
1253         bfd_putl32 (0xbad5161f, regbuf);
1254         (*CPU_REG_STORE (current_cpu)) (current_cpu, H_GR_R11,
1255                                         regbuf, 4);
1256
1257         /* The third argument is unused and the kernel sets it to 0.  */
1258         bfd_putl32 (0, regbuf);
1259         (*CPU_REG_STORE (current_cpu)) (current_cpu, H_GR_R12,
1260                                         regbuf, 4);
1261         return;
1262       }
1263
1264     /* No, there actually was no pending signal for this thread.  Reset
1265        this flag.  */
1266     current_cpu->thread_data[next].sigpending = 0;
1267   }
1268 }
1269
1270 /* Reschedule the simplest possible way until something else is absolutely
1271    necessary:
1272    - A. Find the next process (round-robin) that doesn't have at_syscall
1273         set, schedule it.
1274    - B. If there is none, just run the next process, round-robin.
1275    - Clear at_syscall for the current process.  */
1276
1277 static void
1278 reschedule (SIM_CPU *current_cpu)
1279 {
1280   SIM_DESC sd = CPU_STATE (current_cpu);
1281   int i;
1282
1283   /* Iterate over all thread slots, because after a few thread creations
1284      and exits, we don't know where the live ones are.  */
1285   for (i = (current_cpu->threadno + 1) % SIM_TARGET_MAX_THREADS;
1286        i != current_cpu->threadno;
1287        i = (i + 1) % SIM_TARGET_MAX_THREADS)
1288     if (current_cpu->thread_data[i].cpu_context
1289         && current_cpu->thread_data[i].at_syscall == 0)
1290       {
1291         schedule (current_cpu, i);
1292         return;
1293       }
1294
1295   /* Pick any next live thread.  */
1296   for (i = (current_cpu->threadno + 1) % SIM_TARGET_MAX_THREADS;
1297        i != current_cpu->threadno;
1298        i = (i + 1) % SIM_TARGET_MAX_THREADS)
1299     if (current_cpu->thread_data[i].cpu_context)
1300       {
1301         schedule (current_cpu, i);
1302         return;
1303       }
1304
1305   /* More than one live thread, but we couldn't find the next one?  */
1306   abort ();
1307 }
1308
1309 /* Set up everything to receive (or IGN) an incoming signal to the
1310    current context.  */
1311
1312 static int
1313 deliver_signal (SIM_CPU *current_cpu, int sig, unsigned int pid)
1314 {
1315   int i;
1316   USI pc = sim_pc_get (current_cpu);
1317
1318   /* Find the thread index of the pid. */
1319   for (i = 0; i < SIM_TARGET_MAX_THREADS; i++)
1320     /* Apparently it's ok to send signals to zombies (so a check for
1321        current_cpu->thread_data[i].cpu_context != NULL would be
1322        wrong). */
1323     if (current_cpu->thread_data[i].threadid == pid - TARGET_PID)
1324       {
1325         if (sig < 64)
1326           switch (current_cpu->sighandler[sig])
1327             {
1328             case TARGET_SIG_DFL:
1329               switch (sig)
1330                 {
1331                   /* The following according to the glibc
1332                      documentation. (The kernel code has non-obvious
1333                      execution paths.)  */
1334                 case TARGET_SIGFPE:
1335                 case TARGET_SIGILL:
1336                 case TARGET_SIGSEGV:
1337                 case TARGET_SIGBUS:
1338                 case TARGET_SIGABRT:
1339                 case TARGET_SIGTRAP:
1340                 case TARGET_SIGSYS:
1341
1342                 case TARGET_SIGTERM:
1343                 case TARGET_SIGINT:
1344                 case TARGET_SIGQUIT:
1345                 case TARGET_SIGKILL:
1346                 case TARGET_SIGHUP:
1347
1348                 case TARGET_SIGALRM:
1349                 case TARGET_SIGVTALRM:
1350                 case TARGET_SIGPROF:
1351                 case TARGET_SIGSTOP:
1352
1353                 case TARGET_SIGPIPE:
1354                 case TARGET_SIGLOST:
1355                 case TARGET_SIGXCPU:
1356                 case TARGET_SIGXFSZ:
1357                 case TARGET_SIGUSR1:
1358                 case TARGET_SIGUSR2:
1359                   sim_io_eprintf (CPU_STATE (current_cpu),
1360                                   "Exiting pid %d due to signal %d\n",
1361                                   pid, sig);
1362                   sim_engine_halt (CPU_STATE (current_cpu), current_cpu,
1363                                    NULL, pc, sim_stopped,
1364                                    sig == TARGET_SIGABRT
1365                                    ? SIM_SIGABRT : SIM_SIGILL);
1366                   return 0;
1367
1368                   /* The default for all other signals is to be ignored.  */
1369                 default:
1370                   return 0;
1371                 }
1372
1373             case TARGET_SIG_IGN:
1374               switch (sig)
1375                 {
1376                 case TARGET_SIGKILL:
1377                 case TARGET_SIGSTOP:
1378                   /* Can't ignore these signals.  */
1379                   sim_io_eprintf (CPU_STATE (current_cpu),
1380                                   "Exiting pid %d due to signal %d\n",
1381                                   pid, sig);
1382                   sim_engine_halt (CPU_STATE (current_cpu), current_cpu,
1383                                    NULL, pc, sim_stopped, SIM_SIGILL);
1384                   return 0;
1385
1386                 default:
1387                   return 0;
1388                 }
1389               break;
1390
1391             default:
1392               /* Mark the signal as pending, making schedule () check
1393                  closer.  The signal will be handled when the thread is
1394                  scheduled and the signal is unblocked.  */
1395               current_cpu->thread_data[i].sigdata[sig].pending = 1;
1396               current_cpu->thread_data[i].sigpending = 1;
1397               return 0;
1398             }
1399         else
1400           {
1401             sim_io_eprintf (CPU_STATE (current_cpu),
1402                             "Unimplemented signal: %d\n", sig);
1403             sim_engine_halt (CPU_STATE (current_cpu), current_cpu, NULL, pc,
1404                              sim_stopped, SIM_SIGILL);
1405           }
1406       }
1407
1408   return
1409     -cb_host_to_target_errno (STATE_CALLBACK (CPU_STATE (current_cpu)),
1410                               ESRCH);
1411 }
1412
1413 /* Make the vector and the first item, the main thread.  */
1414
1415 static void
1416 make_first_thread (SIM_CPU *current_cpu)
1417 {
1418   SIM_DESC sd = CPU_STATE (current_cpu);
1419   current_cpu->thread_data
1420     = xcalloc (1,
1421                SIM_TARGET_MAX_THREADS
1422                * sizeof (current_cpu->thread_data[0]));
1423   current_cpu->thread_data[0].cpu_context
1424     = (*current_cpu->make_thread_cpu_data) (current_cpu,
1425                                             &current_cpu
1426                                             ->cpu_data_placeholder);
1427   current_cpu->thread_data[0].parent_threadid = -1;
1428
1429   /* For good measure.  */
1430   if (TARGET_SIG_DFL != 0)
1431     abort ();
1432 }
1433
1434 /* Handle unknown system calls.  Returns (if it does) the syscall
1435    return value.  */
1436
1437 static USI
1438 cris_unknown_syscall (SIM_CPU *current_cpu, USI pc, char *s, ...)
1439 {
1440   SIM_DESC sd = CPU_STATE (current_cpu);
1441   host_callback *cb = STATE_CALLBACK (sd);
1442
1443   if (cris_unknown_syscall_action == CRIS_USYSC_MSG_STOP
1444       || cris_unknown_syscall_action == CRIS_USYSC_MSG_ENOSYS)
1445     {
1446       va_list ap;
1447
1448       va_start (ap, s);
1449       sim_io_evprintf (sd, s, ap);
1450       va_end (ap);
1451
1452       if (cris_unknown_syscall_action == CRIS_USYSC_MSG_STOP)
1453         sim_engine_halt (sd, current_cpu, NULL, pc, sim_stopped, SIM_SIGILL);
1454     }
1455
1456   return -cb_host_to_target_errno (cb, ENOSYS);
1457 }
1458
1459 /* Main function: the handler of the "break 13" syscall insn.  */
1460
1461 USI
1462 cris_break_13_handler (SIM_CPU *current_cpu, USI callnum, USI arg1,
1463                        USI arg2, USI arg3, USI arg4, USI arg5, USI arg6,
1464                        USI pc)
1465 {
1466   CB_SYSCALL s;
1467   SIM_DESC sd = CPU_STATE (current_cpu);
1468   host_callback *cb = STATE_CALLBACK (sd);
1469   int retval;
1470   int threadno = current_cpu->threadno;
1471
1472   current_cpu->syscalls++;
1473
1474   CB_SYSCALL_INIT (&s);
1475   s.func = callnum;
1476   s.arg1 = arg1;
1477   s.arg2 = arg2;
1478   s.arg3 = arg3;
1479
1480   /* The type of s.arg2 is long, so for hosts with 64-bit longs, we need
1481      to sign-extend the lseek offset to be passed as a signed number,
1482      else we'll truncate it to something > 2GB on hosts where sizeof
1483      long > sizeof USI.  We avoid doing it for all syscalls, as arg2 is
1484      e.g. an address for some syscalls.  */
1485   if (callnum == TARGET_SYS_lseek)
1486     s.arg2 = (SI) arg2;
1487
1488   if (callnum == TARGET_SYS_exit_group
1489       || (callnum == TARGET_SYS_exit && current_cpu->m1threads == 0))
1490     {
1491       if (CPU_CRIS_MISC_PROFILE (current_cpu)->flags
1492           & FLAG_CRIS_MISC_PROFILE_ALL)
1493         dump_statistics (current_cpu);
1494       sim_engine_halt (sd, current_cpu, NULL, pc, sim_exited, arg1);
1495     }
1496
1497   s.p1 = (PTR) sd;
1498   s.p2 = (PTR) current_cpu;
1499   s.read_mem = syscall_read_mem;
1500   s.write_mem = syscall_write_mem;
1501
1502   current_cpu_for_cb_callback = current_cpu;
1503
1504   if (cb_syscall (cb, &s) != CB_RC_OK)
1505     {
1506       abort ();
1507       sim_io_eprintf (sd, "Break 13: invalid %d?  Returned %ld\n", callnum,
1508                       s.result);
1509       sim_engine_halt (sd, current_cpu, NULL, pc, sim_stopped, SIM_SIGILL);
1510     }
1511
1512   retval = s.result == -1 ? -s.errcode : s.result;
1513
1514   if (s.errcode != 0 && s.errcode == cb_host_to_target_errno (cb, ENOSYS))
1515     {
1516       /* If the generic simulator call said ENOSYS, then let's try the
1517          ones we know ourselves.
1518
1519          The convention is to provide *very limited* functionality on an
1520          as-needed basis, only what's covered by the test-suite, tests
1521          added when functionality changes and abort with a descriptive
1522          message for *everything* else.  Where there's no test-case, we
1523          just abort.  */
1524       switch (callnum)
1525         {
1526         case 0:
1527           /* It's a pretty safe bet that the "old setup() system call"
1528              number will not be re-used; we can't say the same for higher
1529              numbers.  We treat this simulator-generated call as "wait
1530              forever"; we re-run this insn.  The wait is ended by a
1531              callback.  Sanity check that this is the reason we got
1532              here. */
1533           if (current_cpu->thread_data == NULL
1534               || (current_cpu->thread_data[threadno].pipe_write_fd == 0))
1535             goto unimplemented_syscall;
1536
1537           sim_pc_set (current_cpu, pc);
1538           retval = arg1;
1539           break;
1540
1541         case TARGET_SYS_fcntl64:
1542         case TARGET_SYS_fcntl:
1543           switch (arg2)
1544             {
1545             case 1:
1546               /* F_GETFD.
1547                  Glibc checks stdin, stdout and stderr fd:s for
1548                  close-on-exec security sanity.  We just need to provide a
1549                  OK return value.  If we really need to have a
1550                  close-on-exec flag true, we could just do a real fcntl
1551                  here.  */
1552               retval = 0;
1553               break;
1554
1555             case 2:
1556               /* F_SETFD.  Just ignore attempts to set the close-on-exec
1557                  flag.  */
1558               retval = 0;
1559               break;
1560
1561             case 3:
1562               /* F_GETFL.  Check for the special case for open+fdopen.  */
1563               if (current_cpu->last_syscall == TARGET_SYS_open
1564                   && arg1 == current_cpu->last_open_fd)
1565                 {
1566                   retval = current_cpu->last_open_flags & TARGET_O_ACCMODE;
1567                   break;
1568                 }
1569               else if (arg1 == 0)
1570                 {
1571                   /* Because we can't freopen fd:s 0, 1, 2 to mean
1572                      something else than stdin, stdout and stderr
1573                      (sim/common/syscall.c:cb_syscall special cases fd
1574                      0, 1 and 2), we know what flags that we can
1575                      sanely return for these fd:s.  */
1576                   retval = TARGET_O_RDONLY;
1577                   break;
1578                 }
1579               else if (arg1 == 1 || arg1 == 2)
1580                 {
1581                   retval = TARGET_O_WRONLY;
1582                   break;
1583                 }
1584               /* FALLTHROUGH */
1585             default:
1586               /* Nothing else is implemented.  */
1587               retval
1588                 = cris_unknown_syscall (current_cpu, pc,
1589                                         "Unimplemented %s syscall "
1590                                         "(fd: 0x%lx: cmd: 0x%lx arg: "
1591                                         "0x%lx)\n",
1592                                         callnum == TARGET_SYS_fcntl
1593                                         ? "fcntl" : "fcntl64",
1594                                         (unsigned long) (USI) arg1,
1595                                         (unsigned long) (USI) arg2,
1596                                         (unsigned long) (USI) arg3);
1597               break;
1598             }
1599           break;
1600
1601         case TARGET_SYS_uname:
1602           {
1603             /* Fill in a few constants to appease glibc.  */
1604             static char sim_utsname[6][65] =
1605             {
1606               "Linux",
1607               "sim-target",
1608               "2.6.27",
1609               TARGET_UTSNAME,
1610               "cris",           /* Overwritten below.  */
1611               "localdomain"
1612             };
1613
1614             /* Having the hardware type in Linux equal to the bfd
1615                printable name is deliberate: if you make config.guess
1616                work on your Linux-type system the usual way, it
1617                probably will; either the bfd printable_name or the
1618                ambiguous arch_name.  */
1619             strcpy (sim_utsname[4], STATE_ARCHITECTURE (sd)->printable_name);
1620
1621             if ((s.write_mem) (cb, &s, arg1, (const char *) sim_utsname,
1622                                sizeof (sim_utsname))
1623                 != sizeof (sim_utsname))
1624               retval = -cb_host_to_target_errno (cb, EFAULT);
1625             else
1626               retval = 0;
1627             break;
1628           }
1629
1630         case TARGET_SYS_geteuid32:
1631           /* We tell the truth with these.  Maybe we shouldn't, but it
1632              should match the "stat" information.  */
1633           retval = geteuid ();
1634           break;
1635
1636         case TARGET_SYS_getuid32:
1637           retval = getuid ();
1638           break;
1639
1640         case TARGET_SYS_getegid32:
1641           retval = getegid ();
1642           break;
1643
1644         case TARGET_SYS_getgid32:
1645           retval = getgid ();
1646           break;
1647
1648         case TARGET_SYS_brk:
1649           /* Most often, we just return the argument, like the Linux
1650              kernel.  */
1651           retval = arg1;
1652
1653           if (arg1 == 0)
1654             retval = current_cpu->endbrk;
1655           else if (arg1 <= current_cpu->endmem)
1656             current_cpu->endbrk = arg1;
1657           else
1658             {
1659               USI new_end = (arg1 + 8191) & ~8191;
1660
1661               /* If the simulator wants to brk more than a certain very
1662                  large amount, something is wrong.  FIXME: Return an error
1663                  or abort?  Have command-line selectable?  */
1664               if (new_end - current_cpu->endmem > SIM_MAX_ALLOC_CHUNK)
1665                 {
1666                   current_cpu->endbrk = current_cpu->endmem;
1667                   retval = current_cpu->endmem;
1668                   break;
1669                 }
1670
1671               sim_core_attach (sd, NULL, 0, access_read_write_exec, 0,
1672                                current_cpu->endmem,
1673                                new_end - current_cpu->endmem,
1674                                0, NULL, NULL);
1675               current_cpu->endbrk = arg1;
1676               current_cpu->endmem = new_end;
1677             }
1678           break;
1679
1680         case TARGET_SYS_getpid:
1681           /* Correct until CLONE_THREAD is implemented.  */
1682           retval = current_cpu->thread_data == NULL
1683             ? TARGET_PID
1684             : TARGET_PID + current_cpu->thread_data[threadno].threadid;
1685           break;
1686
1687         case TARGET_SYS_getppid:
1688           /* Correct until CLONE_THREAD is implemented.  */
1689           retval = current_cpu->thread_data == NULL
1690             ? TARGET_PID - 1
1691             : (TARGET_PID
1692                + current_cpu->thread_data[threadno].parent_threadid);
1693           break;
1694
1695         case TARGET_SYS_mmap2:
1696           {
1697             USI addr = arg1;
1698             USI len = arg2;
1699             USI prot = arg3;
1700             USI flags = arg4;
1701             USI fd = arg5;
1702             USI pgoff = arg6;
1703
1704             /* At 2.6.27, Linux (many (all?) ports, in the mmap2 syscalls)
1705                still masked away this bit, so let's just ignore
1706                it.  */
1707             flags &= ~TARGET_MAP_DENYWRITE;
1708
1709             /* If the simulator wants to mmap more than the very large
1710                limit, something is wrong.  FIXME: Return an error or
1711                abort?  Have command-line selectable?  */
1712             if (len > SIM_MAX_ALLOC_CHUNK)
1713               {
1714                 retval = -cb_host_to_target_errno (cb, ENOMEM);
1715                 break;
1716               }
1717
1718             if ((prot != (TARGET_PROT_READ | TARGET_PROT_WRITE)
1719                  && (prot
1720                      != (TARGET_PROT_READ
1721                          | TARGET_PROT_WRITE
1722                          | TARGET_PROT_EXEC))
1723                  && (prot != (TARGET_PROT_READ | TARGET_PROT_EXEC))
1724                  && prot != TARGET_PROT_READ)
1725                 || (flags != (TARGET_MAP_ANONYMOUS | TARGET_MAP_PRIVATE)
1726                     && flags != TARGET_MAP_PRIVATE
1727                     && flags != (TARGET_MAP_ANONYMOUS
1728                                  | TARGET_MAP_PRIVATE | TARGET_MAP_FIXED)
1729                     && flags != (TARGET_MAP_PRIVATE | TARGET_MAP_FIXED)
1730                     && flags != TARGET_MAP_SHARED)
1731                 || (fd != (USI) -1
1732                     && prot != TARGET_PROT_READ
1733                     && prot != (TARGET_PROT_READ | TARGET_PROT_EXEC)
1734                     && prot != (TARGET_PROT_READ | TARGET_PROT_WRITE))
1735                 || (fd == (USI) -1 && pgoff != 0)
1736                 || (fd != (USI) -1 && (flags & TARGET_MAP_ANONYMOUS)))
1737               {
1738                 retval
1739                   = cris_unknown_syscall (current_cpu, pc,
1740                                                  "Unimplemented mmap2 call "
1741                                                  "(0x%lx, 0x%lx, 0x%lx, "
1742                                                  "0x%lx, 0x%lx, 0x%lx)\n",
1743                                                  (unsigned long) arg1,
1744                                                  (unsigned long) arg2,
1745                                                  (unsigned long) arg3,
1746                                                  (unsigned long) arg4,
1747                                                  (unsigned long) arg5,
1748                                                  (unsigned long) arg6);
1749                 break;
1750               }
1751             else if (fd != (USI) -1)
1752               {
1753                 /* Map a file.  */
1754
1755                 USI newaddr;
1756                 USI pos;
1757
1758                 /* A non-aligned argument is allowed for files.  */
1759                 USI newlen = (len + 8191) & ~8191;
1760
1761                 /* We only support read, read|exec, and read|write,
1762                    which we should already have checked.  Check again
1763                    anyway.  */
1764                 if (prot != TARGET_PROT_READ
1765                     && prot != (TARGET_PROT_READ | TARGET_PROT_EXEC)
1766                     && prot != (TARGET_PROT_READ | TARGET_PROT_WRITE))
1767                   abort ();
1768
1769                 if (flags & TARGET_MAP_FIXED)
1770                   unmap_pages (sd, &current_cpu->highest_mmapped_page,
1771                                addr, newlen);
1772                 else if (is_mapped (sd, &current_cpu->highest_mmapped_page,
1773                                     addr, newlen))
1774                   addr = 0;
1775
1776                 newaddr
1777                   = create_map (sd, &current_cpu->highest_mmapped_page,
1778                                 addr != 0 || (flags & TARGET_MAP_FIXED)
1779                                 ? addr : -1,
1780                                 newlen);
1781
1782                 if (newaddr >= (USI) -8191)
1783                   {
1784                     abort ();
1785                     retval = -cb_host_to_target_errno (cb, -(SI) newaddr);
1786                     break;
1787                   }
1788
1789                 /* We were asked for MAP_FIXED, but couldn't.  */
1790                 if ((flags & TARGET_MAP_FIXED) && newaddr != addr)
1791                   {
1792                     abort ();
1793                     unmap_pages (sd, &current_cpu->highest_mmapped_page,
1794                                  newaddr, newlen);
1795                     retval = -cb_host_to_target_errno (cb, EINVAL);
1796                     break;
1797                   }
1798
1799                 /* Find the current position in the file.  */
1800                 s.func = TARGET_SYS_lseek;
1801                 s.arg1 = fd;
1802                 s.arg2 = 0;
1803                 s.arg3 = SEEK_CUR;
1804                 if (cb_syscall (cb, &s) != CB_RC_OK)
1805                   abort ();
1806                 pos = s.result;
1807
1808                 if (s.result < 0)
1809                   abort ();
1810
1811                 /* Move to the correct offset in the file.  */
1812                 s.func = TARGET_SYS_lseek;
1813                 s.arg1 = fd;
1814                 s.arg2 = pgoff*8192;
1815                 s.arg3 = SEEK_SET;
1816                 if (cb_syscall (cb, &s) != CB_RC_OK)
1817                   abort ();
1818
1819                 if (s.result < 0)
1820                   abort ();
1821
1822                 /* Use the standard read callback to read in "len"
1823                    bytes.  */
1824                 s.func = TARGET_SYS_read;
1825                 s.arg1 = fd;
1826                 s.arg2 = newaddr;
1827                 s.arg3 = len;
1828                 if (cb_syscall (cb, &s) != CB_RC_OK)
1829                   abort ();
1830
1831                 /* If the result is a page or more lesser than what
1832                    was requested, something went wrong.  */
1833                 if (len >= 8192 && (USI) s.result <= len - 8192)
1834                   abort ();
1835
1836                 /* After reading, we need to go back to the previous
1837                    position in the file.  */
1838                 s.func = TARGET_SYS_lseek;
1839                 s.arg1 = fd;
1840                 s.arg2 = pos;
1841                 s.arg3 = SEEK_SET;
1842                 if (cb_syscall (cb, &s) != CB_RC_OK)
1843                   abort ();
1844                 if (pos != (USI) s.result)
1845                   abort ();
1846
1847                 retval = newaddr;
1848               }
1849             else
1850               {
1851                 USI newlen = (len + 8191) & ~8191;
1852                 USI newaddr;
1853
1854                 if (flags & TARGET_MAP_FIXED)
1855                   unmap_pages (sd, &current_cpu->highest_mmapped_page,
1856                                addr, newlen);
1857                 else if (is_mapped (sd, &current_cpu->highest_mmapped_page,
1858                                     addr, newlen))
1859                   addr = 0;
1860
1861                 newaddr = create_map (sd, &current_cpu->highest_mmapped_page,
1862                                       addr != 0 || (flags & TARGET_MAP_FIXED)
1863                                       ? addr : -1,
1864                                       newlen);
1865
1866                 if (newaddr >= (USI) -8191)
1867                   retval = -cb_host_to_target_errno (cb, -(SI) newaddr);
1868                 else
1869                   retval = newaddr;
1870
1871                 if ((flags & TARGET_MAP_FIXED) && newaddr != addr)
1872                   {
1873                     abort ();
1874                     unmap_pages (sd, &current_cpu->highest_mmapped_page,
1875                                  newaddr, newlen);
1876                     retval = -cb_host_to_target_errno (cb, EINVAL);
1877                     break;
1878                   }
1879               }
1880             break;
1881           }
1882
1883         case TARGET_SYS_mprotect:
1884           {
1885             /* We only cover the case of linuxthreads mprotecting out
1886                its stack guard page and of dynamic loading mprotecting
1887                away the data (for some reason the whole library, then
1888                mprotects away the data part and mmap-FIX:es it again.  */
1889             USI addr = arg1;
1890             USI len = arg2;
1891             USI prot = arg3;
1892
1893             if (prot != TARGET_PROT_NONE
1894                 || !is_mapped_only (sd, &current_cpu->highest_mmapped_page,
1895                                     addr, (len + 8191) & ~8191))
1896               {
1897                 retval
1898                   = cris_unknown_syscall (current_cpu, pc,
1899                                           "Unimplemented mprotect call "
1900                                           "(0x%lx, 0x%lx, 0x%lx)\n",
1901                                           (unsigned long) arg1,
1902                                           (unsigned long) arg2,
1903                                           (unsigned long) arg3);
1904                 break;
1905               }
1906
1907             /* Just ignore this.  We could make this equal to munmap,
1908                but then we'd have to make sure no anon mmaps gets this
1909                address before a subsequent MAP_FIXED mmap intended to
1910                override it.  */
1911             retval = 0;
1912             break;
1913           }
1914
1915         case TARGET_SYS_ioctl:
1916           {
1917             /* We support only a very limited functionality: checking
1918                stdout with TCGETS to perform the isatty function.  The
1919                TCGETS ioctl isn't actually performed or the result used by
1920                an isatty () caller in a "hello, world" program; only the
1921                return value is then used.  Maybe we shouldn't care about
1922                the environment of the simulator regarding isatty, but
1923                that's been working before, in the xsim simulator.  */
1924             if (arg2 == TARGET_TCGETS && arg1 == 1)
1925               retval = isatty (1) ? 0 : cb_host_to_target_errno (cb, EINVAL);
1926             else
1927               retval = -cb_host_to_target_errno (cb, EINVAL);
1928             break;
1929           }
1930
1931         case TARGET_SYS_munmap:
1932           {
1933             USI addr = arg1;
1934             USI len = arg2;
1935             USI result
1936               = unmap_pages (sd, &current_cpu->highest_mmapped_page, addr,
1937                              len);
1938             retval = result != 0 ? -cb_host_to_target_errno (cb, result) : 0;
1939             break;
1940           }
1941
1942         case TARGET_SYS_wait4:
1943           {
1944             int i;
1945             USI pid = arg1;
1946             USI saddr = arg2;
1947             USI options = arg3;
1948             USI rusagep = arg4;
1949
1950             /* FIXME: We're not properly implementing __WCLONE, and we
1951                don't really need the special casing so we might as well
1952                make this general.  */
1953             if ((!(pid == (USI) -1
1954                    && options == (TARGET___WCLONE | TARGET_WNOHANG)
1955                    && saddr != 0)
1956                  && !(pid > 0
1957                       && (options == TARGET___WCLONE
1958                           || options == TARGET___WALL)))
1959                 || rusagep != 0
1960                 || current_cpu->thread_data == NULL)
1961               {
1962                 retval
1963                   = cris_unknown_syscall (current_cpu, pc,
1964                                           "Unimplemented wait4 call "
1965                                           "(0x%lx, 0x%lx, 0x%lx, 0x%lx)\n",
1966                                           (unsigned long) arg1,
1967                                           (unsigned long) arg2,
1968                                           (unsigned long) arg3,
1969                                           (unsigned long) arg4);
1970                 break;
1971               }
1972
1973             if (pid == (USI) -1)
1974               for (i = 1; i < SIM_TARGET_MAX_THREADS; i++)
1975                 {
1976                   if (current_cpu->thread_data[threadno].threadid
1977                       == current_cpu->thread_data[i].parent_threadid
1978                       && current_cpu->thread_data[i].threadid != 0
1979                       && current_cpu->thread_data[i].cpu_context == NULL)
1980                     {
1981                       /* A zombied child.  Get the exit value and clear the
1982                          zombied entry so it will be reused.  */
1983                       sim_core_write_unaligned_4 (current_cpu, pc, 0, saddr,
1984                                                   current_cpu
1985                                                   ->thread_data[i].exitval);
1986                       retval
1987                         = current_cpu->thread_data[i].threadid + TARGET_PID;
1988                       memset (&current_cpu->thread_data[i], 0,
1989                               sizeof (current_cpu->thread_data[i]));
1990                       goto outer_break;
1991                     }
1992                 }
1993             else
1994               {
1995                 /* We're waiting for a specific PID.  If we don't find
1996                    it zombied on this run, rerun the syscall.  */
1997                 for (i = 1; i < SIM_TARGET_MAX_THREADS; i++)
1998                   if (pid == current_cpu->thread_data[i].threadid + TARGET_PID
1999                       && current_cpu->thread_data[i].cpu_context == NULL)
2000                     {
2001                       if (saddr != 0)
2002                         /* Get the exit value if the caller wants it.  */
2003                         sim_core_write_unaligned_4 (current_cpu, pc, 0,
2004                                                     saddr,
2005                                                     current_cpu
2006                                                     ->thread_data[i]
2007                                                     .exitval);
2008
2009                       retval
2010                         = current_cpu->thread_data[i].threadid + TARGET_PID;
2011                       memset (&current_cpu->thread_data[i], 0,
2012                               sizeof (current_cpu->thread_data[i]));
2013
2014                       goto outer_break;
2015                     }
2016
2017                 sim_pc_set (current_cpu, pc);
2018               }
2019
2020             retval = -cb_host_to_target_errno (cb, ECHILD);
2021           outer_break:
2022             break;
2023           }
2024
2025         case TARGET_SYS_rt_sigaction:
2026           {
2027             USI signum = arg1;
2028             USI old_sa = arg3;
2029             USI new_sa = arg2;
2030
2031             /* The kernel says:
2032                struct sigaction {
2033                         __sighandler_t sa_handler;
2034                         unsigned long sa_flags;
2035                         void (*sa_restorer)(void);
2036                         sigset_t sa_mask;
2037                }; */
2038
2039             if (old_sa != 0)
2040               {
2041                 sim_core_write_unaligned_4 (current_cpu, pc, 0, old_sa + 0,
2042                                             current_cpu->sighandler[signum]);
2043                 sim_core_write_unaligned_4 (current_cpu, pc, 0, arg3 + 4, 0);
2044                 sim_core_write_unaligned_4 (current_cpu, pc, 0, arg3 + 8, 0);
2045
2046                 /* We'll assume _NSIG_WORDS is 2 for the kernel.  */
2047                 sim_core_write_unaligned_4 (current_cpu, pc, 0, arg3 + 12, 0);
2048                 sim_core_write_unaligned_4 (current_cpu, pc, 0, arg3 + 16, 0);
2049               }
2050             if (new_sa != 0)
2051               {
2052                 USI target_sa_handler
2053                   = sim_core_read_unaligned_4 (current_cpu, pc, 0, new_sa);
2054                 USI target_sa_flags
2055                   = sim_core_read_unaligned_4 (current_cpu, pc, 0, new_sa + 4);
2056                 USI target_sa_restorer
2057                   = sim_core_read_unaligned_4 (current_cpu, pc, 0, new_sa + 8);
2058                 USI target_sa_mask_low
2059                   = sim_core_read_unaligned_4 (current_cpu, pc, 0, new_sa + 12);
2060                 USI target_sa_mask_high
2061                   = sim_core_read_unaligned_4 (current_cpu, pc, 0, new_sa + 16);
2062
2063                 /* We won't interrupt a syscall so we won't restart it,
2064                    but a signal(2) call ends up syscalling rt_sigaction
2065                    with this flag, so we have to handle it.  The
2066                    sa_restorer field contains garbage when not
2067                    TARGET_SA_RESTORER, so don't look at it.  For the
2068                    time being, we don't nest sighandlers, so we
2069                    ignore the sa_mask, which simplifies things.  */
2070                 if ((target_sa_flags != 0
2071                      && target_sa_flags != TARGET_SA_RESTART
2072                      && target_sa_flags != (TARGET_SA_RESTART|TARGET_SA_SIGINFO))
2073                     || target_sa_handler == 0)
2074                   {
2075                     retval
2076                       = cris_unknown_syscall (current_cpu, pc,
2077                                               "Unimplemented rt_sigaction "
2078                                               "syscall "
2079                                               "(0x%lx, 0x%lx: "
2080                                               "[0x%x, 0x%x, 0x%x, "
2081                                               "{0x%x, 0x%x}], 0x%lx)\n",
2082                                               (unsigned long) arg1,
2083                                               (unsigned long) arg2,
2084                                               target_sa_handler,
2085                                               target_sa_flags,
2086                                               target_sa_restorer,
2087                                               target_sa_mask_low,
2088                                               target_sa_mask_high,
2089                                               (unsigned long) arg3);
2090                     break;
2091                   }
2092
2093                 current_cpu->sighandler[signum] = target_sa_handler;
2094
2095                 /* Because we may have unblocked signals, one may now be
2096                    pending, if there are threads, that is.  */
2097                 if (current_cpu->thread_data)
2098                   current_cpu->thread_data[threadno].sigpending = 1;
2099               }
2100             retval = 0;
2101             break;
2102           }
2103
2104         case TARGET_SYS_mremap:
2105           {
2106             USI addr = arg1;
2107             USI old_len = arg2;
2108             USI new_len = arg3;
2109             USI flags = arg4;
2110             USI new_addr = arg5;
2111             USI mapped_addr;
2112
2113             if (new_len == old_len)
2114               /* The program and/or library is possibly confused but
2115                  this is a valid call.  Happens with ipps-1.40 on file
2116                  svs_all.  */
2117               retval = addr;
2118             else if (new_len < old_len)
2119               {
2120                 /* Shrinking is easy.  */
2121                 if (unmap_pages (sd, &current_cpu->highest_mmapped_page,
2122                                  addr + new_len, old_len - new_len) != 0)
2123                   retval = -cb_host_to_target_errno (cb, EINVAL);
2124                 else
2125                   retval = addr;
2126               }
2127             else if (! is_mapped (sd, &current_cpu->highest_mmapped_page,
2128                                   addr + old_len, new_len - old_len))
2129               {
2130                 /* If the extension isn't mapped, we can just add it.  */
2131                 mapped_addr
2132                   = create_map (sd, &current_cpu->highest_mmapped_page,
2133                                 addr + old_len, new_len - old_len);
2134
2135                 if (mapped_addr > (USI) -8192)
2136                   retval = -cb_host_to_target_errno (cb, -(SI) mapped_addr);
2137                 else
2138                   retval = addr;
2139               }
2140             else if (flags & TARGET_MREMAP_MAYMOVE)
2141               {
2142                 /* Create a whole new map and copy the contents
2143                    block-by-block there.  We ignore the new_addr argument
2144                    for now.  */
2145                 char buf[8192];
2146                 USI prev_addr = addr;
2147                 USI prev_len = old_len;
2148
2149                 mapped_addr
2150                   = create_map (sd, &current_cpu->highest_mmapped_page,
2151                                 -1, new_len);
2152
2153                 if (mapped_addr > (USI) -8192)
2154                   {
2155                     retval = -cb_host_to_target_errno (cb, -(SI) new_addr);
2156                     break;
2157                   }
2158
2159                 retval = mapped_addr;
2160
2161                 for (; old_len > 0;
2162                      old_len -= 8192, mapped_addr += 8192, addr += 8192)
2163                   {
2164                     if (sim_core_read_buffer (sd, current_cpu, read_map, buf,
2165                                               addr, 8192) != 8192
2166                         || sim_core_write_buffer (sd, current_cpu, 0, buf,
2167                                                   mapped_addr, 8192) != 8192)
2168                       abort ();
2169                   }
2170
2171                 if (unmap_pages (sd, &current_cpu->highest_mmapped_page,
2172                                  prev_addr, prev_len) != 0)
2173                   abort ();
2174               }
2175             else
2176               retval = -cb_host_to_target_errno (cb, -ENOMEM);
2177             break;
2178           }
2179
2180         case TARGET_SYS_poll:
2181           {
2182             int npollfds = arg2;
2183             int timeout = arg3;
2184             SI ufds = arg1;
2185             SI fd = -1;
2186             HI events = -1;
2187             HI revents = 0;
2188             struct stat buf;
2189             int i;
2190
2191             /* The kernel says:
2192                 struct pollfd {
2193                      int fd;
2194                      short events;
2195                      short revents;
2196                 }; */
2197
2198             /* Check that this is the expected poll call from
2199                linuxthreads/manager.c; we don't support anything else.
2200                Remember, fd == 0 isn't supported.  */
2201             if (npollfds != 1
2202                 || ((fd = sim_core_read_unaligned_4 (current_cpu, pc,
2203                                                      0, ufds)) <= 0)
2204                 || ((events = sim_core_read_unaligned_2 (current_cpu, pc,
2205                                                          0, ufds + 4))
2206                     != TARGET_POLLIN)
2207                 || ((cb->fstat) (cb, fd, &buf) != 0
2208                     || (buf.st_mode & S_IFIFO) == 0)
2209                 || current_cpu->thread_data == NULL)
2210               {
2211                 retval
2212                   = cris_unknown_syscall (current_cpu, pc,
2213                                           "Unimplemented poll syscall "
2214                                           "(0x%lx: [0x%x, 0x%x, x], "
2215                                           "0x%lx, 0x%lx)\n",
2216                                           (unsigned long) arg1, fd, events,
2217                                           (unsigned long) arg2,
2218                                           (unsigned long) arg3);
2219                 break;
2220               }
2221
2222             retval = 0;
2223
2224             /* Iterate over threads; find a marker that a writer is
2225                sleeping, waiting for a reader.  */
2226             for (i = 0; i < SIM_TARGET_MAX_THREADS; i++)
2227               if (current_cpu->thread_data[i].cpu_context != NULL
2228                   && current_cpu->thread_data[i].pipe_read_fd == fd)
2229                 {
2230                   revents = TARGET_POLLIN;
2231                   retval = 1;
2232                   break;
2233                 }
2234
2235             /* Timeout decreases with whatever time passed between the
2236                last syscall and this.  That's not exactly right for the
2237                first call, but it's close enough that it isn't
2238                worthwhile to complicate matters by making that a special
2239                case.  */
2240             timeout
2241               -= (TARGET_TIME_MS (current_cpu)
2242                   - (current_cpu->thread_data[threadno].last_execution));
2243
2244             /* Arrange to repeat this syscall until timeout or event,
2245                decreasing timeout at each iteration.  */
2246             if (timeout > 0 && revents == 0)
2247               {
2248                 bfd_byte timeout_buf[4];
2249
2250                 bfd_putl32 (timeout, timeout_buf);
2251                 (*CPU_REG_STORE (current_cpu)) (current_cpu,
2252                                                 H_GR_R12, timeout_buf, 4);
2253                 sim_pc_set (current_cpu, pc);
2254                 retval = arg1;
2255                 break;
2256               }
2257
2258             sim_core_write_unaligned_2 (current_cpu, pc, 0, ufds + 4 + 2,
2259                                         revents);
2260             break;
2261           }
2262
2263         case TARGET_SYS_time:
2264           {
2265             retval = (int) (*cb->time) (cb, 0L);
2266
2267             /* At time of this writing, CB_SYSCALL_time doesn't do the
2268                part of setting *arg1 to the return value.  */
2269             if (arg1)
2270               sim_core_write_unaligned_4 (current_cpu, pc, 0, arg1, retval);
2271             break;
2272           }
2273
2274         case TARGET_SYS_gettimeofday:
2275           if (arg1 != 0)
2276             {
2277               USI ts = TARGET_TIME (current_cpu);
2278               USI tms = TARGET_TIME_MS (current_cpu);
2279
2280               /* First dword is seconds since TARGET_EPOCH.  */
2281               sim_core_write_unaligned_4 (current_cpu, pc, 0, arg1, ts);
2282
2283               /* Second dword is microseconds.  */
2284               sim_core_write_unaligned_4 (current_cpu, pc, 0, arg1 + 4,
2285                                           (tms % 1000) * 1000);
2286             }
2287           if (arg2 != 0)
2288             {
2289               /* Time-zone info is always cleared.  */
2290               sim_core_write_unaligned_4 (current_cpu, pc, 0, arg2, 0);
2291               sim_core_write_unaligned_4 (current_cpu, pc, 0, arg2 + 4, 0);
2292             }
2293           retval = 0;
2294           break;
2295
2296         case TARGET_SYS_llseek:
2297           {
2298             /* If it fits, tweak parameters to fit the "generic" 32-bit
2299                lseek and use that.  */
2300             SI fd = arg1;
2301             SI offs_hi = arg2;
2302             SI offs_lo = arg3;
2303             SI resultp = arg4;
2304             SI whence = arg5;
2305             retval = 0;
2306
2307             if (!((offs_hi == 0 && offs_lo >= 0)
2308                   || (offs_hi == -1 &&  offs_lo < 0)))
2309               {
2310                 retval
2311                   = cris_unknown_syscall (current_cpu, pc,
2312                                           "Unimplemented llseek offset,"
2313                                           " fd %d: 0x%x:0x%x\n",
2314                                           fd, (unsigned) arg2,
2315                                           (unsigned) arg3);
2316                 break;
2317               }
2318
2319             s.func = TARGET_SYS_lseek;
2320             s.arg2 = offs_lo;
2321             s.arg3 = whence;
2322             if (cb_syscall (cb, &s) != CB_RC_OK)
2323               {
2324                 sim_io_eprintf (sd, "Break 13: invalid %d?  Returned %ld\n", callnum,
2325                                 s.result);
2326                 sim_engine_halt (sd, current_cpu, NULL, pc, sim_stopped, SIM_SIGILL);
2327               }
2328             if (s.result < 0)
2329               retval = -s.errcode;
2330             else
2331               {
2332                 sim_core_write_unaligned_4 (current_cpu, pc, 0, resultp,
2333                                             s.result);
2334                 sim_core_write_unaligned_4 (current_cpu, pc, 0, resultp + 4,
2335                                             s.result < 0 ? -1 : 0);
2336               }
2337             break;
2338           }
2339
2340           /* ssize_t writev(int fd, const struct iovec *iov, int iovcnt);
2341               where:
2342              struct iovec {
2343                void  *iov_base;    Starting address
2344                size_t iov_len;     Number of bytes to transfer
2345              }; */
2346         case TARGET_SYS_writev:
2347           {
2348             SI fd = arg1;
2349             SI iov = arg2;
2350             SI iovcnt = arg3;
2351             SI retcnt = 0;
2352             int i;
2353
2354             /* We'll ignore strict error-handling and just do multiple write calls.  */
2355             for (i = 0; i < iovcnt; i++)
2356               {
2357                 int sysret;
2358                 USI iov_base
2359                   = sim_core_read_unaligned_4 (current_cpu, pc, 0,
2360                                                iov + 8*i);
2361                 USI iov_len
2362                   = sim_core_read_unaligned_4 (current_cpu, pc, 0,
2363                                                iov + 8*i + 4);
2364                 
2365                 s.func = TARGET_SYS_write;
2366                 s.arg1 = fd;
2367                 s.arg2 = iov_base;
2368                 s.arg3 = iov_len;
2369
2370                 if (cb_syscall (cb, &s) != CB_RC_OK)
2371                   abort ();
2372                 sysret = s.result == -1 ? -s.errcode : s.result;
2373
2374                 if (sysret != iov_len)
2375                   {
2376                     if (i != 0)
2377                       abort ();
2378                     retcnt = sysret;
2379                     break;
2380                   }
2381
2382                 retcnt += iov_len;
2383               }
2384
2385             retval = retcnt;
2386           }
2387           break;
2388
2389         /* This one does have a generic callback function, but at the time
2390            of this writing, cb_syscall does not have code for it, and we
2391            need target-specific code for the threads implementation
2392            anyway.  */
2393         case TARGET_SYS_kill:
2394           {
2395             USI pid = arg1;
2396             USI sig = arg2;
2397
2398             retval = 0;
2399
2400             /* At kill(2), glibc sets signal masks such that the thread
2401                machinery is initialized.  Still, there is and was only
2402                one thread.  */
2403             if (current_cpu->max_threadid == 0)
2404               {
2405                 if (pid != TARGET_PID)
2406                   {
2407                     retval = -cb_host_to_target_errno (cb, EPERM);
2408                     break;
2409                   }
2410
2411                 /* FIXME: Signal infrastructure (target-to-sim mapping).  */
2412                 if (sig == TARGET_SIGABRT)
2413                   /* A call "abort ()", i.e. "kill (getpid(), SIGABRT)" is
2414                      the end-point for failing GCC test-cases.  */
2415                   sim_engine_halt (sd, current_cpu, NULL, pc, sim_stopped,
2416                                    SIM_SIGABRT);
2417                 else
2418                   {
2419                     sim_io_eprintf (sd, "Unimplemented signal: %d\n", sig);
2420                     sim_engine_halt (sd, current_cpu, NULL, pc, sim_stopped,
2421                                      SIM_SIGILL);
2422                   }
2423
2424                 /* This will not be reached.  */
2425                 abort ();
2426               }
2427             else
2428               retval = deliver_signal (current_cpu, sig, pid);
2429             break;
2430           }
2431
2432         case TARGET_SYS_rt_sigprocmask:
2433           {
2434             int i;
2435             USI how = arg1;
2436             USI newsetp = arg2;
2437             USI oldsetp = arg3;
2438
2439             if (how != TARGET_SIG_BLOCK
2440                 && how != TARGET_SIG_SETMASK
2441                 && how != TARGET_SIG_UNBLOCK)
2442               {
2443                 retval
2444                   = cris_unknown_syscall (current_cpu, pc,
2445                                           "Unimplemented rt_sigprocmask "
2446                                           "syscall (0x%x, 0x%x, 0x%x)\n",
2447                                           arg1, arg2, arg3);
2448                 break;
2449               }
2450
2451             if (newsetp)
2452               {
2453                 USI set_low
2454                   = sim_core_read_unaligned_4 (current_cpu, pc, 0,
2455                                                newsetp);
2456                 USI set_high
2457                   = sim_core_read_unaligned_4 (current_cpu, pc, 0,
2458                                                newsetp + 4);
2459
2460                 /* The sigmask is kept in the per-thread data, so we may
2461                    need to create the first one.  */
2462                 if (current_cpu->thread_data == NULL)
2463                   make_first_thread (current_cpu);
2464
2465                 if (how == TARGET_SIG_SETMASK)
2466                   for (i = 0; i < 64; i++)
2467                     current_cpu->thread_data[threadno].sigdata[i].blocked = 0;
2468
2469                 for (i = 0; i < 32; i++)
2470                   if ((set_low & (1 << i)))
2471                     current_cpu->thread_data[threadno].sigdata[i + 1].blocked
2472                       = (how != TARGET_SIG_UNBLOCK);
2473
2474                 for (i = 0; i < 31; i++)
2475                   if ((set_high & (1 << i)))
2476                     current_cpu->thread_data[threadno].sigdata[i + 33].blocked
2477                       = (how != TARGET_SIG_UNBLOCK);
2478
2479                 /* The mask changed, so a signal may be unblocked for
2480                    execution.  */
2481                 current_cpu->thread_data[threadno].sigpending = 1;
2482               }
2483
2484             if (oldsetp != 0)
2485               {
2486                 USI set_low = 0;
2487                 USI set_high = 0;
2488
2489                 for (i = 0; i < 32; i++)
2490                   if (current_cpu->thread_data[threadno]
2491                       .sigdata[i + 1].blocked)
2492                     set_low |= 1 << i;
2493                 for (i = 0; i < 31; i++)
2494                   if (current_cpu->thread_data[threadno]
2495                       .sigdata[i + 33].blocked)
2496                     set_high |= 1 << i;
2497
2498                 sim_core_write_unaligned_4 (current_cpu, pc, 0, oldsetp + 0, set_low);
2499                 sim_core_write_unaligned_4 (current_cpu, pc, 0, oldsetp + 4, set_high);
2500               }
2501
2502             retval = 0;
2503             break;
2504           }
2505
2506         case TARGET_SYS_sigreturn:
2507           {
2508             int i;
2509             bfd_byte regbuf[4];
2510             int was_sigsuspended;
2511
2512             if (current_cpu->thread_data == NULL
2513                 /* The CPU context is saved with the simulator data, not
2514                    on the stack as in the real world.  */
2515                 || (current_cpu->thread_data[threadno].cpu_context_atsignal
2516                     == NULL))
2517               {
2518                 retval
2519                   = cris_unknown_syscall (current_cpu, pc,
2520                                           "Invalid sigreturn syscall: "
2521                                           "no signal handler active "
2522                                           "(0x%lx, 0x%lx, 0x%lx, 0x%lx, "
2523                                           "0x%lx, 0x%lx)\n",
2524                                           (unsigned long) arg1,
2525                                           (unsigned long) arg2,
2526                                           (unsigned long) arg3,
2527                                           (unsigned long) arg4,
2528                                           (unsigned long) arg5,
2529                                           (unsigned long) arg6);
2530                 break;
2531               }
2532
2533             was_sigsuspended
2534               = current_cpu->thread_data[threadno].sigsuspended;
2535
2536             /* Restore the sigmask, either from the stack copy made when
2537                the sighandler was called, or from the saved state
2538                specifically for sigsuspend(2).  */
2539             if (was_sigsuspended)
2540               {
2541                 current_cpu->thread_data[threadno].sigsuspended = 0;
2542                 for (i = 0; i < 64; i++)
2543                   current_cpu->thread_data[threadno].sigdata[i].blocked
2544                     = current_cpu->thread_data[threadno]
2545                     .sigdata[i].blocked_suspendsave;
2546               }
2547             else
2548               {
2549                 USI sp;
2550                 USI set_low;
2551                 USI set_high;
2552
2553                 (*CPU_REG_FETCH (current_cpu)) (current_cpu,
2554                                             H_GR_SP, regbuf, 4);
2555                 sp = bfd_getl32 (regbuf);
2556                 set_low
2557                   = sim_core_read_unaligned_4 (current_cpu, pc, 0, sp);
2558                 set_high
2559                   = sim_core_read_unaligned_4 (current_cpu, pc, 0, sp + 4);
2560
2561                 for (i = 0; i < 32; i++)
2562                   current_cpu->thread_data[threadno].sigdata[i + 1].blocked
2563                     = (set_low & (1 << i)) != 0;
2564                 for (i = 0; i < 31; i++)
2565                   current_cpu->thread_data[threadno].sigdata[i + 33].blocked
2566                     = (set_high & (1 << i)) != 0;
2567               }
2568
2569             /* The mask changed, so a signal may be unblocked for
2570                execution.  */
2571             current_cpu->thread_data[threadno].sigpending = 1;
2572
2573             memcpy (&current_cpu->cpu_data_placeholder,
2574                     current_cpu->thread_data[threadno].cpu_context_atsignal,
2575                     current_cpu->thread_cpu_data_size);
2576             free (current_cpu->thread_data[threadno].cpu_context_atsignal);
2577             current_cpu->thread_data[threadno].cpu_context_atsignal = NULL;
2578
2579             /* The return value must come from the saved R10.  */
2580             (*CPU_REG_FETCH (current_cpu)) (current_cpu, H_GR_R10, regbuf, 4);
2581             retval = bfd_getl32 (regbuf);
2582
2583             /* We must also break the "sigsuspension loop".  */
2584             if (was_sigsuspended)
2585               sim_pc_set (current_cpu, sim_pc_get (current_cpu) + 2);
2586             break;
2587           }
2588
2589         case TARGET_SYS_rt_sigsuspend:
2590           {
2591             USI newsetp = arg1;
2592             USI setsize = arg2;
2593
2594             if (setsize != 8)
2595               {
2596                 retval
2597                   = cris_unknown_syscall (current_cpu, pc,
2598                                           "Unimplemented rt_sigsuspend syscall"
2599                                           " arguments (0x%lx, 0x%lx)\n",
2600                                           (unsigned long) arg1,
2601                                           (unsigned long) arg2);
2602                 break;
2603               }
2604
2605             /* Don't change the signal mask if we're already in
2606                sigsuspend state (i.e. this syscall is a rerun).  */
2607             else if (!current_cpu->thread_data[threadno].sigsuspended)
2608               {
2609                 USI set_low
2610                   = sim_core_read_unaligned_4 (current_cpu, pc, 0,
2611                                                newsetp);
2612                 USI set_high
2613                   = sim_core_read_unaligned_4 (current_cpu, pc, 0,
2614                                                newsetp + 4);
2615                 int i;
2616
2617                 /* Save the current sigmask and insert the user-supplied
2618                    one.  */
2619                 for (i = 0; i < 32; i++)
2620                   {
2621                     current_cpu->thread_data[threadno]
2622                       .sigdata[i + 1].blocked_suspendsave
2623                       = current_cpu->thread_data[threadno]
2624                       .sigdata[i + 1].blocked;
2625
2626                     current_cpu->thread_data[threadno]
2627                       .sigdata[i + 1].blocked = (set_low & (1 << i)) != 0;
2628                   }
2629                 for (i = 0; i < 31; i++)
2630                   {
2631                     current_cpu->thread_data[threadno]
2632                       .sigdata[i + 33].blocked_suspendsave
2633                       = current_cpu->thread_data[threadno]
2634                       .sigdata[i + 33].blocked;
2635                     current_cpu->thread_data[threadno]
2636                       .sigdata[i + 33].blocked = (set_high & (1 << i)) != 0;
2637                   }
2638
2639                 current_cpu->thread_data[threadno].sigsuspended = 1;
2640
2641                 /* The mask changed, so a signal may be unblocked for
2642                    execution. */
2643                 current_cpu->thread_data[threadno].sigpending = 1;
2644               }
2645
2646             /* Because we don't use arg1 (newsetp) when this syscall is
2647                rerun, it doesn't matter that we overwrite it with the
2648                (constant) return value.  */
2649             retval = -cb_host_to_target_errno (cb, EINTR);
2650             sim_pc_set (current_cpu, pc);
2651             break;
2652           }
2653
2654           /* Add case labels here for other syscalls using the 32-bit
2655              "struct stat", provided they have a corresponding simulator
2656              function of course.  */
2657         case TARGET_SYS_stat:
2658         case TARGET_SYS_fstat:
2659           {
2660             /* As long as the infrastructure doesn't cache anything
2661                related to the stat mapping, this trick gets us a dual
2662                "struct stat"-type mapping in the least error-prone way.  */
2663             const char *saved_map = cb->stat_map;
2664             CB_TARGET_DEFS_MAP *saved_syscall_map = cb->syscall_map;
2665
2666             cb->syscall_map = (CB_TARGET_DEFS_MAP *) syscall_stat32_map;
2667             cb->stat_map = stat32_map;
2668
2669             if (cb_syscall (cb, &s) != CB_RC_OK)
2670               {
2671                 abort ();
2672                 sim_engine_halt (sd, current_cpu, NULL, pc, sim_stopped,
2673                                  SIM_SIGILL);
2674               }
2675             retval = s.result == -1 ? -s.errcode : s.result;
2676
2677             cb->stat_map = saved_map;
2678             cb->syscall_map = saved_syscall_map;
2679             break;
2680           }
2681
2682         case TARGET_SYS_getcwd:
2683           {
2684             USI buf = arg1;
2685             USI size = arg2;
2686
2687             char *cwd = xmalloc (SIM_PATHMAX);
2688             if (cwd != getcwd (cwd, SIM_PATHMAX))
2689               abort ();
2690
2691             /* FIXME: When and if we support chdir, we need something
2692                a bit more elaborate.  */
2693             if (simulator_sysroot[0] != '\0')
2694               strcpy (cwd, "/");
2695
2696             retval = -cb_host_to_target_errno (cb, ERANGE);
2697             if (strlen (cwd) + 1 <= size)
2698               {
2699                 retval = strlen (cwd) + 1;
2700                 if (sim_core_write_buffer (sd, current_cpu, 0, cwd,
2701                                            buf, retval)
2702                     != (unsigned int) retval)
2703                   retval = -cb_host_to_target_errno (cb, EFAULT);
2704               }
2705             free (cwd);
2706             break;
2707           }
2708
2709         case TARGET_SYS_access:
2710           {
2711             SI path = arg1;
2712             SI mode = arg2;
2713             char *pbuf = xmalloc (SIM_PATHMAX);
2714             int i;
2715             int o = 0;
2716             int hmode = 0;
2717
2718             if (sim_core_read_unaligned_1 (current_cpu, pc, 0, path) == '/')
2719               {
2720                 strcpy (pbuf, simulator_sysroot);
2721                 o += strlen (simulator_sysroot);
2722               }
2723
2724             for (i = 0; i + o < SIM_PATHMAX; i++)
2725               {
2726                 pbuf[i + o]
2727                   = sim_core_read_unaligned_1 (current_cpu, pc, 0, path + i);
2728                 if (pbuf[i + o] == 0)
2729                   break;
2730               }
2731
2732             if (i + o == SIM_PATHMAX)
2733               {
2734                 retval = -cb_host_to_target_errno (cb, ENAMETOOLONG);
2735                 break;
2736               }
2737
2738             /* Assert that we don't get calls for files for which we
2739                don't have support.  */
2740             if (strncmp (pbuf + strlen (simulator_sysroot),
2741                          "/proc/", 6) == 0)
2742               abort ();
2743 #define X_AFLAG(x) if (mode & TARGET_ ## x) hmode |= x
2744             X_AFLAG (R_OK);
2745             X_AFLAG (W_OK);
2746             X_AFLAG (X_OK);
2747             X_AFLAG (F_OK);
2748 #undef X_AFLAG
2749
2750             if (access (pbuf, hmode) != 0)
2751               retval = -cb_host_to_target_errno (cb, errno);
2752             else
2753               retval = 0;
2754
2755             free (pbuf);
2756             break;
2757           }
2758
2759         case TARGET_SYS_readlink:
2760           {
2761             SI path = arg1;
2762             SI buf = arg2;
2763             SI bufsiz = arg3;
2764             char *pbuf = xmalloc (SIM_PATHMAX);
2765             char *lbuf = xmalloc (SIM_PATHMAX);
2766             char *lbuf_alloc = lbuf;
2767             int nchars = -1;
2768             int i;
2769             int o = 0;
2770
2771             if (sim_core_read_unaligned_1 (current_cpu, pc, 0, path) == '/')
2772               {
2773                 strcpy (pbuf, simulator_sysroot);
2774                 o += strlen (simulator_sysroot);
2775               }
2776
2777             for (i = 0; i + o < SIM_PATHMAX; i++)
2778               {
2779                 pbuf[i + o]
2780                   = sim_core_read_unaligned_1 (current_cpu, pc, 0, path + i);
2781                 if (pbuf[i + o] == 0)
2782                   break;
2783               }
2784
2785             if (i + o == SIM_PATHMAX)
2786               {
2787                 retval = -cb_host_to_target_errno (cb, ENAMETOOLONG);
2788                 break;
2789               }
2790
2791             /* Intervene calls for certain files expected in the target
2792                proc file system.  */
2793             if (strcmp (pbuf + strlen (simulator_sysroot),
2794                         "/proc/" XSTRING (TARGET_PID) "/exe") == 0)
2795               {
2796                 char *argv0
2797                   = (STATE_PROG_ARGV (sd) != NULL
2798                      ? *STATE_PROG_ARGV (sd) : NULL);
2799
2800                 if (argv0 == NULL || *argv0 == '.')
2801                   {
2802                     retval
2803                       = cris_unknown_syscall (current_cpu, pc,
2804                                               "Unimplemented readlink syscall "
2805                                               "(0x%lx: [\"%s\"], 0x%lx)\n",
2806                                               (unsigned long) arg1, pbuf,
2807                                               (unsigned long) arg2);
2808                     break;
2809                   }
2810                 else if (*argv0 == '/')
2811                   {
2812                     if (strncmp (simulator_sysroot, argv0,
2813                                  strlen (simulator_sysroot)) == 0)
2814                       argv0 += strlen (simulator_sysroot);
2815
2816                     strcpy (lbuf, argv0);
2817                     nchars = strlen (argv0) + 1;
2818                   }
2819                 else
2820                   {
2821                     if (getcwd (lbuf, SIM_PATHMAX) != NULL
2822                         && strlen (lbuf) + 2 + strlen (argv0) < SIM_PATHMAX)
2823                       {
2824                         if (strncmp (simulator_sysroot, lbuf,
2825                                      strlen (simulator_sysroot)) == 0)
2826                           lbuf += strlen (simulator_sysroot);
2827
2828                         strcat (lbuf, "/");
2829                         strcat (lbuf, argv0);
2830                         nchars = strlen (lbuf) + 1;
2831                       }
2832                     else
2833                       abort ();
2834                   }
2835               }
2836             else
2837               nchars = readlink (pbuf, lbuf, SIM_PATHMAX);
2838
2839             /* We trust that the readlink result returns a *relative*
2840                link, or one already adjusted for the file-path-prefix.
2841                (We can't generally tell the difference, so we go with
2842                the easiest decision; no adjustment.)  */
2843
2844             if (nchars == -1)
2845               {
2846                 retval = -cb_host_to_target_errno (cb, errno);
2847                 break;
2848               }
2849
2850             if (bufsiz < nchars)
2851               nchars = bufsiz;
2852
2853             if (sim_core_write_buffer (sd, current_cpu, write_map, lbuf,
2854                                        buf, nchars) != (unsigned int) nchars)
2855               retval = -cb_host_to_target_errno (cb, EFAULT);
2856             else
2857               retval = nchars;
2858
2859             free (pbuf);
2860             free (lbuf_alloc);
2861             break;
2862           }
2863
2864         case TARGET_SYS_sched_getscheduler:
2865           {
2866             USI pid = arg1;
2867
2868             /* FIXME: Search (other) existing threads.  */
2869             if (pid != 0 && pid != TARGET_PID)
2870               retval = -cb_host_to_target_errno (cb, ESRCH);
2871             else
2872               retval = TARGET_SCHED_OTHER;
2873             break;
2874           }
2875
2876         case TARGET_SYS_sched_getparam:
2877           {
2878             USI pid = arg1;
2879             USI paramp = arg2;
2880
2881             /* The kernel says:
2882                struct sched_param {
2883                         int sched_priority;
2884                }; */
2885
2886             if (pid != 0 && pid != TARGET_PID)
2887               retval = -cb_host_to_target_errno (cb, ESRCH);
2888             else
2889               {
2890                 /* FIXME: Save scheduler setting before threads are
2891                    created too.  */
2892                 sim_core_write_unaligned_4 (current_cpu, pc, 0, paramp,
2893                                             current_cpu->thread_data != NULL
2894                                             ? (current_cpu
2895                                                ->thread_data[threadno]
2896                                                .priority)
2897                                             : 0);
2898                 retval = 0;
2899               }
2900             break;
2901           }
2902
2903         case TARGET_SYS_sched_setparam:
2904           {
2905             USI pid = arg1;
2906             USI paramp = arg2;
2907
2908             if ((pid != 0 && pid != TARGET_PID)
2909                 || sim_core_read_unaligned_4 (current_cpu, pc, 0,
2910                                               paramp) != 0)
2911               retval = -cb_host_to_target_errno (cb, EINVAL);
2912             else
2913               retval = 0;
2914             break;
2915           }
2916
2917         case TARGET_SYS_sched_setscheduler:
2918           {
2919             USI pid = arg1;
2920             USI policy = arg2;
2921             USI paramp = arg3;
2922
2923             if ((pid != 0 && pid != TARGET_PID)
2924                 || policy != TARGET_SCHED_OTHER
2925                 || sim_core_read_unaligned_4 (current_cpu, pc, 0,
2926                                               paramp) != 0)
2927               retval = -cb_host_to_target_errno (cb, EINVAL);
2928             else
2929               /* FIXME: Save scheduler setting to be read in later
2930                  sched_getparam calls.  */
2931               retval = 0;
2932             break;
2933           }
2934
2935         case TARGET_SYS_sched_yield:
2936           /* We reschedule to the next thread after a syscall anyway, so
2937              we don't have to do anything here than to set the return
2938              value.  */
2939           retval = 0;
2940           break;
2941
2942         case TARGET_SYS_sched_get_priority_min:
2943         case TARGET_SYS_sched_get_priority_max:
2944           if (arg1 != 0)
2945             retval = -cb_host_to_target_errno (cb, EINVAL);
2946           else
2947             retval = 0;
2948           break;
2949
2950         case TARGET_SYS_ugetrlimit:
2951           {
2952             unsigned int curlim, maxlim;
2953             if (arg1 != TARGET_RLIMIT_STACK && arg1 != TARGET_RLIMIT_NOFILE)
2954               {
2955                 retval = -cb_host_to_target_errno (cb, EINVAL);
2956                 break;
2957               }
2958
2959             /* The kernel says:
2960                struct rlimit {
2961                        unsigned long   rlim_cur;
2962                        unsigned long   rlim_max;
2963                }; */
2964             if (arg1 == TARGET_RLIMIT_NOFILE)
2965               {
2966                 /* Sadly a very low limit.  Better not lie, though.  */
2967                 maxlim = curlim = MAX_CALLBACK_FDS;
2968               }
2969             else /* arg1 == TARGET_RLIMIT_STACK */
2970               {
2971                 maxlim = 0xffffffff;
2972                 curlim = 0x800000;
2973               }
2974             sim_core_write_unaligned_4 (current_cpu, pc, 0, arg2, curlim);
2975             sim_core_write_unaligned_4 (current_cpu, pc, 0, arg2 + 4, maxlim);
2976             retval = 0;
2977             break;
2978           }
2979
2980         case TARGET_SYS_setrlimit:
2981           if (arg1 != TARGET_RLIMIT_STACK)
2982             {
2983               retval = -cb_host_to_target_errno (cb, EINVAL);
2984               break;
2985             }
2986           /* FIXME: Save values for future ugetrlimit calls.  */
2987           retval = 0;
2988           break;
2989
2990         /* Provide a very limited subset of the sysctl functions, and
2991            abort for the rest. */
2992         case TARGET_SYS__sysctl:
2993           {
2994             /* The kernel says:
2995                struct __sysctl_args {
2996                 int *name;
2997                 int nlen;
2998                 void *oldval;
2999                 size_t *oldlenp;
3000                 void *newval;
3001                 size_t newlen;
3002                 unsigned long __unused[4];
3003                }; */
3004             SI name = sim_core_read_unaligned_4 (current_cpu, pc, 0, arg1);
3005             SI name0 = name == 0
3006               ? 0 : sim_core_read_unaligned_4 (current_cpu, pc, 0, name);
3007             SI name1 = name == 0
3008               ? 0 : sim_core_read_unaligned_4 (current_cpu, pc, 0, name + 4);
3009             SI nlen
3010               =  sim_core_read_unaligned_4 (current_cpu, pc, 0, arg1 + 4);
3011             SI oldval
3012               =  sim_core_read_unaligned_4 (current_cpu, pc, 0, arg1 + 8);
3013             SI oldlenp
3014               =  sim_core_read_unaligned_4 (current_cpu, pc, 0, arg1 + 12);
3015             SI oldlen = oldlenp == 0
3016               ? 0 : sim_core_read_unaligned_4 (current_cpu, pc, 0, oldlenp);
3017             SI newval
3018               =  sim_core_read_unaligned_4 (current_cpu, pc, 0, arg1 + 16);
3019             SI newlen
3020               = sim_core_read_unaligned_4 (current_cpu, pc, 0, arg1 + 20);
3021
3022             if (name0 == TARGET_CTL_KERN && name1 == TARGET_CTL_KERN_VERSION)
3023               {
3024                 SI to_write = oldlen < (SI) sizeof (TARGET_UTSNAME)
3025                   ? oldlen : (SI) sizeof (TARGET_UTSNAME);
3026
3027                 sim_core_write_unaligned_4 (current_cpu, pc, 0, oldlenp,
3028                                             sizeof (TARGET_UTSNAME));
3029
3030                 if (sim_core_write_buffer (sd, current_cpu, write_map,
3031                                            TARGET_UTSNAME, oldval,
3032                                            to_write)
3033                     != (unsigned int) to_write)
3034                   retval = -cb_host_to_target_errno (cb, EFAULT);
3035                 else
3036                   retval = 0;
3037                 break;
3038               }
3039
3040             retval
3041               = cris_unknown_syscall (current_cpu, pc,
3042                                       "Unimplemented _sysctl syscall "
3043                                       "(0x%lx: [0x%lx, 0x%lx],"
3044                                       " 0x%lx, 0x%lx, 0x%lx, 0x%lx, 0x%lx)\n",
3045                                       (unsigned long) name,
3046                                       (unsigned long) name0,
3047                                       (unsigned long) name1,
3048                                       (unsigned long) nlen,
3049                                       (unsigned long) oldval,
3050                                       (unsigned long) oldlenp,
3051                                       (unsigned long) newval,
3052                                       (unsigned long) newlen);
3053             break;
3054           }
3055
3056         case TARGET_SYS_exit:
3057           {
3058             /* Here for all but the last thread.  */
3059             int i;
3060             int pid
3061               = current_cpu->thread_data[threadno].threadid + TARGET_PID;
3062             int ppid
3063               = (current_cpu->thread_data[threadno].parent_threadid
3064                  + TARGET_PID);
3065             int exitsig = current_cpu->thread_data[threadno].exitsig;
3066
3067             /* Any children are now all orphans.  */
3068             for (i = 0; i < SIM_TARGET_MAX_THREADS; i++)
3069               if (current_cpu->thread_data[i].parent_threadid
3070                   == current_cpu->thread_data[threadno].threadid)
3071                 /* Make getppid(2) return 1 for them, poor little ones.  */
3072                 current_cpu->thread_data[i].parent_threadid = -TARGET_PID + 1;
3073
3074             /* Free the cpu context data.  When the parent has received
3075                the exit status, we'll clear the entry too.  */
3076             free (current_cpu->thread_data[threadno].cpu_context);
3077             current_cpu->thread_data[threadno].cpu_context = NULL;
3078             current_cpu->m1threads--;
3079             if (arg1 != 0)
3080               {
3081                 sim_io_eprintf (sd, "Thread %d exited with status %d\n",
3082                                 pid, arg1);
3083                 sim_engine_halt (sd, current_cpu, NULL, pc, sim_stopped,
3084                                  SIM_SIGILL);
3085               }
3086
3087             /* Still, we may want to support non-zero exit values.  */
3088             current_cpu->thread_data[threadno].exitval = arg1 << 8;
3089
3090             if (exitsig)
3091               deliver_signal (current_cpu, exitsig, ppid);
3092             break;
3093           }
3094
3095         case TARGET_SYS_clone:
3096           {
3097             int nthreads = current_cpu->m1threads + 1;
3098             void *thread_cpu_data;
3099             bfd_byte old_sp_buf[4];
3100             bfd_byte sp_buf[4];
3101             const bfd_byte zeros[4] = { 0, 0, 0, 0 };
3102             int i;
3103
3104             /* That's right, the syscall clone arguments are reversed
3105                compared to sys_clone notes in clone(2) and compared to
3106                other Linux ports (i.e. it's the same order as in the
3107                clone(2) libcall).  */
3108             USI flags = arg2;
3109             USI newsp = arg1;
3110
3111             if (nthreads == SIM_TARGET_MAX_THREADS)
3112               {
3113                 retval = -cb_host_to_target_errno (cb, EAGAIN);
3114                 break;
3115               }
3116
3117             /* FIXME: Implement the low byte.  */
3118             if ((flags & ~TARGET_CSIGNAL) !=
3119                 (TARGET_CLONE_VM
3120                  | TARGET_CLONE_FS
3121                  | TARGET_CLONE_FILES
3122                  | TARGET_CLONE_SIGHAND)
3123                 || newsp == 0)
3124               {
3125                 retval
3126                   = cris_unknown_syscall (current_cpu, pc,
3127                                           "Unimplemented clone syscall "
3128                                           "(0x%lx, 0x%lx)\n",
3129                                           (unsigned long) arg1,
3130                                           (unsigned long) arg2);
3131                 break;
3132               }
3133
3134             if (current_cpu->thread_data == NULL)
3135               make_first_thread (current_cpu);
3136
3137             /* The created thread will get the new SP and a cleared R10.
3138                Since it's created out of a copy of the old thread and we
3139                don't have a set-register-function that just take the
3140                cpu_data as a parameter, we set the childs values first,
3141                and write back or overwrite them in the parent after the
3142                copy.  */
3143             (*CPU_REG_FETCH (current_cpu)) (current_cpu,
3144                                             H_GR_SP, old_sp_buf, 4);
3145             bfd_putl32 (newsp, sp_buf);
3146             (*CPU_REG_STORE (current_cpu)) (current_cpu,
3147                                             H_GR_SP, sp_buf, 4);
3148             (*CPU_REG_STORE (current_cpu)) (current_cpu,
3149                                             H_GR_R10, (bfd_byte *) zeros, 4);
3150             thread_cpu_data
3151               = (*current_cpu
3152                  ->make_thread_cpu_data) (current_cpu,
3153                                           &current_cpu->cpu_data_placeholder);
3154             (*CPU_REG_STORE (current_cpu)) (current_cpu,
3155                                             H_GR_SP, old_sp_buf, 4);
3156
3157             retval = ++current_cpu->max_threadid + TARGET_PID;
3158
3159             /* Find an unused slot.  After a few threads have been created
3160                and exited, the array is expected to be a bit fragmented.
3161                We don't reuse the first entry, though, that of the
3162                original thread.  */
3163             for (i = 1; i < SIM_TARGET_MAX_THREADS; i++)
3164               if (current_cpu->thread_data[i].cpu_context == NULL
3165                   /* Don't reuse a zombied entry.  */
3166                   && current_cpu->thread_data[i].threadid == 0)
3167                 break;
3168
3169             memcpy (&current_cpu->thread_data[i],
3170                     &current_cpu->thread_data[threadno],
3171                     sizeof (current_cpu->thread_data[i]));
3172             current_cpu->thread_data[i].cpu_context = thread_cpu_data;
3173             current_cpu->thread_data[i].cpu_context_atsignal = NULL;
3174             current_cpu->thread_data[i].threadid = current_cpu->max_threadid;
3175             current_cpu->thread_data[i].parent_threadid
3176               = current_cpu->thread_data[threadno].threadid;
3177             current_cpu->thread_data[i].pipe_read_fd = 0;
3178             current_cpu->thread_data[i].pipe_write_fd = 0;
3179             current_cpu->thread_data[i].at_syscall = 0;
3180             current_cpu->thread_data[i].sigpending = 0;
3181             current_cpu->thread_data[i].sigsuspended = 0;
3182             current_cpu->thread_data[i].exitsig = flags & TARGET_CSIGNAL;
3183             current_cpu->m1threads = nthreads;
3184             break;
3185           }
3186
3187         /* Better watch these in case they do something necessary.  */
3188         case TARGET_SYS_socketcall:
3189           retval = -cb_host_to_target_errno (cb, ENOSYS);
3190           break;
3191
3192         case TARGET_SYS_set_thread_area:
3193           /* Do the same error check as Linux.  */
3194           if (arg1 & 255)
3195             {
3196               retval = -cb_host_to_target_errno (cb, EINVAL);
3197               break;
3198             }
3199           (*current_cpu->set_target_thread_data) (current_cpu, arg1);
3200           retval = 0;
3201           break;
3202
3203         unimplemented_syscall:
3204         default:
3205           retval
3206             = cris_unknown_syscall (current_cpu, pc,
3207                                     "Unimplemented syscall: %d "
3208                                     "(0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x)\n",
3209                                     callnum, arg1, arg2, arg3, arg4, arg5,
3210                                     arg6);
3211         }
3212     }
3213
3214   /* Minimal support for fcntl F_GETFL as used in open+fdopen.  */
3215   if (callnum == TARGET_SYS_open)
3216     {
3217       current_cpu->last_open_fd = retval;
3218       current_cpu->last_open_flags = arg2;
3219     }
3220
3221   current_cpu->last_syscall = callnum;
3222
3223   /* A system call is a rescheduling point.  For the time being, we don't
3224      reschedule anywhere else.  */
3225   if (current_cpu->m1threads != 0
3226       /* We need to schedule off from an exiting thread that is the
3227          second-last one.  */
3228       || (current_cpu->thread_data != NULL
3229           && current_cpu->thread_data[threadno].cpu_context == NULL))
3230     {
3231       bfd_byte retval_buf[4];
3232
3233       current_cpu->thread_data[threadno].last_execution
3234         = TARGET_TIME_MS (current_cpu);
3235       bfd_putl32 (retval, retval_buf);
3236       (*CPU_REG_STORE (current_cpu)) (current_cpu, H_GR_R10, retval_buf, 4);
3237
3238       current_cpu->thread_data[threadno].at_syscall = 1;
3239       reschedule (current_cpu);
3240
3241       (*CPU_REG_FETCH (current_cpu)) (current_cpu, H_GR_R10, retval_buf, 4);
3242       retval = bfd_getl32 (retval_buf);
3243     }
3244
3245   return retval;
3246 }
3247
3248 /* Callback from simulator write saying that the pipe at (reader, writer)
3249    is now non-empty (so the writer should wait until the pipe is empty, at
3250    least not write to this or any other pipe).  Simplest is to just wait
3251    until the pipe is empty.  */
3252
3253 static void
3254 cris_pipe_nonempty (host_callback *cb ATTRIBUTE_UNUSED,
3255                     int reader, int writer)
3256 {
3257   SIM_CPU *cpu = current_cpu_for_cb_callback;
3258   const bfd_byte zeros[4] = { 0, 0, 0, 0 };
3259
3260   /* It's the current thread: we just have to re-run the current
3261      syscall instruction (presumably "break 13") and change the syscall
3262      to the special simulator-wait code.  Oh, and set a marker that
3263      we're waiting, so we can disambiguate the special call from a
3264      program error.
3265
3266      This function may be called multiple times between cris_pipe_empty,
3267      but we must avoid e.g. decreasing PC every time.  Check fd markers
3268      to tell.  */
3269   if (cpu->thread_data == NULL)
3270     {
3271       sim_io_eprintf (CPU_STATE (cpu),
3272                       "Terminating simulation due to writing pipe rd:wr %d:%d"
3273                       " from one single thread\n", reader, writer);
3274       sim_engine_halt (CPU_STATE (cpu), cpu,
3275                        NULL, sim_pc_get (cpu), sim_stopped, SIM_SIGILL);
3276     }
3277   else if (cpu->thread_data[cpu->threadno].pipe_write_fd == 0)
3278     {
3279       cpu->thread_data[cpu->threadno].pipe_write_fd = writer;
3280       cpu->thread_data[cpu->threadno].pipe_read_fd = reader;
3281       /* FIXME: We really shouldn't change registers other than R10 in
3282          syscalls (like R9), here or elsewhere.  */
3283       (*CPU_REG_STORE (cpu)) (cpu, H_GR_R9, (bfd_byte *) zeros, 4);
3284       sim_pc_set (cpu, sim_pc_get (cpu) - 2);
3285     }
3286 }
3287
3288 /* Callback from simulator close or read call saying that the pipe at
3289    (reader, writer) is now empty (so the writer can write again, perhaps
3290    leave a waiting state).  If there are bytes remaining, they couldn't be
3291    consumed (perhaps due to the pipe closing).  */
3292
3293 static void
3294 cris_pipe_empty (host_callback *cb,
3295                  int reader,
3296                  int writer)
3297 {
3298   int i;
3299   SIM_CPU *cpu = current_cpu_for_cb_callback;
3300   SIM_DESC sd = CPU_STATE (current_cpu_for_cb_callback);
3301   bfd_byte r10_buf[4];
3302   int remaining
3303     = cb->pipe_buffer[writer].size - cb->pipe_buffer[reader].size;
3304
3305   /* We need to find the thread that waits for this pipe.  */
3306   for (i = 0; i < SIM_TARGET_MAX_THREADS; i++)
3307     if (cpu->thread_data[i].cpu_context
3308         && cpu->thread_data[i].pipe_write_fd == writer)
3309       {
3310         int retval;
3311
3312         /* Temporarily switch to this cpu context, so we can change the
3313            PC by ordinary calls.  */
3314
3315         memcpy (cpu->thread_data[cpu->threadno].cpu_context,
3316                 &cpu->cpu_data_placeholder,
3317                 cpu->thread_cpu_data_size);
3318         memcpy (&cpu->cpu_data_placeholder,
3319                 cpu->thread_data[i].cpu_context,
3320                 cpu->thread_cpu_data_size);
3321
3322         /* The return value is supposed to contain the number of
3323            written bytes, which is the number of bytes requested and
3324            returned at the write call.  You might think the right
3325            thing is to adjust the return-value to be only the
3326            *consumed* number of bytes, but it isn't.  We're only
3327            called if the pipe buffer is fully consumed or it is being
3328            closed, possibly with remaining bytes.  For the latter
3329            case, the writer is still supposed to see success for
3330            PIPE_BUF bytes (a constant which we happen to know and is
3331            unlikely to change).  The return value may also be a
3332            negative number; an error value.  This case is covered
3333            because "remaining" is always >= 0.  */
3334         (*CPU_REG_FETCH (cpu)) (cpu, H_GR_R10, r10_buf, 4);
3335         retval = (int) bfd_getl_signed_32 (r10_buf);
3336         if (retval - remaining > TARGET_PIPE_BUF)
3337           {
3338             bfd_putl32 (retval - remaining, r10_buf);
3339             (*CPU_REG_STORE (cpu)) (cpu, H_GR_R10, r10_buf, 4);
3340           }
3341         sim_pc_set (cpu, sim_pc_get (cpu) + 2);
3342         memcpy (cpu->thread_data[i].cpu_context,
3343                 &cpu->cpu_data_placeholder,
3344                 cpu->thread_cpu_data_size);
3345         memcpy (&cpu->cpu_data_placeholder,
3346                 cpu->thread_data[cpu->threadno].cpu_context,
3347                 cpu->thread_cpu_data_size);
3348         cpu->thread_data[i].pipe_read_fd = 0;
3349         cpu->thread_data[i].pipe_write_fd = 0;
3350         return;
3351       }
3352
3353   abort ();
3354 }
3355
3356 /* We have a simulator-specific notion of time.  See TARGET_TIME.  */
3357
3358 static long
3359 cris_time (host_callback *cb ATTRIBUTE_UNUSED, long *t)
3360 {
3361   long retval = TARGET_TIME (current_cpu_for_cb_callback);
3362   if (t)
3363     *t = retval;
3364   return retval;
3365 }
3366
3367 /* Set target-specific callback data. */
3368
3369 void
3370 cris_set_callbacks (host_callback *cb)
3371 {
3372   /* Yeargh, have to cast away constness to avoid warnings.  */
3373   cb->syscall_map = (CB_TARGET_DEFS_MAP *) syscall_map;
3374   cb->errno_map = (CB_TARGET_DEFS_MAP *) errno_map;
3375
3376   /* The kernel stat64 layout.  If we see a file > 2G, the "long"
3377      parameter to cb_store_target_endian will make st_size negative.
3378      Similarly for st_ino.  FIXME: Find a 64-bit type, and use it
3379      *unsigned*, and/or add syntax for signed-ness.  */
3380   cb->stat_map = stat_map;
3381   cb->open_map = (CB_TARGET_DEFS_MAP *) open_map;
3382   cb->pipe_nonempty = cris_pipe_nonempty;
3383   cb->pipe_empty = cris_pipe_empty;
3384   cb->time = cris_time;
3385 }
3386
3387 /* Process an address exception.  */
3388
3389 void
3390 cris_core_signal (SIM_DESC sd, SIM_CPU *current_cpu, sim_cia cia,
3391                   unsigned int map, int nr_bytes, address_word addr,
3392                   transfer_type transfer, sim_core_signals sig)
3393 {
3394   sim_core_signal (sd, current_cpu, cia, map, nr_bytes, addr,
3395                    transfer, sig);
3396 }