4 * Copyright (c) 2003 Fabrice Bellard
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
31 #include <sys/types.h>
37 #include <sys/mount.h>
38 #include <sys/prctl.h>
39 #include <sys/resource.h>
44 #include <sys/socket.h>
47 #include <sys/times.h>
50 #include <sys/statfs.h>
52 #include <sys/sysinfo.h>
53 //#include <sys/user.h>
54 #include <netinet/ip.h>
55 #include <netinet/tcp.h>
56 #include <qemu-common.h>
61 #define termios host_termios
62 #define winsize host_winsize
63 #define termio host_termio
64 #define sgttyb host_sgttyb /* same as target */
65 #define tchars host_tchars /* same as target */
66 #define ltchars host_ltchars /* same as target */
68 #include <linux/termios.h>
69 #include <linux/unistd.h>
70 #include <linux/utsname.h>
71 #include <linux/cdrom.h>
72 #include <linux/hdreg.h>
73 #include <linux/soundcard.h>
75 #include <linux/mtio.h>
76 #include "linux_loop.h"
79 #include "qemu-common.h"
82 #include <linux/futex.h>
83 #define CLONE_NPTL_FLAGS2 (CLONE_SETTLS | \
84 CLONE_PARENT_SETTID | CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID)
86 /* XXX: Hardcode the above values. */
87 #define CLONE_NPTL_FLAGS2 0
92 #if defined(TARGET_I386) || defined(TARGET_ARM) || defined(TARGET_SPARC) \
93 || defined(TARGET_M68K) || defined(TARGET_SH4) || defined(TARGET_CRIS)
94 /* 16 bit uid wrappers emulation */
98 //#include <linux/msdos_fs.h>
99 #define VFAT_IOCTL_READDIR_BOTH _IOR('r', 1, struct linux_dirent [2])
100 #define VFAT_IOCTL_READDIR_SHORT _IOR('r', 2, struct linux_dirent [2])
111 #define _syscall0(type,name) \
112 static type name (void) \
114 return syscall(__NR_##name); \
117 #define _syscall1(type,name,type1,arg1) \
118 static type name (type1 arg1) \
120 return syscall(__NR_##name, arg1); \
123 #define _syscall2(type,name,type1,arg1,type2,arg2) \
124 static type name (type1 arg1,type2 arg2) \
126 return syscall(__NR_##name, arg1, arg2); \
129 #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \
130 static type name (type1 arg1,type2 arg2,type3 arg3) \
132 return syscall(__NR_##name, arg1, arg2, arg3); \
135 #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
136 static type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4) \
138 return syscall(__NR_##name, arg1, arg2, arg3, arg4); \
141 #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
143 static type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5) \
145 return syscall(__NR_##name, arg1, arg2, arg3, arg4, arg5); \
149 #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
150 type5,arg5,type6,arg6) \
151 static type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5, \
154 return syscall(__NR_##name, arg1, arg2, arg3, arg4, arg5, arg6); \
158 #define __NR_sys_exit __NR_exit
159 #define __NR_sys_uname __NR_uname
160 #define __NR_sys_faccessat __NR_faccessat
161 #define __NR_sys_fchmodat __NR_fchmodat
162 #define __NR_sys_fchownat __NR_fchownat
163 #define __NR_sys_fstatat64 __NR_fstatat64
164 #define __NR_sys_futimesat __NR_futimesat
165 #define __NR_sys_getcwd1 __NR_getcwd
166 #define __NR_sys_getdents __NR_getdents
167 #define __NR_sys_getdents64 __NR_getdents64
168 #define __NR_sys_getpriority __NR_getpriority
169 #define __NR_sys_linkat __NR_linkat
170 #define __NR_sys_mkdirat __NR_mkdirat
171 #define __NR_sys_mknodat __NR_mknodat
172 #define __NR_sys_openat __NR_openat
173 #define __NR_sys_readlinkat __NR_readlinkat
174 #define __NR_sys_renameat __NR_renameat
175 #define __NR_sys_rt_sigqueueinfo __NR_rt_sigqueueinfo
176 #define __NR_sys_symlinkat __NR_symlinkat
177 #define __NR_sys_syslog __NR_syslog
178 #define __NR_sys_tgkill __NR_tgkill
179 #define __NR_sys_tkill __NR_tkill
180 #define __NR_sys_unlinkat __NR_unlinkat
181 #define __NR_sys_utimensat __NR_utimensat
182 #define __NR_sys_futex __NR_futex
183 #define __NR_sys_inotify_init __NR_inotify_init
184 #define __NR_sys_inotify_add_watch __NR_inotify_add_watch
185 #define __NR_sys_inotify_rm_watch __NR_inotify_rm_watch
187 #if defined(__alpha__) || defined (__ia64__) || defined(__x86_64__)
188 #define __NR__llseek __NR_lseek
192 _syscall0(int, gettid
)
194 /* This is a replacement for the host gettid() and must return a host
196 static int gettid(void) {
200 _syscall1(int,sys_exit
,int,status
)
201 _syscall1(int,sys_uname
,struct new_utsname
*,buf
)
202 #if defined(TARGET_NR_faccessat) && defined(__NR_faccessat)
203 _syscall4(int,sys_faccessat
,int,dirfd
,const char *,pathname
,int,mode
,int,flags
)
205 #if defined(TARGET_NR_fchmodat) && defined(__NR_fchmodat)
206 _syscall4(int,sys_fchmodat
,int,dirfd
,const char *,pathname
,
207 mode_t
,mode
,int,flags
)
209 #if defined(TARGET_NR_fchownat) && defined(__NR_fchownat) && defined(USE_UID16)
210 _syscall5(int,sys_fchownat
,int,dirfd
,const char *,pathname
,
211 uid_t
,owner
,gid_t
,group
,int,flags
)
213 #if defined(TARGET_NR_fstatat64) && defined(__NR_fstatat64)
214 _syscall4(int,sys_fstatat64
,int,dirfd
,const char *,pathname
,
215 struct stat
*,buf
,int,flags
)
217 #if defined(TARGET_NR_futimesat) && defined(__NR_futimesat)
218 _syscall3(int,sys_futimesat
,int,dirfd
,const char *,pathname
,
219 const struct timeval
*,times
)
221 _syscall2(int,sys_getcwd1
,char *,buf
,size_t,size
)
222 #if TARGET_ABI_BITS == 32
223 _syscall3(int, sys_getdents
, uint
, fd
, struct linux_dirent
*, dirp
, uint
, count
);
225 #if defined(TARGET_NR_getdents64) && defined(__NR_getdents64)
226 _syscall3(int, sys_getdents64
, uint
, fd
, struct linux_dirent64
*, dirp
, uint
, count
);
228 _syscall2(int, sys_getpriority
, int, which
, int, who
);
229 #if !defined (__x86_64__)
230 _syscall5(int, _llseek
, uint
, fd
, ulong
, hi
, ulong
, lo
,
231 loff_t
*, res
, uint
, wh
);
233 #if defined(TARGET_NR_linkat) && defined(__NR_linkat)
234 _syscall5(int,sys_linkat
,int,olddirfd
,const char *,oldpath
,
235 int,newdirfd
,const char *,newpath
,int,flags
)
237 #if defined(TARGET_NR_mkdirat) && defined(__NR_mkdirat)
238 _syscall3(int,sys_mkdirat
,int,dirfd
,const char *,pathname
,mode_t
,mode
)
240 #if defined(TARGET_NR_mknodat) && defined(__NR_mknodat)
241 _syscall4(int,sys_mknodat
,int,dirfd
,const char *,pathname
,
242 mode_t
,mode
,dev_t
,dev
)
244 #if defined(TARGET_NR_openat) && defined(__NR_openat)
245 _syscall4(int,sys_openat
,int,dirfd
,const char *,pathname
,int,flags
,mode_t
,mode
)
247 #if defined(TARGET_NR_readlinkat) && defined(__NR_readlinkat)
248 _syscall4(int,sys_readlinkat
,int,dirfd
,const char *,pathname
,
249 char *,buf
,size_t,bufsize
)
251 #if defined(TARGET_NR_renameat) && defined(__NR_renameat)
252 _syscall4(int,sys_renameat
,int,olddirfd
,const char *,oldpath
,
253 int,newdirfd
,const char *,newpath
)
255 _syscall3(int,sys_rt_sigqueueinfo
,int,pid
,int,sig
,siginfo_t
*,uinfo
)
256 #if defined(TARGET_NR_symlinkat) && defined(__NR_symlinkat)
257 _syscall3(int,sys_symlinkat
,const char *,oldpath
,
258 int,newdirfd
,const char *,newpath
)
260 _syscall3(int,sys_syslog
,int,type
,char*,bufp
,int,len
)
261 #if defined(TARGET_NR_tgkill) && defined(__NR_tgkill)
262 _syscall3(int,sys_tgkill
,int,tgid
,int,pid
,int,sig
)
264 #if defined(TARGET_NR_tkill) && defined(__NR_tkill)
265 _syscall2(int,sys_tkill
,int,tid
,int,sig
)
267 #ifdef __NR_exit_group
268 _syscall1(int,exit_group
,int,error_code
)
270 #if defined(TARGET_NR_set_tid_address) && defined(__NR_set_tid_address)
271 _syscall1(int,set_tid_address
,int *,tidptr
)
273 #if defined(TARGET_NR_unlinkat) && defined(__NR_unlinkat)
274 _syscall3(int,sys_unlinkat
,int,dirfd
,const char *,pathname
,int,flags
)
276 #if defined(TARGET_NR_utimensat) && defined(__NR_utimensat)
277 _syscall4(int,sys_utimensat
,int,dirfd
,const char *,pathname
,
278 const struct timespec
*,tsp
,int,flags
)
280 #if defined(TARGET_NR_inotify_init) && defined(__NR_inotify_init)
281 _syscall0(int,sys_inotify_init
)
283 #if defined(TARGET_NR_inotify_add_watch) && defined(__NR_inotify_add_watch)
284 _syscall3(int,sys_inotify_add_watch
,int,fd
,const char *,pathname
,uint32_t,mask
)
286 #if defined(TARGET_NR_inotify_rm_watch) && defined(__NR_inotify_rm_watch)
287 _syscall2(int,sys_inotify_rm_watch
,int,fd
,uint32_t,wd
)
289 #if defined(USE_NPTL)
290 #if defined(TARGET_NR_futex) && defined(__NR_futex)
291 _syscall6(int,sys_futex
,int *,uaddr
,int,op
,int,val
,
292 const struct timespec
*,timeout
,int *,uaddr2
,int,val3
)
296 extern int personality(int);
297 extern int flock(int, int);
298 extern int setfsuid(int);
299 extern int setfsgid(int);
300 extern int setgroups(int, gid_t
*);
302 #define ERRNO_TABLE_SIZE 1200
304 /* target_to_host_errno_table[] is initialized from
305 * host_to_target_errno_table[] in syscall_init(). */
306 static uint16_t target_to_host_errno_table
[ERRNO_TABLE_SIZE
] = {
310 * This list is the union of errno values overridden in asm-<arch>/errno.h
311 * minus the errnos that are not actually generic to all archs.
313 static uint16_t host_to_target_errno_table
[ERRNO_TABLE_SIZE
] = {
314 [EIDRM
] = TARGET_EIDRM
,
315 [ECHRNG
] = TARGET_ECHRNG
,
316 [EL2NSYNC
] = TARGET_EL2NSYNC
,
317 [EL3HLT
] = TARGET_EL3HLT
,
318 [EL3RST
] = TARGET_EL3RST
,
319 [ELNRNG
] = TARGET_ELNRNG
,
320 [EUNATCH
] = TARGET_EUNATCH
,
321 [ENOCSI
] = TARGET_ENOCSI
,
322 [EL2HLT
] = TARGET_EL2HLT
,
323 [EDEADLK
] = TARGET_EDEADLK
,
324 [ENOLCK
] = TARGET_ENOLCK
,
325 [EBADE
] = TARGET_EBADE
,
326 [EBADR
] = TARGET_EBADR
,
327 [EXFULL
] = TARGET_EXFULL
,
328 [ENOANO
] = TARGET_ENOANO
,
329 [EBADRQC
] = TARGET_EBADRQC
,
330 [EBADSLT
] = TARGET_EBADSLT
,
331 [EBFONT
] = TARGET_EBFONT
,
332 [ENOSTR
] = TARGET_ENOSTR
,
333 [ENODATA
] = TARGET_ENODATA
,
334 [ETIME
] = TARGET_ETIME
,
335 [ENOSR
] = TARGET_ENOSR
,
336 [ENONET
] = TARGET_ENONET
,
337 [ENOPKG
] = TARGET_ENOPKG
,
338 [EREMOTE
] = TARGET_EREMOTE
,
339 [ENOLINK
] = TARGET_ENOLINK
,
340 [EADV
] = TARGET_EADV
,
341 [ESRMNT
] = TARGET_ESRMNT
,
342 [ECOMM
] = TARGET_ECOMM
,
343 [EPROTO
] = TARGET_EPROTO
,
344 [EDOTDOT
] = TARGET_EDOTDOT
,
345 [EMULTIHOP
] = TARGET_EMULTIHOP
,
346 [EBADMSG
] = TARGET_EBADMSG
,
347 [ENAMETOOLONG
] = TARGET_ENAMETOOLONG
,
348 [EOVERFLOW
] = TARGET_EOVERFLOW
,
349 [ENOTUNIQ
] = TARGET_ENOTUNIQ
,
350 [EBADFD
] = TARGET_EBADFD
,
351 [EREMCHG
] = TARGET_EREMCHG
,
352 [ELIBACC
] = TARGET_ELIBACC
,
353 [ELIBBAD
] = TARGET_ELIBBAD
,
354 [ELIBSCN
] = TARGET_ELIBSCN
,
355 [ELIBMAX
] = TARGET_ELIBMAX
,
356 [ELIBEXEC
] = TARGET_ELIBEXEC
,
357 [EILSEQ
] = TARGET_EILSEQ
,
358 [ENOSYS
] = TARGET_ENOSYS
,
359 [ELOOP
] = TARGET_ELOOP
,
360 [ERESTART
] = TARGET_ERESTART
,
361 [ESTRPIPE
] = TARGET_ESTRPIPE
,
362 [ENOTEMPTY
] = TARGET_ENOTEMPTY
,
363 [EUSERS
] = TARGET_EUSERS
,
364 [ENOTSOCK
] = TARGET_ENOTSOCK
,
365 [EDESTADDRREQ
] = TARGET_EDESTADDRREQ
,
366 [EMSGSIZE
] = TARGET_EMSGSIZE
,
367 [EPROTOTYPE
] = TARGET_EPROTOTYPE
,
368 [ENOPROTOOPT
] = TARGET_ENOPROTOOPT
,
369 [EPROTONOSUPPORT
] = TARGET_EPROTONOSUPPORT
,
370 [ESOCKTNOSUPPORT
] = TARGET_ESOCKTNOSUPPORT
,
371 [EOPNOTSUPP
] = TARGET_EOPNOTSUPP
,
372 [EPFNOSUPPORT
] = TARGET_EPFNOSUPPORT
,
373 [EAFNOSUPPORT
] = TARGET_EAFNOSUPPORT
,
374 [EADDRINUSE
] = TARGET_EADDRINUSE
,
375 [EADDRNOTAVAIL
] = TARGET_EADDRNOTAVAIL
,
376 [ENETDOWN
] = TARGET_ENETDOWN
,
377 [ENETUNREACH
] = TARGET_ENETUNREACH
,
378 [ENETRESET
] = TARGET_ENETRESET
,
379 [ECONNABORTED
] = TARGET_ECONNABORTED
,
380 [ECONNRESET
] = TARGET_ECONNRESET
,
381 [ENOBUFS
] = TARGET_ENOBUFS
,
382 [EISCONN
] = TARGET_EISCONN
,
383 [ENOTCONN
] = TARGET_ENOTCONN
,
384 [EUCLEAN
] = TARGET_EUCLEAN
,
385 [ENOTNAM
] = TARGET_ENOTNAM
,
386 [ENAVAIL
] = TARGET_ENAVAIL
,
387 [EISNAM
] = TARGET_EISNAM
,
388 [EREMOTEIO
] = TARGET_EREMOTEIO
,
389 [ESHUTDOWN
] = TARGET_ESHUTDOWN
,
390 [ETOOMANYREFS
] = TARGET_ETOOMANYREFS
,
391 [ETIMEDOUT
] = TARGET_ETIMEDOUT
,
392 [ECONNREFUSED
] = TARGET_ECONNREFUSED
,
393 [EHOSTDOWN
] = TARGET_EHOSTDOWN
,
394 [EHOSTUNREACH
] = TARGET_EHOSTUNREACH
,
395 [EALREADY
] = TARGET_EALREADY
,
396 [EINPROGRESS
] = TARGET_EINPROGRESS
,
397 [ESTALE
] = TARGET_ESTALE
,
398 [ECANCELED
] = TARGET_ECANCELED
,
399 [ENOMEDIUM
] = TARGET_ENOMEDIUM
,
400 [EMEDIUMTYPE
] = TARGET_EMEDIUMTYPE
,
402 [ENOKEY
] = TARGET_ENOKEY
,
405 [EKEYEXPIRED
] = TARGET_EKEYEXPIRED
,
408 [EKEYREVOKED
] = TARGET_EKEYREVOKED
,
411 [EKEYREJECTED
] = TARGET_EKEYREJECTED
,
414 [EOWNERDEAD
] = TARGET_EOWNERDEAD
,
416 #ifdef ENOTRECOVERABLE
417 [ENOTRECOVERABLE
] = TARGET_ENOTRECOVERABLE
,
421 static inline int host_to_target_errno(int err
)
423 if(host_to_target_errno_table
[err
])
424 return host_to_target_errno_table
[err
];
428 static inline int target_to_host_errno(int err
)
430 if (target_to_host_errno_table
[err
])
431 return target_to_host_errno_table
[err
];
435 static inline abi_long
get_errno(abi_long ret
)
438 return -host_to_target_errno(errno
);
443 static inline int is_error(abi_long ret
)
445 return (abi_ulong
)ret
>= (abi_ulong
)(-4096);
448 char *target_strerror(int err
)
450 return strerror(target_to_host_errno(err
));
453 static abi_ulong target_brk
;
454 static abi_ulong target_original_brk
;
456 void target_set_brk(abi_ulong new_brk
)
458 target_original_brk
= target_brk
= HOST_PAGE_ALIGN(new_brk
);
461 /* do_brk() must return target values and target errnos. */
462 abi_long
do_brk(abi_ulong new_brk
)
465 abi_long mapped_addr
;
470 if (new_brk
< target_original_brk
)
473 brk_page
= HOST_PAGE_ALIGN(target_brk
);
475 /* If the new brk is less than this, set it and we're done... */
476 if (new_brk
< brk_page
) {
477 target_brk
= new_brk
;
481 /* We need to allocate more memory after the brk... */
482 new_alloc_size
= HOST_PAGE_ALIGN(new_brk
- brk_page
+ 1);
483 mapped_addr
= get_errno(target_mmap(brk_page
, new_alloc_size
,
484 PROT_READ
|PROT_WRITE
,
485 MAP_ANON
|MAP_FIXED
|MAP_PRIVATE
, 0, 0));
487 if (!is_error(mapped_addr
))
488 target_brk
= new_brk
;
493 static inline abi_long
copy_from_user_fdset(fd_set
*fds
,
494 abi_ulong target_fds_addr
,
498 abi_ulong b
, *target_fds
;
500 nw
= (n
+ TARGET_ABI_BITS
- 1) / TARGET_ABI_BITS
;
501 if (!(target_fds
= lock_user(VERIFY_READ
,
503 sizeof(abi_ulong
) * nw
,
505 return -TARGET_EFAULT
;
509 for (i
= 0; i
< nw
; i
++) {
510 /* grab the abi_ulong */
511 __get_user(b
, &target_fds
[i
]);
512 for (j
= 0; j
< TARGET_ABI_BITS
; j
++) {
513 /* check the bit inside the abi_ulong */
520 unlock_user(target_fds
, target_fds_addr
, 0);
525 static inline abi_long
copy_to_user_fdset(abi_ulong target_fds_addr
,
531 abi_ulong
*target_fds
;
533 nw
= (n
+ TARGET_ABI_BITS
- 1) / TARGET_ABI_BITS
;
534 if (!(target_fds
= lock_user(VERIFY_WRITE
,
536 sizeof(abi_ulong
) * nw
,
538 return -TARGET_EFAULT
;
541 for (i
= 0; i
< nw
; i
++) {
543 for (j
= 0; j
< TARGET_ABI_BITS
; j
++) {
544 v
|= ((FD_ISSET(k
, fds
) != 0) << j
);
547 __put_user(v
, &target_fds
[i
]);
550 unlock_user(target_fds
, target_fds_addr
, sizeof(abi_ulong
) * nw
);
555 #if defined(__alpha__)
561 static inline abi_long
host_to_target_clock_t(long ticks
)
563 #if HOST_HZ == TARGET_HZ
566 return ((int64_t)ticks
* TARGET_HZ
) / HOST_HZ
;
570 static inline abi_long
host_to_target_rusage(abi_ulong target_addr
,
571 const struct rusage
*rusage
)
573 struct target_rusage
*target_rusage
;
575 if (!lock_user_struct(VERIFY_WRITE
, target_rusage
, target_addr
, 0))
576 return -TARGET_EFAULT
;
577 target_rusage
->ru_utime
.tv_sec
= tswapl(rusage
->ru_utime
.tv_sec
);
578 target_rusage
->ru_utime
.tv_usec
= tswapl(rusage
->ru_utime
.tv_usec
);
579 target_rusage
->ru_stime
.tv_sec
= tswapl(rusage
->ru_stime
.tv_sec
);
580 target_rusage
->ru_stime
.tv_usec
= tswapl(rusage
->ru_stime
.tv_usec
);
581 target_rusage
->ru_maxrss
= tswapl(rusage
->ru_maxrss
);
582 target_rusage
->ru_ixrss
= tswapl(rusage
->ru_ixrss
);
583 target_rusage
->ru_idrss
= tswapl(rusage
->ru_idrss
);
584 target_rusage
->ru_isrss
= tswapl(rusage
->ru_isrss
);
585 target_rusage
->ru_minflt
= tswapl(rusage
->ru_minflt
);
586 target_rusage
->ru_majflt
= tswapl(rusage
->ru_majflt
);
587 target_rusage
->ru_nswap
= tswapl(rusage
->ru_nswap
);
588 target_rusage
->ru_inblock
= tswapl(rusage
->ru_inblock
);
589 target_rusage
->ru_oublock
= tswapl(rusage
->ru_oublock
);
590 target_rusage
->ru_msgsnd
= tswapl(rusage
->ru_msgsnd
);
591 target_rusage
->ru_msgrcv
= tswapl(rusage
->ru_msgrcv
);
592 target_rusage
->ru_nsignals
= tswapl(rusage
->ru_nsignals
);
593 target_rusage
->ru_nvcsw
= tswapl(rusage
->ru_nvcsw
);
594 target_rusage
->ru_nivcsw
= tswapl(rusage
->ru_nivcsw
);
595 unlock_user_struct(target_rusage
, target_addr
, 1);
600 static inline abi_long
copy_from_user_timeval(struct timeval
*tv
,
601 abi_ulong target_tv_addr
)
603 struct target_timeval
*target_tv
;
605 if (!lock_user_struct(VERIFY_READ
, target_tv
, target_tv_addr
, 1))
606 return -TARGET_EFAULT
;
608 __get_user(tv
->tv_sec
, &target_tv
->tv_sec
);
609 __get_user(tv
->tv_usec
, &target_tv
->tv_usec
);
611 unlock_user_struct(target_tv
, target_tv_addr
, 0);
616 static inline abi_long
copy_to_user_timeval(abi_ulong target_tv_addr
,
617 const struct timeval
*tv
)
619 struct target_timeval
*target_tv
;
621 if (!lock_user_struct(VERIFY_WRITE
, target_tv
, target_tv_addr
, 0))
622 return -TARGET_EFAULT
;
624 __put_user(tv
->tv_sec
, &target_tv
->tv_sec
);
625 __put_user(tv
->tv_usec
, &target_tv
->tv_usec
);
627 unlock_user_struct(target_tv
, target_tv_addr
, 1);
633 /* do_select() must return target values and target errnos. */
634 static abi_long
do_select(int n
,
635 abi_ulong rfd_addr
, abi_ulong wfd_addr
,
636 abi_ulong efd_addr
, abi_ulong target_tv_addr
)
638 fd_set rfds
, wfds
, efds
;
639 fd_set
*rfds_ptr
, *wfds_ptr
, *efds_ptr
;
640 struct timeval tv
, *tv_ptr
;
644 if (copy_from_user_fdset(&rfds
, rfd_addr
, n
))
645 return -TARGET_EFAULT
;
651 if (copy_from_user_fdset(&wfds
, wfd_addr
, n
))
652 return -TARGET_EFAULT
;
658 if (copy_from_user_fdset(&efds
, efd_addr
, n
))
659 return -TARGET_EFAULT
;
665 if (target_tv_addr
) {
666 if (copy_from_user_timeval(&tv
, target_tv_addr
))
667 return -TARGET_EFAULT
;
673 ret
= get_errno(select(n
, rfds_ptr
, wfds_ptr
, efds_ptr
, tv_ptr
));
675 if (!is_error(ret
)) {
676 if (rfd_addr
&& copy_to_user_fdset(rfd_addr
, &rfds
, n
))
677 return -TARGET_EFAULT
;
678 if (wfd_addr
&& copy_to_user_fdset(wfd_addr
, &wfds
, n
))
679 return -TARGET_EFAULT
;
680 if (efd_addr
&& copy_to_user_fdset(efd_addr
, &efds
, n
))
681 return -TARGET_EFAULT
;
683 if (target_tv_addr
&& copy_to_user_timeval(target_tv_addr
, &tv
))
684 return -TARGET_EFAULT
;
690 static inline abi_long
target_to_host_sockaddr(struct sockaddr
*addr
,
691 abi_ulong target_addr
,
694 struct target_sockaddr
*target_saddr
;
696 target_saddr
= lock_user(VERIFY_READ
, target_addr
, len
, 1);
698 return -TARGET_EFAULT
;
699 memcpy(addr
, target_saddr
, len
);
700 addr
->sa_family
= tswap16(target_saddr
->sa_family
);
701 unlock_user(target_saddr
, target_addr
, 0);
706 static inline abi_long
host_to_target_sockaddr(abi_ulong target_addr
,
707 struct sockaddr
*addr
,
710 struct target_sockaddr
*target_saddr
;
712 target_saddr
= lock_user(VERIFY_WRITE
, target_addr
, len
, 0);
714 return -TARGET_EFAULT
;
715 memcpy(target_saddr
, addr
, len
);
716 target_saddr
->sa_family
= tswap16(addr
->sa_family
);
717 unlock_user(target_saddr
, target_addr
, len
);
722 /* ??? Should this also swap msgh->name? */
723 static inline abi_long
target_to_host_cmsg(struct msghdr
*msgh
,
724 struct target_msghdr
*target_msgh
)
726 struct cmsghdr
*cmsg
= CMSG_FIRSTHDR(msgh
);
727 abi_long msg_controllen
;
728 abi_ulong target_cmsg_addr
;
729 struct target_cmsghdr
*target_cmsg
;
732 msg_controllen
= tswapl(target_msgh
->msg_controllen
);
733 if (msg_controllen
< sizeof (struct target_cmsghdr
))
735 target_cmsg_addr
= tswapl(target_msgh
->msg_control
);
736 target_cmsg
= lock_user(VERIFY_READ
, target_cmsg_addr
, msg_controllen
, 1);
738 return -TARGET_EFAULT
;
740 while (cmsg
&& target_cmsg
) {
741 void *data
= CMSG_DATA(cmsg
);
742 void *target_data
= TARGET_CMSG_DATA(target_cmsg
);
744 int len
= tswapl(target_cmsg
->cmsg_len
)
745 - TARGET_CMSG_ALIGN(sizeof (struct target_cmsghdr
));
747 space
+= CMSG_SPACE(len
);
748 if (space
> msgh
->msg_controllen
) {
749 space
-= CMSG_SPACE(len
);
750 gemu_log("Host cmsg overflow\n");
754 cmsg
->cmsg_level
= tswap32(target_cmsg
->cmsg_level
);
755 cmsg
->cmsg_type
= tswap32(target_cmsg
->cmsg_type
);
756 cmsg
->cmsg_len
= CMSG_LEN(len
);
758 if (cmsg
->cmsg_level
!= TARGET_SOL_SOCKET
|| cmsg
->cmsg_type
!= SCM_RIGHTS
) {
759 gemu_log("Unsupported ancillary data: %d/%d\n", cmsg
->cmsg_level
, cmsg
->cmsg_type
);
760 memcpy(data
, target_data
, len
);
762 int *fd
= (int *)data
;
763 int *target_fd
= (int *)target_data
;
764 int i
, numfds
= len
/ sizeof(int);
766 for (i
= 0; i
< numfds
; i
++)
767 fd
[i
] = tswap32(target_fd
[i
]);
770 cmsg
= CMSG_NXTHDR(msgh
, cmsg
);
771 target_cmsg
= TARGET_CMSG_NXTHDR(target_msgh
, target_cmsg
);
773 unlock_user(target_cmsg
, target_cmsg_addr
, 0);
775 msgh
->msg_controllen
= space
;
779 /* ??? Should this also swap msgh->name? */
780 static inline abi_long
host_to_target_cmsg(struct target_msghdr
*target_msgh
,
783 struct cmsghdr
*cmsg
= CMSG_FIRSTHDR(msgh
);
784 abi_long msg_controllen
;
785 abi_ulong target_cmsg_addr
;
786 struct target_cmsghdr
*target_cmsg
;
789 msg_controllen
= tswapl(target_msgh
->msg_controllen
);
790 if (msg_controllen
< sizeof (struct target_cmsghdr
))
792 target_cmsg_addr
= tswapl(target_msgh
->msg_control
);
793 target_cmsg
= lock_user(VERIFY_WRITE
, target_cmsg_addr
, msg_controllen
, 0);
795 return -TARGET_EFAULT
;
797 while (cmsg
&& target_cmsg
) {
798 void *data
= CMSG_DATA(cmsg
);
799 void *target_data
= TARGET_CMSG_DATA(target_cmsg
);
801 int len
= cmsg
->cmsg_len
- CMSG_ALIGN(sizeof (struct cmsghdr
));
803 space
+= TARGET_CMSG_SPACE(len
);
804 if (space
> msg_controllen
) {
805 space
-= TARGET_CMSG_SPACE(len
);
806 gemu_log("Target cmsg overflow\n");
810 target_cmsg
->cmsg_level
= tswap32(cmsg
->cmsg_level
);
811 target_cmsg
->cmsg_type
= tswap32(cmsg
->cmsg_type
);
812 target_cmsg
->cmsg_len
= tswapl(TARGET_CMSG_LEN(len
));
814 if (cmsg
->cmsg_level
!= TARGET_SOL_SOCKET
|| cmsg
->cmsg_type
!= SCM_RIGHTS
) {
815 gemu_log("Unsupported ancillary data: %d/%d\n", cmsg
->cmsg_level
, cmsg
->cmsg_type
);
816 memcpy(target_data
, data
, len
);
818 int *fd
= (int *)data
;
819 int *target_fd
= (int *)target_data
;
820 int i
, numfds
= len
/ sizeof(int);
822 for (i
= 0; i
< numfds
; i
++)
823 target_fd
[i
] = tswap32(fd
[i
]);
826 cmsg
= CMSG_NXTHDR(msgh
, cmsg
);
827 target_cmsg
= TARGET_CMSG_NXTHDR(target_msgh
, target_cmsg
);
829 unlock_user(target_cmsg
, target_cmsg_addr
, space
);
831 target_msgh
->msg_controllen
= tswapl(space
);
835 /* do_setsockopt() Must return target values and target errnos. */
836 static abi_long
do_setsockopt(int sockfd
, int level
, int optname
,
837 abi_ulong optval_addr
, socklen_t optlen
)
844 /* TCP options all take an 'int' value. */
845 if (optlen
< sizeof(uint32_t))
846 return -TARGET_EINVAL
;
848 if (get_user_u32(val
, optval_addr
))
849 return -TARGET_EFAULT
;
850 ret
= get_errno(setsockopt(sockfd
, level
, optname
, &val
, sizeof(val
)));
857 case IP_ROUTER_ALERT
:
861 case IP_MTU_DISCOVER
:
867 case IP_MULTICAST_TTL
:
868 case IP_MULTICAST_LOOP
:
870 if (optlen
>= sizeof(uint32_t)) {
871 if (get_user_u32(val
, optval_addr
))
872 return -TARGET_EFAULT
;
873 } else if (optlen
>= 1) {
874 if (get_user_u8(val
, optval_addr
))
875 return -TARGET_EFAULT
;
877 ret
= get_errno(setsockopt(sockfd
, level
, optname
, &val
, sizeof(val
)));
883 case TARGET_SOL_SOCKET
:
885 /* Options with 'int' argument. */
886 case TARGET_SO_DEBUG
:
889 case TARGET_SO_REUSEADDR
:
890 optname
= SO_REUSEADDR
;
895 case TARGET_SO_ERROR
:
898 case TARGET_SO_DONTROUTE
:
899 optname
= SO_DONTROUTE
;
901 case TARGET_SO_BROADCAST
:
902 optname
= SO_BROADCAST
;
904 case TARGET_SO_SNDBUF
:
907 case TARGET_SO_RCVBUF
:
910 case TARGET_SO_KEEPALIVE
:
911 optname
= SO_KEEPALIVE
;
913 case TARGET_SO_OOBINLINE
:
914 optname
= SO_OOBINLINE
;
916 case TARGET_SO_NO_CHECK
:
917 optname
= SO_NO_CHECK
;
919 case TARGET_SO_PRIORITY
:
920 optname
= SO_PRIORITY
;
923 case TARGET_SO_BSDCOMPAT
:
924 optname
= SO_BSDCOMPAT
;
927 case TARGET_SO_PASSCRED
:
928 optname
= SO_PASSCRED
;
930 case TARGET_SO_TIMESTAMP
:
931 optname
= SO_TIMESTAMP
;
933 case TARGET_SO_RCVLOWAT
:
934 optname
= SO_RCVLOWAT
;
936 case TARGET_SO_RCVTIMEO
:
937 optname
= SO_RCVTIMEO
;
939 case TARGET_SO_SNDTIMEO
:
940 optname
= SO_SNDTIMEO
;
946 if (optlen
< sizeof(uint32_t))
947 return -TARGET_EINVAL
;
949 if (get_user_u32(val
, optval_addr
))
950 return -TARGET_EFAULT
;
951 ret
= get_errno(setsockopt(sockfd
, SOL_SOCKET
, optname
, &val
, sizeof(val
)));
955 gemu_log("Unsupported setsockopt level=%d optname=%d \n", level
, optname
);
956 ret
= -TARGET_ENOPROTOOPT
;
961 /* do_getsockopt() Must return target values and target errnos. */
962 static abi_long
do_getsockopt(int sockfd
, int level
, int optname
,
963 abi_ulong optval_addr
, abi_ulong optlen
)
970 case TARGET_SOL_SOCKET
:
973 case TARGET_SO_LINGER
:
974 case TARGET_SO_RCVTIMEO
:
975 case TARGET_SO_SNDTIMEO
:
976 case TARGET_SO_PEERCRED
:
977 case TARGET_SO_PEERNAME
:
978 /* These don't just return a single integer */
985 /* TCP options all take an 'int' value. */
987 if (get_user_u32(len
, optlen
))
988 return -TARGET_EFAULT
;
990 return -TARGET_EINVAL
;
992 ret
= get_errno(getsockopt(sockfd
, level
, optname
, &val
, &lv
));
999 if (put_user_u32(val
, optval_addr
))
1000 return -TARGET_EFAULT
;
1002 if (put_user_u8(val
, optval_addr
))
1003 return -TARGET_EFAULT
;
1005 if (put_user_u32(len
, optlen
))
1006 return -TARGET_EFAULT
;
1013 case IP_ROUTER_ALERT
:
1017 case IP_MTU_DISCOVER
:
1023 case IP_MULTICAST_TTL
:
1024 case IP_MULTICAST_LOOP
:
1025 if (get_user_u32(len
, optlen
))
1026 return -TARGET_EFAULT
;
1028 return -TARGET_EINVAL
;
1030 ret
= get_errno(getsockopt(sockfd
, level
, optname
, &val
, &lv
));
1033 if (len
< sizeof(int) && len
> 0 && val
>= 0 && val
< 255) {
1035 if (put_user_u32(len
, optlen
)
1036 || put_user_u8(val
, optval_addr
))
1037 return -TARGET_EFAULT
;
1039 if (len
> sizeof(int))
1041 if (put_user_u32(len
, optlen
)
1042 || put_user_u32(val
, optval_addr
))
1043 return -TARGET_EFAULT
;
1047 ret
= -TARGET_ENOPROTOOPT
;
1053 gemu_log("getsockopt level=%d optname=%d not yet supported\n",
1055 ret
= -TARGET_EOPNOTSUPP
;
1062 * lock_iovec()/unlock_iovec() have a return code of 0 for success where
1063 * other lock functions have a return code of 0 for failure.
1065 static abi_long
lock_iovec(int type
, struct iovec
*vec
, abi_ulong target_addr
,
1066 int count
, int copy
)
1068 struct target_iovec
*target_vec
;
1072 target_vec
= lock_user(VERIFY_READ
, target_addr
, count
* sizeof(struct target_iovec
), 1);
1074 return -TARGET_EFAULT
;
1075 for(i
= 0;i
< count
; i
++) {
1076 base
= tswapl(target_vec
[i
].iov_base
);
1077 vec
[i
].iov_len
= tswapl(target_vec
[i
].iov_len
);
1078 if (vec
[i
].iov_len
!= 0) {
1079 vec
[i
].iov_base
= lock_user(type
, base
, vec
[i
].iov_len
, copy
);
1080 /* Don't check lock_user return value. We must call writev even
1081 if a element has invalid base address. */
1083 /* zero length pointer is ignored */
1084 vec
[i
].iov_base
= NULL
;
1087 unlock_user (target_vec
, target_addr
, 0);
1091 static abi_long
unlock_iovec(struct iovec
*vec
, abi_ulong target_addr
,
1092 int count
, int copy
)
1094 struct target_iovec
*target_vec
;
1098 target_vec
= lock_user(VERIFY_READ
, target_addr
, count
* sizeof(struct target_iovec
), 1);
1100 return -TARGET_EFAULT
;
1101 for(i
= 0;i
< count
; i
++) {
1102 if (target_vec
[i
].iov_base
) {
1103 base
= tswapl(target_vec
[i
].iov_base
);
1104 unlock_user(vec
[i
].iov_base
, base
, copy
? vec
[i
].iov_len
: 0);
1107 unlock_user (target_vec
, target_addr
, 0);
1112 /* do_socket() Must return target values and target errnos. */
1113 static abi_long
do_socket(int domain
, int type
, int protocol
)
1115 #if defined(TARGET_MIPS)
1117 case TARGET_SOCK_DGRAM
:
1120 case TARGET_SOCK_STREAM
:
1123 case TARGET_SOCK_RAW
:
1126 case TARGET_SOCK_RDM
:
1129 case TARGET_SOCK_SEQPACKET
:
1130 type
= SOCK_SEQPACKET
;
1132 case TARGET_SOCK_PACKET
:
1137 if (domain
== PF_NETLINK
)
1138 return -EAFNOSUPPORT
; /* do not NETLINK socket connections possible */
1139 return get_errno(socket(domain
, type
, protocol
));
1142 /* do_bind() Must return target values and target errnos. */
1143 static abi_long
do_bind(int sockfd
, abi_ulong target_addr
,
1146 void *addr
= alloca(addrlen
);
1148 target_to_host_sockaddr(addr
, target_addr
, addrlen
);
1149 return get_errno(bind(sockfd
, addr
, addrlen
));
1152 /* do_connect() Must return target values and target errnos. */
1153 static abi_long
do_connect(int sockfd
, abi_ulong target_addr
,
1156 void *addr
= alloca(addrlen
);
1158 target_to_host_sockaddr(addr
, target_addr
, addrlen
);
1159 return get_errno(connect(sockfd
, addr
, addrlen
));
1162 /* do_sendrecvmsg() Must return target values and target errnos. */
1163 static abi_long
do_sendrecvmsg(int fd
, abi_ulong target_msg
,
1164 int flags
, int send
)
1167 struct target_msghdr
*msgp
;
1171 abi_ulong target_vec
;
1174 if (!lock_user_struct(send
? VERIFY_READ
: VERIFY_WRITE
,
1178 return -TARGET_EFAULT
;
1179 if (msgp
->msg_name
) {
1180 msg
.msg_namelen
= tswap32(msgp
->msg_namelen
);
1181 msg
.msg_name
= alloca(msg
.msg_namelen
);
1182 target_to_host_sockaddr(msg
.msg_name
, tswapl(msgp
->msg_name
),
1185 msg
.msg_name
= NULL
;
1186 msg
.msg_namelen
= 0;
1188 msg
.msg_controllen
= 2 * tswapl(msgp
->msg_controllen
);
1189 msg
.msg_control
= alloca(msg
.msg_controllen
);
1190 msg
.msg_flags
= tswap32(msgp
->msg_flags
);
1192 count
= tswapl(msgp
->msg_iovlen
);
1193 vec
= alloca(count
* sizeof(struct iovec
));
1194 target_vec
= tswapl(msgp
->msg_iov
);
1195 lock_iovec(send
? VERIFY_READ
: VERIFY_WRITE
, vec
, target_vec
, count
, send
);
1196 msg
.msg_iovlen
= count
;
1200 ret
= target_to_host_cmsg(&msg
, msgp
);
1202 ret
= get_errno(sendmsg(fd
, &msg
, flags
));
1204 ret
= get_errno(recvmsg(fd
, &msg
, flags
));
1205 if (!is_error(ret
)) {
1207 ret
= host_to_target_cmsg(msgp
, &msg
);
1212 unlock_iovec(vec
, target_vec
, count
, !send
);
1213 unlock_user_struct(msgp
, target_msg
, send
? 0 : 1);
1217 /* do_accept() Must return target values and target errnos. */
1218 static abi_long
do_accept(int fd
, abi_ulong target_addr
,
1219 abi_ulong target_addrlen_addr
)
1225 if (get_user_u32(addrlen
, target_addrlen_addr
))
1226 return -TARGET_EFAULT
;
1228 addr
= alloca(addrlen
);
1230 ret
= get_errno(accept(fd
, addr
, &addrlen
));
1231 if (!is_error(ret
)) {
1232 host_to_target_sockaddr(target_addr
, addr
, addrlen
);
1233 if (put_user_u32(addrlen
, target_addrlen_addr
))
1234 ret
= -TARGET_EFAULT
;
1239 /* do_getpeername() Must return target values and target errnos. */
1240 static abi_long
do_getpeername(int fd
, abi_ulong target_addr
,
1241 abi_ulong target_addrlen_addr
)
1247 if (get_user_u32(addrlen
, target_addrlen_addr
))
1248 return -TARGET_EFAULT
;
1250 addr
= alloca(addrlen
);
1252 ret
= get_errno(getpeername(fd
, addr
, &addrlen
));
1253 if (!is_error(ret
)) {
1254 host_to_target_sockaddr(target_addr
, addr
, addrlen
);
1255 if (put_user_u32(addrlen
, target_addrlen_addr
))
1256 ret
= -TARGET_EFAULT
;
1261 /* do_getsockname() Must return target values and target errnos. */
1262 static abi_long
do_getsockname(int fd
, abi_ulong target_addr
,
1263 abi_ulong target_addrlen_addr
)
1269 if (get_user_u32(addrlen
, target_addrlen_addr
))
1270 return -TARGET_EFAULT
;
1272 addr
= alloca(addrlen
);
1274 ret
= get_errno(getsockname(fd
, addr
, &addrlen
));
1275 if (!is_error(ret
)) {
1276 host_to_target_sockaddr(target_addr
, addr
, addrlen
);
1277 if (put_user_u32(addrlen
, target_addrlen_addr
))
1278 ret
= -TARGET_EFAULT
;
1283 /* do_socketpair() Must return target values and target errnos. */
1284 static abi_long
do_socketpair(int domain
, int type
, int protocol
,
1285 abi_ulong target_tab_addr
)
1290 ret
= get_errno(socketpair(domain
, type
, protocol
, tab
));
1291 if (!is_error(ret
)) {
1292 if (put_user_s32(tab
[0], target_tab_addr
)
1293 || put_user_s32(tab
[1], target_tab_addr
+ sizeof(tab
[0])))
1294 ret
= -TARGET_EFAULT
;
1299 /* do_sendto() Must return target values and target errnos. */
1300 static abi_long
do_sendto(int fd
, abi_ulong msg
, size_t len
, int flags
,
1301 abi_ulong target_addr
, socklen_t addrlen
)
1307 host_msg
= lock_user(VERIFY_READ
, msg
, len
, 1);
1309 return -TARGET_EFAULT
;
1311 addr
= alloca(addrlen
);
1312 target_to_host_sockaddr(addr
, target_addr
, addrlen
);
1313 ret
= get_errno(sendto(fd
, host_msg
, len
, flags
, addr
, addrlen
));
1315 ret
= get_errno(send(fd
, host_msg
, len
, flags
));
1317 unlock_user(host_msg
, msg
, 0);
1321 /* do_recvfrom() Must return target values and target errnos. */
1322 static abi_long
do_recvfrom(int fd
, abi_ulong msg
, size_t len
, int flags
,
1323 abi_ulong target_addr
,
1324 abi_ulong target_addrlen
)
1331 host_msg
= lock_user(VERIFY_WRITE
, msg
, len
, 0);
1333 return -TARGET_EFAULT
;
1335 if (get_user_u32(addrlen
, target_addrlen
)) {
1336 ret
= -TARGET_EFAULT
;
1339 addr
= alloca(addrlen
);
1340 ret
= get_errno(recvfrom(fd
, host_msg
, len
, flags
, addr
, &addrlen
));
1342 addr
= NULL
; /* To keep compiler quiet. */
1343 ret
= get_errno(recv(fd
, host_msg
, len
, flags
));
1345 if (!is_error(ret
)) {
1347 host_to_target_sockaddr(target_addr
, addr
, addrlen
);
1348 if (put_user_u32(addrlen
, target_addrlen
)) {
1349 ret
= -TARGET_EFAULT
;
1353 unlock_user(host_msg
, msg
, len
);
1356 unlock_user(host_msg
, msg
, 0);
1361 #ifdef TARGET_NR_socketcall
1362 /* do_socketcall() Must return target values and target errnos. */
1363 static abi_long
do_socketcall(int num
, abi_ulong vptr
)
1366 const int n
= sizeof(abi_ulong
);
1371 int domain
, type
, protocol
;
1373 if (get_user_s32(domain
, vptr
)
1374 || get_user_s32(type
, vptr
+ n
)
1375 || get_user_s32(protocol
, vptr
+ 2 * n
))
1376 return -TARGET_EFAULT
;
1378 ret
= do_socket(domain
, type
, protocol
);
1384 abi_ulong target_addr
;
1387 if (get_user_s32(sockfd
, vptr
)
1388 || get_user_ual(target_addr
, vptr
+ n
)
1389 || get_user_u32(addrlen
, vptr
+ 2 * n
))
1390 return -TARGET_EFAULT
;
1392 ret
= do_bind(sockfd
, target_addr
, addrlen
);
1395 case SOCKOP_connect
:
1398 abi_ulong target_addr
;
1401 if (get_user_s32(sockfd
, vptr
)
1402 || get_user_ual(target_addr
, vptr
+ n
)
1403 || get_user_u32(addrlen
, vptr
+ 2 * n
))
1404 return -TARGET_EFAULT
;
1406 ret
= do_connect(sockfd
, target_addr
, addrlen
);
1411 int sockfd
, backlog
;
1413 if (get_user_s32(sockfd
, vptr
)
1414 || get_user_s32(backlog
, vptr
+ n
))
1415 return -TARGET_EFAULT
;
1417 ret
= get_errno(listen(sockfd
, backlog
));
1423 abi_ulong target_addr
, target_addrlen
;
1425 if (get_user_s32(sockfd
, vptr
)
1426 || get_user_ual(target_addr
, vptr
+ n
)
1427 || get_user_u32(target_addrlen
, vptr
+ 2 * n
))
1428 return -TARGET_EFAULT
;
1430 ret
= do_accept(sockfd
, target_addr
, target_addrlen
);
1433 case SOCKOP_getsockname
:
1436 abi_ulong target_addr
, target_addrlen
;
1438 if (get_user_s32(sockfd
, vptr
)
1439 || get_user_ual(target_addr
, vptr
+ n
)
1440 || get_user_u32(target_addrlen
, vptr
+ 2 * n
))
1441 return -TARGET_EFAULT
;
1443 ret
= do_getsockname(sockfd
, target_addr
, target_addrlen
);
1446 case SOCKOP_getpeername
:
1449 abi_ulong target_addr
, target_addrlen
;
1451 if (get_user_s32(sockfd
, vptr
)
1452 || get_user_ual(target_addr
, vptr
+ n
)
1453 || get_user_u32(target_addrlen
, vptr
+ 2 * n
))
1454 return -TARGET_EFAULT
;
1456 ret
= do_getpeername(sockfd
, target_addr
, target_addrlen
);
1459 case SOCKOP_socketpair
:
1461 int domain
, type
, protocol
;
1464 if (get_user_s32(domain
, vptr
)
1465 || get_user_s32(type
, vptr
+ n
)
1466 || get_user_s32(protocol
, vptr
+ 2 * n
)
1467 || get_user_ual(tab
, vptr
+ 3 * n
))
1468 return -TARGET_EFAULT
;
1470 ret
= do_socketpair(domain
, type
, protocol
, tab
);
1480 if (get_user_s32(sockfd
, vptr
)
1481 || get_user_ual(msg
, vptr
+ n
)
1482 || get_user_ual(len
, vptr
+ 2 * n
)
1483 || get_user_s32(flags
, vptr
+ 3 * n
))
1484 return -TARGET_EFAULT
;
1486 ret
= do_sendto(sockfd
, msg
, len
, flags
, 0, 0);
1496 if (get_user_s32(sockfd
, vptr
)
1497 || get_user_ual(msg
, vptr
+ n
)
1498 || get_user_ual(len
, vptr
+ 2 * n
)
1499 || get_user_s32(flags
, vptr
+ 3 * n
))
1500 return -TARGET_EFAULT
;
1502 ret
= do_recvfrom(sockfd
, msg
, len
, flags
, 0, 0);
1514 if (get_user_s32(sockfd
, vptr
)
1515 || get_user_ual(msg
, vptr
+ n
)
1516 || get_user_ual(len
, vptr
+ 2 * n
)
1517 || get_user_s32(flags
, vptr
+ 3 * n
)
1518 || get_user_ual(addr
, vptr
+ 4 * n
)
1519 || get_user_u32(addrlen
, vptr
+ 5 * n
))
1520 return -TARGET_EFAULT
;
1522 ret
= do_sendto(sockfd
, msg
, len
, flags
, addr
, addrlen
);
1525 case SOCKOP_recvfrom
:
1534 if (get_user_s32(sockfd
, vptr
)
1535 || get_user_ual(msg
, vptr
+ n
)
1536 || get_user_ual(len
, vptr
+ 2 * n
)
1537 || get_user_s32(flags
, vptr
+ 3 * n
)
1538 || get_user_ual(addr
, vptr
+ 4 * n
)
1539 || get_user_u32(addrlen
, vptr
+ 5 * n
))
1540 return -TARGET_EFAULT
;
1542 ret
= do_recvfrom(sockfd
, msg
, len
, flags
, addr
, addrlen
);
1545 case SOCKOP_shutdown
:
1549 if (get_user_s32(sockfd
, vptr
)
1550 || get_user_s32(how
, vptr
+ n
))
1551 return -TARGET_EFAULT
;
1553 ret
= get_errno(shutdown(sockfd
, how
));
1556 case SOCKOP_sendmsg
:
1557 case SOCKOP_recvmsg
:
1560 abi_ulong target_msg
;
1563 if (get_user_s32(fd
, vptr
)
1564 || get_user_ual(target_msg
, vptr
+ n
)
1565 || get_user_s32(flags
, vptr
+ 2 * n
))
1566 return -TARGET_EFAULT
;
1568 ret
= do_sendrecvmsg(fd
, target_msg
, flags
,
1569 (num
== SOCKOP_sendmsg
));
1572 case SOCKOP_setsockopt
:
1580 if (get_user_s32(sockfd
, vptr
)
1581 || get_user_s32(level
, vptr
+ n
)
1582 || get_user_s32(optname
, vptr
+ 2 * n
)
1583 || get_user_ual(optval
, vptr
+ 3 * n
)
1584 || get_user_u32(optlen
, vptr
+ 4 * n
))
1585 return -TARGET_EFAULT
;
1587 ret
= do_setsockopt(sockfd
, level
, optname
, optval
, optlen
);
1590 case SOCKOP_getsockopt
:
1598 if (get_user_s32(sockfd
, vptr
)
1599 || get_user_s32(level
, vptr
+ n
)
1600 || get_user_s32(optname
, vptr
+ 2 * n
)
1601 || get_user_ual(optval
, vptr
+ 3 * n
)
1602 || get_user_u32(optlen
, vptr
+ 4 * n
))
1603 return -TARGET_EFAULT
;
1605 ret
= do_getsockopt(sockfd
, level
, optname
, optval
, optlen
);
1609 gemu_log("Unsupported socketcall: %d\n", num
);
1610 ret
= -TARGET_ENOSYS
;
1617 #define N_SHM_REGIONS 32
1619 static struct shm_region
{
1622 } shm_regions
[N_SHM_REGIONS
];
1624 struct target_ipc_perm
1631 unsigned short int mode
;
1632 unsigned short int __pad1
;
1633 unsigned short int __seq
;
1634 unsigned short int __pad2
;
1635 abi_ulong __unused1
;
1636 abi_ulong __unused2
;
1639 struct target_semid_ds
1641 struct target_ipc_perm sem_perm
;
1642 abi_ulong sem_otime
;
1643 abi_ulong __unused1
;
1644 abi_ulong sem_ctime
;
1645 abi_ulong __unused2
;
1646 abi_ulong sem_nsems
;
1647 abi_ulong __unused3
;
1648 abi_ulong __unused4
;
1651 static inline abi_long
target_to_host_ipc_perm(struct ipc_perm
*host_ip
,
1652 abi_ulong target_addr
)
1654 struct target_ipc_perm
*target_ip
;
1655 struct target_semid_ds
*target_sd
;
1657 if (!lock_user_struct(VERIFY_READ
, target_sd
, target_addr
, 1))
1658 return -TARGET_EFAULT
;
1659 target_ip
=&(target_sd
->sem_perm
);
1660 host_ip
->__key
= tswapl(target_ip
->__key
);
1661 host_ip
->uid
= tswapl(target_ip
->uid
);
1662 host_ip
->gid
= tswapl(target_ip
->gid
);
1663 host_ip
->cuid
= tswapl(target_ip
->cuid
);
1664 host_ip
->cgid
= tswapl(target_ip
->cgid
);
1665 host_ip
->mode
= tswapl(target_ip
->mode
);
1666 unlock_user_struct(target_sd
, target_addr
, 0);
1670 static inline abi_long
host_to_target_ipc_perm(abi_ulong target_addr
,
1671 struct ipc_perm
*host_ip
)
1673 struct target_ipc_perm
*target_ip
;
1674 struct target_semid_ds
*target_sd
;
1676 if (!lock_user_struct(VERIFY_WRITE
, target_sd
, target_addr
, 0))
1677 return -TARGET_EFAULT
;
1678 target_ip
= &(target_sd
->sem_perm
);
1679 target_ip
->__key
= tswapl(host_ip
->__key
);
1680 target_ip
->uid
= tswapl(host_ip
->uid
);
1681 target_ip
->gid
= tswapl(host_ip
->gid
);
1682 target_ip
->cuid
= tswapl(host_ip
->cuid
);
1683 target_ip
->cgid
= tswapl(host_ip
->cgid
);
1684 target_ip
->mode
= tswapl(host_ip
->mode
);
1685 unlock_user_struct(target_sd
, target_addr
, 1);
1689 static inline abi_long
target_to_host_semid_ds(struct semid_ds
*host_sd
,
1690 abi_ulong target_addr
)
1692 struct target_semid_ds
*target_sd
;
1694 if (!lock_user_struct(VERIFY_READ
, target_sd
, target_addr
, 1))
1695 return -TARGET_EFAULT
;
1696 target_to_host_ipc_perm(&(host_sd
->sem_perm
),target_addr
);
1697 host_sd
->sem_nsems
= tswapl(target_sd
->sem_nsems
);
1698 host_sd
->sem_otime
= tswapl(target_sd
->sem_otime
);
1699 host_sd
->sem_ctime
= tswapl(target_sd
->sem_ctime
);
1700 unlock_user_struct(target_sd
, target_addr
, 0);
1704 static inline abi_long
host_to_target_semid_ds(abi_ulong target_addr
,
1705 struct semid_ds
*host_sd
)
1707 struct target_semid_ds
*target_sd
;
1709 if (!lock_user_struct(VERIFY_WRITE
, target_sd
, target_addr
, 0))
1710 return -TARGET_EFAULT
;
1711 host_to_target_ipc_perm(target_addr
,&(host_sd
->sem_perm
));
1712 target_sd
->sem_nsems
= tswapl(host_sd
->sem_nsems
);
1713 target_sd
->sem_otime
= tswapl(host_sd
->sem_otime
);
1714 target_sd
->sem_ctime
= tswapl(host_sd
->sem_ctime
);
1715 unlock_user_struct(target_sd
, target_addr
, 1);
1721 struct semid_ds
*buf
;
1722 unsigned short *array
;
1725 union target_semun
{
1728 unsigned short int *array
;
1731 static inline abi_long
target_to_host_semun(int cmd
,
1732 union semun
*host_su
,
1733 abi_ulong target_addr
,
1734 struct semid_ds
*ds
)
1736 union target_semun
*target_su
;
1741 if (!lock_user_struct(VERIFY_READ
, target_su
, target_addr
, 1))
1742 return -TARGET_EFAULT
;
1743 target_to_host_semid_ds(ds
,target_su
->buf
);
1745 unlock_user_struct(target_su
, target_addr
, 0);
1749 if (!lock_user_struct(VERIFY_READ
, target_su
, target_addr
, 1))
1750 return -TARGET_EFAULT
;
1751 host_su
->val
= tswapl(target_su
->val
);
1752 unlock_user_struct(target_su
, target_addr
, 0);
1756 if (!lock_user_struct(VERIFY_READ
, target_su
, target_addr
, 1))
1757 return -TARGET_EFAULT
;
1758 *host_su
->array
= tswap16(*target_su
->array
);
1759 unlock_user_struct(target_su
, target_addr
, 0);
1762 gemu_log("semun operation not fully supported: %d\n", (int)cmd
);
1767 static inline abi_long
host_to_target_semun(int cmd
,
1768 abi_ulong target_addr
,
1769 union semun
*host_su
,
1770 struct semid_ds
*ds
)
1772 union target_semun
*target_su
;
1777 if (lock_user_struct(VERIFY_WRITE
, target_su
, target_addr
, 0))
1778 return -TARGET_EFAULT
;
1779 host_to_target_semid_ds(target_su
->buf
,ds
);
1780 unlock_user_struct(target_su
, target_addr
, 1);
1784 if (lock_user_struct(VERIFY_WRITE
, target_su
, target_addr
, 0))
1785 return -TARGET_EFAULT
;
1786 target_su
->val
= tswapl(host_su
->val
);
1787 unlock_user_struct(target_su
, target_addr
, 1);
1791 if (lock_user_struct(VERIFY_WRITE
, target_su
, target_addr
, 0))
1792 return -TARGET_EFAULT
;
1793 *target_su
->array
= tswap16(*host_su
->array
);
1794 unlock_user_struct(target_su
, target_addr
, 1);
1797 gemu_log("semun operation not fully supported: %d\n", (int)cmd
);
1802 static inline abi_long
do_semctl(int first
, int second
, int third
,
1806 struct semid_ds dsarg
;
1807 int cmd
= third
&0xff;
1812 target_to_host_semun(cmd
,&arg
,ptr
,&dsarg
);
1813 ret
= get_errno(semctl(first
, second
, cmd
, arg
));
1814 host_to_target_semun(cmd
,ptr
,&arg
,&dsarg
);
1817 target_to_host_semun(cmd
,&arg
,ptr
,&dsarg
);
1818 ret
= get_errno(semctl(first
, second
, cmd
, arg
));
1819 host_to_target_semun(cmd
,ptr
,&arg
,&dsarg
);
1822 target_to_host_semun(cmd
,&arg
,ptr
,&dsarg
);
1823 ret
= get_errno(semctl(first
, second
, cmd
, arg
));
1824 host_to_target_semun(cmd
,ptr
,&arg
,&dsarg
);
1827 target_to_host_semun(cmd
,&arg
,ptr
,&dsarg
);
1828 ret
= get_errno(semctl(first
, second
, cmd
, arg
));
1829 host_to_target_semun(cmd
,ptr
,&arg
,&dsarg
);
1832 target_to_host_semun(cmd
,&arg
,ptr
,&dsarg
);
1833 ret
= get_errno(semctl(first
, second
, cmd
, arg
));
1834 host_to_target_semun(cmd
,ptr
,&arg
,&dsarg
);
1837 target_to_host_semun(cmd
,&arg
,ptr
,&dsarg
);
1838 ret
= get_errno(semctl(first
, second
, cmd
, arg
));
1839 host_to_target_semun(cmd
,ptr
,&arg
,&dsarg
);
1842 ret
= get_errno(semctl(first
, second
, cmd
, arg
));
1848 struct target_msqid_ds
1850 struct target_ipc_perm msg_perm
;
1851 abi_ulong msg_stime
;
1852 #if TARGET_ABI_BITS == 32
1853 abi_ulong __unused1
;
1855 abi_ulong msg_rtime
;
1856 #if TARGET_ABI_BITS == 32
1857 abi_ulong __unused2
;
1859 abi_ulong msg_ctime
;
1860 #if TARGET_ABI_BITS == 32
1861 abi_ulong __unused3
;
1863 abi_ulong __msg_cbytes
;
1865 abi_ulong msg_qbytes
;
1866 abi_ulong msg_lspid
;
1867 abi_ulong msg_lrpid
;
1868 abi_ulong __unused4
;
1869 abi_ulong __unused5
;
1872 static inline abi_long
target_to_host_msqid_ds(struct msqid_ds
*host_md
,
1873 abi_ulong target_addr
)
1875 struct target_msqid_ds
*target_md
;
1877 if (!lock_user_struct(VERIFY_READ
, target_md
, target_addr
, 1))
1878 return -TARGET_EFAULT
;
1879 if (target_to_host_ipc_perm(&(host_md
->msg_perm
),target_addr
))
1880 return -TARGET_EFAULT
;
1881 host_md
->msg_stime
= tswapl(target_md
->msg_stime
);
1882 host_md
->msg_rtime
= tswapl(target_md
->msg_rtime
);
1883 host_md
->msg_ctime
= tswapl(target_md
->msg_ctime
);
1884 host_md
->__msg_cbytes
= tswapl(target_md
->__msg_cbytes
);
1885 host_md
->msg_qnum
= tswapl(target_md
->msg_qnum
);
1886 host_md
->msg_qbytes
= tswapl(target_md
->msg_qbytes
);
1887 host_md
->msg_lspid
= tswapl(target_md
->msg_lspid
);
1888 host_md
->msg_lrpid
= tswapl(target_md
->msg_lrpid
);
1889 unlock_user_struct(target_md
, target_addr
, 0);
1893 static inline abi_long
host_to_target_msqid_ds(abi_ulong target_addr
,
1894 struct msqid_ds
*host_md
)
1896 struct target_msqid_ds
*target_md
;
1898 if (!lock_user_struct(VERIFY_WRITE
, target_md
, target_addr
, 0))
1899 return -TARGET_EFAULT
;
1900 if (host_to_target_ipc_perm(target_addr
,&(host_md
->msg_perm
)))
1901 return -TARGET_EFAULT
;
1902 target_md
->msg_stime
= tswapl(host_md
->msg_stime
);
1903 target_md
->msg_rtime
= tswapl(host_md
->msg_rtime
);
1904 target_md
->msg_ctime
= tswapl(host_md
->msg_ctime
);
1905 target_md
->__msg_cbytes
= tswapl(host_md
->__msg_cbytes
);
1906 target_md
->msg_qnum
= tswapl(host_md
->msg_qnum
);
1907 target_md
->msg_qbytes
= tswapl(host_md
->msg_qbytes
);
1908 target_md
->msg_lspid
= tswapl(host_md
->msg_lspid
);
1909 target_md
->msg_lrpid
= tswapl(host_md
->msg_lrpid
);
1910 unlock_user_struct(target_md
, target_addr
, 1);
1914 struct target_msginfo
{
1922 unsigned short int msgseg
;
1925 static inline abi_long
host_to_target_msginfo(abi_ulong target_addr
,
1926 struct msginfo
*host_msginfo
)
1928 struct target_msginfo
*target_msginfo
;
1929 if (!lock_user_struct(VERIFY_WRITE
, target_msginfo
, target_addr
, 0))
1930 return -TARGET_EFAULT
;
1931 __put_user(host_msginfo
->msgpool
, &target_msginfo
->msgpool
);
1932 __put_user(host_msginfo
->msgmap
, &target_msginfo
->msgmap
);
1933 __put_user(host_msginfo
->msgmax
, &target_msginfo
->msgmax
);
1934 __put_user(host_msginfo
->msgmnb
, &target_msginfo
->msgmnb
);
1935 __put_user(host_msginfo
->msgmni
, &target_msginfo
->msgmni
);
1936 __put_user(host_msginfo
->msgssz
, &target_msginfo
->msgssz
);
1937 __put_user(host_msginfo
->msgtql
, &target_msginfo
->msgtql
);
1938 __put_user(host_msginfo
->msgseg
, &target_msginfo
->msgseg
);
1939 unlock_user_struct(target_msginfo
, target_addr
, 1);
1943 static inline abi_long
do_msgctl(int msgid
, int cmd
, abi_long ptr
)
1945 struct msqid_ds dsarg
;
1946 struct msginfo msginfo
;
1947 abi_long ret
= -TARGET_EINVAL
;
1955 if (target_to_host_msqid_ds(&dsarg
,ptr
))
1956 return -TARGET_EFAULT
;
1957 ret
= get_errno(msgctl(msgid
, cmd
, &dsarg
));
1958 if (host_to_target_msqid_ds(ptr
,&dsarg
))
1959 return -TARGET_EFAULT
;
1962 ret
= get_errno(msgctl(msgid
, cmd
, NULL
));
1966 ret
= get_errno(msgctl(msgid
, cmd
, (struct msqid_ds
*)&msginfo
));
1967 if (host_to_target_msginfo(ptr
, &msginfo
))
1968 return -TARGET_EFAULT
;
1975 struct target_msgbuf
{
1980 static inline abi_long
do_msgsnd(int msqid
, abi_long msgp
,
1981 unsigned int msgsz
, int msgflg
)
1983 struct target_msgbuf
*target_mb
;
1984 struct msgbuf
*host_mb
;
1987 if (!lock_user_struct(VERIFY_READ
, target_mb
, msgp
, 0))
1988 return -TARGET_EFAULT
;
1989 host_mb
= malloc(msgsz
+sizeof(long));
1990 host_mb
->mtype
= (abi_long
) tswapl(target_mb
->mtype
);
1991 memcpy(host_mb
->mtext
, target_mb
->mtext
, msgsz
);
1992 ret
= get_errno(msgsnd(msqid
, host_mb
, msgsz
, msgflg
));
1994 unlock_user_struct(target_mb
, msgp
, 0);
1999 static inline abi_long
do_msgrcv(int msqid
, abi_long msgp
,
2000 unsigned int msgsz
, abi_long msgtyp
,
2003 struct target_msgbuf
*target_mb
;
2005 struct msgbuf
*host_mb
;
2008 if (!lock_user_struct(VERIFY_WRITE
, target_mb
, msgp
, 0))
2009 return -TARGET_EFAULT
;
2011 host_mb
= malloc(msgsz
+sizeof(long));
2012 ret
= get_errno(msgrcv(msqid
, host_mb
, msgsz
, tswapl(msgtyp
), msgflg
));
2015 abi_ulong target_mtext_addr
= msgp
+ sizeof(abi_ulong
);
2016 target_mtext
= lock_user(VERIFY_WRITE
, target_mtext_addr
, ret
, 0);
2017 if (!target_mtext
) {
2018 ret
= -TARGET_EFAULT
;
2021 memcpy(target_mb
->mtext
, host_mb
->mtext
, ret
);
2022 unlock_user(target_mtext
, target_mtext_addr
, ret
);
2025 target_mb
->mtype
= tswapl(host_mb
->mtype
);
2030 unlock_user_struct(target_mb
, msgp
, 1);
2034 #ifdef TARGET_NR_ipc
2035 /* ??? This only works with linear mappings. */
2036 /* do_ipc() must return target values and target errnos. */
2037 static abi_long
do_ipc(unsigned int call
, int first
,
2038 int second
, int third
,
2039 abi_long ptr
, abi_long fifth
)
2043 struct shmid_ds shm_info
;
2046 version
= call
>> 16;
2051 ret
= get_errno(semop(first
,(struct sembuf
*)g2h(ptr
), second
));
2055 ret
= get_errno(semget(first
, second
, third
));
2059 ret
= do_semctl(first
, second
, third
, ptr
);
2062 case IPCOP_semtimedop
:
2063 gemu_log("Unsupported ipc call: %d (version %d)\n", call
, version
);
2064 ret
= -TARGET_ENOSYS
;
2068 ret
= get_errno(msgget(first
, second
));
2072 ret
= do_msgsnd(first
, ptr
, second
, third
);
2076 ret
= do_msgctl(first
, second
, ptr
);
2083 struct target_ipc_kludge
{
2088 if (!lock_user_struct(VERIFY_READ
, tmp
, ptr
, 1)) {
2089 ret
= -TARGET_EFAULT
;
2093 ret
= do_msgrcv(first
, tmp
->msgp
, second
, tmp
->msgtyp
, third
);
2095 unlock_user_struct(tmp
, ptr
, 0);
2099 ret
= do_msgrcv(first
, ptr
, second
, fifth
, third
);
2107 /* SHM_* flags are the same on all linux platforms */
2108 host_addr
= shmat(first
, (void *)g2h(ptr
), second
);
2109 if (host_addr
== (void *)-1) {
2110 ret
= get_errno((long)host_addr
);
2113 raddr
= h2g((unsigned long)host_addr
);
2114 /* find out the length of the shared memory segment */
2116 ret
= get_errno(shmctl(first
, IPC_STAT
, &shm_info
));
2117 if (is_error(ret
)) {
2118 /* can't get length, bail out */
2122 page_set_flags(raddr
, raddr
+ shm_info
.shm_segsz
,
2123 PAGE_VALID
| PAGE_READ
|
2124 ((second
& SHM_RDONLY
)? 0: PAGE_WRITE
));
2125 for (i
= 0; i
< N_SHM_REGIONS
; ++i
) {
2126 if (shm_regions
[i
].start
== 0) {
2127 shm_regions
[i
].start
= raddr
;
2128 shm_regions
[i
].size
= shm_info
.shm_segsz
;
2132 if (put_user_ual(raddr
, third
))
2133 return -TARGET_EFAULT
;
2138 for (i
= 0; i
< N_SHM_REGIONS
; ++i
) {
2139 if (shm_regions
[i
].start
== ptr
) {
2140 shm_regions
[i
].start
= 0;
2141 page_set_flags(ptr
, shm_regions
[i
].size
, 0);
2145 ret
= get_errno(shmdt((void *)g2h(ptr
)));
2149 /* IPC_* flag values are the same on all linux platforms */
2150 ret
= get_errno(shmget(first
, second
, third
));
2153 /* IPC_* and SHM_* command values are the same on all linux platforms */
2159 ret
= get_errno(shmctl(first
, second
, NULL
));
2167 gemu_log("Unsupported ipc call: %d (version %d)\n", call
, version
);
2168 ret
= -TARGET_ENOSYS
;
2175 /* kernel structure types definitions */
2178 #define STRUCT(name, list...) STRUCT_ ## name,
2179 #define STRUCT_SPECIAL(name) STRUCT_ ## name,
2181 #include "syscall_types.h"
2184 #undef STRUCT_SPECIAL
2186 #define STRUCT(name, list...) static const argtype struct_ ## name ## _def[] = { list, TYPE_NULL };
2187 #define STRUCT_SPECIAL(name)
2188 #include "syscall_types.h"
2190 #undef STRUCT_SPECIAL
2192 typedef struct IOCTLEntry
{
2193 unsigned int target_cmd
;
2194 unsigned int host_cmd
;
2197 const argtype arg_type
[5];
2200 #define IOC_R 0x0001
2201 #define IOC_W 0x0002
2202 #define IOC_RW (IOC_R | IOC_W)
2204 #define MAX_STRUCT_SIZE 4096
2206 static IOCTLEntry ioctl_entries
[] = {
2207 #define IOCTL(cmd, access, types...) \
2208 { TARGET_ ## cmd, cmd, #cmd, access, { types } },
2213 /* ??? Implement proper locking for ioctls. */
2214 /* do_ioctl() Must return target values and target errnos. */
2215 static abi_long
do_ioctl(int fd
, abi_long cmd
, abi_long arg
)
2217 const IOCTLEntry
*ie
;
2218 const argtype
*arg_type
;
2220 uint8_t buf_temp
[MAX_STRUCT_SIZE
];
2226 if (ie
->target_cmd
== 0) {
2227 gemu_log("Unsupported ioctl: cmd=0x%04lx\n", (long)cmd
);
2228 return -TARGET_ENOSYS
;
2230 if (ie
->target_cmd
== cmd
)
2234 arg_type
= ie
->arg_type
;
2236 gemu_log("ioctl: cmd=0x%04lx (%s)\n", (long)cmd
, ie
->name
);
2238 switch(arg_type
[0]) {
2241 ret
= get_errno(ioctl(fd
, ie
->host_cmd
));
2246 ret
= get_errno(ioctl(fd
, ie
->host_cmd
, arg
));
2250 target_size
= thunk_type_size(arg_type
, 0);
2251 switch(ie
->access
) {
2253 ret
= get_errno(ioctl(fd
, ie
->host_cmd
, buf_temp
));
2254 if (!is_error(ret
)) {
2255 argptr
= lock_user(VERIFY_WRITE
, arg
, target_size
, 0);
2257 return -TARGET_EFAULT
;
2258 thunk_convert(argptr
, buf_temp
, arg_type
, THUNK_TARGET
);
2259 unlock_user(argptr
, arg
, target_size
);
2263 argptr
= lock_user(VERIFY_READ
, arg
, target_size
, 1);
2265 return -TARGET_EFAULT
;
2266 thunk_convert(buf_temp
, argptr
, arg_type
, THUNK_HOST
);
2267 unlock_user(argptr
, arg
, 0);
2268 ret
= get_errno(ioctl(fd
, ie
->host_cmd
, buf_temp
));
2272 argptr
= lock_user(VERIFY_READ
, arg
, target_size
, 1);
2274 return -TARGET_EFAULT
;
2275 thunk_convert(buf_temp
, argptr
, arg_type
, THUNK_HOST
);
2276 unlock_user(argptr
, arg
, 0);
2277 ret
= get_errno(ioctl(fd
, ie
->host_cmd
, buf_temp
));
2278 if (!is_error(ret
)) {
2279 argptr
= lock_user(VERIFY_WRITE
, arg
, target_size
, 0);
2281 return -TARGET_EFAULT
;
2282 thunk_convert(argptr
, buf_temp
, arg_type
, THUNK_TARGET
);
2283 unlock_user(argptr
, arg
, target_size
);
2289 gemu_log("Unsupported ioctl type: cmd=0x%04lx type=%d\n",
2290 (long)cmd
, arg_type
[0]);
2291 ret
= -TARGET_ENOSYS
;
2297 static const bitmask_transtbl iflag_tbl
[] = {
2298 { TARGET_IGNBRK
, TARGET_IGNBRK
, IGNBRK
, IGNBRK
},
2299 { TARGET_BRKINT
, TARGET_BRKINT
, BRKINT
, BRKINT
},
2300 { TARGET_IGNPAR
, TARGET_IGNPAR
, IGNPAR
, IGNPAR
},
2301 { TARGET_PARMRK
, TARGET_PARMRK
, PARMRK
, PARMRK
},
2302 { TARGET_INPCK
, TARGET_INPCK
, INPCK
, INPCK
},
2303 { TARGET_ISTRIP
, TARGET_ISTRIP
, ISTRIP
, ISTRIP
},
2304 { TARGET_INLCR
, TARGET_INLCR
, INLCR
, INLCR
},
2305 { TARGET_IGNCR
, TARGET_IGNCR
, IGNCR
, IGNCR
},
2306 { TARGET_ICRNL
, TARGET_ICRNL
, ICRNL
, ICRNL
},
2307 { TARGET_IUCLC
, TARGET_IUCLC
, IUCLC
, IUCLC
},
2308 { TARGET_IXON
, TARGET_IXON
, IXON
, IXON
},
2309 { TARGET_IXANY
, TARGET_IXANY
, IXANY
, IXANY
},
2310 { TARGET_IXOFF
, TARGET_IXOFF
, IXOFF
, IXOFF
},
2311 { TARGET_IMAXBEL
, TARGET_IMAXBEL
, IMAXBEL
, IMAXBEL
},
2315 static const bitmask_transtbl oflag_tbl
[] = {
2316 { TARGET_OPOST
, TARGET_OPOST
, OPOST
, OPOST
},
2317 { TARGET_OLCUC
, TARGET_OLCUC
, OLCUC
, OLCUC
},
2318 { TARGET_ONLCR
, TARGET_ONLCR
, ONLCR
, ONLCR
},
2319 { TARGET_OCRNL
, TARGET_OCRNL
, OCRNL
, OCRNL
},
2320 { TARGET_ONOCR
, TARGET_ONOCR
, ONOCR
, ONOCR
},
2321 { TARGET_ONLRET
, TARGET_ONLRET
, ONLRET
, ONLRET
},
2322 { TARGET_OFILL
, TARGET_OFILL
, OFILL
, OFILL
},
2323 { TARGET_OFDEL
, TARGET_OFDEL
, OFDEL
, OFDEL
},
2324 { TARGET_NLDLY
, TARGET_NL0
, NLDLY
, NL0
},
2325 { TARGET_NLDLY
, TARGET_NL1
, NLDLY
, NL1
},
2326 { TARGET_CRDLY
, TARGET_CR0
, CRDLY
, CR0
},
2327 { TARGET_CRDLY
, TARGET_CR1
, CRDLY
, CR1
},
2328 { TARGET_CRDLY
, TARGET_CR2
, CRDLY
, CR2
},
2329 { TARGET_CRDLY
, TARGET_CR3
, CRDLY
, CR3
},
2330 { TARGET_TABDLY
, TARGET_TAB0
, TABDLY
, TAB0
},
2331 { TARGET_TABDLY
, TARGET_TAB1
, TABDLY
, TAB1
},
2332 { TARGET_TABDLY
, TARGET_TAB2
, TABDLY
, TAB2
},
2333 { TARGET_TABDLY
, TARGET_TAB3
, TABDLY
, TAB3
},
2334 { TARGET_BSDLY
, TARGET_BS0
, BSDLY
, BS0
},
2335 { TARGET_BSDLY
, TARGET_BS1
, BSDLY
, BS1
},
2336 { TARGET_VTDLY
, TARGET_VT0
, VTDLY
, VT0
},
2337 { TARGET_VTDLY
, TARGET_VT1
, VTDLY
, VT1
},
2338 { TARGET_FFDLY
, TARGET_FF0
, FFDLY
, FF0
},
2339 { TARGET_FFDLY
, TARGET_FF1
, FFDLY
, FF1
},
2343 static const bitmask_transtbl cflag_tbl
[] = {
2344 { TARGET_CBAUD
, TARGET_B0
, CBAUD
, B0
},
2345 { TARGET_CBAUD
, TARGET_B50
, CBAUD
, B50
},
2346 { TARGET_CBAUD
, TARGET_B75
, CBAUD
, B75
},
2347 { TARGET_CBAUD
, TARGET_B110
, CBAUD
, B110
},
2348 { TARGET_CBAUD
, TARGET_B134
, CBAUD
, B134
},
2349 { TARGET_CBAUD
, TARGET_B150
, CBAUD
, B150
},
2350 { TARGET_CBAUD
, TARGET_B200
, CBAUD
, B200
},
2351 { TARGET_CBAUD
, TARGET_B300
, CBAUD
, B300
},
2352 { TARGET_CBAUD
, TARGET_B600
, CBAUD
, B600
},
2353 { TARGET_CBAUD
, TARGET_B1200
, CBAUD
, B1200
},
2354 { TARGET_CBAUD
, TARGET_B1800
, CBAUD
, B1800
},
2355 { TARGET_CBAUD
, TARGET_B2400
, CBAUD
, B2400
},
2356 { TARGET_CBAUD
, TARGET_B4800
, CBAUD
, B4800
},
2357 { TARGET_CBAUD
, TARGET_B9600
, CBAUD
, B9600
},
2358 { TARGET_CBAUD
, TARGET_B19200
, CBAUD
, B19200
},
2359 { TARGET_CBAUD
, TARGET_B38400
, CBAUD
, B38400
},
2360 { TARGET_CBAUD
, TARGET_B57600
, CBAUD
, B57600
},
2361 { TARGET_CBAUD
, TARGET_B115200
, CBAUD
, B115200
},
2362 { TARGET_CBAUD
, TARGET_B230400
, CBAUD
, B230400
},
2363 { TARGET_CBAUD
, TARGET_B460800
, CBAUD
, B460800
},
2364 { TARGET_CSIZE
, TARGET_CS5
, CSIZE
, CS5
},
2365 { TARGET_CSIZE
, TARGET_CS6
, CSIZE
, CS6
},
2366 { TARGET_CSIZE
, TARGET_CS7
, CSIZE
, CS7
},
2367 { TARGET_CSIZE
, TARGET_CS8
, CSIZE
, CS8
},
2368 { TARGET_CSTOPB
, TARGET_CSTOPB
, CSTOPB
, CSTOPB
},
2369 { TARGET_CREAD
, TARGET_CREAD
, CREAD
, CREAD
},
2370 { TARGET_PARENB
, TARGET_PARENB
, PARENB
, PARENB
},
2371 { TARGET_PARODD
, TARGET_PARODD
, PARODD
, PARODD
},
2372 { TARGET_HUPCL
, TARGET_HUPCL
, HUPCL
, HUPCL
},
2373 { TARGET_CLOCAL
, TARGET_CLOCAL
, CLOCAL
, CLOCAL
},
2374 { TARGET_CRTSCTS
, TARGET_CRTSCTS
, CRTSCTS
, CRTSCTS
},
2378 static const bitmask_transtbl lflag_tbl
[] = {
2379 { TARGET_ISIG
, TARGET_ISIG
, ISIG
, ISIG
},
2380 { TARGET_ICANON
, TARGET_ICANON
, ICANON
, ICANON
},
2381 { TARGET_XCASE
, TARGET_XCASE
, XCASE
, XCASE
},
2382 { TARGET_ECHO
, TARGET_ECHO
, ECHO
, ECHO
},
2383 { TARGET_ECHOE
, TARGET_ECHOE
, ECHOE
, ECHOE
},
2384 { TARGET_ECHOK
, TARGET_ECHOK
, ECHOK
, ECHOK
},
2385 { TARGET_ECHONL
, TARGET_ECHONL
, ECHONL
, ECHONL
},
2386 { TARGET_NOFLSH
, TARGET_NOFLSH
, NOFLSH
, NOFLSH
},
2387 { TARGET_TOSTOP
, TARGET_TOSTOP
, TOSTOP
, TOSTOP
},
2388 { TARGET_ECHOCTL
, TARGET_ECHOCTL
, ECHOCTL
, ECHOCTL
},
2389 { TARGET_ECHOPRT
, TARGET_ECHOPRT
, ECHOPRT
, ECHOPRT
},
2390 { TARGET_ECHOKE
, TARGET_ECHOKE
, ECHOKE
, ECHOKE
},
2391 { TARGET_FLUSHO
, TARGET_FLUSHO
, FLUSHO
, FLUSHO
},
2392 { TARGET_PENDIN
, TARGET_PENDIN
, PENDIN
, PENDIN
},
2393 { TARGET_IEXTEN
, TARGET_IEXTEN
, IEXTEN
, IEXTEN
},
2397 static void target_to_host_termios (void *dst
, const void *src
)
2399 struct host_termios
*host
= dst
;
2400 const struct target_termios
*target
= src
;
2403 target_to_host_bitmask(tswap32(target
->c_iflag
), iflag_tbl
);
2405 target_to_host_bitmask(tswap32(target
->c_oflag
), oflag_tbl
);
2407 target_to_host_bitmask(tswap32(target
->c_cflag
), cflag_tbl
);
2409 target_to_host_bitmask(tswap32(target
->c_lflag
), lflag_tbl
);
2410 host
->c_line
= target
->c_line
;
2412 host
->c_cc
[VINTR
] = target
->c_cc
[TARGET_VINTR
];
2413 host
->c_cc
[VQUIT
] = target
->c_cc
[TARGET_VQUIT
];
2414 host
->c_cc
[VERASE
] = target
->c_cc
[TARGET_VERASE
];
2415 host
->c_cc
[VKILL
] = target
->c_cc
[TARGET_VKILL
];
2416 host
->c_cc
[VEOF
] = target
->c_cc
[TARGET_VEOF
];
2417 host
->c_cc
[VTIME
] = target
->c_cc
[TARGET_VTIME
];
2418 host
->c_cc
[VMIN
] = target
->c_cc
[TARGET_VMIN
];
2419 host
->c_cc
[VSWTC
] = target
->c_cc
[TARGET_VSWTC
];
2420 host
->c_cc
[VSTART
] = target
->c_cc
[TARGET_VSTART
];
2421 host
->c_cc
[VSTOP
] = target
->c_cc
[TARGET_VSTOP
];
2422 host
->c_cc
[VSUSP
] = target
->c_cc
[TARGET_VSUSP
];
2423 host
->c_cc
[VEOL
] = target
->c_cc
[TARGET_VEOL
];
2424 host
->c_cc
[VREPRINT
] = target
->c_cc
[TARGET_VREPRINT
];
2425 host
->c_cc
[VDISCARD
] = target
->c_cc
[TARGET_VDISCARD
];
2426 host
->c_cc
[VWERASE
] = target
->c_cc
[TARGET_VWERASE
];
2427 host
->c_cc
[VLNEXT
] = target
->c_cc
[TARGET_VLNEXT
];
2428 host
->c_cc
[VEOL2
] = target
->c_cc
[TARGET_VEOL2
];
2431 static void host_to_target_termios (void *dst
, const void *src
)
2433 struct target_termios
*target
= dst
;
2434 const struct host_termios
*host
= src
;
2437 tswap32(host_to_target_bitmask(host
->c_iflag
, iflag_tbl
));
2439 tswap32(host_to_target_bitmask(host
->c_oflag
, oflag_tbl
));
2441 tswap32(host_to_target_bitmask(host
->c_cflag
, cflag_tbl
));
2443 tswap32(host_to_target_bitmask(host
->c_lflag
, lflag_tbl
));
2444 target
->c_line
= host
->c_line
;
2446 target
->c_cc
[TARGET_VINTR
] = host
->c_cc
[VINTR
];
2447 target
->c_cc
[TARGET_VQUIT
] = host
->c_cc
[VQUIT
];
2448 target
->c_cc
[TARGET_VERASE
] = host
->c_cc
[VERASE
];
2449 target
->c_cc
[TARGET_VKILL
] = host
->c_cc
[VKILL
];
2450 target
->c_cc
[TARGET_VEOF
] = host
->c_cc
[VEOF
];
2451 target
->c_cc
[TARGET_VTIME
] = host
->c_cc
[VTIME
];
2452 target
->c_cc
[TARGET_VMIN
] = host
->c_cc
[VMIN
];
2453 target
->c_cc
[TARGET_VSWTC
] = host
->c_cc
[VSWTC
];
2454 target
->c_cc
[TARGET_VSTART
] = host
->c_cc
[VSTART
];
2455 target
->c_cc
[TARGET_VSTOP
] = host
->c_cc
[VSTOP
];
2456 target
->c_cc
[TARGET_VSUSP
] = host
->c_cc
[VSUSP
];
2457 target
->c_cc
[TARGET_VEOL
] = host
->c_cc
[VEOL
];
2458 target
->c_cc
[TARGET_VREPRINT
] = host
->c_cc
[VREPRINT
];
2459 target
->c_cc
[TARGET_VDISCARD
] = host
->c_cc
[VDISCARD
];
2460 target
->c_cc
[TARGET_VWERASE
] = host
->c_cc
[VWERASE
];
2461 target
->c_cc
[TARGET_VLNEXT
] = host
->c_cc
[VLNEXT
];
2462 target
->c_cc
[TARGET_VEOL2
] = host
->c_cc
[VEOL2
];
2465 static const StructEntry struct_termios_def
= {
2466 .convert
= { host_to_target_termios
, target_to_host_termios
},
2467 .size
= { sizeof(struct target_termios
), sizeof(struct host_termios
) },
2468 .align
= { __alignof__(struct target_termios
), __alignof__(struct host_termios
) },
2471 static bitmask_transtbl mmap_flags_tbl
[] = {
2472 { TARGET_MAP_SHARED
, TARGET_MAP_SHARED
, MAP_SHARED
, MAP_SHARED
},
2473 { TARGET_MAP_PRIVATE
, TARGET_MAP_PRIVATE
, MAP_PRIVATE
, MAP_PRIVATE
},
2474 { TARGET_MAP_FIXED
, TARGET_MAP_FIXED
, MAP_FIXED
, MAP_FIXED
},
2475 { TARGET_MAP_ANONYMOUS
, TARGET_MAP_ANONYMOUS
, MAP_ANONYMOUS
, MAP_ANONYMOUS
},
2476 { TARGET_MAP_GROWSDOWN
, TARGET_MAP_GROWSDOWN
, MAP_GROWSDOWN
, MAP_GROWSDOWN
},
2477 { TARGET_MAP_DENYWRITE
, TARGET_MAP_DENYWRITE
, MAP_DENYWRITE
, MAP_DENYWRITE
},
2478 { TARGET_MAP_EXECUTABLE
, TARGET_MAP_EXECUTABLE
, MAP_EXECUTABLE
, MAP_EXECUTABLE
},
2479 { TARGET_MAP_LOCKED
, TARGET_MAP_LOCKED
, MAP_LOCKED
, MAP_LOCKED
},
2483 static bitmask_transtbl fcntl_flags_tbl
[] = {
2484 { TARGET_O_ACCMODE
, TARGET_O_WRONLY
, O_ACCMODE
, O_WRONLY
, },
2485 { TARGET_O_ACCMODE
, TARGET_O_RDWR
, O_ACCMODE
, O_RDWR
, },
2486 { TARGET_O_CREAT
, TARGET_O_CREAT
, O_CREAT
, O_CREAT
, },
2487 { TARGET_O_EXCL
, TARGET_O_EXCL
, O_EXCL
, O_EXCL
, },
2488 { TARGET_O_NOCTTY
, TARGET_O_NOCTTY
, O_NOCTTY
, O_NOCTTY
, },
2489 { TARGET_O_TRUNC
, TARGET_O_TRUNC
, O_TRUNC
, O_TRUNC
, },
2490 { TARGET_O_APPEND
, TARGET_O_APPEND
, O_APPEND
, O_APPEND
, },
2491 { TARGET_O_NONBLOCK
, TARGET_O_NONBLOCK
, O_NONBLOCK
, O_NONBLOCK
, },
2492 { TARGET_O_SYNC
, TARGET_O_SYNC
, O_SYNC
, O_SYNC
, },
2493 { TARGET_FASYNC
, TARGET_FASYNC
, FASYNC
, FASYNC
, },
2494 { TARGET_O_DIRECTORY
, TARGET_O_DIRECTORY
, O_DIRECTORY
, O_DIRECTORY
, },
2495 { TARGET_O_NOFOLLOW
, TARGET_O_NOFOLLOW
, O_NOFOLLOW
, O_NOFOLLOW
, },
2496 { TARGET_O_LARGEFILE
, TARGET_O_LARGEFILE
, O_LARGEFILE
, O_LARGEFILE
, },
2497 #if defined(O_DIRECT)
2498 { TARGET_O_DIRECT
, TARGET_O_DIRECT
, O_DIRECT
, O_DIRECT
, },
2503 #if defined(TARGET_I386)
2505 /* NOTE: there is really one LDT for all the threads */
2506 static uint8_t *ldt_table
;
2508 static abi_long
read_ldt(abi_ulong ptr
, unsigned long bytecount
)
2515 size
= TARGET_LDT_ENTRIES
* TARGET_LDT_ENTRY_SIZE
;
2516 if (size
> bytecount
)
2518 p
= lock_user(VERIFY_WRITE
, ptr
, size
, 0);
2520 return -TARGET_EFAULT
;
2521 /* ??? Should this by byteswapped? */
2522 memcpy(p
, ldt_table
, size
);
2523 unlock_user(p
, ptr
, size
);
2527 /* XXX: add locking support */
2528 static abi_long
write_ldt(CPUX86State
*env
,
2529 abi_ulong ptr
, unsigned long bytecount
, int oldmode
)
2531 struct target_modify_ldt_ldt_s ldt_info
;
2532 struct target_modify_ldt_ldt_s
*target_ldt_info
;
2533 int seg_32bit
, contents
, read_exec_only
, limit_in_pages
;
2534 int seg_not_present
, useable
, lm
;
2535 uint32_t *lp
, entry_1
, entry_2
;
2537 if (bytecount
!= sizeof(ldt_info
))
2538 return -TARGET_EINVAL
;
2539 if (!lock_user_struct(VERIFY_READ
, target_ldt_info
, ptr
, 1))
2540 return -TARGET_EFAULT
;
2541 ldt_info
.entry_number
= tswap32(target_ldt_info
->entry_number
);
2542 ldt_info
.base_addr
= tswapl(target_ldt_info
->base_addr
);
2543 ldt_info
.limit
= tswap32(target_ldt_info
->limit
);
2544 ldt_info
.flags
= tswap32(target_ldt_info
->flags
);
2545 unlock_user_struct(target_ldt_info
, ptr
, 0);
2547 if (ldt_info
.entry_number
>= TARGET_LDT_ENTRIES
)
2548 return -TARGET_EINVAL
;
2549 seg_32bit
= ldt_info
.flags
& 1;
2550 contents
= (ldt_info
.flags
>> 1) & 3;
2551 read_exec_only
= (ldt_info
.flags
>> 3) & 1;
2552 limit_in_pages
= (ldt_info
.flags
>> 4) & 1;
2553 seg_not_present
= (ldt_info
.flags
>> 5) & 1;
2554 useable
= (ldt_info
.flags
>> 6) & 1;
2558 lm
= (ldt_info
.flags
>> 7) & 1;
2560 if (contents
== 3) {
2562 return -TARGET_EINVAL
;
2563 if (seg_not_present
== 0)
2564 return -TARGET_EINVAL
;
2566 /* allocate the LDT */
2568 env
->ldt
.base
= target_mmap(0,
2569 TARGET_LDT_ENTRIES
* TARGET_LDT_ENTRY_SIZE
,
2570 PROT_READ
|PROT_WRITE
,
2571 MAP_ANONYMOUS
|MAP_PRIVATE
, -1, 0);
2572 if (env
->ldt
.base
== -1)
2573 return -TARGET_ENOMEM
;
2574 memset(g2h(env
->ldt
.base
), 0,
2575 TARGET_LDT_ENTRIES
* TARGET_LDT_ENTRY_SIZE
);
2576 env
->ldt
.limit
= 0xffff;
2577 ldt_table
= g2h(env
->ldt
.base
);
2580 /* NOTE: same code as Linux kernel */
2581 /* Allow LDTs to be cleared by the user. */
2582 if (ldt_info
.base_addr
== 0 && ldt_info
.limit
== 0) {
2585 read_exec_only
== 1 &&
2587 limit_in_pages
== 0 &&
2588 seg_not_present
== 1 &&
2596 entry_1
= ((ldt_info
.base_addr
& 0x0000ffff) << 16) |
2597 (ldt_info
.limit
& 0x0ffff);
2598 entry_2
= (ldt_info
.base_addr
& 0xff000000) |
2599 ((ldt_info
.base_addr
& 0x00ff0000) >> 16) |
2600 (ldt_info
.limit
& 0xf0000) |
2601 ((read_exec_only
^ 1) << 9) |
2603 ((seg_not_present
^ 1) << 15) |
2605 (limit_in_pages
<< 23) |
2609 entry_2
|= (useable
<< 20);
2611 /* Install the new entry ... */
2613 lp
= (uint32_t *)(ldt_table
+ (ldt_info
.entry_number
<< 3));
2614 lp
[0] = tswap32(entry_1
);
2615 lp
[1] = tswap32(entry_2
);
2619 /* specific and weird i386 syscalls */
2620 static abi_long
do_modify_ldt(CPUX86State
*env
, int func
, abi_ulong ptr
,
2621 unsigned long bytecount
)
2627 ret
= read_ldt(ptr
, bytecount
);
2630 ret
= write_ldt(env
, ptr
, bytecount
, 1);
2633 ret
= write_ldt(env
, ptr
, bytecount
, 0);
2636 ret
= -TARGET_ENOSYS
;
2642 #if defined(TARGET_I386) && defined(TARGET_ABI32)
2643 static abi_long
do_set_thread_area(CPUX86State
*env
, abi_ulong ptr
)
2645 uint64_t *gdt_table
= g2h(env
->gdt
.base
);
2646 struct target_modify_ldt_ldt_s ldt_info
;
2647 struct target_modify_ldt_ldt_s
*target_ldt_info
;
2648 int seg_32bit
, contents
, read_exec_only
, limit_in_pages
;
2649 int seg_not_present
, useable
, lm
;
2650 uint32_t *lp
, entry_1
, entry_2
;
2653 lock_user_struct(VERIFY_WRITE
, target_ldt_info
, ptr
, 1);
2654 if (!target_ldt_info
)
2655 return -TARGET_EFAULT
;
2656 ldt_info
.entry_number
= tswap32(target_ldt_info
->entry_number
);
2657 ldt_info
.base_addr
= tswapl(target_ldt_info
->base_addr
);
2658 ldt_info
.limit
= tswap32(target_ldt_info
->limit
);
2659 ldt_info
.flags
= tswap32(target_ldt_info
->flags
);
2660 if (ldt_info
.entry_number
== -1) {
2661 for (i
=TARGET_GDT_ENTRY_TLS_MIN
; i
<=TARGET_GDT_ENTRY_TLS_MAX
; i
++) {
2662 if (gdt_table
[i
] == 0) {
2663 ldt_info
.entry_number
= i
;
2664 target_ldt_info
->entry_number
= tswap32(i
);
2669 unlock_user_struct(target_ldt_info
, ptr
, 1);
2671 if (ldt_info
.entry_number
< TARGET_GDT_ENTRY_TLS_MIN
||
2672 ldt_info
.entry_number
> TARGET_GDT_ENTRY_TLS_MAX
)
2673 return -TARGET_EINVAL
;
2674 seg_32bit
= ldt_info
.flags
& 1;
2675 contents
= (ldt_info
.flags
>> 1) & 3;
2676 read_exec_only
= (ldt_info
.flags
>> 3) & 1;
2677 limit_in_pages
= (ldt_info
.flags
>> 4) & 1;
2678 seg_not_present
= (ldt_info
.flags
>> 5) & 1;
2679 useable
= (ldt_info
.flags
>> 6) & 1;
2683 lm
= (ldt_info
.flags
>> 7) & 1;
2686 if (contents
== 3) {
2687 if (seg_not_present
== 0)
2688 return -TARGET_EINVAL
;
2691 /* NOTE: same code as Linux kernel */
2692 /* Allow LDTs to be cleared by the user. */
2693 if (ldt_info
.base_addr
== 0 && ldt_info
.limit
== 0) {
2694 if ((contents
== 0 &&
2695 read_exec_only
== 1 &&
2697 limit_in_pages
== 0 &&
2698 seg_not_present
== 1 &&
2706 entry_1
= ((ldt_info
.base_addr
& 0x0000ffff) << 16) |
2707 (ldt_info
.limit
& 0x0ffff);
2708 entry_2
= (ldt_info
.base_addr
& 0xff000000) |
2709 ((ldt_info
.base_addr
& 0x00ff0000) >> 16) |
2710 (ldt_info
.limit
& 0xf0000) |
2711 ((read_exec_only
^ 1) << 9) |
2713 ((seg_not_present
^ 1) << 15) |
2715 (limit_in_pages
<< 23) |
2720 /* Install the new entry ... */
2722 lp
= (uint32_t *)(gdt_table
+ ldt_info
.entry_number
);
2723 lp
[0] = tswap32(entry_1
);
2724 lp
[1] = tswap32(entry_2
);
2728 static abi_long
do_get_thread_area(CPUX86State
*env
, abi_ulong ptr
)
2730 struct target_modify_ldt_ldt_s
*target_ldt_info
;
2731 uint64_t *gdt_table
= g2h(env
->gdt
.base
);
2732 uint32_t base_addr
, limit
, flags
;
2733 int seg_32bit
, contents
, read_exec_only
, limit_in_pages
, idx
;
2734 int seg_not_present
, useable
, lm
;
2735 uint32_t *lp
, entry_1
, entry_2
;
2737 lock_user_struct(VERIFY_WRITE
, target_ldt_info
, ptr
, 1);
2738 if (!target_ldt_info
)
2739 return -TARGET_EFAULT
;
2740 idx
= tswap32(target_ldt_info
->entry_number
);
2741 if (idx
< TARGET_GDT_ENTRY_TLS_MIN
||
2742 idx
> TARGET_GDT_ENTRY_TLS_MAX
) {
2743 unlock_user_struct(target_ldt_info
, ptr
, 1);
2744 return -TARGET_EINVAL
;
2746 lp
= (uint32_t *)(gdt_table
+ idx
);
2747 entry_1
= tswap32(lp
[0]);
2748 entry_2
= tswap32(lp
[1]);
2750 read_exec_only
= ((entry_2
>> 9) & 1) ^ 1;
2751 contents
= (entry_2
>> 10) & 3;
2752 seg_not_present
= ((entry_2
>> 15) & 1) ^ 1;
2753 seg_32bit
= (entry_2
>> 22) & 1;
2754 limit_in_pages
= (entry_2
>> 23) & 1;
2755 useable
= (entry_2
>> 20) & 1;
2759 lm
= (entry_2
>> 21) & 1;
2761 flags
= (seg_32bit
<< 0) | (contents
<< 1) |
2762 (read_exec_only
<< 3) | (limit_in_pages
<< 4) |
2763 (seg_not_present
<< 5) | (useable
<< 6) | (lm
<< 7);
2764 limit
= (entry_1
& 0xffff) | (entry_2
& 0xf0000);
2765 base_addr
= (entry_1
>> 16) |
2766 (entry_2
& 0xff000000) |
2767 ((entry_2
& 0xff) << 16);
2768 target_ldt_info
->base_addr
= tswapl(base_addr
);
2769 target_ldt_info
->limit
= tswap32(limit
);
2770 target_ldt_info
->flags
= tswap32(flags
);
2771 unlock_user_struct(target_ldt_info
, ptr
, 1);
2774 #endif /* TARGET_I386 && TARGET_ABI32 */
2776 #ifndef TARGET_ABI32
2777 static abi_long
do_arch_prctl(CPUX86State
*env
, int code
, abi_ulong addr
)
2784 case TARGET_ARCH_SET_GS
:
2785 case TARGET_ARCH_SET_FS
:
2786 if (code
== TARGET_ARCH_SET_GS
)
2790 cpu_x86_load_seg(env
, idx
, 0);
2791 env
->segs
[idx
].base
= addr
;
2793 case TARGET_ARCH_GET_GS
:
2794 case TARGET_ARCH_GET_FS
:
2795 if (code
== TARGET_ARCH_GET_GS
)
2799 val
= env
->segs
[idx
].base
;
2800 if (put_user(val
, addr
, abi_ulong
))
2801 return -TARGET_EFAULT
;
2804 ret
= -TARGET_EINVAL
;
2811 #endif /* defined(TARGET_I386) */
2813 #if defined(USE_NPTL)
2815 #define NEW_STACK_SIZE PTHREAD_STACK_MIN
2817 static pthread_mutex_t clone_lock
= PTHREAD_MUTEX_INITIALIZER
;
2820 pthread_mutex_t mutex
;
2821 pthread_cond_t cond
;
2824 abi_ulong child_tidptr
;
2825 abi_ulong parent_tidptr
;
2829 static void *clone_func(void *arg
)
2831 new_thread_info
*info
= arg
;
2836 info
->tid
= gettid();
2837 if (info
->child_tidptr
)
2838 put_user_u32(info
->tid
, info
->child_tidptr
);
2839 if (info
->parent_tidptr
)
2840 put_user_u32(info
->tid
, info
->parent_tidptr
);
2841 /* Enable signals. */
2842 sigprocmask(SIG_SETMASK
, &info
->sigmask
, NULL
);
2843 /* Signal to the parent that we're ready. */
2844 pthread_mutex_lock(&info
->mutex
);
2845 pthread_cond_broadcast(&info
->cond
);
2846 pthread_mutex_unlock(&info
->mutex
);
2847 /* Wait until the parent has finshed initializing the tls state. */
2848 pthread_mutex_lock(&clone_lock
);
2849 pthread_mutex_unlock(&clone_lock
);
2855 /* this stack is the equivalent of the kernel stack associated with a
2857 #define NEW_STACK_SIZE 8192
2859 static int clone_func(void *arg
)
2861 CPUState
*env
= arg
;
2868 /* do_fork() Must return host values and target errnos (unlike most
2869 do_*() functions). */
2870 static int do_fork(CPUState
*env
, unsigned int flags
, abi_ulong newsp
,
2871 abi_ulong parent_tidptr
, target_ulong newtls
,
2872 abi_ulong child_tidptr
)
2878 #if defined(USE_NPTL)
2879 unsigned int nptl_flags
;
2883 /* Emulate vfork() with fork() */
2884 if (flags
& CLONE_VFORK
)
2885 flags
&= ~(CLONE_VFORK
| CLONE_VM
);
2887 if (flags
& CLONE_VM
) {
2888 #if defined(USE_NPTL)
2889 new_thread_info info
;
2890 pthread_attr_t attr
;
2892 ts
= qemu_mallocz(sizeof(TaskState
) + NEW_STACK_SIZE
);
2893 init_task_state(ts
);
2894 new_stack
= ts
->stack
;
2895 /* we create a new CPU instance. */
2896 new_env
= cpu_copy(env
);
2897 /* Init regs that differ from the parent. */
2898 cpu_clone_regs(new_env
, newsp
);
2899 new_env
->opaque
= ts
;
2900 #if defined(USE_NPTL)
2902 flags
&= ~CLONE_NPTL_FLAGS2
;
2904 /* TODO: Implement CLONE_CHILD_CLEARTID. */
2905 if (nptl_flags
& CLONE_SETTLS
)
2906 cpu_set_tls (new_env
, newtls
);
2908 /* Grab a mutex so that thread setup appears atomic. */
2909 pthread_mutex_lock(&clone_lock
);
2911 memset(&info
, 0, sizeof(info
));
2912 pthread_mutex_init(&info
.mutex
, NULL
);
2913 pthread_mutex_lock(&info
.mutex
);
2914 pthread_cond_init(&info
.cond
, NULL
);
2916 if (nptl_flags
& CLONE_CHILD_SETTID
)
2917 info
.child_tidptr
= child_tidptr
;
2918 if (nptl_flags
& CLONE_PARENT_SETTID
)
2919 info
.parent_tidptr
= parent_tidptr
;
2921 ret
= pthread_attr_init(&attr
);
2922 ret
= pthread_attr_setstack(&attr
, new_stack
, NEW_STACK_SIZE
);
2923 /* It is not safe to deliver signals until the child has finished
2924 initializing, so temporarily block all signals. */
2925 sigfillset(&sigmask
);
2926 sigprocmask(SIG_BLOCK
, &sigmask
, &info
.sigmask
);
2928 ret
= pthread_create(&info
.thread
, &attr
, clone_func
, &info
);
2930 sigprocmask(SIG_SETMASK
, &info
.sigmask
, NULL
);
2931 pthread_attr_destroy(&attr
);
2933 /* Wait for the child to initialize. */
2934 pthread_cond_wait(&info
.cond
, &info
.mutex
);
2936 if (flags
& CLONE_PARENT_SETTID
)
2937 put_user_u32(ret
, parent_tidptr
);
2941 pthread_mutex_unlock(&info
.mutex
);
2942 pthread_cond_destroy(&info
.cond
);
2943 pthread_mutex_destroy(&info
.mutex
);
2944 pthread_mutex_unlock(&clone_lock
);
2946 if (flags
& CLONE_NPTL_FLAGS2
)
2948 /* This is probably going to die very quickly, but do it anyway. */
2950 ret
= __clone2(clone_func
, new_stack
+ NEW_STACK_SIZE
, flags
, new_env
);
2952 ret
= clone(clone_func
, new_stack
+ NEW_STACK_SIZE
, flags
, new_env
);
2956 /* if no CLONE_VM, we consider it is a fork */
2957 if ((flags
& ~(CSIGNAL
| CLONE_NPTL_FLAGS2
)) != 0)
2961 #if defined(USE_NPTL)
2962 /* There is a race condition here. The parent process could
2963 theoretically read the TID in the child process before the child
2964 tid is set. This would require using either ptrace
2965 (not implemented) or having *_tidptr to point at a shared memory
2966 mapping. We can't repeat the spinlock hack used above because
2967 the child process gets its own copy of the lock. */
2969 cpu_clone_regs(env
, newsp
);
2971 /* Child Process. */
2972 if (flags
& CLONE_CHILD_SETTID
)
2973 put_user_u32(gettid(), child_tidptr
);
2974 if (flags
& CLONE_PARENT_SETTID
)
2975 put_user_u32(gettid(), parent_tidptr
);
2976 ts
= (TaskState
*)env
->opaque
;
2977 if (flags
& CLONE_SETTLS
)
2978 cpu_set_tls (env
, newtls
);
2979 /* TODO: Implement CLONE_CHILD_CLEARTID. */
2985 cpu_clone_regs(env
, newsp
);
2992 static abi_long
do_fcntl(int fd
, int cmd
, abi_ulong arg
)
2995 struct target_flock
*target_fl
;
2996 struct flock64 fl64
;
2997 struct target_flock64
*target_fl64
;
3001 case TARGET_F_GETLK
:
3002 if (!lock_user_struct(VERIFY_READ
, target_fl
, arg
, 1))
3003 return -TARGET_EFAULT
;
3004 fl
.l_type
= tswap16(target_fl
->l_type
);
3005 fl
.l_whence
= tswap16(target_fl
->l_whence
);
3006 fl
.l_start
= tswapl(target_fl
->l_start
);
3007 fl
.l_len
= tswapl(target_fl
->l_len
);
3008 fl
.l_pid
= tswapl(target_fl
->l_pid
);
3009 unlock_user_struct(target_fl
, arg
, 0);
3010 ret
= get_errno(fcntl(fd
, cmd
, &fl
));
3012 if (!lock_user_struct(VERIFY_WRITE
, target_fl
, arg
, 0))
3013 return -TARGET_EFAULT
;
3014 target_fl
->l_type
= tswap16(fl
.l_type
);
3015 target_fl
->l_whence
= tswap16(fl
.l_whence
);
3016 target_fl
->l_start
= tswapl(fl
.l_start
);
3017 target_fl
->l_len
= tswapl(fl
.l_len
);
3018 target_fl
->l_pid
= tswapl(fl
.l_pid
);
3019 unlock_user_struct(target_fl
, arg
, 1);
3023 case TARGET_F_SETLK
:
3024 case TARGET_F_SETLKW
:
3025 if (!lock_user_struct(VERIFY_READ
, target_fl
, arg
, 1))
3026 return -TARGET_EFAULT
;
3027 fl
.l_type
= tswap16(target_fl
->l_type
);
3028 fl
.l_whence
= tswap16(target_fl
->l_whence
);
3029 fl
.l_start
= tswapl(target_fl
->l_start
);
3030 fl
.l_len
= tswapl(target_fl
->l_len
);
3031 fl
.l_pid
= tswapl(target_fl
->l_pid
);
3032 unlock_user_struct(target_fl
, arg
, 0);
3033 ret
= get_errno(fcntl(fd
, cmd
, &fl
));
3036 case TARGET_F_GETLK64
:
3037 if (!lock_user_struct(VERIFY_READ
, target_fl64
, arg
, 1))
3038 return -TARGET_EFAULT
;
3039 fl64
.l_type
= tswap16(target_fl64
->l_type
) >> 1;
3040 fl64
.l_whence
= tswap16(target_fl64
->l_whence
);
3041 fl64
.l_start
= tswapl(target_fl64
->l_start
);
3042 fl64
.l_len
= tswapl(target_fl64
->l_len
);
3043 fl64
.l_pid
= tswap16(target_fl64
->l_pid
);
3044 unlock_user_struct(target_fl64
, arg
, 0);
3045 ret
= get_errno(fcntl(fd
, cmd
>> 1, &fl64
));
3047 if (!lock_user_struct(VERIFY_WRITE
, target_fl64
, arg
, 0))
3048 return -TARGET_EFAULT
;
3049 target_fl64
->l_type
= tswap16(fl64
.l_type
) >> 1;
3050 target_fl64
->l_whence
= tswap16(fl64
.l_whence
);
3051 target_fl64
->l_start
= tswapl(fl64
.l_start
);
3052 target_fl64
->l_len
= tswapl(fl64
.l_len
);
3053 target_fl64
->l_pid
= tswapl(fl64
.l_pid
);
3054 unlock_user_struct(target_fl64
, arg
, 1);
3057 case TARGET_F_SETLK64
:
3058 case TARGET_F_SETLKW64
:
3059 if (!lock_user_struct(VERIFY_READ
, target_fl64
, arg
, 1))
3060 return -TARGET_EFAULT
;
3061 fl64
.l_type
= tswap16(target_fl64
->l_type
) >> 1;
3062 fl64
.l_whence
= tswap16(target_fl64
->l_whence
);
3063 fl64
.l_start
= tswapl(target_fl64
->l_start
);
3064 fl64
.l_len
= tswapl(target_fl64
->l_len
);
3065 fl64
.l_pid
= tswap16(target_fl64
->l_pid
);
3066 unlock_user_struct(target_fl64
, arg
, 0);
3067 ret
= get_errno(fcntl(fd
, cmd
>> 1, &fl64
));
3071 ret
= get_errno(fcntl(fd
, cmd
, arg
));
3073 ret
= host_to_target_bitmask(ret
, fcntl_flags_tbl
);
3078 ret
= get_errno(fcntl(fd
, cmd
, target_to_host_bitmask(arg
, fcntl_flags_tbl
)));
3082 ret
= get_errno(fcntl(fd
, cmd
, arg
));
3090 static inline int high2lowuid(int uid
)
3098 static inline int high2lowgid(int gid
)
3106 static inline int low2highuid(int uid
)
3108 if ((int16_t)uid
== -1)
3114 static inline int low2highgid(int gid
)
3116 if ((int16_t)gid
== -1)
3122 #endif /* USE_UID16 */
3124 void syscall_init(void)
3127 const argtype
*arg_type
;
3131 #define STRUCT(name, list...) thunk_register_struct(STRUCT_ ## name, #name, struct_ ## name ## _def);
3132 #define STRUCT_SPECIAL(name) thunk_register_struct_direct(STRUCT_ ## name, #name, &struct_ ## name ## _def);
3133 #include "syscall_types.h"
3135 #undef STRUCT_SPECIAL
3137 /* we patch the ioctl size if necessary. We rely on the fact that
3138 no ioctl has all the bits at '1' in the size field */
3140 while (ie
->target_cmd
!= 0) {
3141 if (((ie
->target_cmd
>> TARGET_IOC_SIZESHIFT
) & TARGET_IOC_SIZEMASK
) ==
3142 TARGET_IOC_SIZEMASK
) {
3143 arg_type
= ie
->arg_type
;
3144 if (arg_type
[0] != TYPE_PTR
) {
3145 fprintf(stderr
, "cannot patch size for ioctl 0x%x\n",
3150 size
= thunk_type_size(arg_type
, 0);
3151 ie
->target_cmd
= (ie
->target_cmd
&
3152 ~(TARGET_IOC_SIZEMASK
<< TARGET_IOC_SIZESHIFT
)) |
3153 (size
<< TARGET_IOC_SIZESHIFT
);
3156 /* Build target_to_host_errno_table[] table from
3157 * host_to_target_errno_table[]. */
3158 for (i
=0; i
< ERRNO_TABLE_SIZE
; i
++)
3159 target_to_host_errno_table
[host_to_target_errno_table
[i
]] = i
;
3161 /* automatic consistency check if same arch */
3162 #if (defined(__i386__) && defined(TARGET_I386) && defined(TARGET_ABI32)) || \
3163 (defined(__x86_64__) && defined(TARGET_X86_64))
3164 if (unlikely(ie
->target_cmd
!= ie
->host_cmd
)) {
3165 fprintf(stderr
, "ERROR: ioctl(%s): target=0x%x host=0x%x\n",
3166 ie
->name
, ie
->target_cmd
, ie
->host_cmd
);
3173 #if TARGET_ABI_BITS == 32
3174 static inline uint64_t target_offset64(uint32_t word0
, uint32_t word1
)
3176 #ifdef TARGET_WORDS_BIGENDIAN
3177 return ((uint64_t)word0
<< 32) | word1
;
3179 return ((uint64_t)word1
<< 32) | word0
;
3182 #else /* TARGET_ABI_BITS == 32 */
3183 static inline uint64_t target_offset64(uint64_t word0
, uint64_t word1
)
3187 #endif /* TARGET_ABI_BITS != 32 */
3189 #ifdef TARGET_NR_truncate64
3190 static inline abi_long
target_truncate64(void *cpu_env
, const char *arg1
,
3196 if (((CPUARMState
*)cpu_env
)->eabi
)
3202 return get_errno(truncate64(arg1
, target_offset64(arg2
, arg3
)));
3206 #ifdef TARGET_NR_ftruncate64
3207 static inline abi_long
target_ftruncate64(void *cpu_env
, abi_long arg1
,
3213 if (((CPUARMState
*)cpu_env
)->eabi
)
3219 return get_errno(ftruncate64(arg1
, target_offset64(arg2
, arg3
)));
3223 static inline abi_long
target_to_host_timespec(struct timespec
*host_ts
,
3224 abi_ulong target_addr
)
3226 struct target_timespec
*target_ts
;
3228 if (!lock_user_struct(VERIFY_READ
, target_ts
, target_addr
, 1))
3229 return -TARGET_EFAULT
;
3230 host_ts
->tv_sec
= tswapl(target_ts
->tv_sec
);
3231 host_ts
->tv_nsec
= tswapl(target_ts
->tv_nsec
);
3232 unlock_user_struct(target_ts
, target_addr
, 0);
3236 static inline abi_long
host_to_target_timespec(abi_ulong target_addr
,
3237 struct timespec
*host_ts
)
3239 struct target_timespec
*target_ts
;
3241 if (!lock_user_struct(VERIFY_WRITE
, target_ts
, target_addr
, 0))
3242 return -TARGET_EFAULT
;
3243 target_ts
->tv_sec
= tswapl(host_ts
->tv_sec
);
3244 target_ts
->tv_nsec
= tswapl(host_ts
->tv_nsec
);
3245 unlock_user_struct(target_ts
, target_addr
, 1);
3249 #ifdef TARGET_NR_stat64
3250 static inline abi_long
host_to_target_stat64(void *cpu_env
,
3251 abi_ulong target_addr
,
3252 struct stat
*host_st
)
3255 if (((CPUARMState
*)cpu_env
)->eabi
) {
3256 struct target_eabi_stat64
*target_st
;
3258 if (!lock_user_struct(VERIFY_WRITE
, target_st
, target_addr
, 0))
3259 return -TARGET_EFAULT
;
3260 memset(target_st
, 0, sizeof(struct target_eabi_stat64
));
3261 __put_user(host_st
->st_dev
, &target_st
->st_dev
);
3262 __put_user(host_st
->st_ino
, &target_st
->st_ino
);
3263 #ifdef TARGET_STAT64_HAS_BROKEN_ST_INO
3264 __put_user(host_st
->st_ino
, &target_st
->__st_ino
);
3266 __put_user(host_st
->st_mode
, &target_st
->st_mode
);
3267 __put_user(host_st
->st_nlink
, &target_st
->st_nlink
);
3268 __put_user(host_st
->st_uid
, &target_st
->st_uid
);
3269 __put_user(host_st
->st_gid
, &target_st
->st_gid
);
3270 __put_user(host_st
->st_rdev
, &target_st
->st_rdev
);
3271 __put_user(host_st
->st_size
, &target_st
->st_size
);
3272 __put_user(host_st
->st_blksize
, &target_st
->st_blksize
);
3273 __put_user(host_st
->st_blocks
, &target_st
->st_blocks
);
3274 __put_user(host_st
->st_atime
, &target_st
->target_st_atime
);
3275 __put_user(host_st
->st_mtime
, &target_st
->target_st_mtime
);
3276 __put_user(host_st
->st_ctime
, &target_st
->target_st_ctime
);
3277 unlock_user_struct(target_st
, target_addr
, 1);
3281 struct target_stat64
*target_st
;
3283 if (!lock_user_struct(VERIFY_WRITE
, target_st
, target_addr
, 0))
3284 return -TARGET_EFAULT
;
3285 memset(target_st
, 0, sizeof(struct target_stat64
));
3286 __put_user(host_st
->st_dev
, &target_st
->st_dev
);
3287 __put_user(host_st
->st_ino
, &target_st
->st_ino
);
3288 #ifdef TARGET_STAT64_HAS_BROKEN_ST_INO
3289 __put_user(host_st
->st_ino
, &target_st
->__st_ino
);
3291 __put_user(host_st
->st_mode
, &target_st
->st_mode
);
3292 __put_user(host_st
->st_nlink
, &target_st
->st_nlink
);
3293 __put_user(host_st
->st_uid
, &target_st
->st_uid
);
3294 __put_user(host_st
->st_gid
, &target_st
->st_gid
);
3295 __put_user(host_st
->st_rdev
, &target_st
->st_rdev
);
3296 /* XXX: better use of kernel struct */
3297 __put_user(host_st
->st_size
, &target_st
->st_size
);
3298 __put_user(host_st
->st_blksize
, &target_st
->st_blksize
);
3299 __put_user(host_st
->st_blocks
, &target_st
->st_blocks
);
3300 __put_user(host_st
->st_atime
, &target_st
->target_st_atime
);
3301 __put_user(host_st
->st_mtime
, &target_st
->target_st_mtime
);
3302 __put_user(host_st
->st_ctime
, &target_st
->target_st_ctime
);
3303 unlock_user_struct(target_st
, target_addr
, 1);
3310 #if defined(USE_NPTL)
3311 /* ??? Using host futex calls even when target atomic operations
3312 are not really atomic probably breaks things. However implementing
3313 futexes locally would make futexes shared between multiple processes
3314 tricky. However they're probably useless because guest atomic
3315 operations won't work either. */
3316 static int do_futex(target_ulong uaddr
, int op
, int val
, target_ulong timeout
,
3317 target_ulong uaddr2
, int val3
)
3319 struct timespec ts
, *pts
;
3321 /* ??? We assume FUTEX_* constants are the same on both host
3327 target_to_host_timespec(pts
, timeout
);
3331 return get_errno(sys_futex(g2h(uaddr
), FUTEX_WAIT
, tswap32(val
),
3334 return get_errno(sys_futex(g2h(uaddr
), FUTEX_WAKE
, val
, NULL
, NULL
, 0));
3336 return get_errno(sys_futex(g2h(uaddr
), FUTEX_FD
, val
, NULL
, NULL
, 0));
3338 return get_errno(sys_futex(g2h(uaddr
), FUTEX_REQUEUE
, val
,
3339 NULL
, g2h(uaddr2
), 0));
3340 case FUTEX_CMP_REQUEUE
:
3341 return get_errno(sys_futex(g2h(uaddr
), FUTEX_CMP_REQUEUE
, val
,
3342 NULL
, g2h(uaddr2
), tswap32(val3
)));
3344 return -TARGET_ENOSYS
;
3349 int get_osversion(void)
3351 static int osversion
;
3352 struct new_utsname buf
;
3357 if (qemu_uname_release
&& *qemu_uname_release
) {
3358 s
= qemu_uname_release
;
3360 if (sys_uname(&buf
))
3365 for (i
= 0; i
< 3; i
++) {
3367 while (*s
>= '0' && *s
<= '9') {
3372 tmp
= (tmp
<< 8) + n
;
3380 /* do_syscall() should always have a single exit point at the end so
3381 that actions, such as logging of syscall results, can be performed.
3382 All errnos that do_syscall() returns must be -TARGET_<errcode>. */
3383 abi_long
do_syscall(void *cpu_env
, int num
, abi_long arg1
,
3384 abi_long arg2
, abi_long arg3
, abi_long arg4
,
3385 abi_long arg5
, abi_long arg6
)
3393 gemu_log("syscall %d", num
);
3396 print_syscall(num
, arg1
, arg2
, arg3
, arg4
, arg5
, arg6
);
3399 case TARGET_NR_exit
:
3403 gdb_exit(cpu_env
, arg1
);
3404 /* XXX: should free thread stack and CPU env */
3406 ret
= 0; /* avoid warning */
3408 case TARGET_NR_read
:
3409 if (!(p
= lock_user(VERIFY_WRITE
, arg2
, arg3
, 0)))
3411 ret
= get_errno(read(arg1
, p
, arg3
));
3412 unlock_user(p
, arg2
, ret
);
3414 case TARGET_NR_write
:
3415 if (!(p
= lock_user(VERIFY_READ
, arg2
, arg3
, 1)))
3417 ret
= get_errno(write(arg1
, p
, arg3
));
3418 unlock_user(p
, arg2
, 0);
3420 case TARGET_NR_open
:
3421 if (!(p
= lock_user_string(arg1
)))
3423 ret
= get_errno(open(path(p
),
3424 target_to_host_bitmask(arg2
, fcntl_flags_tbl
),
3426 unlock_user(p
, arg1
, 0);
3428 #if defined(TARGET_NR_openat) && defined(__NR_openat)
3429 case TARGET_NR_openat
:
3430 if (!(p
= lock_user_string(arg2
)))
3432 ret
= get_errno(sys_openat(arg1
,
3434 target_to_host_bitmask(arg3
, fcntl_flags_tbl
),
3436 unlock_user(p
, arg2
, 0);
3439 case TARGET_NR_close
:
3440 ret
= get_errno(close(arg1
));
3445 case TARGET_NR_fork
:
3446 ret
= get_errno(do_fork(cpu_env
, SIGCHLD
, 0, 0, 0, 0));
3448 #ifdef TARGET_NR_waitpid
3449 case TARGET_NR_waitpid
:
3452 ret
= get_errno(waitpid(arg1
, &status
, arg3
));
3453 if (!is_error(ret
) && arg2
3454 && put_user_s32(status
, arg2
))
3459 #ifdef TARGET_NR_waitid
3460 case TARGET_NR_waitid
:
3464 ret
= get_errno(waitid(arg1
, arg2
, &info
, arg4
));
3465 if (!is_error(ret
) && arg3
&& info
.si_pid
!= 0) {
3466 if (!(p
= lock_user(VERIFY_WRITE
, arg3
, sizeof(target_siginfo_t
), 0)))
3468 host_to_target_siginfo(p
, &info
);
3469 unlock_user(p
, arg3
, sizeof(target_siginfo_t
));
3474 #ifdef TARGET_NR_creat /* not on alpha */
3475 case TARGET_NR_creat
:
3476 if (!(p
= lock_user_string(arg1
)))
3478 ret
= get_errno(creat(p
, arg2
));
3479 unlock_user(p
, arg1
, 0);
3482 case TARGET_NR_link
:
3485 p
= lock_user_string(arg1
);
3486 p2
= lock_user_string(arg2
);
3488 ret
= -TARGET_EFAULT
;
3490 ret
= get_errno(link(p
, p2
));
3491 unlock_user(p2
, arg2
, 0);
3492 unlock_user(p
, arg1
, 0);
3495 #if defined(TARGET_NR_linkat) && defined(__NR_linkat)
3496 case TARGET_NR_linkat
:
3501 p
= lock_user_string(arg2
);
3502 p2
= lock_user_string(arg4
);
3504 ret
= -TARGET_EFAULT
;
3506 ret
= get_errno(sys_linkat(arg1
, p
, arg3
, p2
, arg5
));
3507 unlock_user(p
, arg2
, 0);
3508 unlock_user(p2
, arg4
, 0);
3512 case TARGET_NR_unlink
:
3513 if (!(p
= lock_user_string(arg1
)))
3515 ret
= get_errno(unlink(p
));
3516 unlock_user(p
, arg1
, 0);
3518 #if defined(TARGET_NR_unlinkat) && defined(__NR_unlinkat)
3519 case TARGET_NR_unlinkat
:
3520 if (!(p
= lock_user_string(arg2
)))
3522 ret
= get_errno(sys_unlinkat(arg1
, p
, arg3
));
3523 unlock_user(p
, arg2
, 0);
3526 case TARGET_NR_execve
:
3528 char **argp
, **envp
;
3531 abi_ulong guest_argp
;
3532 abi_ulong guest_envp
;
3538 for (gp
= guest_argp
; gp
; gp
+= sizeof(abi_ulong
)) {
3539 if (get_user_ual(addr
, gp
))
3547 for (gp
= guest_envp
; gp
; gp
+= sizeof(abi_ulong
)) {
3548 if (get_user_ual(addr
, gp
))
3555 argp
= alloca((argc
+ 1) * sizeof(void *));
3556 envp
= alloca((envc
+ 1) * sizeof(void *));
3558 for (gp
= guest_argp
, q
= argp
; gp
;
3559 gp
+= sizeof(abi_ulong
), q
++) {
3560 if (get_user_ual(addr
, gp
))
3564 if (!(*q
= lock_user_string(addr
)))
3569 for (gp
= guest_envp
, q
= envp
; gp
;
3570 gp
+= sizeof(abi_ulong
), q
++) {
3571 if (get_user_ual(addr
, gp
))
3575 if (!(*q
= lock_user_string(addr
)))
3580 if (!(p
= lock_user_string(arg1
)))
3582 ret
= get_errno(execve(p
, argp
, envp
));
3583 unlock_user(p
, arg1
, 0);
3588 ret
= -TARGET_EFAULT
;
3591 for (gp
= guest_argp
, q
= argp
; *q
;
3592 gp
+= sizeof(abi_ulong
), q
++) {
3593 if (get_user_ual(addr
, gp
)
3596 unlock_user(*q
, addr
, 0);
3598 for (gp
= guest_envp
, q
= envp
; *q
;
3599 gp
+= sizeof(abi_ulong
), q
++) {
3600 if (get_user_ual(addr
, gp
)
3603 unlock_user(*q
, addr
, 0);
3607 case TARGET_NR_chdir
:
3608 if (!(p
= lock_user_string(arg1
)))
3610 ret
= get_errno(chdir(p
));
3611 unlock_user(p
, arg1
, 0);
3613 #ifdef TARGET_NR_time
3614 case TARGET_NR_time
:
3617 ret
= get_errno(time(&host_time
));
3620 && put_user_sal(host_time
, arg1
))
3625 case TARGET_NR_mknod
:
3626 if (!(p
= lock_user_string(arg1
)))
3628 ret
= get_errno(mknod(p
, arg2
, arg3
));
3629 unlock_user(p
, arg1
, 0);
3631 #if defined(TARGET_NR_mknodat) && defined(__NR_mknodat)
3632 case TARGET_NR_mknodat
:
3633 if (!(p
= lock_user_string(arg2
)))
3635 ret
= get_errno(sys_mknodat(arg1
, p
, arg3
, arg4
));
3636 unlock_user(p
, arg2
, 0);
3639 case TARGET_NR_chmod
:
3640 if (!(p
= lock_user_string(arg1
)))
3642 ret
= get_errno(chmod(p
, arg2
));
3643 unlock_user(p
, arg1
, 0);
3645 #ifdef TARGET_NR_break
3646 case TARGET_NR_break
:
3649 #ifdef TARGET_NR_oldstat
3650 case TARGET_NR_oldstat
:
3653 case TARGET_NR_lseek
:
3654 ret
= get_errno(lseek(arg1
, arg2
, arg3
));
3656 #ifdef TARGET_NR_getxpid
3657 case TARGET_NR_getxpid
:
3659 case TARGET_NR_getpid
:
3661 ret
= get_errno(getpid());
3663 case TARGET_NR_mount
:
3665 /* need to look at the data field */
3667 p
= lock_user_string(arg1
);
3668 p2
= lock_user_string(arg2
);
3669 p3
= lock_user_string(arg3
);
3670 if (!p
|| !p2
|| !p3
)
3671 ret
= -TARGET_EFAULT
;
3673 /* FIXME - arg5 should be locked, but it isn't clear how to
3674 * do that since it's not guaranteed to be a NULL-terminated
3677 ret
= get_errno(mount(p
, p2
, p3
, (unsigned long)arg4
, g2h(arg5
)));
3678 unlock_user(p
, arg1
, 0);
3679 unlock_user(p2
, arg2
, 0);
3680 unlock_user(p3
, arg3
, 0);
3683 #ifdef TARGET_NR_umount
3684 case TARGET_NR_umount
:
3685 if (!(p
= lock_user_string(arg1
)))
3687 ret
= get_errno(umount(p
));
3688 unlock_user(p
, arg1
, 0);
3691 #ifdef TARGET_NR_stime /* not on alpha */
3692 case TARGET_NR_stime
:
3695 if (get_user_sal(host_time
, arg1
))
3697 ret
= get_errno(stime(&host_time
));
3701 case TARGET_NR_ptrace
:
3703 #ifdef TARGET_NR_alarm /* not on alpha */
3704 case TARGET_NR_alarm
:
3708 #ifdef TARGET_NR_oldfstat
3709 case TARGET_NR_oldfstat
:
3712 #ifdef TARGET_NR_pause /* not on alpha */
3713 case TARGET_NR_pause
:
3714 ret
= get_errno(pause());
3717 #ifdef TARGET_NR_utime
3718 case TARGET_NR_utime
:
3720 struct utimbuf tbuf
, *host_tbuf
;
3721 struct target_utimbuf
*target_tbuf
;
3723 if (!lock_user_struct(VERIFY_READ
, target_tbuf
, arg2
, 1))
3725 tbuf
.actime
= tswapl(target_tbuf
->actime
);
3726 tbuf
.modtime
= tswapl(target_tbuf
->modtime
);
3727 unlock_user_struct(target_tbuf
, arg2
, 0);
3732 if (!(p
= lock_user_string(arg1
)))
3734 ret
= get_errno(utime(p
, host_tbuf
));
3735 unlock_user(p
, arg1
, 0);
3739 case TARGET_NR_utimes
:
3741 struct timeval
*tvp
, tv
[2];
3743 if (copy_from_user_timeval(&tv
[0], arg2
)
3744 || copy_from_user_timeval(&tv
[1],
3745 arg2
+ sizeof(struct target_timeval
)))
3751 if (!(p
= lock_user_string(arg1
)))
3753 ret
= get_errno(utimes(p
, tvp
));
3754 unlock_user(p
, arg1
, 0);
3757 #if defined(TARGET_NR_futimesat) && defined(__NR_futimesat)
3758 case TARGET_NR_futimesat
:
3760 struct timeval
*tvp
, tv
[2];
3762 if (copy_from_user_timeval(&tv
[0], arg3
)
3763 || copy_from_user_timeval(&tv
[1],
3764 arg3
+ sizeof(struct target_timeval
)))
3770 if (!(p
= lock_user_string(arg2
)))
3772 ret
= get_errno(sys_futimesat(arg1
, path(p
), tvp
));
3773 unlock_user(p
, arg2
, 0);
3777 #ifdef TARGET_NR_stty
3778 case TARGET_NR_stty
:
3781 #ifdef TARGET_NR_gtty
3782 case TARGET_NR_gtty
:
3785 case TARGET_NR_access
:
3786 if (!(p
= lock_user_string(arg1
)))
3788 ret
= get_errno(access(p
, arg2
));
3789 unlock_user(p
, arg1
, 0);
3791 #if defined(TARGET_NR_faccessat) && defined(__NR_faccessat)
3792 case TARGET_NR_faccessat
:
3793 if (!(p
= lock_user_string(arg2
)))
3795 ret
= get_errno(sys_faccessat(arg1
, p
, arg3
, arg4
));
3796 unlock_user(p
, arg2
, 0);
3799 #ifdef TARGET_NR_nice /* not on alpha */
3800 case TARGET_NR_nice
:
3801 ret
= get_errno(nice(arg1
));
3804 #ifdef TARGET_NR_ftime
3805 case TARGET_NR_ftime
:
3808 case TARGET_NR_sync
:
3812 case TARGET_NR_kill
:
3813 ret
= get_errno(kill(arg1
, target_to_host_signal(arg2
)));
3815 case TARGET_NR_rename
:
3818 p
= lock_user_string(arg1
);
3819 p2
= lock_user_string(arg2
);
3821 ret
= -TARGET_EFAULT
;
3823 ret
= get_errno(rename(p
, p2
));
3824 unlock_user(p2
, arg2
, 0);
3825 unlock_user(p
, arg1
, 0);
3828 #if defined(TARGET_NR_renameat) && defined(__NR_renameat)
3829 case TARGET_NR_renameat
:
3832 p
= lock_user_string(arg2
);
3833 p2
= lock_user_string(arg4
);
3835 ret
= -TARGET_EFAULT
;
3837 ret
= get_errno(sys_renameat(arg1
, p
, arg3
, p2
));
3838 unlock_user(p2
, arg4
, 0);
3839 unlock_user(p
, arg2
, 0);
3843 case TARGET_NR_mkdir
:
3844 if (!(p
= lock_user_string(arg1
)))
3846 ret
= get_errno(mkdir(p
, arg2
));
3847 unlock_user(p
, arg1
, 0);
3849 #if defined(TARGET_NR_mkdirat) && defined(__NR_mkdirat)
3850 case TARGET_NR_mkdirat
:
3851 if (!(p
= lock_user_string(arg2
)))
3853 ret
= get_errno(sys_mkdirat(arg1
, p
, arg3
));
3854 unlock_user(p
, arg2
, 0);
3857 case TARGET_NR_rmdir
:
3858 if (!(p
= lock_user_string(arg1
)))
3860 ret
= get_errno(rmdir(p
));
3861 unlock_user(p
, arg1
, 0);
3864 ret
= get_errno(dup(arg1
));
3866 case TARGET_NR_pipe
:
3869 ret
= get_errno(pipe(host_pipe
));
3870 if (!is_error(ret
)) {
3871 #if defined(TARGET_MIPS)
3872 CPUMIPSState
*env
= (CPUMIPSState
*)cpu_env
;
3873 env
->active_tc
.gpr
[3] = host_pipe
[1];
3875 #elif defined(TARGET_SH4)
3876 ((CPUSH4State
*)cpu_env
)->gregs
[1] = host_pipe
[1];
3879 if (put_user_s32(host_pipe
[0], arg1
)
3880 || put_user_s32(host_pipe
[1], arg1
+ sizeof(host_pipe
[0])))
3886 case TARGET_NR_times
:
3888 struct target_tms
*tmsp
;
3890 ret
= get_errno(times(&tms
));
3892 tmsp
= lock_user(VERIFY_WRITE
, arg1
, sizeof(struct target_tms
), 0);
3895 tmsp
->tms_utime
= tswapl(host_to_target_clock_t(tms
.tms_utime
));
3896 tmsp
->tms_stime
= tswapl(host_to_target_clock_t(tms
.tms_stime
));
3897 tmsp
->tms_cutime
= tswapl(host_to_target_clock_t(tms
.tms_cutime
));
3898 tmsp
->tms_cstime
= tswapl(host_to_target_clock_t(tms
.tms_cstime
));
3901 ret
= host_to_target_clock_t(ret
);
3904 #ifdef TARGET_NR_prof
3905 case TARGET_NR_prof
:
3908 #ifdef TARGET_NR_signal
3909 case TARGET_NR_signal
:
3912 case TARGET_NR_acct
:
3913 if (!(p
= lock_user_string(arg1
)))
3915 ret
= get_errno(acct(path(p
)));
3916 unlock_user(p
, arg1
, 0);
3918 #ifdef TARGET_NR_umount2 /* not on alpha */
3919 case TARGET_NR_umount2
:
3920 if (!(p
= lock_user_string(arg1
)))
3922 ret
= get_errno(umount2(p
, arg2
));
3923 unlock_user(p
, arg1
, 0);
3926 #ifdef TARGET_NR_lock
3927 case TARGET_NR_lock
:
3930 case TARGET_NR_ioctl
:
3931 ret
= do_ioctl(arg1
, arg2
, arg3
);
3933 case TARGET_NR_fcntl
:
3934 ret
= do_fcntl(arg1
, arg2
, arg3
);
3936 #ifdef TARGET_NR_mpx
3940 case TARGET_NR_setpgid
:
3941 ret
= get_errno(setpgid(arg1
, arg2
));
3943 #ifdef TARGET_NR_ulimit
3944 case TARGET_NR_ulimit
:
3947 #ifdef TARGET_NR_oldolduname
3948 case TARGET_NR_oldolduname
:
3951 case TARGET_NR_umask
:
3952 ret
= get_errno(umask(arg1
));
3954 case TARGET_NR_chroot
:
3955 if (!(p
= lock_user_string(arg1
)))
3957 ret
= get_errno(chroot(p
));
3958 unlock_user(p
, arg1
, 0);
3960 case TARGET_NR_ustat
:
3962 case TARGET_NR_dup2
:
3963 ret
= get_errno(dup2(arg1
, arg2
));
3965 #ifdef TARGET_NR_getppid /* not on alpha */
3966 case TARGET_NR_getppid
:
3967 ret
= get_errno(getppid());
3970 case TARGET_NR_getpgrp
:
3971 ret
= get_errno(getpgrp());
3973 case TARGET_NR_setsid
:
3974 ret
= get_errno(setsid());
3976 #ifdef TARGET_NR_sigaction
3977 case TARGET_NR_sigaction
:
3979 #if !defined(TARGET_MIPS)
3980 struct target_old_sigaction
*old_act
;
3981 struct target_sigaction act
, oact
, *pact
;
3983 if (!lock_user_struct(VERIFY_READ
, old_act
, arg2
, 1))
3985 act
._sa_handler
= old_act
->_sa_handler
;
3986 target_siginitset(&act
.sa_mask
, old_act
->sa_mask
);
3987 act
.sa_flags
= old_act
->sa_flags
;
3988 act
.sa_restorer
= old_act
->sa_restorer
;
3989 unlock_user_struct(old_act
, arg2
, 0);
3994 ret
= get_errno(do_sigaction(arg1
, pact
, &oact
));
3995 if (!is_error(ret
) && arg3
) {
3996 if (!lock_user_struct(VERIFY_WRITE
, old_act
, arg3
, 0))
3998 old_act
->_sa_handler
= oact
._sa_handler
;
3999 old_act
->sa_mask
= oact
.sa_mask
.sig
[0];
4000 old_act
->sa_flags
= oact
.sa_flags
;
4001 old_act
->sa_restorer
= oact
.sa_restorer
;
4002 unlock_user_struct(old_act
, arg3
, 1);
4005 struct target_sigaction act
, oact
, *pact
, *old_act
;
4008 if (!lock_user_struct(VERIFY_READ
, old_act
, arg2
, 1))
4010 act
._sa_handler
= old_act
->_sa_handler
;
4011 target_siginitset(&act
.sa_mask
, old_act
->sa_mask
.sig
[0]);
4012 act
.sa_flags
= old_act
->sa_flags
;
4013 unlock_user_struct(old_act
, arg2
, 0);
4019 ret
= get_errno(do_sigaction(arg1
, pact
, &oact
));
4021 if (!is_error(ret
) && arg3
) {
4022 if (!lock_user_struct(VERIFY_WRITE
, old_act
, arg3
, 0))
4024 old_act
->_sa_handler
= oact
._sa_handler
;
4025 old_act
->sa_flags
= oact
.sa_flags
;
4026 old_act
->sa_mask
.sig
[0] = oact
.sa_mask
.sig
[0];
4027 old_act
->sa_mask
.sig
[1] = 0;
4028 old_act
->sa_mask
.sig
[2] = 0;
4029 old_act
->sa_mask
.sig
[3] = 0;
4030 unlock_user_struct(old_act
, arg3
, 1);
4036 case TARGET_NR_rt_sigaction
:
4038 struct target_sigaction
*act
;
4039 struct target_sigaction
*oact
;
4042 if (!lock_user_struct(VERIFY_READ
, act
, arg2
, 1))
4047 if (!lock_user_struct(VERIFY_WRITE
, oact
, arg3
, 0)) {
4048 ret
= -TARGET_EFAULT
;
4049 goto rt_sigaction_fail
;
4053 ret
= get_errno(do_sigaction(arg1
, act
, oact
));
4056 unlock_user_struct(act
, arg2
, 0);
4058 unlock_user_struct(oact
, arg3
, 1);
4061 #ifdef TARGET_NR_sgetmask /* not on alpha */
4062 case TARGET_NR_sgetmask
:
4065 abi_ulong target_set
;
4066 sigprocmask(0, NULL
, &cur_set
);
4067 host_to_target_old_sigset(&target_set
, &cur_set
);
4072 #ifdef TARGET_NR_ssetmask /* not on alpha */
4073 case TARGET_NR_ssetmask
:
4075 sigset_t set
, oset
, cur_set
;
4076 abi_ulong target_set
= arg1
;
4077 sigprocmask(0, NULL
, &cur_set
);
4078 target_to_host_old_sigset(&set
, &target_set
);
4079 sigorset(&set
, &set
, &cur_set
);
4080 sigprocmask(SIG_SETMASK
, &set
, &oset
);
4081 host_to_target_old_sigset(&target_set
, &oset
);
4086 #ifdef TARGET_NR_sigprocmask
4087 case TARGET_NR_sigprocmask
:
4090 sigset_t set
, oldset
, *set_ptr
;
4094 case TARGET_SIG_BLOCK
:
4097 case TARGET_SIG_UNBLOCK
:
4100 case TARGET_SIG_SETMASK
:
4104 ret
= -TARGET_EINVAL
;
4107 if (!(p
= lock_user(VERIFY_READ
, arg2
, sizeof(target_sigset_t
), 1)))
4109 target_to_host_old_sigset(&set
, p
);
4110 unlock_user(p
, arg2
, 0);
4116 ret
= get_errno(sigprocmask(arg1
, set_ptr
, &oldset
));
4117 if (!is_error(ret
) && arg3
) {
4118 if (!(p
= lock_user(VERIFY_WRITE
, arg3
, sizeof(target_sigset_t
), 0)))
4120 host_to_target_old_sigset(p
, &oldset
);
4121 unlock_user(p
, arg3
, sizeof(target_sigset_t
));
4126 case TARGET_NR_rt_sigprocmask
:
4129 sigset_t set
, oldset
, *set_ptr
;
4133 case TARGET_SIG_BLOCK
:
4136 case TARGET_SIG_UNBLOCK
:
4139 case TARGET_SIG_SETMASK
:
4143 ret
= -TARGET_EINVAL
;
4146 if (!(p
= lock_user(VERIFY_READ
, arg2
, sizeof(target_sigset_t
), 1)))
4148 target_to_host_sigset(&set
, p
);
4149 unlock_user(p
, arg2
, 0);
4155 ret
= get_errno(sigprocmask(how
, set_ptr
, &oldset
));
4156 if (!is_error(ret
) && arg3
) {
4157 if (!(p
= lock_user(VERIFY_WRITE
, arg3
, sizeof(target_sigset_t
), 0)))
4159 host_to_target_sigset(p
, &oldset
);
4160 unlock_user(p
, arg3
, sizeof(target_sigset_t
));
4164 #ifdef TARGET_NR_sigpending
4165 case TARGET_NR_sigpending
:
4168 ret
= get_errno(sigpending(&set
));
4169 if (!is_error(ret
)) {
4170 if (!(p
= lock_user(VERIFY_WRITE
, arg1
, sizeof(target_sigset_t
), 0)))
4172 host_to_target_old_sigset(p
, &set
);
4173 unlock_user(p
, arg1
, sizeof(target_sigset_t
));
4178 case TARGET_NR_rt_sigpending
:
4181 ret
= get_errno(sigpending(&set
));
4182 if (!is_error(ret
)) {
4183 if (!(p
= lock_user(VERIFY_WRITE
, arg1
, sizeof(target_sigset_t
), 0)))
4185 host_to_target_sigset(p
, &set
);
4186 unlock_user(p
, arg1
, sizeof(target_sigset_t
));
4190 #ifdef TARGET_NR_sigsuspend
4191 case TARGET_NR_sigsuspend
:
4194 if (!(p
= lock_user(VERIFY_READ
, arg1
, sizeof(target_sigset_t
), 1)))
4196 target_to_host_old_sigset(&set
, p
);
4197 unlock_user(p
, arg1
, 0);
4198 ret
= get_errno(sigsuspend(&set
));
4202 case TARGET_NR_rt_sigsuspend
:
4205 if (!(p
= lock_user(VERIFY_READ
, arg1
, sizeof(target_sigset_t
), 1)))
4207 target_to_host_sigset(&set
, p
);
4208 unlock_user(p
, arg1
, 0);
4209 ret
= get_errno(sigsuspend(&set
));
4212 case TARGET_NR_rt_sigtimedwait
:
4215 struct timespec uts
, *puts
;
4218 if (!(p
= lock_user(VERIFY_READ
, arg1
, sizeof(target_sigset_t
), 1)))
4220 target_to_host_sigset(&set
, p
);
4221 unlock_user(p
, arg1
, 0);
4224 target_to_host_timespec(puts
, arg3
);
4228 ret
= get_errno(sigtimedwait(&set
, &uinfo
, puts
));
4229 if (!is_error(ret
) && arg2
) {
4230 if (!(p
= lock_user(VERIFY_WRITE
, arg2
, sizeof(target_siginfo_t
), 0)))
4232 host_to_target_siginfo(p
, &uinfo
);
4233 unlock_user(p
, arg2
, sizeof(target_siginfo_t
));
4237 case TARGET_NR_rt_sigqueueinfo
:
4240 if (!(p
= lock_user(VERIFY_READ
, arg3
, sizeof(target_sigset_t
), 1)))
4242 target_to_host_siginfo(&uinfo
, p
);
4243 unlock_user(p
, arg1
, 0);
4244 ret
= get_errno(sys_rt_sigqueueinfo(arg1
, arg2
, &uinfo
));
4247 #ifdef TARGET_NR_sigreturn
4248 case TARGET_NR_sigreturn
:
4249 /* NOTE: ret is eax, so not transcoding must be done */
4250 ret
= do_sigreturn(cpu_env
);
4253 case TARGET_NR_rt_sigreturn
:
4254 /* NOTE: ret is eax, so not transcoding must be done */
4255 ret
= do_rt_sigreturn(cpu_env
);
4257 case TARGET_NR_sethostname
:
4258 if (!(p
= lock_user_string(arg1
)))
4260 ret
= get_errno(sethostname(p
, arg2
));
4261 unlock_user(p
, arg1
, 0);
4263 case TARGET_NR_setrlimit
:
4265 /* XXX: convert resource ? */
4266 int resource
= arg1
;
4267 struct target_rlimit
*target_rlim
;
4269 if (!lock_user_struct(VERIFY_READ
, target_rlim
, arg2
, 1))
4271 rlim
.rlim_cur
= tswapl(target_rlim
->rlim_cur
);
4272 rlim
.rlim_max
= tswapl(target_rlim
->rlim_max
);
4273 unlock_user_struct(target_rlim
, arg2
, 0);
4274 ret
= get_errno(setrlimit(resource
, &rlim
));
4277 case TARGET_NR_getrlimit
:
4279 /* XXX: convert resource ? */
4280 int resource
= arg1
;
4281 struct target_rlimit
*target_rlim
;
4284 ret
= get_errno(getrlimit(resource
, &rlim
));
4285 if (!is_error(ret
)) {
4286 if (!lock_user_struct(VERIFY_WRITE
, target_rlim
, arg2
, 0))
4288 rlim
.rlim_cur
= tswapl(target_rlim
->rlim_cur
);
4289 rlim
.rlim_max
= tswapl(target_rlim
->rlim_max
);
4290 unlock_user_struct(target_rlim
, arg2
, 1);
4294 case TARGET_NR_getrusage
:
4296 struct rusage rusage
;
4297 ret
= get_errno(getrusage(arg1
, &rusage
));
4298 if (!is_error(ret
)) {
4299 host_to_target_rusage(arg2
, &rusage
);
4303 case TARGET_NR_gettimeofday
:
4306 ret
= get_errno(gettimeofday(&tv
, NULL
));
4307 if (!is_error(ret
)) {
4308 if (copy_to_user_timeval(arg1
, &tv
))
4313 case TARGET_NR_settimeofday
:
4316 if (copy_from_user_timeval(&tv
, arg1
))
4318 ret
= get_errno(settimeofday(&tv
, NULL
));
4321 #ifdef TARGET_NR_select
4322 case TARGET_NR_select
:
4324 struct target_sel_arg_struct
*sel
;
4325 abi_ulong inp
, outp
, exp
, tvp
;
4328 if (!lock_user_struct(VERIFY_READ
, sel
, arg1
, 1))
4330 nsel
= tswapl(sel
->n
);
4331 inp
= tswapl(sel
->inp
);
4332 outp
= tswapl(sel
->outp
);
4333 exp
= tswapl(sel
->exp
);
4334 tvp
= tswapl(sel
->tvp
);
4335 unlock_user_struct(sel
, arg1
, 0);
4336 ret
= do_select(nsel
, inp
, outp
, exp
, tvp
);
4340 case TARGET_NR_symlink
:
4343 p
= lock_user_string(arg1
);
4344 p2
= lock_user_string(arg2
);
4346 ret
= -TARGET_EFAULT
;
4348 ret
= get_errno(symlink(p
, p2
));
4349 unlock_user(p2
, arg2
, 0);
4350 unlock_user(p
, arg1
, 0);
4353 #if defined(TARGET_NR_symlinkat) && defined(__NR_symlinkat)
4354 case TARGET_NR_symlinkat
:
4357 p
= lock_user_string(arg1
);
4358 p2
= lock_user_string(arg3
);
4360 ret
= -TARGET_EFAULT
;
4362 ret
= get_errno(sys_symlinkat(p
, arg2
, p2
));
4363 unlock_user(p2
, arg3
, 0);
4364 unlock_user(p
, arg1
, 0);
4368 #ifdef TARGET_NR_oldlstat
4369 case TARGET_NR_oldlstat
:
4372 case TARGET_NR_readlink
:
4375 p
= lock_user_string(arg1
);
4376 p2
= lock_user(VERIFY_WRITE
, arg2
, arg3
, 0);
4378 ret
= -TARGET_EFAULT
;
4380 ret
= get_errno(readlink(path(p
), p2
, arg3
));
4381 unlock_user(p2
, arg2
, ret
);
4382 unlock_user(p
, arg1
, 0);
4385 #if defined(TARGET_NR_readlinkat) && defined(__NR_readlinkat)
4386 case TARGET_NR_readlinkat
:
4389 p
= lock_user_string(arg2
);
4390 p2
= lock_user(VERIFY_WRITE
, arg3
, arg4
, 0);
4392 ret
= -TARGET_EFAULT
;
4394 ret
= get_errno(sys_readlinkat(arg1
, path(p
), p2
, arg4
));
4395 unlock_user(p2
, arg3
, ret
);
4396 unlock_user(p
, arg2
, 0);
4400 #ifdef TARGET_NR_uselib
4401 case TARGET_NR_uselib
:
4404 #ifdef TARGET_NR_swapon
4405 case TARGET_NR_swapon
:
4406 if (!(p
= lock_user_string(arg1
)))
4408 ret
= get_errno(swapon(p
, arg2
));
4409 unlock_user(p
, arg1
, 0);
4412 case TARGET_NR_reboot
:
4414 #ifdef TARGET_NR_readdir
4415 case TARGET_NR_readdir
:
4418 #ifdef TARGET_NR_mmap
4419 case TARGET_NR_mmap
:
4420 #if (defined(TARGET_I386) && defined(TARGET_ABI32)) || defined(TARGET_ARM) || defined(TARGET_M68K) || defined(TARGET_CRIS)
4423 abi_ulong v1
, v2
, v3
, v4
, v5
, v6
;
4424 if (!(v
= lock_user(VERIFY_READ
, arg1
, 6 * sizeof(abi_ulong
), 1)))
4432 unlock_user(v
, arg1
, 0);
4433 ret
= get_errno(target_mmap(v1
, v2
, v3
,
4434 target_to_host_bitmask(v4
, mmap_flags_tbl
),
4438 ret
= get_errno(target_mmap(arg1
, arg2
, arg3
,
4439 target_to_host_bitmask(arg4
, mmap_flags_tbl
),
4445 #ifdef TARGET_NR_mmap2
4446 case TARGET_NR_mmap2
:
4448 #define MMAP_SHIFT 12
4450 ret
= get_errno(target_mmap(arg1
, arg2
, arg3
,
4451 target_to_host_bitmask(arg4
, mmap_flags_tbl
),
4453 arg6
<< MMAP_SHIFT
));
4456 case TARGET_NR_munmap
:
4457 ret
= get_errno(target_munmap(arg1
, arg2
));
4459 case TARGET_NR_mprotect
:
4460 ret
= get_errno(target_mprotect(arg1
, arg2
, arg3
));
4462 #ifdef TARGET_NR_mremap
4463 case TARGET_NR_mremap
:
4464 ret
= get_errno(target_mremap(arg1
, arg2
, arg3
, arg4
, arg5
));
4467 /* ??? msync/mlock/munlock are broken for softmmu. */
4468 #ifdef TARGET_NR_msync
4469 case TARGET_NR_msync
:
4470 ret
= get_errno(msync(g2h(arg1
), arg2
, arg3
));
4473 #ifdef TARGET_NR_mlock
4474 case TARGET_NR_mlock
:
4475 ret
= get_errno(mlock(g2h(arg1
), arg2
));
4478 #ifdef TARGET_NR_munlock
4479 case TARGET_NR_munlock
:
4480 ret
= get_errno(munlock(g2h(arg1
), arg2
));
4483 #ifdef TARGET_NR_mlockall
4484 case TARGET_NR_mlockall
:
4485 ret
= get_errno(mlockall(arg1
));
4488 #ifdef TARGET_NR_munlockall
4489 case TARGET_NR_munlockall
:
4490 ret
= get_errno(munlockall());
4493 case TARGET_NR_truncate
:
4494 if (!(p
= lock_user_string(arg1
)))
4496 ret
= get_errno(truncate(p
, arg2
));
4497 unlock_user(p
, arg1
, 0);
4499 case TARGET_NR_ftruncate
:
4500 ret
= get_errno(ftruncate(arg1
, arg2
));
4502 case TARGET_NR_fchmod
:
4503 ret
= get_errno(fchmod(arg1
, arg2
));
4505 #if defined(TARGET_NR_fchmodat) && defined(__NR_fchmodat)
4506 case TARGET_NR_fchmodat
:
4507 if (!(p
= lock_user_string(arg2
)))
4509 ret
= get_errno(sys_fchmodat(arg1
, p
, arg3
, arg4
));
4510 unlock_user(p
, arg2
, 0);
4513 case TARGET_NR_getpriority
:
4514 /* libc does special remapping of the return value of
4515 * sys_getpriority() so it's just easiest to call
4516 * sys_getpriority() directly rather than through libc. */
4517 ret
= sys_getpriority(arg1
, arg2
);
4519 case TARGET_NR_setpriority
:
4520 ret
= get_errno(setpriority(arg1
, arg2
, arg3
));
4522 #ifdef TARGET_NR_profil
4523 case TARGET_NR_profil
:
4526 case TARGET_NR_statfs
:
4527 if (!(p
= lock_user_string(arg1
)))
4529 ret
= get_errno(statfs(path(p
), &stfs
));
4530 unlock_user(p
, arg1
, 0);
4532 if (!is_error(ret
)) {
4533 struct target_statfs
*target_stfs
;
4535 if (!lock_user_struct(VERIFY_WRITE
, target_stfs
, arg2
, 0))
4537 __put_user(stfs
.f_type
, &target_stfs
->f_type
);
4538 __put_user(stfs
.f_bsize
, &target_stfs
->f_bsize
);
4539 __put_user(stfs
.f_blocks
, &target_stfs
->f_blocks
);
4540 __put_user(stfs
.f_bfree
, &target_stfs
->f_bfree
);
4541 __put_user(stfs
.f_bavail
, &target_stfs
->f_bavail
);
4542 __put_user(stfs
.f_files
, &target_stfs
->f_files
);
4543 __put_user(stfs
.f_ffree
, &target_stfs
->f_ffree
);
4544 __put_user(stfs
.f_fsid
.__val
[0], &target_stfs
->f_fsid
.val
[0]);
4545 __put_user(stfs
.f_fsid
.__val
[1], &target_stfs
->f_fsid
.val
[1]);
4546 __put_user(stfs
.f_namelen
, &target_stfs
->f_namelen
);
4547 unlock_user_struct(target_stfs
, arg2
, 1);
4550 case TARGET_NR_fstatfs
:
4551 ret
= get_errno(fstatfs(arg1
, &stfs
));
4552 goto convert_statfs
;
4553 #ifdef TARGET_NR_statfs64
4554 case TARGET_NR_statfs64
:
4555 if (!(p
= lock_user_string(arg1
)))
4557 ret
= get_errno(statfs(path(p
), &stfs
));
4558 unlock_user(p
, arg1
, 0);
4560 if (!is_error(ret
)) {
4561 struct target_statfs64
*target_stfs
;
4563 if (!lock_user_struct(VERIFY_WRITE
, target_stfs
, arg3
, 0))
4565 __put_user(stfs
.f_type
, &target_stfs
->f_type
);
4566 __put_user(stfs
.f_bsize
, &target_stfs
->f_bsize
);
4567 __put_user(stfs
.f_blocks
, &target_stfs
->f_blocks
);
4568 __put_user(stfs
.f_bfree
, &target_stfs
->f_bfree
);
4569 __put_user(stfs
.f_bavail
, &target_stfs
->f_bavail
);
4570 __put_user(stfs
.f_files
, &target_stfs
->f_files
);
4571 __put_user(stfs
.f_ffree
, &target_stfs
->f_ffree
);
4572 __put_user(stfs
.f_fsid
.__val
[0], &target_stfs
->f_fsid
.val
[0]);
4573 __put_user(stfs
.f_fsid
.__val
[1], &target_stfs
->f_fsid
.val
[1]);
4574 __put_user(stfs
.f_namelen
, &target_stfs
->f_namelen
);
4575 unlock_user_struct(target_stfs
, arg3
, 1);
4578 case TARGET_NR_fstatfs64
:
4579 ret
= get_errno(fstatfs(arg1
, &stfs
));
4580 goto convert_statfs64
;
4582 #ifdef TARGET_NR_ioperm
4583 case TARGET_NR_ioperm
:
4586 #ifdef TARGET_NR_socketcall
4587 case TARGET_NR_socketcall
:
4588 ret
= do_socketcall(arg1
, arg2
);
4591 #ifdef TARGET_NR_accept
4592 case TARGET_NR_accept
:
4593 ret
= do_accept(arg1
, arg2
, arg3
);
4596 #ifdef TARGET_NR_bind
4597 case TARGET_NR_bind
:
4598 ret
= do_bind(arg1
, arg2
, arg3
);
4601 #ifdef TARGET_NR_connect
4602 case TARGET_NR_connect
:
4603 ret
= do_connect(arg1
, arg2
, arg3
);
4606 #ifdef TARGET_NR_getpeername
4607 case TARGET_NR_getpeername
:
4608 ret
= do_getpeername(arg1
, arg2
, arg3
);
4611 #ifdef TARGET_NR_getsockname
4612 case TARGET_NR_getsockname
:
4613 ret
= do_getsockname(arg1
, arg2
, arg3
);
4616 #ifdef TARGET_NR_getsockopt
4617 case TARGET_NR_getsockopt
:
4618 ret
= do_getsockopt(arg1
, arg2
, arg3
, arg4
, arg5
);
4621 #ifdef TARGET_NR_listen
4622 case TARGET_NR_listen
:
4623 ret
= get_errno(listen(arg1
, arg2
));
4626 #ifdef TARGET_NR_recv
4627 case TARGET_NR_recv
:
4628 ret
= do_recvfrom(arg1
, arg2
, arg3
, arg4
, 0, 0);
4631 #ifdef TARGET_NR_recvfrom
4632 case TARGET_NR_recvfrom
:
4633 ret
= do_recvfrom(arg1
, arg2
, arg3
, arg4
, arg5
, arg6
);
4636 #ifdef TARGET_NR_recvmsg
4637 case TARGET_NR_recvmsg
:
4638 ret
= do_sendrecvmsg(arg1
, arg2
, arg3
, 0);
4641 #ifdef TARGET_NR_send
4642 case TARGET_NR_send
:
4643 ret
= do_sendto(arg1
, arg2
, arg3
, arg4
, 0, 0);
4646 #ifdef TARGET_NR_sendmsg
4647 case TARGET_NR_sendmsg
:
4648 ret
= do_sendrecvmsg(arg1
, arg2
, arg3
, 1);
4651 #ifdef TARGET_NR_sendto
4652 case TARGET_NR_sendto
:
4653 ret
= do_sendto(arg1
, arg2
, arg3
, arg4
, arg5
, arg6
);
4656 #ifdef TARGET_NR_shutdown
4657 case TARGET_NR_shutdown
:
4658 ret
= get_errno(shutdown(arg1
, arg2
));
4661 #ifdef TARGET_NR_socket
4662 case TARGET_NR_socket
:
4663 ret
= do_socket(arg1
, arg2
, arg3
);
4666 #ifdef TARGET_NR_socketpair
4667 case TARGET_NR_socketpair
:
4668 ret
= do_socketpair(arg1
, arg2
, arg3
, arg4
);
4671 #ifdef TARGET_NR_setsockopt
4672 case TARGET_NR_setsockopt
:
4673 ret
= do_setsockopt(arg1
, arg2
, arg3
, arg4
, (socklen_t
) arg5
);
4677 case TARGET_NR_syslog
:
4678 if (!(p
= lock_user_string(arg2
)))
4680 ret
= get_errno(sys_syslog((int)arg1
, p
, (int)arg3
));
4681 unlock_user(p
, arg2
, 0);
4684 case TARGET_NR_setitimer
:
4686 struct itimerval value
, ovalue
, *pvalue
;
4690 if (copy_from_user_timeval(&pvalue
->it_interval
, arg2
)
4691 || copy_from_user_timeval(&pvalue
->it_value
,
4692 arg2
+ sizeof(struct target_timeval
)))
4697 ret
= get_errno(setitimer(arg1
, pvalue
, &ovalue
));
4698 if (!is_error(ret
) && arg3
) {
4699 if (copy_to_user_timeval(arg3
,
4700 &ovalue
.it_interval
)
4701 || copy_to_user_timeval(arg3
+ sizeof(struct target_timeval
),
4707 case TARGET_NR_getitimer
:
4709 struct itimerval value
;
4711 ret
= get_errno(getitimer(arg1
, &value
));
4712 if (!is_error(ret
) && arg2
) {
4713 if (copy_to_user_timeval(arg2
,
4715 || copy_to_user_timeval(arg2
+ sizeof(struct target_timeval
),
4721 case TARGET_NR_stat
:
4722 if (!(p
= lock_user_string(arg1
)))
4724 ret
= get_errno(stat(path(p
), &st
));
4725 unlock_user(p
, arg1
, 0);
4727 case TARGET_NR_lstat
:
4728 if (!(p
= lock_user_string(arg1
)))
4730 ret
= get_errno(lstat(path(p
), &st
));
4731 unlock_user(p
, arg1
, 0);
4733 case TARGET_NR_fstat
:
4735 ret
= get_errno(fstat(arg1
, &st
));
4737 if (!is_error(ret
)) {
4738 struct target_stat
*target_st
;
4740 if (!lock_user_struct(VERIFY_WRITE
, target_st
, arg2
, 0))
4742 __put_user(st
.st_dev
, &target_st
->st_dev
);
4743 __put_user(st
.st_ino
, &target_st
->st_ino
);
4744 __put_user(st
.st_mode
, &target_st
->st_mode
);
4745 __put_user(st
.st_uid
, &target_st
->st_uid
);
4746 __put_user(st
.st_gid
, &target_st
->st_gid
);
4747 __put_user(st
.st_nlink
, &target_st
->st_nlink
);
4748 __put_user(st
.st_rdev
, &target_st
->st_rdev
);
4749 __put_user(st
.st_size
, &target_st
->st_size
);
4750 __put_user(st
.st_blksize
, &target_st
->st_blksize
);
4751 __put_user(st
.st_blocks
, &target_st
->st_blocks
);
4752 __put_user(st
.st_atime
, &target_st
->target_st_atime
);
4753 __put_user(st
.st_mtime
, &target_st
->target_st_mtime
);
4754 __put_user(st
.st_ctime
, &target_st
->target_st_ctime
);
4755 unlock_user_struct(target_st
, arg2
, 1);
4759 #ifdef TARGET_NR_olduname
4760 case TARGET_NR_olduname
:
4763 #ifdef TARGET_NR_iopl
4764 case TARGET_NR_iopl
:
4767 case TARGET_NR_vhangup
:
4768 ret
= get_errno(vhangup());
4770 #ifdef TARGET_NR_idle
4771 case TARGET_NR_idle
:
4774 #ifdef TARGET_NR_syscall
4775 case TARGET_NR_syscall
:
4776 ret
= do_syscall(cpu_env
,arg1
& 0xffff,arg2
,arg3
,arg4
,arg5
,arg6
,0);
4779 case TARGET_NR_wait4
:
4782 abi_long status_ptr
= arg2
;
4783 struct rusage rusage
, *rusage_ptr
;
4784 abi_ulong target_rusage
= arg4
;
4786 rusage_ptr
= &rusage
;
4789 ret
= get_errno(wait4(arg1
, &status
, arg3
, rusage_ptr
));
4790 if (!is_error(ret
)) {
4792 if (put_user_s32(status
, status_ptr
))
4796 host_to_target_rusage(target_rusage
, &rusage
);
4800 #ifdef TARGET_NR_swapoff
4801 case TARGET_NR_swapoff
:
4802 if (!(p
= lock_user_string(arg1
)))
4804 ret
= get_errno(swapoff(p
));
4805 unlock_user(p
, arg1
, 0);
4808 case TARGET_NR_sysinfo
:
4810 struct target_sysinfo
*target_value
;
4811 struct sysinfo value
;
4812 ret
= get_errno(sysinfo(&value
));
4813 if (!is_error(ret
) && arg1
)
4815 if (!lock_user_struct(VERIFY_WRITE
, target_value
, arg1
, 0))
4817 __put_user(value
.uptime
, &target_value
->uptime
);
4818 __put_user(value
.loads
[0], &target_value
->loads
[0]);
4819 __put_user(value
.loads
[1], &target_value
->loads
[1]);
4820 __put_user(value
.loads
[2], &target_value
->loads
[2]);
4821 __put_user(value
.totalram
, &target_value
->totalram
);
4822 __put_user(value
.freeram
, &target_value
->freeram
);
4823 __put_user(value
.sharedram
, &target_value
->sharedram
);
4824 __put_user(value
.bufferram
, &target_value
->bufferram
);
4825 __put_user(value
.totalswap
, &target_value
->totalswap
);
4826 __put_user(value
.freeswap
, &target_value
->freeswap
);
4827 __put_user(value
.procs
, &target_value
->procs
);
4828 __put_user(value
.totalhigh
, &target_value
->totalhigh
);
4829 __put_user(value
.freehigh
, &target_value
->freehigh
);
4830 __put_user(value
.mem_unit
, &target_value
->mem_unit
);
4831 unlock_user_struct(target_value
, arg1
, 1);
4835 #ifdef TARGET_NR_ipc
4837 ret
= do_ipc(arg1
, arg2
, arg3
, arg4
, arg5
, arg6
);
4841 #ifdef TARGET_NR_msgctl
4842 case TARGET_NR_msgctl
:
4843 ret
= do_msgctl(arg1
, arg2
, arg3
);
4846 #ifdef TARGET_NR_msgget
4847 case TARGET_NR_msgget
:
4848 ret
= get_errno(msgget(arg1
, arg2
));
4851 #ifdef TARGET_NR_msgrcv
4852 case TARGET_NR_msgrcv
:
4853 ret
= do_msgrcv(arg1
, arg2
, arg3
, arg4
, arg5
);
4856 #ifdef TARGET_NR_msgsnd
4857 case TARGET_NR_msgsnd
:
4858 ret
= do_msgsnd(arg1
, arg2
, arg3
, arg4
);
4861 case TARGET_NR_fsync
:
4862 ret
= get_errno(fsync(arg1
));
4864 case TARGET_NR_clone
:
4865 #if defined(TARGET_SH4)
4866 ret
= get_errno(do_fork(cpu_env
, arg1
, arg2
, arg3
, arg5
, arg4
));
4868 ret
= get_errno(do_fork(cpu_env
, arg1
, arg2
, arg3
, arg4
, arg5
));
4871 #ifdef __NR_exit_group
4872 /* new thread calls */
4873 case TARGET_NR_exit_group
:
4877 gdb_exit(cpu_env
, arg1
);
4878 ret
= get_errno(exit_group(arg1
));
4881 case TARGET_NR_setdomainname
:
4882 if (!(p
= lock_user_string(arg1
)))
4884 ret
= get_errno(setdomainname(p
, arg2
));
4885 unlock_user(p
, arg1
, 0);
4887 case TARGET_NR_uname
:
4888 /* no need to transcode because we use the linux syscall */
4890 struct new_utsname
* buf
;
4892 if (!lock_user_struct(VERIFY_WRITE
, buf
, arg1
, 0))
4894 ret
= get_errno(sys_uname(buf
));
4895 if (!is_error(ret
)) {
4896 /* Overrite the native machine name with whatever is being
4898 strcpy (buf
->machine
, UNAME_MACHINE
);
4899 /* Allow the user to override the reported release. */
4900 if (qemu_uname_release
&& *qemu_uname_release
)
4901 strcpy (buf
->release
, qemu_uname_release
);
4903 unlock_user_struct(buf
, arg1
, 1);
4907 case TARGET_NR_modify_ldt
:
4908 ret
= do_modify_ldt(cpu_env
, arg1
, arg2
, arg3
);
4910 #if !defined(TARGET_X86_64)
4911 case TARGET_NR_vm86old
:
4913 case TARGET_NR_vm86
:
4914 ret
= do_vm86(cpu_env
, arg1
, arg2
);
4918 case TARGET_NR_adjtimex
:
4920 #ifdef TARGET_NR_create_module
4921 case TARGET_NR_create_module
:
4923 case TARGET_NR_init_module
:
4924 case TARGET_NR_delete_module
:
4925 #ifdef TARGET_NR_get_kernel_syms
4926 case TARGET_NR_get_kernel_syms
:
4929 case TARGET_NR_quotactl
:
4931 case TARGET_NR_getpgid
:
4932 ret
= get_errno(getpgid(arg1
));
4934 case TARGET_NR_fchdir
:
4935 ret
= get_errno(fchdir(arg1
));
4937 #ifdef TARGET_NR_bdflush /* not on x86_64 */
4938 case TARGET_NR_bdflush
:
4941 #ifdef TARGET_NR_sysfs
4942 case TARGET_NR_sysfs
:
4945 case TARGET_NR_personality
:
4946 ret
= get_errno(personality(arg1
));
4948 #ifdef TARGET_NR_afs_syscall
4949 case TARGET_NR_afs_syscall
:
4952 #ifdef TARGET_NR__llseek /* Not on alpha */
4953 case TARGET_NR__llseek
:
4955 #if defined (__x86_64__)
4956 ret
= get_errno(lseek(arg1
, ((uint64_t )arg2
<< 32) | arg3
, arg5
));
4957 if (put_user_s64(ret
, arg4
))
4961 ret
= get_errno(_llseek(arg1
, arg2
, arg3
, &res
, arg5
));
4962 if (put_user_s64(res
, arg4
))
4968 case TARGET_NR_getdents
:
4969 #if TARGET_ABI_BITS != 32
4971 #elif TARGET_ABI_BITS == 32 && HOST_LONG_BITS == 64
4973 struct target_dirent
*target_dirp
;
4974 struct linux_dirent
*dirp
;
4975 abi_long count
= arg3
;
4977 dirp
= malloc(count
);
4979 ret
= -TARGET_ENOMEM
;
4983 ret
= get_errno(sys_getdents(arg1
, dirp
, count
));
4984 if (!is_error(ret
)) {
4985 struct linux_dirent
*de
;
4986 struct target_dirent
*tde
;
4988 int reclen
, treclen
;
4989 int count1
, tnamelen
;
4993 if (!(target_dirp
= lock_user(VERIFY_WRITE
, arg2
, count
, 0)))
4997 reclen
= de
->d_reclen
;
4998 treclen
= reclen
- (2 * (sizeof(long) - sizeof(abi_long
)));
4999 tde
->d_reclen
= tswap16(treclen
);
5000 tde
->d_ino
= tswapl(de
->d_ino
);
5001 tde
->d_off
= tswapl(de
->d_off
);
5002 tnamelen
= treclen
- (2 * sizeof(abi_long
) + 2);
5005 /* XXX: may not be correct */
5006 pstrcpy(tde
->d_name
, tnamelen
, de
->d_name
);
5007 de
= (struct linux_dirent
*)((char *)de
+ reclen
);
5009 tde
= (struct target_dirent
*)((char *)tde
+ treclen
);
5013 unlock_user(target_dirp
, arg2
, ret
);
5019 struct linux_dirent
*dirp
;
5020 abi_long count
= arg3
;
5022 if (!(dirp
= lock_user(VERIFY_WRITE
, arg2
, count
, 0)))
5024 ret
= get_errno(sys_getdents(arg1
, dirp
, count
));
5025 if (!is_error(ret
)) {
5026 struct linux_dirent
*de
;
5031 reclen
= de
->d_reclen
;
5034 de
->d_reclen
= tswap16(reclen
);
5035 tswapls(&de
->d_ino
);
5036 tswapls(&de
->d_off
);
5037 de
= (struct linux_dirent
*)((char *)de
+ reclen
);
5041 unlock_user(dirp
, arg2
, ret
);
5045 #if defined(TARGET_NR_getdents64) && defined(__NR_getdents64)
5046 case TARGET_NR_getdents64
:
5048 struct linux_dirent64
*dirp
;
5049 abi_long count
= arg3
;
5050 if (!(dirp
= lock_user(VERIFY_WRITE
, arg2
, count
, 0)))
5052 ret
= get_errno(sys_getdents64(arg1
, dirp
, count
));
5053 if (!is_error(ret
)) {
5054 struct linux_dirent64
*de
;
5059 reclen
= de
->d_reclen
;
5062 de
->d_reclen
= tswap16(reclen
);
5063 tswap64s((uint64_t *)&de
->d_ino
);
5064 tswap64s((uint64_t *)&de
->d_off
);
5065 de
= (struct linux_dirent64
*)((char *)de
+ reclen
);
5069 unlock_user(dirp
, arg2
, ret
);
5072 #endif /* TARGET_NR_getdents64 */
5073 #ifdef TARGET_NR__newselect
5074 case TARGET_NR__newselect
:
5075 ret
= do_select(arg1
, arg2
, arg3
, arg4
, arg5
);
5078 #ifdef TARGET_NR_poll
5079 case TARGET_NR_poll
:
5081 struct target_pollfd
*target_pfd
;
5082 unsigned int nfds
= arg2
;
5087 target_pfd
= lock_user(VERIFY_WRITE
, arg1
, sizeof(struct target_pollfd
) * nfds
, 1);
5090 pfd
= alloca(sizeof(struct pollfd
) * nfds
);
5091 for(i
= 0; i
< nfds
; i
++) {
5092 pfd
[i
].fd
= tswap32(target_pfd
[i
].fd
);
5093 pfd
[i
].events
= tswap16(target_pfd
[i
].events
);
5095 ret
= get_errno(poll(pfd
, nfds
, timeout
));
5096 if (!is_error(ret
)) {
5097 for(i
= 0; i
< nfds
; i
++) {
5098 target_pfd
[i
].revents
= tswap16(pfd
[i
].revents
);
5100 ret
+= nfds
* (sizeof(struct target_pollfd
)
5101 - sizeof(struct pollfd
));
5103 unlock_user(target_pfd
, arg1
, ret
);
5107 case TARGET_NR_flock
:
5108 /* NOTE: the flock constant seems to be the same for every
5110 ret
= get_errno(flock(arg1
, arg2
));
5112 case TARGET_NR_readv
:
5117 vec
= alloca(count
* sizeof(struct iovec
));
5118 if (lock_iovec(VERIFY_WRITE
, vec
, arg2
, count
, 0) < 0)
5120 ret
= get_errno(readv(arg1
, vec
, count
));
5121 unlock_iovec(vec
, arg2
, count
, 1);
5124 case TARGET_NR_writev
:
5129 vec
= alloca(count
* sizeof(struct iovec
));
5130 if (lock_iovec(VERIFY_READ
, vec
, arg2
, count
, 1) < 0)
5132 ret
= get_errno(writev(arg1
, vec
, count
));
5133 unlock_iovec(vec
, arg2
, count
, 0);
5136 case TARGET_NR_getsid
:
5137 ret
= get_errno(getsid(arg1
));
5139 #if defined(TARGET_NR_fdatasync) /* Not on alpha (osf_datasync ?) */
5140 case TARGET_NR_fdatasync
:
5141 ret
= get_errno(fdatasync(arg1
));
5144 case TARGET_NR__sysctl
:
5145 /* We don't implement this, but ENOTDIR is always a safe
5147 ret
= -TARGET_ENOTDIR
;
5149 case TARGET_NR_sched_setparam
:
5151 struct sched_param
*target_schp
;
5152 struct sched_param schp
;
5154 if (!lock_user_struct(VERIFY_READ
, target_schp
, arg2
, 1))
5156 schp
.sched_priority
= tswap32(target_schp
->sched_priority
);
5157 unlock_user_struct(target_schp
, arg2
, 0);
5158 ret
= get_errno(sched_setparam(arg1
, &schp
));
5161 case TARGET_NR_sched_getparam
:
5163 struct sched_param
*target_schp
;
5164 struct sched_param schp
;
5165 ret
= get_errno(sched_getparam(arg1
, &schp
));
5166 if (!is_error(ret
)) {
5167 if (!lock_user_struct(VERIFY_WRITE
, target_schp
, arg2
, 0))
5169 target_schp
->sched_priority
= tswap32(schp
.sched_priority
);
5170 unlock_user_struct(target_schp
, arg2
, 1);
5174 case TARGET_NR_sched_setscheduler
:
5176 struct sched_param
*target_schp
;
5177 struct sched_param schp
;
5178 if (!lock_user_struct(VERIFY_READ
, target_schp
, arg3
, 1))
5180 schp
.sched_priority
= tswap32(target_schp
->sched_priority
);
5181 unlock_user_struct(target_schp
, arg3
, 0);
5182 ret
= get_errno(sched_setscheduler(arg1
, arg2
, &schp
));
5185 case TARGET_NR_sched_getscheduler
:
5186 ret
= get_errno(sched_getscheduler(arg1
));
5188 case TARGET_NR_sched_yield
:
5189 ret
= get_errno(sched_yield());
5191 case TARGET_NR_sched_get_priority_max
:
5192 ret
= get_errno(sched_get_priority_max(arg1
));
5194 case TARGET_NR_sched_get_priority_min
:
5195 ret
= get_errno(sched_get_priority_min(arg1
));
5197 case TARGET_NR_sched_rr_get_interval
:
5200 ret
= get_errno(sched_rr_get_interval(arg1
, &ts
));
5201 if (!is_error(ret
)) {
5202 host_to_target_timespec(arg2
, &ts
);
5206 case TARGET_NR_nanosleep
:
5208 struct timespec req
, rem
;
5209 target_to_host_timespec(&req
, arg1
);
5210 ret
= get_errno(nanosleep(&req
, &rem
));
5211 if (is_error(ret
) && arg2
) {
5212 host_to_target_timespec(arg2
, &rem
);
5216 #ifdef TARGET_NR_query_module
5217 case TARGET_NR_query_module
:
5220 #ifdef TARGET_NR_nfsservctl
5221 case TARGET_NR_nfsservctl
:
5224 case TARGET_NR_prctl
:
5227 case PR_GET_PDEATHSIG
:
5230 ret
= get_errno(prctl(arg1
, &deathsig
, arg3
, arg4
, arg5
));
5231 if (!is_error(ret
) && arg2
5232 && put_user_ual(deathsig
, arg2
))
5237 ret
= get_errno(prctl(arg1
, arg2
, arg3
, arg4
, arg5
));
5241 #ifdef TARGET_NR_arch_prctl
5242 case TARGET_NR_arch_prctl
:
5243 #if defined(TARGET_I386) && !defined(TARGET_ABI32)
5244 ret
= do_arch_prctl(cpu_env
, arg1
, arg2
);
5250 #ifdef TARGET_NR_pread
5251 case TARGET_NR_pread
:
5253 if (((CPUARMState
*)cpu_env
)->eabi
)
5256 if (!(p
= lock_user(VERIFY_WRITE
, arg2
, arg3
, 0)))
5258 ret
= get_errno(pread(arg1
, p
, arg3
, arg4
));
5259 unlock_user(p
, arg2
, ret
);
5261 case TARGET_NR_pwrite
:
5263 if (((CPUARMState
*)cpu_env
)->eabi
)
5266 if (!(p
= lock_user(VERIFY_READ
, arg2
, arg3
, 1)))
5268 ret
= get_errno(pwrite(arg1
, p
, arg3
, arg4
));
5269 unlock_user(p
, arg2
, 0);
5272 #ifdef TARGET_NR_pread64
5273 case TARGET_NR_pread64
:
5274 if (!(p
= lock_user(VERIFY_WRITE
, arg2
, arg3
, 0)))
5276 ret
= get_errno(pread64(arg1
, p
, arg3
, target_offset64(arg4
, arg5
)));
5277 unlock_user(p
, arg2
, ret
);
5279 case TARGET_NR_pwrite64
:
5280 if (!(p
= lock_user(VERIFY_READ
, arg2
, arg3
, 1)))
5282 ret
= get_errno(pwrite64(arg1
, p
, arg3
, target_offset64(arg4
, arg5
)));
5283 unlock_user(p
, arg2
, 0);
5286 case TARGET_NR_getcwd
:
5287 if (!(p
= lock_user(VERIFY_WRITE
, arg1
, arg2
, 0)))
5289 ret
= get_errno(sys_getcwd1(p
, arg2
));
5290 unlock_user(p
, arg1
, ret
);
5292 case TARGET_NR_capget
:
5294 case TARGET_NR_capset
:
5296 case TARGET_NR_sigaltstack
:
5297 #if defined(TARGET_I386) || defined(TARGET_ARM) || defined(TARGET_MIPS) || \
5298 defined(TARGET_SPARC) || defined(TARGET_PPC) || defined(TARGET_ALPHA)
5299 ret
= do_sigaltstack(arg1
, arg2
, get_sp_from_cpustate((CPUState
*)cpu_env
));
5304 case TARGET_NR_sendfile
:
5306 #ifdef TARGET_NR_getpmsg
5307 case TARGET_NR_getpmsg
:
5310 #ifdef TARGET_NR_putpmsg
5311 case TARGET_NR_putpmsg
:
5314 #ifdef TARGET_NR_vfork
5315 case TARGET_NR_vfork
:
5316 ret
= get_errno(do_fork(cpu_env
, CLONE_VFORK
| CLONE_VM
| SIGCHLD
,
5320 #ifdef TARGET_NR_ugetrlimit
5321 case TARGET_NR_ugetrlimit
:
5324 ret
= get_errno(getrlimit(arg1
, &rlim
));
5325 if (!is_error(ret
)) {
5326 struct target_rlimit
*target_rlim
;
5327 if (!lock_user_struct(VERIFY_WRITE
, target_rlim
, arg2
, 0))
5329 target_rlim
->rlim_cur
= tswapl(rlim
.rlim_cur
);
5330 target_rlim
->rlim_max
= tswapl(rlim
.rlim_max
);
5331 unlock_user_struct(target_rlim
, arg2
, 1);
5336 #ifdef TARGET_NR_truncate64
5337 case TARGET_NR_truncate64
:
5338 if (!(p
= lock_user_string(arg1
)))
5340 ret
= target_truncate64(cpu_env
, p
, arg2
, arg3
, arg4
);
5341 unlock_user(p
, arg1
, 0);
5344 #ifdef TARGET_NR_ftruncate64
5345 case TARGET_NR_ftruncate64
:
5346 ret
= target_ftruncate64(cpu_env
, arg1
, arg2
, arg3
, arg4
);
5349 #ifdef TARGET_NR_stat64
5350 case TARGET_NR_stat64
:
5351 if (!(p
= lock_user_string(arg1
)))
5353 ret
= get_errno(stat(path(p
), &st
));
5354 unlock_user(p
, arg1
, 0);
5356 ret
= host_to_target_stat64(cpu_env
, arg2
, &st
);
5359 #ifdef TARGET_NR_lstat64
5360 case TARGET_NR_lstat64
:
5361 if (!(p
= lock_user_string(arg1
)))
5363 ret
= get_errno(lstat(path(p
), &st
));
5364 unlock_user(p
, arg1
, 0);
5366 ret
= host_to_target_stat64(cpu_env
, arg2
, &st
);
5369 #ifdef TARGET_NR_fstat64
5370 case TARGET_NR_fstat64
:
5371 ret
= get_errno(fstat(arg1
, &st
));
5373 ret
= host_to_target_stat64(cpu_env
, arg2
, &st
);
5376 #if defined(TARGET_NR_fstatat64) && defined(__NR_fstatat64)
5377 case TARGET_NR_fstatat64
:
5378 if (!(p
= lock_user_string(arg2
)))
5380 ret
= get_errno(sys_fstatat64(arg1
, path(p
), &st
, arg4
));
5382 ret
= host_to_target_stat64(cpu_env
, arg3
, &st
);
5386 case TARGET_NR_lchown
:
5387 if (!(p
= lock_user_string(arg1
)))
5389 ret
= get_errno(lchown(p
, low2highuid(arg2
), low2highgid(arg3
)));
5390 unlock_user(p
, arg1
, 0);
5392 case TARGET_NR_getuid
:
5393 ret
= get_errno(high2lowuid(getuid()));
5395 case TARGET_NR_getgid
:
5396 ret
= get_errno(high2lowgid(getgid()));
5398 case TARGET_NR_geteuid
:
5399 ret
= get_errno(high2lowuid(geteuid()));
5401 case TARGET_NR_getegid
:
5402 ret
= get_errno(high2lowgid(getegid()));
5404 case TARGET_NR_setreuid
:
5405 ret
= get_errno(setreuid(low2highuid(arg1
), low2highuid(arg2
)));
5407 case TARGET_NR_setregid
:
5408 ret
= get_errno(setregid(low2highgid(arg1
), low2highgid(arg2
)));
5410 case TARGET_NR_getgroups
:
5412 int gidsetsize
= arg1
;
5413 uint16_t *target_grouplist
;
5417 grouplist
= alloca(gidsetsize
* sizeof(gid_t
));
5418 ret
= get_errno(getgroups(gidsetsize
, grouplist
));
5419 if (gidsetsize
== 0)
5421 if (!is_error(ret
)) {
5422 target_grouplist
= lock_user(VERIFY_WRITE
, arg2
, gidsetsize
* 2, 0);
5423 if (!target_grouplist
)
5425 for(i
= 0;i
< ret
; i
++)
5426 target_grouplist
[i
] = tswap16(grouplist
[i
]);
5427 unlock_user(target_grouplist
, arg2
, gidsetsize
* 2);
5431 case TARGET_NR_setgroups
:
5433 int gidsetsize
= arg1
;
5434 uint16_t *target_grouplist
;
5438 grouplist
= alloca(gidsetsize
* sizeof(gid_t
));
5439 target_grouplist
= lock_user(VERIFY_READ
, arg2
, gidsetsize
* 2, 1);
5440 if (!target_grouplist
) {
5441 ret
= -TARGET_EFAULT
;
5444 for(i
= 0;i
< gidsetsize
; i
++)
5445 grouplist
[i
] = tswap16(target_grouplist
[i
]);
5446 unlock_user(target_grouplist
, arg2
, 0);
5447 ret
= get_errno(setgroups(gidsetsize
, grouplist
));
5450 case TARGET_NR_fchown
:
5451 ret
= get_errno(fchown(arg1
, low2highuid(arg2
), low2highgid(arg3
)));
5453 #if defined(TARGET_NR_fchownat) && defined(__NR_fchownat)
5454 case TARGET_NR_fchownat
:
5455 if (!(p
= lock_user_string(arg2
)))
5457 ret
= get_errno(sys_fchownat(arg1
, p
, low2highuid(arg3
), low2highgid(arg4
), arg5
));
5458 unlock_user(p
, arg2
, 0);
5461 #ifdef TARGET_NR_setresuid
5462 case TARGET_NR_setresuid
:
5463 ret
= get_errno(setresuid(low2highuid(arg1
),
5465 low2highuid(arg3
)));
5468 #ifdef TARGET_NR_getresuid
5469 case TARGET_NR_getresuid
:
5471 uid_t ruid
, euid
, suid
;
5472 ret
= get_errno(getresuid(&ruid
, &euid
, &suid
));
5473 if (!is_error(ret
)) {
5474 if (put_user_u16(high2lowuid(ruid
), arg1
)
5475 || put_user_u16(high2lowuid(euid
), arg2
)
5476 || put_user_u16(high2lowuid(suid
), arg3
))
5482 #ifdef TARGET_NR_getresgid
5483 case TARGET_NR_setresgid
:
5484 ret
= get_errno(setresgid(low2highgid(arg1
),
5486 low2highgid(arg3
)));
5489 #ifdef TARGET_NR_getresgid
5490 case TARGET_NR_getresgid
:
5492 gid_t rgid
, egid
, sgid
;
5493 ret
= get_errno(getresgid(&rgid
, &egid
, &sgid
));
5494 if (!is_error(ret
)) {
5495 if (put_user_u16(high2lowgid(rgid
), arg1
)
5496 || put_user_u16(high2lowgid(egid
), arg2
)
5497 || put_user_u16(high2lowgid(sgid
), arg3
))
5503 case TARGET_NR_chown
:
5504 if (!(p
= lock_user_string(arg1
)))
5506 ret
= get_errno(chown(p
, low2highuid(arg2
), low2highgid(arg3
)));
5507 unlock_user(p
, arg1
, 0);
5509 case TARGET_NR_setuid
:
5510 ret
= get_errno(setuid(low2highuid(arg1
)));
5512 case TARGET_NR_setgid
:
5513 ret
= get_errno(setgid(low2highgid(arg1
)));
5515 case TARGET_NR_setfsuid
:
5516 ret
= get_errno(setfsuid(arg1
));
5518 case TARGET_NR_setfsgid
:
5519 ret
= get_errno(setfsgid(arg1
));
5521 #endif /* USE_UID16 */
5523 #ifdef TARGET_NR_lchown32
5524 case TARGET_NR_lchown32
:
5525 if (!(p
= lock_user_string(arg1
)))
5527 ret
= get_errno(lchown(p
, arg2
, arg3
));
5528 unlock_user(p
, arg1
, 0);
5531 #ifdef TARGET_NR_getuid32
5532 case TARGET_NR_getuid32
:
5533 ret
= get_errno(getuid());
5537 #if defined(TARGET_NR_getxuid) && defined(TARGET_ALPHA)
5538 /* Alpha specific */
5539 case TARGET_NR_getxuid
:
5543 ((CPUAlphaState
*)cpu_env
)->ir
[IR_A4
]=euid
;
5545 ret
= get_errno(getuid());
5548 #if defined(TARGET_NR_getxgid) && defined(TARGET_ALPHA)
5549 /* Alpha specific */
5550 case TARGET_NR_getxgid
:
5554 ((CPUAlphaState
*)cpu_env
)->ir
[IR_A4
]=egid
;
5556 ret
= get_errno(getgid());
5560 #ifdef TARGET_NR_getgid32
5561 case TARGET_NR_getgid32
:
5562 ret
= get_errno(getgid());
5565 #ifdef TARGET_NR_geteuid32
5566 case TARGET_NR_geteuid32
:
5567 ret
= get_errno(geteuid());
5570 #ifdef TARGET_NR_getegid32
5571 case TARGET_NR_getegid32
:
5572 ret
= get_errno(getegid());
5575 #ifdef TARGET_NR_setreuid32
5576 case TARGET_NR_setreuid32
:
5577 ret
= get_errno(setreuid(arg1
, arg2
));
5580 #ifdef TARGET_NR_setregid32
5581 case TARGET_NR_setregid32
:
5582 ret
= get_errno(setregid(arg1
, arg2
));
5585 #ifdef TARGET_NR_getgroups32
5586 case TARGET_NR_getgroups32
:
5588 int gidsetsize
= arg1
;
5589 uint32_t *target_grouplist
;
5593 grouplist
= alloca(gidsetsize
* sizeof(gid_t
));
5594 ret
= get_errno(getgroups(gidsetsize
, grouplist
));
5595 if (gidsetsize
== 0)
5597 if (!is_error(ret
)) {
5598 target_grouplist
= lock_user(VERIFY_WRITE
, arg2
, gidsetsize
* 4, 0);
5599 if (!target_grouplist
) {
5600 ret
= -TARGET_EFAULT
;
5603 for(i
= 0;i
< ret
; i
++)
5604 target_grouplist
[i
] = tswap32(grouplist
[i
]);
5605 unlock_user(target_grouplist
, arg2
, gidsetsize
* 4);
5610 #ifdef TARGET_NR_setgroups32
5611 case TARGET_NR_setgroups32
:
5613 int gidsetsize
= arg1
;
5614 uint32_t *target_grouplist
;
5618 grouplist
= alloca(gidsetsize
* sizeof(gid_t
));
5619 target_grouplist
= lock_user(VERIFY_READ
, arg2
, gidsetsize
* 4, 1);
5620 if (!target_grouplist
) {
5621 ret
= -TARGET_EFAULT
;
5624 for(i
= 0;i
< gidsetsize
; i
++)
5625 grouplist
[i
] = tswap32(target_grouplist
[i
]);
5626 unlock_user(target_grouplist
, arg2
, 0);
5627 ret
= get_errno(setgroups(gidsetsize
, grouplist
));
5631 #ifdef TARGET_NR_fchown32
5632 case TARGET_NR_fchown32
:
5633 ret
= get_errno(fchown(arg1
, arg2
, arg3
));
5636 #ifdef TARGET_NR_setresuid32
5637 case TARGET_NR_setresuid32
:
5638 ret
= get_errno(setresuid(arg1
, arg2
, arg3
));
5641 #ifdef TARGET_NR_getresuid32
5642 case TARGET_NR_getresuid32
:
5644 uid_t ruid
, euid
, suid
;
5645 ret
= get_errno(getresuid(&ruid
, &euid
, &suid
));
5646 if (!is_error(ret
)) {
5647 if (put_user_u32(ruid
, arg1
)
5648 || put_user_u32(euid
, arg2
)
5649 || put_user_u32(suid
, arg3
))
5655 #ifdef TARGET_NR_setresgid32
5656 case TARGET_NR_setresgid32
:
5657 ret
= get_errno(setresgid(arg1
, arg2
, arg3
));
5660 #ifdef TARGET_NR_getresgid32
5661 case TARGET_NR_getresgid32
:
5663 gid_t rgid
, egid
, sgid
;
5664 ret
= get_errno(getresgid(&rgid
, &egid
, &sgid
));
5665 if (!is_error(ret
)) {
5666 if (put_user_u32(rgid
, arg1
)
5667 || put_user_u32(egid
, arg2
)
5668 || put_user_u32(sgid
, arg3
))
5674 #ifdef TARGET_NR_chown32
5675 case TARGET_NR_chown32
:
5676 if (!(p
= lock_user_string(arg1
)))
5678 ret
= get_errno(chown(p
, arg2
, arg3
));
5679 unlock_user(p
, arg1
, 0);
5682 #ifdef TARGET_NR_setuid32
5683 case TARGET_NR_setuid32
:
5684 ret
= get_errno(setuid(arg1
));
5687 #ifdef TARGET_NR_setgid32
5688 case TARGET_NR_setgid32
:
5689 ret
= get_errno(setgid(arg1
));
5692 #ifdef TARGET_NR_setfsuid32
5693 case TARGET_NR_setfsuid32
:
5694 ret
= get_errno(setfsuid(arg1
));
5697 #ifdef TARGET_NR_setfsgid32
5698 case TARGET_NR_setfsgid32
:
5699 ret
= get_errno(setfsgid(arg1
));
5703 case TARGET_NR_pivot_root
:
5705 #ifdef TARGET_NR_mincore
5706 case TARGET_NR_mincore
:
5709 ret
= -TARGET_EFAULT
;
5710 if (!(a
= lock_user(VERIFY_READ
, arg1
,arg2
, 0)))
5712 if (!(p
= lock_user_string(arg3
)))
5714 ret
= get_errno(mincore(a
, arg2
, p
));
5715 unlock_user(p
, arg3
, ret
);
5717 unlock_user(a
, arg1
, 0);
5721 #ifdef TARGET_NR_arm_fadvise64_64
5722 case TARGET_NR_arm_fadvise64_64
:
5725 * arm_fadvise64_64 looks like fadvise64_64 but
5726 * with different argument order
5734 #if defined(TARGET_NR_fadvise64_64) || defined(TARGET_NR_arm_fadvise64_64)
5735 #ifdef TARGET_NR_fadvise64_64
5736 case TARGET_NR_fadvise64_64
:
5738 /* This is a hint, so ignoring and returning success is ok. */
5742 #ifdef TARGET_NR_madvise
5743 case TARGET_NR_madvise
:
5744 /* A straight passthrough may not be safe because qemu sometimes
5745 turns private flie-backed mappings into anonymous mappings.
5746 This will break MADV_DONTNEED.
5747 This is a hint, so ignoring and returning success is ok. */
5751 #if TARGET_ABI_BITS == 32
5752 case TARGET_NR_fcntl64
:
5756 struct target_flock64
*target_fl
;
5758 struct target_eabi_flock64
*target_efl
;
5762 case TARGET_F_GETLK64
:
5765 case TARGET_F_SETLK64
:
5768 case TARGET_F_SETLKW64
:
5777 case TARGET_F_GETLK64
:
5779 if (((CPUARMState
*)cpu_env
)->eabi
) {
5780 if (!lock_user_struct(VERIFY_READ
, target_efl
, arg3
, 1))
5782 fl
.l_type
= tswap16(target_efl
->l_type
);
5783 fl
.l_whence
= tswap16(target_efl
->l_whence
);
5784 fl
.l_start
= tswap64(target_efl
->l_start
);
5785 fl
.l_len
= tswap64(target_efl
->l_len
);
5786 fl
.l_pid
= tswapl(target_efl
->l_pid
);
5787 unlock_user_struct(target_efl
, arg3
, 0);
5791 if (!lock_user_struct(VERIFY_READ
, target_fl
, arg3
, 1))
5793 fl
.l_type
= tswap16(target_fl
->l_type
);
5794 fl
.l_whence
= tswap16(target_fl
->l_whence
);
5795 fl
.l_start
= tswap64(target_fl
->l_start
);
5796 fl
.l_len
= tswap64(target_fl
->l_len
);
5797 fl
.l_pid
= tswapl(target_fl
->l_pid
);
5798 unlock_user_struct(target_fl
, arg3
, 0);
5800 ret
= get_errno(fcntl(arg1
, cmd
, &fl
));
5803 if (((CPUARMState
*)cpu_env
)->eabi
) {
5804 if (!lock_user_struct(VERIFY_WRITE
, target_efl
, arg3
, 0))
5806 target_efl
->l_type
= tswap16(fl
.l_type
);
5807 target_efl
->l_whence
= tswap16(fl
.l_whence
);
5808 target_efl
->l_start
= tswap64(fl
.l_start
);
5809 target_efl
->l_len
= tswap64(fl
.l_len
);
5810 target_efl
->l_pid
= tswapl(fl
.l_pid
);
5811 unlock_user_struct(target_efl
, arg3
, 1);
5815 if (!lock_user_struct(VERIFY_WRITE
, target_fl
, arg3
, 0))
5817 target_fl
->l_type
= tswap16(fl
.l_type
);
5818 target_fl
->l_whence
= tswap16(fl
.l_whence
);
5819 target_fl
->l_start
= tswap64(fl
.l_start
);
5820 target_fl
->l_len
= tswap64(fl
.l_len
);
5821 target_fl
->l_pid
= tswapl(fl
.l_pid
);
5822 unlock_user_struct(target_fl
, arg3
, 1);
5827 case TARGET_F_SETLK64
:
5828 case TARGET_F_SETLKW64
:
5830 if (((CPUARMState
*)cpu_env
)->eabi
) {
5831 if (!lock_user_struct(VERIFY_READ
, target_efl
, arg3
, 1))
5833 fl
.l_type
= tswap16(target_efl
->l_type
);
5834 fl
.l_whence
= tswap16(target_efl
->l_whence
);
5835 fl
.l_start
= tswap64(target_efl
->l_start
);
5836 fl
.l_len
= tswap64(target_efl
->l_len
);
5837 fl
.l_pid
= tswapl(target_efl
->l_pid
);
5838 unlock_user_struct(target_efl
, arg3
, 0);
5842 if (!lock_user_struct(VERIFY_READ
, target_fl
, arg3
, 1))
5844 fl
.l_type
= tswap16(target_fl
->l_type
);
5845 fl
.l_whence
= tswap16(target_fl
->l_whence
);
5846 fl
.l_start
= tswap64(target_fl
->l_start
);
5847 fl
.l_len
= tswap64(target_fl
->l_len
);
5848 fl
.l_pid
= tswapl(target_fl
->l_pid
);
5849 unlock_user_struct(target_fl
, arg3
, 0);
5851 ret
= get_errno(fcntl(arg1
, cmd
, &fl
));
5854 ret
= do_fcntl(arg1
, cmd
, arg3
);
5860 #ifdef TARGET_NR_cacheflush
5861 case TARGET_NR_cacheflush
:
5862 /* self-modifying code is handled automatically, so nothing needed */
5866 #ifdef TARGET_NR_security
5867 case TARGET_NR_security
:
5870 #ifdef TARGET_NR_getpagesize
5871 case TARGET_NR_getpagesize
:
5872 ret
= TARGET_PAGE_SIZE
;
5875 case TARGET_NR_gettid
:
5876 ret
= get_errno(gettid());
5878 #ifdef TARGET_NR_readahead
5879 case TARGET_NR_readahead
:
5880 #if TARGET_ABI_BITS == 32
5882 if (((CPUARMState
*)cpu_env
)->eabi
)
5889 ret
= get_errno(readahead(arg1
, ((off64_t
)arg3
<< 32) | arg2
, arg4
));
5891 ret
= get_errno(readahead(arg1
, arg2
, arg3
));
5895 #ifdef TARGET_NR_setxattr
5896 case TARGET_NR_setxattr
:
5897 case TARGET_NR_lsetxattr
:
5898 case TARGET_NR_fsetxattr
:
5899 case TARGET_NR_getxattr
:
5900 case TARGET_NR_lgetxattr
:
5901 case TARGET_NR_fgetxattr
:
5902 case TARGET_NR_listxattr
:
5903 case TARGET_NR_llistxattr
:
5904 case TARGET_NR_flistxattr
:
5905 case TARGET_NR_removexattr
:
5906 case TARGET_NR_lremovexattr
:
5907 case TARGET_NR_fremovexattr
:
5908 goto unimplemented_nowarn
;
5910 #ifdef TARGET_NR_set_thread_area
5911 case TARGET_NR_set_thread_area
:
5912 #if defined(TARGET_MIPS)
5913 ((CPUMIPSState
*) cpu_env
)->tls_value
= arg1
;
5916 #elif defined(TARGET_I386) && defined(TARGET_ABI32)
5917 ret
= do_set_thread_area(cpu_env
, arg1
);
5920 goto unimplemented_nowarn
;
5923 #ifdef TARGET_NR_get_thread_area
5924 case TARGET_NR_get_thread_area
:
5925 #if defined(TARGET_I386) && defined(TARGET_ABI32)
5926 ret
= do_get_thread_area(cpu_env
, arg1
);
5928 goto unimplemented_nowarn
;
5931 #ifdef TARGET_NR_getdomainname
5932 case TARGET_NR_getdomainname
:
5933 goto unimplemented_nowarn
;
5936 #ifdef TARGET_NR_clock_gettime
5937 case TARGET_NR_clock_gettime
:
5940 ret
= get_errno(clock_gettime(arg1
, &ts
));
5941 if (!is_error(ret
)) {
5942 host_to_target_timespec(arg2
, &ts
);
5947 #ifdef TARGET_NR_clock_getres
5948 case TARGET_NR_clock_getres
:
5951 ret
= get_errno(clock_getres(arg1
, &ts
));
5952 if (!is_error(ret
)) {
5953 host_to_target_timespec(arg2
, &ts
);
5958 #ifdef TARGET_NR_clock_nanosleep
5959 case TARGET_NR_clock_nanosleep
:
5962 target_to_host_timespec(&ts
, arg3
);
5963 ret
= get_errno(clock_nanosleep(arg1
, arg2
, &ts
, arg4
? &ts
: NULL
));
5965 host_to_target_timespec(arg4
, &ts
);
5970 #if defined(TARGET_NR_set_tid_address) && defined(__NR_set_tid_address)
5971 case TARGET_NR_set_tid_address
:
5972 ret
= get_errno(set_tid_address((int *)g2h(arg1
)));
5976 #if defined(TARGET_NR_tkill) && defined(__NR_tkill)
5977 case TARGET_NR_tkill
:
5978 ret
= get_errno(sys_tkill((int)arg1
, target_to_host_signal(arg2
)));
5982 #if defined(TARGET_NR_tgkill) && defined(__NR_tgkill)
5983 case TARGET_NR_tgkill
:
5984 ret
= get_errno(sys_tgkill((int)arg1
, (int)arg2
,
5985 target_to_host_signal(arg3
)));
5989 #ifdef TARGET_NR_set_robust_list
5990 case TARGET_NR_set_robust_list
:
5991 goto unimplemented_nowarn
;
5994 #if defined(TARGET_NR_utimensat) && defined(__NR_utimensat)
5995 case TARGET_NR_utimensat
:
5997 struct timespec ts
[2];
5998 target_to_host_timespec(ts
, arg3
);
5999 target_to_host_timespec(ts
+1, arg3
+sizeof(struct target_timespec
));
6001 ret
= get_errno(sys_utimensat(arg1
, NULL
, ts
, arg4
));
6003 if (!(p
= lock_user_string(arg2
))) {
6004 ret
= -TARGET_EFAULT
;
6007 ret
= get_errno(sys_utimensat(arg1
, path(p
), ts
, arg4
));
6008 unlock_user(p
, arg2
, 0);
6013 #if defined(USE_NPTL)
6014 case TARGET_NR_futex
:
6015 ret
= do_futex(arg1
, arg2
, arg3
, arg4
, arg5
, arg6
);
6018 #ifdef TARGET_NR_inotify_init
6019 case TARGET_NR_inotify_init
:
6020 ret
= get_errno(sys_inotify_init());
6023 #ifdef TARGET_NR_inotify_add_watch
6024 case TARGET_NR_inotify_add_watch
:
6025 p
= lock_user_string(arg2
);
6026 ret
= get_errno(sys_inotify_add_watch(arg1
, path(p
), arg3
));
6027 unlock_user(p
, arg2
, 0);
6030 #ifdef TARGET_NR_inotify_rm_watch
6031 case TARGET_NR_inotify_rm_watch
:
6032 ret
= get_errno(sys_inotify_rm_watch(arg1
, arg2
));
6038 gemu_log("qemu: Unsupported syscall: %d\n", num
);
6039 #if defined(TARGET_NR_setxattr) || defined(TARGET_NR_get_thread_area) || defined(TARGET_NR_getdomainname) || defined(TARGET_NR_set_robust_list)
6040 unimplemented_nowarn
:
6042 ret
= -TARGET_ENOSYS
;
6047 gemu_log(" = %ld\n", ret
);
6050 print_syscall_ret(num
, ret
);
6053 ret
= -TARGET_EFAULT
;