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