xref: /netbsd-src/external/gpl3/gdb/dist/sim/cris/traps.c (revision b7b7574d3bf8eeb51a1fa3977b59142ec6434a55)
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 }
3397