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>
58 #define termios host_termios
59 #define winsize host_winsize
60 #define termio host_termio
61 #define sgttyb host_sgttyb /* same as target */
62 #define tchars host_tchars /* same as target */
63 #define ltchars host_ltchars /* same as target */
65 #include <linux/termios.h>
66 #include <linux/unistd.h>
67 #include <linux/utsname.h>
68 #include <linux/cdrom.h>
69 #include <linux/hdreg.h>
70 #include <linux/soundcard.h>
72 #include <linux/mtio.h>
73 #include "linux_loop.h"
76 #include "qemu-common.h"
79 #include <linux/futex.h>
80 #define CLONE_NPTL_FLAGS2 (CLONE_SETTLS | \
81 CLONE_PARENT_SETTID | CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID)
83 /* XXX: Hardcode the above values. */
84 #define CLONE_NPTL_FLAGS2 0
89 #if defined(TARGET_I386) || defined(TARGET_ARM) || defined(TARGET_SPARC) \
90 || defined(TARGET_M68K) || defined(TARGET_SH4) || defined(TARGET_CRIS)
91 /* 16 bit uid wrappers emulation */
95 //#include <linux/msdos_fs.h>
96 #define VFAT_IOCTL_READDIR_BOTH _IOR('r', 1, struct linux_dirent [2])
97 #define VFAT_IOCTL_READDIR_SHORT _IOR('r', 2, struct linux_dirent [2])
108 #define _syscall0(type,name) \
109 static type name (void) \
111 return syscall(__NR_##name); \
114 #define _syscall1(type,name,type1,arg1) \
115 static type name (type1 arg1) \
117 return syscall(__NR_##name, arg1); \
120 #define _syscall2(type,name,type1,arg1,type2,arg2) \
121 static type name (type1 arg1,type2 arg2) \
123 return syscall(__NR_##name, arg1, arg2); \
126 #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \
127 static type name (type1 arg1,type2 arg2,type3 arg3) \
129 return syscall(__NR_##name, arg1, arg2, arg3); \
132 #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
133 static type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4) \
135 return syscall(__NR_##name, arg1, arg2, arg3, arg4); \
138 #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
140 static type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5) \
142 return syscall(__NR_##name, arg1, arg2, arg3, arg4, arg5); \
146 #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
147 type5,arg5,type6,arg6) \
148 static type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5, \
151 return syscall(__NR_##name, arg1, arg2, arg3, arg4, arg5, arg6); \
155 #define __NR_sys_exit __NR_exit
156 #define __NR_sys_uname __NR_uname
157 #define __NR_sys_faccessat __NR_faccessat
158 #define __NR_sys_fchmodat __NR_fchmodat
159 #define __NR_sys_fchownat __NR_fchownat
160 #define __NR_sys_fstatat64 __NR_fstatat64
161 #define __NR_sys_futimesat __NR_futimesat
162 #define __NR_sys_getcwd1 __NR_getcwd
163 #define __NR_sys_getdents __NR_getdents
164 #define __NR_sys_getdents64 __NR_getdents64
165 #define __NR_sys_getpriority __NR_getpriority
166 #define __NR_sys_linkat __NR_linkat
167 #define __NR_sys_mkdirat __NR_mkdirat
168 #define __NR_sys_mknodat __NR_mknodat
169 #define __NR_sys_openat __NR_openat
170 #define __NR_sys_readlinkat __NR_readlinkat
171 #define __NR_sys_renameat __NR_renameat
172 #define __NR_sys_rt_sigqueueinfo __NR_rt_sigqueueinfo
173 #define __NR_sys_symlinkat __NR_symlinkat
174 #define __NR_sys_syslog __NR_syslog
175 #define __NR_sys_tgkill __NR_tgkill
176 #define __NR_sys_tkill __NR_tkill
177 #define __NR_sys_unlinkat __NR_unlinkat
178 #define __NR_sys_utimensat __NR_utimensat
179 #define __NR_sys_futex __NR_futex
180 #define __NR_sys_inotify_init __NR_inotify_init
181 #define __NR_sys_inotify_add_watch __NR_inotify_add_watch
182 #define __NR_sys_inotify_rm_watch __NR_inotify_rm_watch
184 #if defined(__alpha__) || defined (__ia64__) || defined(__x86_64__)
185 #define __NR__llseek __NR_lseek
189 _syscall0(int, gettid
)
191 /* This is a replacement for the host gettid() and must return a host
193 static int gettid(void) {
197 _syscall1(int,sys_exit
,int,status
)
198 _syscall1(int,sys_uname
,struct new_utsname
*,buf
)
199 #if defined(TARGET_NR_faccessat) && defined(__NR_faccessat)
200 _syscall4(int,sys_faccessat
,int,dirfd
,const char *,pathname
,int,mode
,int,flags
)
202 #if defined(TARGET_NR_fchmodat) && defined(__NR_fchmodat)
203 _syscall4(int,sys_fchmodat
,int,dirfd
,const char *,pathname
,
204 mode_t
,mode
,int,flags
)
206 #if defined(TARGET_NR_fchownat) && defined(__NR_fchownat) && defined(USE_UID16)
207 _syscall5(int,sys_fchownat
,int,dirfd
,const char *,pathname
,
208 uid_t
,owner
,gid_t
,group
,int,flags
)
210 #if defined(TARGET_NR_fstatat64) && defined(__NR_fstatat64)
211 _syscall4(int,sys_fstatat64
,int,dirfd
,const char *,pathname
,
212 struct stat
*,buf
,int,flags
)
214 #if defined(TARGET_NR_futimesat) && defined(__NR_futimesat)
215 _syscall3(int,sys_futimesat
,int,dirfd
,const char *,pathname
,
216 const struct timeval
*,times
)
218 _syscall2(int,sys_getcwd1
,char *,buf
,size_t,size
)
219 #if TARGET_ABI_BITS == 32
220 _syscall3(int, sys_getdents
, uint
, fd
, struct linux_dirent
*, dirp
, uint
, count
);
222 #if defined(TARGET_NR_getdents64) && defined(__NR_getdents64)
223 _syscall3(int, sys_getdents64
, uint
, fd
, struct linux_dirent64
*, dirp
, uint
, count
);
225 _syscall2(int, sys_getpriority
, int, which
, int, who
);
226 #if !defined (__x86_64__)
227 _syscall5(int, _llseek
, uint
, fd
, ulong
, hi
, ulong
, lo
,
228 loff_t
*, res
, uint
, wh
);
230 #if defined(TARGET_NR_linkat) && defined(__NR_linkat)
231 _syscall5(int,sys_linkat
,int,olddirfd
,const char *,oldpath
,
232 int,newdirfd
,const char *,newpath
,int,flags
)
234 #if defined(TARGET_NR_mkdirat) && defined(__NR_mkdirat)
235 _syscall3(int,sys_mkdirat
,int,dirfd
,const char *,pathname
,mode_t
,mode
)
237 #if defined(TARGET_NR_mknodat) && defined(__NR_mknodat)
238 _syscall4(int,sys_mknodat
,int,dirfd
,const char *,pathname
,
239 mode_t
,mode
,dev_t
,dev
)
241 #if defined(TARGET_NR_openat) && defined(__NR_openat)
242 _syscall4(int,sys_openat
,int,dirfd
,const char *,pathname
,int,flags
,mode_t
,mode
)
244 #if defined(TARGET_NR_readlinkat) && defined(__NR_readlinkat)
245 _syscall4(int,sys_readlinkat
,int,dirfd
,const char *,pathname
,
246 char *,buf
,size_t,bufsize
)
248 #if defined(TARGET_NR_renameat) && defined(__NR_renameat)
249 _syscall4(int,sys_renameat
,int,olddirfd
,const char *,oldpath
,
250 int,newdirfd
,const char *,newpath
)
252 _syscall3(int,sys_rt_sigqueueinfo
,int,pid
,int,sig
,siginfo_t
*,uinfo
)
253 #if defined(TARGET_NR_symlinkat) && defined(__NR_symlinkat)
254 _syscall3(int,sys_symlinkat
,const char *,oldpath
,
255 int,newdirfd
,const char *,newpath
)
257 _syscall3(int,sys_syslog
,int,type
,char*,bufp
,int,len
)
258 #if defined(TARGET_NR_tgkill) && defined(__NR_tgkill)
259 _syscall3(int,sys_tgkill
,int,tgid
,int,pid
,int,sig
)
261 #if defined(TARGET_NR_tkill) && defined(__NR_tkill)
262 _syscall2(int,sys_tkill
,int,tid
,int,sig
)
264 #ifdef __NR_exit_group
265 _syscall1(int,exit_group
,int,error_code
)
267 #if defined(TARGET_NR_set_tid_address) && defined(__NR_set_tid_address)
268 _syscall1(int,set_tid_address
,int *,tidptr
)
270 #if defined(TARGET_NR_unlinkat) && defined(__NR_unlinkat)
271 _syscall3(int,sys_unlinkat
,int,dirfd
,const char *,pathname
,int,flags
)
273 #if defined(TARGET_NR_utimensat) && defined(__NR_utimensat)
274 _syscall4(int,sys_utimensat
,int,dirfd
,const char *,pathname
,
275 const struct timespec
*,tsp
,int,flags
)
277 #if defined(TARGET_NR_inotify_init) && defined(__NR_inotify_init)
278 _syscall0(int,sys_inotify_init
)
280 #if defined(TARGET_NR_inotify_add_watch) && defined(__NR_inotify_add_watch)
281 _syscall3(int,sys_inotify_add_watch
,int,fd
,const char *,pathname
,uint32_t,mask
)
283 #if defined(TARGET_NR_inotify_rm_watch) && defined(__NR_inotify_rm_watch)
284 _syscall2(int,sys_inotify_rm_watch
,int,fd
,uint32_t,wd
)
286 #if defined(USE_NPTL)
287 #if defined(TARGET_NR_futex) && defined(__NR_futex)
288 _syscall6(int,sys_futex
,int *,uaddr
,int,op
,int,val
,
289 const struct timespec
*,timeout
,int *,uaddr2
,int,val3
)
293 extern int personality(int);
294 extern int flock(int, int);
295 extern int setfsuid(int);
296 extern int setfsgid(int);
297 extern int setgroups(int, gid_t
*);
299 #define ERRNO_TABLE_SIZE 1200
301 /* target_to_host_errno_table[] is initialized from
302 * host_to_target_errno_table[] in syscall_init(). */
303 static uint16_t target_to_host_errno_table
[ERRNO_TABLE_SIZE
] = {
307 * This list is the union of errno values overridden in asm-<arch>/errno.h
308 * minus the errnos that are not actually generic to all archs.
310 static uint16_t host_to_target_errno_table
[ERRNO_TABLE_SIZE
] = {
311 [EIDRM
] = TARGET_EIDRM
,
312 [ECHRNG
] = TARGET_ECHRNG
,
313 [EL2NSYNC
] = TARGET_EL2NSYNC
,
314 [EL3HLT
] = TARGET_EL3HLT
,
315 [EL3RST
] = TARGET_EL3RST
,
316 [ELNRNG
] = TARGET_ELNRNG
,
317 [EUNATCH
] = TARGET_EUNATCH
,
318 [ENOCSI
] = TARGET_ENOCSI
,
319 [EL2HLT
] = TARGET_EL2HLT
,
320 [EDEADLK
] = TARGET_EDEADLK
,
321 [ENOLCK
] = TARGET_ENOLCK
,
322 [EBADE
] = TARGET_EBADE
,
323 [EBADR
] = TARGET_EBADR
,
324 [EXFULL
] = TARGET_EXFULL
,
325 [ENOANO
] = TARGET_ENOANO
,
326 [EBADRQC
] = TARGET_EBADRQC
,
327 [EBADSLT
] = TARGET_EBADSLT
,
328 [EBFONT
] = TARGET_EBFONT
,
329 [ENOSTR
] = TARGET_ENOSTR
,
330 [ENODATA
] = TARGET_ENODATA
,
331 [ETIME
] = TARGET_ETIME
,
332 [ENOSR
] = TARGET_ENOSR
,
333 [ENONET
] = TARGET_ENONET
,
334 [ENOPKG
] = TARGET_ENOPKG
,
335 [EREMOTE
] = TARGET_EREMOTE
,
336 [ENOLINK
] = TARGET_ENOLINK
,
337 [EADV
] = TARGET_EADV
,
338 [ESRMNT
] = TARGET_ESRMNT
,
339 [ECOMM
] = TARGET_ECOMM
,
340 [EPROTO
] = TARGET_EPROTO
,
341 [EDOTDOT
] = TARGET_EDOTDOT
,
342 [EMULTIHOP
] = TARGET_EMULTIHOP
,
343 [EBADMSG
] = TARGET_EBADMSG
,
344 [ENAMETOOLONG
] = TARGET_ENAMETOOLONG
,
345 [EOVERFLOW
] = TARGET_EOVERFLOW
,
346 [ENOTUNIQ
] = TARGET_ENOTUNIQ
,
347 [EBADFD
] = TARGET_EBADFD
,
348 [EREMCHG
] = TARGET_EREMCHG
,
349 [ELIBACC
] = TARGET_ELIBACC
,
350 [ELIBBAD
] = TARGET_ELIBBAD
,
351 [ELIBSCN
] = TARGET_ELIBSCN
,
352 [ELIBMAX
] = TARGET_ELIBMAX
,
353 [ELIBEXEC
] = TARGET_ELIBEXEC
,
354 [EILSEQ
] = TARGET_EILSEQ
,
355 [ENOSYS
] = TARGET_ENOSYS
,
356 [ELOOP
] = TARGET_ELOOP
,
357 [ERESTART
] = TARGET_ERESTART
,
358 [ESTRPIPE
] = TARGET_ESTRPIPE
,
359 [ENOTEMPTY
] = TARGET_ENOTEMPTY
,
360 [EUSERS
] = TARGET_EUSERS
,
361 [ENOTSOCK
] = TARGET_ENOTSOCK
,
362 [EDESTADDRREQ
] = TARGET_EDESTADDRREQ
,
363 [EMSGSIZE
] = TARGET_EMSGSIZE
,
364 [EPROTOTYPE
] = TARGET_EPROTOTYPE
,
365 [ENOPROTOOPT
] = TARGET_ENOPROTOOPT
,
366 [EPROTONOSUPPORT
] = TARGET_EPROTONOSUPPORT
,
367 [ESOCKTNOSUPPORT
] = TARGET_ESOCKTNOSUPPORT
,
368 [EOPNOTSUPP
] = TARGET_EOPNOTSUPP
,
369 [EPFNOSUPPORT
] = TARGET_EPFNOSUPPORT
,
370 [EAFNOSUPPORT
] = TARGET_EAFNOSUPPORT
,
371 [EADDRINUSE
] = TARGET_EADDRINUSE
,
372 [EADDRNOTAVAIL
] = TARGET_EADDRNOTAVAIL
,
373 [ENETDOWN
] = TARGET_ENETDOWN
,
374 [ENETUNREACH
] = TARGET_ENETUNREACH
,
375 [ENETRESET
] = TARGET_ENETRESET
,
376 [ECONNABORTED
] = TARGET_ECONNABORTED
,
377 [ECONNRESET
] = TARGET_ECONNRESET
,
378 [ENOBUFS
] = TARGET_ENOBUFS
,
379 [EISCONN
] = TARGET_EISCONN
,
380 [ENOTCONN
] = TARGET_ENOTCONN
,
381 [EUCLEAN
] = TARGET_EUCLEAN
,
382 [ENOTNAM
] = TARGET_ENOTNAM
,
383 [ENAVAIL
] = TARGET_ENAVAIL
,
384 [EISNAM
] = TARGET_EISNAM
,
385 [EREMOTEIO
] = TARGET_EREMOTEIO
,
386 [ESHUTDOWN
] = TARGET_ESHUTDOWN
,
387 [ETOOMANYREFS
] = TARGET_ETOOMANYREFS
,
388 [ETIMEDOUT
] = TARGET_ETIMEDOUT
,
389 [ECONNREFUSED
] = TARGET_ECONNREFUSED
,
390 [EHOSTDOWN
] = TARGET_EHOSTDOWN
,
391 [EHOSTUNREACH
] = TARGET_EHOSTUNREACH
,
392 [EALREADY
] = TARGET_EALREADY
,
393 [EINPROGRESS
] = TARGET_EINPROGRESS
,
394 [ESTALE
] = TARGET_ESTALE
,
395 [ECANCELED
] = TARGET_ECANCELED
,
396 [ENOMEDIUM
] = TARGET_ENOMEDIUM
,
397 [EMEDIUMTYPE
] = TARGET_EMEDIUMTYPE
,
399 [ENOKEY
] = TARGET_ENOKEY
,
402 [EKEYEXPIRED
] = TARGET_EKEYEXPIRED
,
405 [EKEYREVOKED
] = TARGET_EKEYREVOKED
,
408 [EKEYREJECTED
] = TARGET_EKEYREJECTED
,
411 [EOWNERDEAD
] = TARGET_EOWNERDEAD
,
413 #ifdef ENOTRECOVERABLE
414 [ENOTRECOVERABLE
] = TARGET_ENOTRECOVERABLE
,
418 static inline int host_to_target_errno(int err
)
420 if(host_to_target_errno_table
[err
])
421 return host_to_target_errno_table
[err
];
425 static inline int target_to_host_errno(int err
)
427 if (target_to_host_errno_table
[err
])
428 return target_to_host_errno_table
[err
];
432 static inline abi_long
get_errno(abi_long ret
)
435 return -host_to_target_errno(errno
);
440 static inline int is_error(abi_long ret
)
442 return (abi_ulong
)ret
>= (abi_ulong
)(-4096);
445 char *target_strerror(int err
)
447 return strerror(target_to_host_errno(err
));
450 static abi_ulong target_brk
;
451 static abi_ulong target_original_brk
;
453 void target_set_brk(abi_ulong new_brk
)
455 target_original_brk
= target_brk
= HOST_PAGE_ALIGN(new_brk
);
458 /* do_brk() must return target values and target errnos. */
459 abi_long
do_brk(abi_ulong new_brk
)
462 abi_long mapped_addr
;
467 if (new_brk
< target_original_brk
)
470 brk_page
= HOST_PAGE_ALIGN(target_brk
);
472 /* If the new brk is less than this, set it and we're done... */
473 if (new_brk
< brk_page
) {
474 target_brk
= new_brk
;
478 /* We need to allocate more memory after the brk... */
479 new_alloc_size
= HOST_PAGE_ALIGN(new_brk
- brk_page
+ 1);
480 mapped_addr
= get_errno(target_mmap(brk_page
, new_alloc_size
,
481 PROT_READ
|PROT_WRITE
,
482 MAP_ANON
|MAP_FIXED
|MAP_PRIVATE
, 0, 0));
484 if (!is_error(mapped_addr
))
485 target_brk
= new_brk
;
490 static inline abi_long
copy_from_user_fdset(fd_set
*fds
,
491 abi_ulong target_fds_addr
,
495 abi_ulong b
, *target_fds
;
497 nw
= (n
+ TARGET_ABI_BITS
- 1) / TARGET_ABI_BITS
;
498 if (!(target_fds
= lock_user(VERIFY_READ
,
500 sizeof(abi_ulong
) * nw
,
502 return -TARGET_EFAULT
;
506 for (i
= 0; i
< nw
; i
++) {
507 /* grab the abi_ulong */
508 __get_user(b
, &target_fds
[i
]);
509 for (j
= 0; j
< TARGET_ABI_BITS
; j
++) {
510 /* check the bit inside the abi_ulong */
517 unlock_user(target_fds
, target_fds_addr
, 0);
522 static inline abi_long
copy_to_user_fdset(abi_ulong target_fds_addr
,
528 abi_ulong
*target_fds
;
530 nw
= (n
+ TARGET_ABI_BITS
- 1) / TARGET_ABI_BITS
;
531 if (!(target_fds
= lock_user(VERIFY_WRITE
,
533 sizeof(abi_ulong
) * nw
,
535 return -TARGET_EFAULT
;
538 for (i
= 0; i
< nw
; i
++) {
540 for (j
= 0; j
< TARGET_ABI_BITS
; j
++) {
541 v
|= ((FD_ISSET(k
, fds
) != 0) << j
);
544 __put_user(v
, &target_fds
[i
]);
547 unlock_user(target_fds
, target_fds_addr
, sizeof(abi_ulong
) * nw
);
552 #if defined(__alpha__)
558 static inline abi_long
host_to_target_clock_t(long ticks
)
560 #if HOST_HZ == TARGET_HZ
563 return ((int64_t)ticks
* TARGET_HZ
) / HOST_HZ
;
567 static inline abi_long
host_to_target_rusage(abi_ulong target_addr
,
568 const struct rusage
*rusage
)
570 struct target_rusage
*target_rusage
;
572 if (!lock_user_struct(VERIFY_WRITE
, target_rusage
, target_addr
, 0))
573 return -TARGET_EFAULT
;
574 target_rusage
->ru_utime
.tv_sec
= tswapl(rusage
->ru_utime
.tv_sec
);
575 target_rusage
->ru_utime
.tv_usec
= tswapl(rusage
->ru_utime
.tv_usec
);
576 target_rusage
->ru_stime
.tv_sec
= tswapl(rusage
->ru_stime
.tv_sec
);
577 target_rusage
->ru_stime
.tv_usec
= tswapl(rusage
->ru_stime
.tv_usec
);
578 target_rusage
->ru_maxrss
= tswapl(rusage
->ru_maxrss
);
579 target_rusage
->ru_ixrss
= tswapl(rusage
->ru_ixrss
);
580 target_rusage
->ru_idrss
= tswapl(rusage
->ru_idrss
);
581 target_rusage
->ru_isrss
= tswapl(rusage
->ru_isrss
);
582 target_rusage
->ru_minflt
= tswapl(rusage
->ru_minflt
);
583 target_rusage
->ru_majflt
= tswapl(rusage
->ru_majflt
);
584 target_rusage
->ru_nswap
= tswapl(rusage
->ru_nswap
);
585 target_rusage
->ru_inblock
= tswapl(rusage
->ru_inblock
);
586 target_rusage
->ru_oublock
= tswapl(rusage
->ru_oublock
);
587 target_rusage
->ru_msgsnd
= tswapl(rusage
->ru_msgsnd
);
588 target_rusage
->ru_msgrcv
= tswapl(rusage
->ru_msgrcv
);
589 target_rusage
->ru_nsignals
= tswapl(rusage
->ru_nsignals
);
590 target_rusage
->ru_nvcsw
= tswapl(rusage
->ru_nvcsw
);
591 target_rusage
->ru_nivcsw
= tswapl(rusage
->ru_nivcsw
);
592 unlock_user_struct(target_rusage
, target_addr
, 1);
597 static inline abi_long
copy_from_user_timeval(struct timeval
*tv
,
598 abi_ulong target_tv_addr
)
600 struct target_timeval
*target_tv
;
602 if (!lock_user_struct(VERIFY_READ
, target_tv
, target_tv_addr
, 1))
603 return -TARGET_EFAULT
;
605 __get_user(tv
->tv_sec
, &target_tv
->tv_sec
);
606 __get_user(tv
->tv_usec
, &target_tv
->tv_usec
);
608 unlock_user_struct(target_tv
, target_tv_addr
, 0);
613 static inline abi_long
copy_to_user_timeval(abi_ulong target_tv_addr
,
614 const struct timeval
*tv
)
616 struct target_timeval
*target_tv
;
618 if (!lock_user_struct(VERIFY_WRITE
, target_tv
, target_tv_addr
, 0))
619 return -TARGET_EFAULT
;
621 __put_user(tv
->tv_sec
, &target_tv
->tv_sec
);
622 __put_user(tv
->tv_usec
, &target_tv
->tv_usec
);
624 unlock_user_struct(target_tv
, target_tv_addr
, 1);
630 /* do_select() must return target values and target errnos. */
631 static abi_long
do_select(int n
,
632 abi_ulong rfd_addr
, abi_ulong wfd_addr
,
633 abi_ulong efd_addr
, abi_ulong target_tv_addr
)
635 fd_set rfds
, wfds
, efds
;
636 fd_set
*rfds_ptr
, *wfds_ptr
, *efds_ptr
;
637 struct timeval tv
, *tv_ptr
;
641 if (copy_from_user_fdset(&rfds
, rfd_addr
, n
))
642 return -TARGET_EFAULT
;
648 if (copy_from_user_fdset(&wfds
, wfd_addr
, n
))
649 return -TARGET_EFAULT
;
655 if (copy_from_user_fdset(&efds
, efd_addr
, n
))
656 return -TARGET_EFAULT
;
662 if (target_tv_addr
) {
663 if (copy_from_user_timeval(&tv
, target_tv_addr
))
664 return -TARGET_EFAULT
;
670 ret
= get_errno(select(n
, rfds_ptr
, wfds_ptr
, efds_ptr
, tv_ptr
));
672 if (!is_error(ret
)) {
673 if (rfd_addr
&& copy_to_user_fdset(rfd_addr
, &rfds
, n
))
674 return -TARGET_EFAULT
;
675 if (wfd_addr
&& copy_to_user_fdset(wfd_addr
, &wfds
, n
))
676 return -TARGET_EFAULT
;
677 if (efd_addr
&& copy_to_user_fdset(efd_addr
, &efds
, n
))
678 return -TARGET_EFAULT
;
680 if (target_tv_addr
&& copy_to_user_timeval(target_tv_addr
, &tv
))
681 return -TARGET_EFAULT
;
687 static inline abi_long
target_to_host_sockaddr(struct sockaddr
*addr
,
688 abi_ulong target_addr
,
691 struct target_sockaddr
*target_saddr
;
693 target_saddr
= lock_user(VERIFY_READ
, target_addr
, len
, 1);
695 return -TARGET_EFAULT
;
696 memcpy(addr
, target_saddr
, len
);
697 addr
->sa_family
= tswap16(target_saddr
->sa_family
);
698 unlock_user(target_saddr
, target_addr
, 0);
703 static inline abi_long
host_to_target_sockaddr(abi_ulong target_addr
,
704 struct sockaddr
*addr
,
707 struct target_sockaddr
*target_saddr
;
709 target_saddr
= lock_user(VERIFY_WRITE
, target_addr
, len
, 0);
711 return -TARGET_EFAULT
;
712 memcpy(target_saddr
, addr
, len
);
713 target_saddr
->sa_family
= tswap16(addr
->sa_family
);
714 unlock_user(target_saddr
, target_addr
, len
);
719 /* ??? Should this also swap msgh->name? */
720 static inline abi_long
target_to_host_cmsg(struct msghdr
*msgh
,
721 struct target_msghdr
*target_msgh
)
723 struct cmsghdr
*cmsg
= CMSG_FIRSTHDR(msgh
);
724 abi_long msg_controllen
;
725 abi_ulong target_cmsg_addr
;
726 struct target_cmsghdr
*target_cmsg
;
729 msg_controllen
= tswapl(target_msgh
->msg_controllen
);
730 if (msg_controllen
< sizeof (struct target_cmsghdr
))
732 target_cmsg_addr
= tswapl(target_msgh
->msg_control
);
733 target_cmsg
= lock_user(VERIFY_READ
, target_cmsg_addr
, msg_controllen
, 1);
735 return -TARGET_EFAULT
;
737 while (cmsg
&& target_cmsg
) {
738 void *data
= CMSG_DATA(cmsg
);
739 void *target_data
= TARGET_CMSG_DATA(target_cmsg
);
741 int len
= tswapl(target_cmsg
->cmsg_len
)
742 - TARGET_CMSG_ALIGN(sizeof (struct target_cmsghdr
));
744 space
+= CMSG_SPACE(len
);
745 if (space
> msgh
->msg_controllen
) {
746 space
-= CMSG_SPACE(len
);
747 gemu_log("Host cmsg overflow\n");
751 cmsg
->cmsg_level
= tswap32(target_cmsg
->cmsg_level
);
752 cmsg
->cmsg_type
= tswap32(target_cmsg
->cmsg_type
);
753 cmsg
->cmsg_len
= CMSG_LEN(len
);
755 if (cmsg
->cmsg_level
!= TARGET_SOL_SOCKET
|| cmsg
->cmsg_type
!= SCM_RIGHTS
) {
756 gemu_log("Unsupported ancillary data: %d/%d\n", cmsg
->cmsg_level
, cmsg
->cmsg_type
);
757 memcpy(data
, target_data
, len
);
759 int *fd
= (int *)data
;
760 int *target_fd
= (int *)target_data
;
761 int i
, numfds
= len
/ sizeof(int);
763 for (i
= 0; i
< numfds
; i
++)
764 fd
[i
] = tswap32(target_fd
[i
]);
767 cmsg
= CMSG_NXTHDR(msgh
, cmsg
);
768 target_cmsg
= TARGET_CMSG_NXTHDR(target_msgh
, target_cmsg
);
770 unlock_user(target_cmsg
, target_cmsg_addr
, 0);
772 msgh
->msg_controllen
= space
;
776 /* ??? Should this also swap msgh->name? */
777 static inline abi_long
host_to_target_cmsg(struct target_msghdr
*target_msgh
,
780 struct cmsghdr
*cmsg
= CMSG_FIRSTHDR(msgh
);
781 abi_long msg_controllen
;
782 abi_ulong target_cmsg_addr
;
783 struct target_cmsghdr
*target_cmsg
;
786 msg_controllen
= tswapl(target_msgh
->msg_controllen
);
787 if (msg_controllen
< sizeof (struct target_cmsghdr
))
789 target_cmsg_addr
= tswapl(target_msgh
->msg_control
);
790 target_cmsg
= lock_user(VERIFY_WRITE
, target_cmsg_addr
, msg_controllen
, 0);
792 return -TARGET_EFAULT
;
794 while (cmsg
&& target_cmsg
) {
795 void *data
= CMSG_DATA(cmsg
);
796 void *target_data
= TARGET_CMSG_DATA(target_cmsg
);
798 int len
= cmsg
->cmsg_len
- CMSG_ALIGN(sizeof (struct cmsghdr
));
800 space
+= TARGET_CMSG_SPACE(len
);
801 if (space
> msg_controllen
) {
802 space
-= TARGET_CMSG_SPACE(len
);
803 gemu_log("Target cmsg overflow\n");
807 target_cmsg
->cmsg_level
= tswap32(cmsg
->cmsg_level
);
808 target_cmsg
->cmsg_type
= tswap32(cmsg
->cmsg_type
);
809 target_cmsg
->cmsg_len
= tswapl(TARGET_CMSG_LEN(len
));
811 if (cmsg
->cmsg_level
!= TARGET_SOL_SOCKET
|| cmsg
->cmsg_type
!= SCM_RIGHTS
) {
812 gemu_log("Unsupported ancillary data: %d/%d\n", cmsg
->cmsg_level
, cmsg
->cmsg_type
);
813 memcpy(target_data
, data
, len
);
815 int *fd
= (int *)data
;
816 int *target_fd
= (int *)target_data
;
817 int i
, numfds
= len
/ sizeof(int);
819 for (i
= 0; i
< numfds
; i
++)
820 target_fd
[i
] = tswap32(fd
[i
]);
823 cmsg
= CMSG_NXTHDR(msgh
, cmsg
);
824 target_cmsg
= TARGET_CMSG_NXTHDR(target_msgh
, target_cmsg
);
826 unlock_user(target_cmsg
, target_cmsg_addr
, space
);
828 target_msgh
->msg_controllen
= tswapl(space
);
832 /* do_setsockopt() Must return target values and target errnos. */
833 static abi_long
do_setsockopt(int sockfd
, int level
, int optname
,
834 abi_ulong optval_addr
, socklen_t optlen
)
841 /* TCP options all take an 'int' value. */
842 if (optlen
< sizeof(uint32_t))
843 return -TARGET_EINVAL
;
845 if (get_user_u32(val
, optval_addr
))
846 return -TARGET_EFAULT
;
847 ret
= get_errno(setsockopt(sockfd
, level
, optname
, &val
, sizeof(val
)));
854 case IP_ROUTER_ALERT
:
858 case IP_MTU_DISCOVER
:
864 case IP_MULTICAST_TTL
:
865 case IP_MULTICAST_LOOP
:
867 if (optlen
>= sizeof(uint32_t)) {
868 if (get_user_u32(val
, optval_addr
))
869 return -TARGET_EFAULT
;
870 } else if (optlen
>= 1) {
871 if (get_user_u8(val
, optval_addr
))
872 return -TARGET_EFAULT
;
874 ret
= get_errno(setsockopt(sockfd
, level
, optname
, &val
, sizeof(val
)));
880 case TARGET_SOL_SOCKET
:
882 /* Options with 'int' argument. */
883 case TARGET_SO_DEBUG
:
886 case TARGET_SO_REUSEADDR
:
887 optname
= SO_REUSEADDR
;
892 case TARGET_SO_ERROR
:
895 case TARGET_SO_DONTROUTE
:
896 optname
= SO_DONTROUTE
;
898 case TARGET_SO_BROADCAST
:
899 optname
= SO_BROADCAST
;
901 case TARGET_SO_SNDBUF
:
904 case TARGET_SO_RCVBUF
:
907 case TARGET_SO_KEEPALIVE
:
908 optname
= SO_KEEPALIVE
;
910 case TARGET_SO_OOBINLINE
:
911 optname
= SO_OOBINLINE
;
913 case TARGET_SO_NO_CHECK
:
914 optname
= SO_NO_CHECK
;
916 case TARGET_SO_PRIORITY
:
917 optname
= SO_PRIORITY
;
920 case TARGET_SO_BSDCOMPAT
:
921 optname
= SO_BSDCOMPAT
;
924 case TARGET_SO_PASSCRED
:
925 optname
= SO_PASSCRED
;
927 case TARGET_SO_TIMESTAMP
:
928 optname
= SO_TIMESTAMP
;
930 case TARGET_SO_RCVLOWAT
:
931 optname
= SO_RCVLOWAT
;
933 case TARGET_SO_RCVTIMEO
:
934 optname
= SO_RCVTIMEO
;
936 case TARGET_SO_SNDTIMEO
:
937 optname
= SO_SNDTIMEO
;
943 if (optlen
< sizeof(uint32_t))
944 return -TARGET_EINVAL
;
946 if (get_user_u32(val
, optval_addr
))
947 return -TARGET_EFAULT
;
948 ret
= get_errno(setsockopt(sockfd
, SOL_SOCKET
, optname
, &val
, sizeof(val
)));
952 gemu_log("Unsupported setsockopt level=%d optname=%d \n", level
, optname
);
953 ret
= -TARGET_ENOPROTOOPT
;
958 /* do_getsockopt() Must return target values and target errnos. */
959 static abi_long
do_getsockopt(int sockfd
, int level
, int optname
,
960 abi_ulong optval_addr
, abi_ulong optlen
)
967 case TARGET_SOL_SOCKET
:
970 case TARGET_SO_LINGER
:
971 case TARGET_SO_RCVTIMEO
:
972 case TARGET_SO_SNDTIMEO
:
973 case TARGET_SO_PEERCRED
:
974 case TARGET_SO_PEERNAME
:
975 /* These don't just return a single integer */
982 /* TCP options all take an 'int' value. */
984 if (get_user_u32(len
, optlen
))
985 return -TARGET_EFAULT
;
987 return -TARGET_EINVAL
;
989 ret
= get_errno(getsockopt(sockfd
, level
, optname
, &val
, &lv
));
996 if (put_user_u32(val
, optval_addr
))
997 return -TARGET_EFAULT
;
999 if (put_user_u8(val
, optval_addr
))
1000 return -TARGET_EFAULT
;
1002 if (put_user_u32(len
, optlen
))
1003 return -TARGET_EFAULT
;
1010 case IP_ROUTER_ALERT
:
1014 case IP_MTU_DISCOVER
:
1020 case IP_MULTICAST_TTL
:
1021 case IP_MULTICAST_LOOP
:
1022 if (get_user_u32(len
, optlen
))
1023 return -TARGET_EFAULT
;
1025 return -TARGET_EINVAL
;
1027 ret
= get_errno(getsockopt(sockfd
, level
, optname
, &val
, &lv
));
1030 if (len
< sizeof(int) && len
> 0 && val
>= 0 && val
< 255) {
1032 if (put_user_u32(len
, optlen
)
1033 || put_user_u8(val
, optval_addr
))
1034 return -TARGET_EFAULT
;
1036 if (len
> sizeof(int))
1038 if (put_user_u32(len
, optlen
)
1039 || put_user_u32(val
, optval_addr
))
1040 return -TARGET_EFAULT
;
1044 ret
= -TARGET_ENOPROTOOPT
;
1050 gemu_log("getsockopt level=%d optname=%d not yet supported\n",
1052 ret
= -TARGET_EOPNOTSUPP
;
1059 * lock_iovec()/unlock_iovec() have a return code of 0 for success where
1060 * other lock functions have a return code of 0 for failure.
1062 static abi_long
lock_iovec(int type
, struct iovec
*vec
, abi_ulong target_addr
,
1063 int count
, int copy
)
1065 struct target_iovec
*target_vec
;
1069 target_vec
= lock_user(VERIFY_READ
, target_addr
, count
* sizeof(struct target_iovec
), 1);
1071 return -TARGET_EFAULT
;
1072 for(i
= 0;i
< count
; i
++) {
1073 base
= tswapl(target_vec
[i
].iov_base
);
1074 vec
[i
].iov_len
= tswapl(target_vec
[i
].iov_len
);
1075 if (vec
[i
].iov_len
!= 0) {
1076 vec
[i
].iov_base
= lock_user(type
, base
, vec
[i
].iov_len
, copy
);
1077 if (!vec
[i
].iov_base
&& vec
[i
].iov_len
)
1080 /* zero length pointer is ignored */
1081 vec
[i
].iov_base
= NULL
;
1084 unlock_user (target_vec
, target_addr
, 0);
1087 /* failure - unwind locks */
1088 for (j
= 0; j
< i
; j
++) {
1089 base
= tswapl(target_vec
[j
].iov_base
);
1090 unlock_user(vec
[j
].iov_base
, base
, 0);
1092 unlock_user (target_vec
, target_addr
, 0);
1093 return -TARGET_EFAULT
;
1096 static abi_long
unlock_iovec(struct iovec
*vec
, abi_ulong target_addr
,
1097 int count
, int copy
)
1099 struct target_iovec
*target_vec
;
1103 target_vec
= lock_user(VERIFY_READ
, target_addr
, count
* sizeof(struct target_iovec
), 1);
1105 return -TARGET_EFAULT
;
1106 for(i
= 0;i
< count
; i
++) {
1107 base
= tswapl(target_vec
[i
].iov_base
);
1108 unlock_user(vec
[i
].iov_base
, base
, copy
? vec
[i
].iov_len
: 0);
1110 unlock_user (target_vec
, target_addr
, 0);
1115 /* do_socket() Must return target values and target errnos. */
1116 static abi_long
do_socket(int domain
, int type
, int protocol
)
1118 #if defined(TARGET_MIPS)
1120 case TARGET_SOCK_DGRAM
:
1123 case TARGET_SOCK_STREAM
:
1126 case TARGET_SOCK_RAW
:
1129 case TARGET_SOCK_RDM
:
1132 case TARGET_SOCK_SEQPACKET
:
1133 type
= SOCK_SEQPACKET
;
1135 case TARGET_SOCK_PACKET
:
1140 if (domain
== PF_NETLINK
)
1141 return -EAFNOSUPPORT
; /* do not NETLINK socket connections possible */
1142 return get_errno(socket(domain
, type
, protocol
));
1145 /* do_bind() Must return target values and target errnos. */
1146 static abi_long
do_bind(int sockfd
, abi_ulong target_addr
,
1149 void *addr
= alloca(addrlen
);
1151 target_to_host_sockaddr(addr
, target_addr
, addrlen
);
1152 return get_errno(bind(sockfd
, addr
, addrlen
));
1155 /* do_connect() Must return target values and target errnos. */
1156 static abi_long
do_connect(int sockfd
, abi_ulong target_addr
,
1159 void *addr
= alloca(addrlen
);
1161 target_to_host_sockaddr(addr
, target_addr
, addrlen
);
1162 return get_errno(connect(sockfd
, addr
, addrlen
));
1165 /* do_sendrecvmsg() Must return target values and target errnos. */
1166 static abi_long
do_sendrecvmsg(int fd
, abi_ulong target_msg
,
1167 int flags
, int send
)
1170 struct target_msghdr
*msgp
;
1174 abi_ulong target_vec
;
1177 if (!lock_user_struct(send
? VERIFY_READ
: VERIFY_WRITE
,
1181 return -TARGET_EFAULT
;
1182 if (msgp
->msg_name
) {
1183 msg
.msg_namelen
= tswap32(msgp
->msg_namelen
);
1184 msg
.msg_name
= alloca(msg
.msg_namelen
);
1185 target_to_host_sockaddr(msg
.msg_name
, tswapl(msgp
->msg_name
),
1188 msg
.msg_name
= NULL
;
1189 msg
.msg_namelen
= 0;
1191 msg
.msg_controllen
= 2 * tswapl(msgp
->msg_controllen
);
1192 msg
.msg_control
= alloca(msg
.msg_controllen
);
1193 msg
.msg_flags
= tswap32(msgp
->msg_flags
);
1195 count
= tswapl(msgp
->msg_iovlen
);
1196 vec
= alloca(count
* sizeof(struct iovec
));
1197 target_vec
= tswapl(msgp
->msg_iov
);
1198 lock_iovec(send
? VERIFY_READ
: VERIFY_WRITE
, vec
, target_vec
, count
, send
);
1199 msg
.msg_iovlen
= count
;
1203 ret
= target_to_host_cmsg(&msg
, msgp
);
1205 ret
= get_errno(sendmsg(fd
, &msg
, flags
));
1207 ret
= get_errno(recvmsg(fd
, &msg
, flags
));
1209 ret
= host_to_target_cmsg(msgp
, &msg
);
1211 unlock_iovec(vec
, target_vec
, count
, !send
);
1212 unlock_user_struct(msgp
, target_msg
, send
? 0 : 1);
1216 /* do_accept() Must return target values and target errnos. */
1217 static abi_long
do_accept(int fd
, abi_ulong target_addr
,
1218 abi_ulong target_addrlen_addr
)
1224 if (get_user_u32(addrlen
, target_addrlen_addr
))
1225 return -TARGET_EFAULT
;
1227 addr
= alloca(addrlen
);
1229 ret
= get_errno(accept(fd
, addr
, &addrlen
));
1230 if (!is_error(ret
)) {
1231 host_to_target_sockaddr(target_addr
, addr
, addrlen
);
1232 if (put_user_u32(addrlen
, target_addrlen_addr
))
1233 ret
= -TARGET_EFAULT
;
1238 /* do_getpeername() Must return target values and target errnos. */
1239 static abi_long
do_getpeername(int fd
, abi_ulong target_addr
,
1240 abi_ulong target_addrlen_addr
)
1246 if (get_user_u32(addrlen
, target_addrlen_addr
))
1247 return -TARGET_EFAULT
;
1249 addr
= alloca(addrlen
);
1251 ret
= get_errno(getpeername(fd
, addr
, &addrlen
));
1252 if (!is_error(ret
)) {
1253 host_to_target_sockaddr(target_addr
, addr
, addrlen
);
1254 if (put_user_u32(addrlen
, target_addrlen_addr
))
1255 ret
= -TARGET_EFAULT
;
1260 /* do_getsockname() Must return target values and target errnos. */
1261 static abi_long
do_getsockname(int fd
, abi_ulong target_addr
,
1262 abi_ulong target_addrlen_addr
)
1268 if (get_user_u32(addrlen
, target_addrlen_addr
))
1269 return -TARGET_EFAULT
;
1271 addr
= alloca(addrlen
);
1273 ret
= get_errno(getsockname(fd
, addr
, &addrlen
));
1274 if (!is_error(ret
)) {
1275 host_to_target_sockaddr(target_addr
, addr
, addrlen
);
1276 if (put_user_u32(addrlen
, target_addrlen_addr
))
1277 ret
= -TARGET_EFAULT
;
1282 /* do_socketpair() Must return target values and target errnos. */
1283 static abi_long
do_socketpair(int domain
, int type
, int protocol
,
1284 abi_ulong target_tab_addr
)
1289 ret
= get_errno(socketpair(domain
, type
, protocol
, tab
));
1290 if (!is_error(ret
)) {
1291 if (put_user_s32(tab
[0], target_tab_addr
)
1292 || put_user_s32(tab
[1], target_tab_addr
+ sizeof(tab
[0])))
1293 ret
= -TARGET_EFAULT
;
1298 /* do_sendto() Must return target values and target errnos. */
1299 static abi_long
do_sendto(int fd
, abi_ulong msg
, size_t len
, int flags
,
1300 abi_ulong target_addr
, socklen_t addrlen
)
1306 host_msg
= lock_user(VERIFY_READ
, msg
, len
, 1);
1308 return -TARGET_EFAULT
;
1310 addr
= alloca(addrlen
);
1311 target_to_host_sockaddr(addr
, target_addr
, addrlen
);
1312 ret
= get_errno(sendto(fd
, host_msg
, len
, flags
, addr
, addrlen
));
1314 ret
= get_errno(send(fd
, host_msg
, len
, flags
));
1316 unlock_user(host_msg
, msg
, 0);
1320 /* do_recvfrom() Must return target values and target errnos. */
1321 static abi_long
do_recvfrom(int fd
, abi_ulong msg
, size_t len
, int flags
,
1322 abi_ulong target_addr
,
1323 abi_ulong target_addrlen
)
1330 host_msg
= lock_user(VERIFY_WRITE
, msg
, len
, 0);
1332 return -TARGET_EFAULT
;
1334 if (get_user_u32(addrlen
, target_addrlen
)) {
1335 ret
= -TARGET_EFAULT
;
1338 addr
= alloca(addrlen
);
1339 ret
= get_errno(recvfrom(fd
, host_msg
, len
, flags
, addr
, &addrlen
));
1341 addr
= NULL
; /* To keep compiler quiet. */
1342 ret
= get_errno(recv(fd
, host_msg
, len
, flags
));
1344 if (!is_error(ret
)) {
1346 host_to_target_sockaddr(target_addr
, addr
, addrlen
);
1347 if (put_user_u32(addrlen
, target_addrlen
)) {
1348 ret
= -TARGET_EFAULT
;
1352 unlock_user(host_msg
, msg
, len
);
1355 unlock_user(host_msg
, msg
, 0);
1360 #ifdef TARGET_NR_socketcall
1361 /* do_socketcall() Must return target values and target errnos. */
1362 static abi_long
do_socketcall(int num
, abi_ulong vptr
)
1365 const int n
= sizeof(abi_ulong
);
1370 int domain
, type
, protocol
;
1372 if (get_user_s32(domain
, vptr
)
1373 || get_user_s32(type
, vptr
+ n
)
1374 || get_user_s32(protocol
, vptr
+ 2 * n
))
1375 return -TARGET_EFAULT
;
1377 ret
= do_socket(domain
, type
, protocol
);
1383 abi_ulong target_addr
;
1386 if (get_user_s32(sockfd
, vptr
)
1387 || get_user_ual(target_addr
, vptr
+ n
)
1388 || get_user_u32(addrlen
, vptr
+ 2 * n
))
1389 return -TARGET_EFAULT
;
1391 ret
= do_bind(sockfd
, target_addr
, addrlen
);
1394 case SOCKOP_connect
:
1397 abi_ulong target_addr
;
1400 if (get_user_s32(sockfd
, vptr
)
1401 || get_user_ual(target_addr
, vptr
+ n
)
1402 || get_user_u32(addrlen
, vptr
+ 2 * n
))
1403 return -TARGET_EFAULT
;
1405 ret
= do_connect(sockfd
, target_addr
, addrlen
);
1410 int sockfd
, backlog
;
1412 if (get_user_s32(sockfd
, vptr
)
1413 || get_user_s32(backlog
, vptr
+ n
))
1414 return -TARGET_EFAULT
;
1416 ret
= get_errno(listen(sockfd
, backlog
));
1422 abi_ulong target_addr
, target_addrlen
;
1424 if (get_user_s32(sockfd
, vptr
)
1425 || get_user_ual(target_addr
, vptr
+ n
)
1426 || get_user_u32(target_addrlen
, vptr
+ 2 * n
))
1427 return -TARGET_EFAULT
;
1429 ret
= do_accept(sockfd
, target_addr
, target_addrlen
);
1432 case SOCKOP_getsockname
:
1435 abi_ulong target_addr
, target_addrlen
;
1437 if (get_user_s32(sockfd
, vptr
)
1438 || get_user_ual(target_addr
, vptr
+ n
)
1439 || get_user_u32(target_addrlen
, vptr
+ 2 * n
))
1440 return -TARGET_EFAULT
;
1442 ret
= do_getsockname(sockfd
, target_addr
, target_addrlen
);
1445 case SOCKOP_getpeername
:
1448 abi_ulong target_addr
, target_addrlen
;
1450 if (get_user_s32(sockfd
, vptr
)
1451 || get_user_ual(target_addr
, vptr
+ n
)
1452 || get_user_u32(target_addrlen
, vptr
+ 2 * n
))
1453 return -TARGET_EFAULT
;
1455 ret
= do_getpeername(sockfd
, target_addr
, target_addrlen
);
1458 case SOCKOP_socketpair
:
1460 int domain
, type
, protocol
;
1463 if (get_user_s32(domain
, vptr
)
1464 || get_user_s32(type
, vptr
+ n
)
1465 || get_user_s32(protocol
, vptr
+ 2 * n
)
1466 || get_user_ual(tab
, vptr
+ 3 * n
))
1467 return -TARGET_EFAULT
;
1469 ret
= do_socketpair(domain
, type
, protocol
, tab
);
1479 if (get_user_s32(sockfd
, vptr
)
1480 || get_user_ual(msg
, vptr
+ n
)
1481 || get_user_ual(len
, vptr
+ 2 * n
)
1482 || get_user_s32(flags
, vptr
+ 3 * n
))
1483 return -TARGET_EFAULT
;
1485 ret
= do_sendto(sockfd
, msg
, len
, flags
, 0, 0);
1495 if (get_user_s32(sockfd
, vptr
)
1496 || get_user_ual(msg
, vptr
+ n
)
1497 || get_user_ual(len
, vptr
+ 2 * n
)
1498 || get_user_s32(flags
, vptr
+ 3 * n
))
1499 return -TARGET_EFAULT
;
1501 ret
= do_recvfrom(sockfd
, msg
, len
, flags
, 0, 0);
1513 if (get_user_s32(sockfd
, vptr
)
1514 || get_user_ual(msg
, vptr
+ n
)
1515 || get_user_ual(len
, vptr
+ 2 * n
)
1516 || get_user_s32(flags
, vptr
+ 3 * n
)
1517 || get_user_ual(addr
, vptr
+ 4 * n
)
1518 || get_user_u32(addrlen
, vptr
+ 5 * n
))
1519 return -TARGET_EFAULT
;
1521 ret
= do_sendto(sockfd
, msg
, len
, flags
, addr
, addrlen
);
1524 case SOCKOP_recvfrom
:
1533 if (get_user_s32(sockfd
, vptr
)
1534 || get_user_ual(msg
, vptr
+ n
)
1535 || get_user_ual(len
, vptr
+ 2 * n
)
1536 || get_user_s32(flags
, vptr
+ 3 * n
)
1537 || get_user_ual(addr
, vptr
+ 4 * n
)
1538 || get_user_u32(addrlen
, vptr
+ 5 * n
))
1539 return -TARGET_EFAULT
;
1541 ret
= do_recvfrom(sockfd
, msg
, len
, flags
, addr
, addrlen
);
1544 case SOCKOP_shutdown
:
1548 if (get_user_s32(sockfd
, vptr
)
1549 || get_user_s32(how
, vptr
+ n
))
1550 return -TARGET_EFAULT
;
1552 ret
= get_errno(shutdown(sockfd
, how
));
1555 case SOCKOP_sendmsg
:
1556 case SOCKOP_recvmsg
:
1559 abi_ulong target_msg
;
1562 if (get_user_s32(fd
, vptr
)
1563 || get_user_ual(target_msg
, vptr
+ n
)
1564 || get_user_s32(flags
, vptr
+ 2 * n
))
1565 return -TARGET_EFAULT
;
1567 ret
= do_sendrecvmsg(fd
, target_msg
, flags
,
1568 (num
== SOCKOP_sendmsg
));
1571 case SOCKOP_setsockopt
:
1579 if (get_user_s32(sockfd
, vptr
)
1580 || get_user_s32(level
, vptr
+ n
)
1581 || get_user_s32(optname
, vptr
+ 2 * n
)
1582 || get_user_ual(optval
, vptr
+ 3 * n
)
1583 || get_user_u32(optlen
, vptr
+ 4 * n
))
1584 return -TARGET_EFAULT
;
1586 ret
= do_setsockopt(sockfd
, level
, optname
, optval
, optlen
);
1589 case SOCKOP_getsockopt
:
1597 if (get_user_s32(sockfd
, vptr
)
1598 || get_user_s32(level
, vptr
+ n
)
1599 || get_user_s32(optname
, vptr
+ 2 * n
)
1600 || get_user_ual(optval
, vptr
+ 3 * n
)
1601 || get_user_u32(optlen
, vptr
+ 4 * n
))
1602 return -TARGET_EFAULT
;
1604 ret
= do_getsockopt(sockfd
, level
, optname
, optval
, optlen
);
1608 gemu_log("Unsupported socketcall: %d\n", num
);
1609 ret
= -TARGET_ENOSYS
;
1616 #define N_SHM_REGIONS 32
1618 static struct shm_region
{
1621 } shm_regions
[N_SHM_REGIONS
];
1623 struct target_ipc_perm
1630 unsigned short int mode
;
1631 unsigned short int __pad1
;
1632 unsigned short int __seq
;
1633 unsigned short int __pad2
;
1634 abi_ulong __unused1
;
1635 abi_ulong __unused2
;
1638 struct target_semid_ds
1640 struct target_ipc_perm sem_perm
;
1641 abi_ulong sem_otime
;
1642 abi_ulong __unused1
;
1643 abi_ulong sem_ctime
;
1644 abi_ulong __unused2
;
1645 abi_ulong sem_nsems
;
1646 abi_ulong __unused3
;
1647 abi_ulong __unused4
;
1650 static inline abi_long
target_to_host_ipc_perm(struct ipc_perm
*host_ip
,
1651 abi_ulong target_addr
)
1653 struct target_ipc_perm
*target_ip
;
1654 struct target_semid_ds
*target_sd
;
1656 if (!lock_user_struct(VERIFY_READ
, target_sd
, target_addr
, 1))
1657 return -TARGET_EFAULT
;
1658 target_ip
=&(target_sd
->sem_perm
);
1659 host_ip
->__key
= tswapl(target_ip
->__key
);
1660 host_ip
->uid
= tswapl(target_ip
->uid
);
1661 host_ip
->gid
= tswapl(target_ip
->gid
);
1662 host_ip
->cuid
= tswapl(target_ip
->cuid
);
1663 host_ip
->cgid
= tswapl(target_ip
->cgid
);
1664 host_ip
->mode
= tswapl(target_ip
->mode
);
1665 unlock_user_struct(target_sd
, target_addr
, 0);
1669 static inline abi_long
host_to_target_ipc_perm(abi_ulong target_addr
,
1670 struct ipc_perm
*host_ip
)
1672 struct target_ipc_perm
*target_ip
;
1673 struct target_semid_ds
*target_sd
;
1675 if (!lock_user_struct(VERIFY_WRITE
, target_sd
, target_addr
, 0))
1676 return -TARGET_EFAULT
;
1677 target_ip
= &(target_sd
->sem_perm
);
1678 target_ip
->__key
= tswapl(host_ip
->__key
);
1679 target_ip
->uid
= tswapl(host_ip
->uid
);
1680 target_ip
->gid
= tswapl(host_ip
->gid
);
1681 target_ip
->cuid
= tswapl(host_ip
->cuid
);
1682 target_ip
->cgid
= tswapl(host_ip
->cgid
);
1683 target_ip
->mode
= tswapl(host_ip
->mode
);
1684 unlock_user_struct(target_sd
, target_addr
, 1);
1688 static inline abi_long
target_to_host_semid_ds(struct semid_ds
*host_sd
,
1689 abi_ulong target_addr
)
1691 struct target_semid_ds
*target_sd
;
1693 if (!lock_user_struct(VERIFY_READ
, target_sd
, target_addr
, 1))
1694 return -TARGET_EFAULT
;
1695 target_to_host_ipc_perm(&(host_sd
->sem_perm
),target_addr
);
1696 host_sd
->sem_nsems
= tswapl(target_sd
->sem_nsems
);
1697 host_sd
->sem_otime
= tswapl(target_sd
->sem_otime
);
1698 host_sd
->sem_ctime
= tswapl(target_sd
->sem_ctime
);
1699 unlock_user_struct(target_sd
, target_addr
, 0);
1703 static inline abi_long
host_to_target_semid_ds(abi_ulong target_addr
,
1704 struct semid_ds
*host_sd
)
1706 struct target_semid_ds
*target_sd
;
1708 if (!lock_user_struct(VERIFY_WRITE
, target_sd
, target_addr
, 0))
1709 return -TARGET_EFAULT
;
1710 host_to_target_ipc_perm(target_addr
,&(host_sd
->sem_perm
));
1711 target_sd
->sem_nsems
= tswapl(host_sd
->sem_nsems
);
1712 target_sd
->sem_otime
= tswapl(host_sd
->sem_otime
);
1713 target_sd
->sem_ctime
= tswapl(host_sd
->sem_ctime
);
1714 unlock_user_struct(target_sd
, target_addr
, 1);
1720 struct semid_ds
*buf
;
1721 unsigned short *array
;
1724 union target_semun
{
1727 unsigned short int *array
;
1730 static inline abi_long
target_to_host_semun(int cmd
,
1731 union semun
*host_su
,
1732 abi_ulong target_addr
,
1733 struct semid_ds
*ds
)
1735 union target_semun
*target_su
;
1740 if (!lock_user_struct(VERIFY_READ
, target_su
, target_addr
, 1))
1741 return -TARGET_EFAULT
;
1742 target_to_host_semid_ds(ds
,target_su
->buf
);
1744 unlock_user_struct(target_su
, target_addr
, 0);
1748 if (!lock_user_struct(VERIFY_READ
, target_su
, target_addr
, 1))
1749 return -TARGET_EFAULT
;
1750 host_su
->val
= tswapl(target_su
->val
);
1751 unlock_user_struct(target_su
, target_addr
, 0);
1755 if (!lock_user_struct(VERIFY_READ
, target_su
, target_addr
, 1))
1756 return -TARGET_EFAULT
;
1757 *host_su
->array
= tswap16(*target_su
->array
);
1758 unlock_user_struct(target_su
, target_addr
, 0);
1761 gemu_log("semun operation not fully supported: %d\n", (int)cmd
);
1766 static inline abi_long
host_to_target_semun(int cmd
,
1767 abi_ulong target_addr
,
1768 union semun
*host_su
,
1769 struct semid_ds
*ds
)
1771 union target_semun
*target_su
;
1776 if (lock_user_struct(VERIFY_WRITE
, target_su
, target_addr
, 0))
1777 return -TARGET_EFAULT
;
1778 host_to_target_semid_ds(target_su
->buf
,ds
);
1779 unlock_user_struct(target_su
, target_addr
, 1);
1783 if (lock_user_struct(VERIFY_WRITE
, target_su
, target_addr
, 0))
1784 return -TARGET_EFAULT
;
1785 target_su
->val
= tswapl(host_su
->val
);
1786 unlock_user_struct(target_su
, target_addr
, 1);
1790 if (lock_user_struct(VERIFY_WRITE
, target_su
, target_addr
, 0))
1791 return -TARGET_EFAULT
;
1792 *target_su
->array
= tswap16(*host_su
->array
);
1793 unlock_user_struct(target_su
, target_addr
, 1);
1796 gemu_log("semun operation not fully supported: %d\n", (int)cmd
);
1801 static inline abi_long
do_semctl(int first
, int second
, int third
,
1805 struct semid_ds dsarg
;
1806 int cmd
= third
&0xff;
1811 target_to_host_semun(cmd
,&arg
,ptr
,&dsarg
);
1812 ret
= get_errno(semctl(first
, second
, cmd
, arg
));
1813 host_to_target_semun(cmd
,ptr
,&arg
,&dsarg
);
1816 target_to_host_semun(cmd
,&arg
,ptr
,&dsarg
);
1817 ret
= get_errno(semctl(first
, second
, cmd
, arg
));
1818 host_to_target_semun(cmd
,ptr
,&arg
,&dsarg
);
1821 target_to_host_semun(cmd
,&arg
,ptr
,&dsarg
);
1822 ret
= get_errno(semctl(first
, second
, cmd
, arg
));
1823 host_to_target_semun(cmd
,ptr
,&arg
,&dsarg
);
1826 target_to_host_semun(cmd
,&arg
,ptr
,&dsarg
);
1827 ret
= get_errno(semctl(first
, second
, cmd
, arg
));
1828 host_to_target_semun(cmd
,ptr
,&arg
,&dsarg
);
1831 target_to_host_semun(cmd
,&arg
,ptr
,&dsarg
);
1832 ret
= get_errno(semctl(first
, second
, cmd
, arg
));
1833 host_to_target_semun(cmd
,ptr
,&arg
,&dsarg
);
1836 target_to_host_semun(cmd
,&arg
,ptr
,&dsarg
);
1837 ret
= get_errno(semctl(first
, second
, cmd
, arg
));
1838 host_to_target_semun(cmd
,ptr
,&arg
,&dsarg
);
1841 ret
= get_errno(semctl(first
, second
, cmd
, arg
));
1847 struct target_msqid_ds
1849 struct target_ipc_perm msg_perm
;
1850 abi_ulong msg_stime
;
1851 #if TARGET_ABI_BITS == 32
1852 abi_ulong __unused1
;
1854 abi_ulong msg_rtime
;
1855 #if TARGET_ABI_BITS == 32
1856 abi_ulong __unused2
;
1858 abi_ulong msg_ctime
;
1859 #if TARGET_ABI_BITS == 32
1860 abi_ulong __unused3
;
1862 abi_ulong __msg_cbytes
;
1864 abi_ulong msg_qbytes
;
1865 abi_ulong msg_lspid
;
1866 abi_ulong msg_lrpid
;
1867 abi_ulong __unused4
;
1868 abi_ulong __unused5
;
1871 static inline abi_long
target_to_host_msqid_ds(struct msqid_ds
*host_md
,
1872 abi_ulong target_addr
)
1874 struct target_msqid_ds
*target_md
;
1876 if (!lock_user_struct(VERIFY_READ
, target_md
, target_addr
, 1))
1877 return -TARGET_EFAULT
;
1878 if (target_to_host_ipc_perm(&(host_md
->msg_perm
),target_addr
))
1879 return -TARGET_EFAULT
;
1880 host_md
->msg_stime
= tswapl(target_md
->msg_stime
);
1881 host_md
->msg_rtime
= tswapl(target_md
->msg_rtime
);
1882 host_md
->msg_ctime
= tswapl(target_md
->msg_ctime
);
1883 host_md
->__msg_cbytes
= tswapl(target_md
->__msg_cbytes
);
1884 host_md
->msg_qnum
= tswapl(target_md
->msg_qnum
);
1885 host_md
->msg_qbytes
= tswapl(target_md
->msg_qbytes
);
1886 host_md
->msg_lspid
= tswapl(target_md
->msg_lspid
);
1887 host_md
->msg_lrpid
= tswapl(target_md
->msg_lrpid
);
1888 unlock_user_struct(target_md
, target_addr
, 0);
1892 static inline abi_long
host_to_target_msqid_ds(abi_ulong target_addr
,
1893 struct msqid_ds
*host_md
)
1895 struct target_msqid_ds
*target_md
;
1897 if (!lock_user_struct(VERIFY_WRITE
, target_md
, target_addr
, 0))
1898 return -TARGET_EFAULT
;
1899 if (host_to_target_ipc_perm(target_addr
,&(host_md
->msg_perm
)))
1900 return -TARGET_EFAULT
;
1901 target_md
->msg_stime
= tswapl(host_md
->msg_stime
);
1902 target_md
->msg_rtime
= tswapl(host_md
->msg_rtime
);
1903 target_md
->msg_ctime
= tswapl(host_md
->msg_ctime
);
1904 target_md
->__msg_cbytes
= tswapl(host_md
->__msg_cbytes
);
1905 target_md
->msg_qnum
= tswapl(host_md
->msg_qnum
);
1906 target_md
->msg_qbytes
= tswapl(host_md
->msg_qbytes
);
1907 target_md
->msg_lspid
= tswapl(host_md
->msg_lspid
);
1908 target_md
->msg_lrpid
= tswapl(host_md
->msg_lrpid
);
1909 unlock_user_struct(target_md
, target_addr
, 1);
1913 struct target_msginfo
{
1921 unsigned short int msgseg
;
1924 static inline abi_long
host_to_target_msginfo(abi_ulong target_addr
,
1925 struct msginfo
*host_msginfo
)
1927 struct target_msginfo
*target_msginfo
;
1928 if (!lock_user_struct(VERIFY_WRITE
, target_msginfo
, target_addr
, 0))
1929 return -TARGET_EFAULT
;
1930 __put_user(host_msginfo
->msgpool
, &target_msginfo
->msgpool
);
1931 __put_user(host_msginfo
->msgmap
, &target_msginfo
->msgmap
);
1932 __put_user(host_msginfo
->msgmax
, &target_msginfo
->msgmax
);
1933 __put_user(host_msginfo
->msgmnb
, &target_msginfo
->msgmnb
);
1934 __put_user(host_msginfo
->msgmni
, &target_msginfo
->msgmni
);
1935 __put_user(host_msginfo
->msgssz
, &target_msginfo
->msgssz
);
1936 __put_user(host_msginfo
->msgtql
, &target_msginfo
->msgtql
);
1937 __put_user(host_msginfo
->msgseg
, &target_msginfo
->msgseg
);
1938 unlock_user_struct(target_msginfo
, target_addr
, 1);
1942 static inline abi_long
do_msgctl(int msgid
, int cmd
, abi_long ptr
)
1944 struct msqid_ds dsarg
;
1945 struct msginfo msginfo
;
1946 abi_long ret
= -TARGET_EINVAL
;
1954 if (target_to_host_msqid_ds(&dsarg
,ptr
))
1955 return -TARGET_EFAULT
;
1956 ret
= get_errno(msgctl(msgid
, cmd
, &dsarg
));
1957 if (host_to_target_msqid_ds(ptr
,&dsarg
))
1958 return -TARGET_EFAULT
;
1961 ret
= get_errno(msgctl(msgid
, cmd
, NULL
));
1965 ret
= get_errno(msgctl(msgid
, cmd
, (struct msqid_ds
*)&msginfo
));
1966 if (host_to_target_msginfo(ptr
, &msginfo
))
1967 return -TARGET_EFAULT
;
1974 struct target_msgbuf
{
1979 static inline abi_long
do_msgsnd(int msqid
, abi_long msgp
,
1980 unsigned int msgsz
, int msgflg
)
1982 struct target_msgbuf
*target_mb
;
1983 struct msgbuf
*host_mb
;
1986 if (!lock_user_struct(VERIFY_READ
, target_mb
, msgp
, 0))
1987 return -TARGET_EFAULT
;
1988 host_mb
= malloc(msgsz
+sizeof(long));
1989 host_mb
->mtype
= (abi_long
) tswapl(target_mb
->mtype
);
1990 memcpy(host_mb
->mtext
, target_mb
->mtext
, msgsz
);
1991 ret
= get_errno(msgsnd(msqid
, host_mb
, msgsz
, msgflg
));
1993 unlock_user_struct(target_mb
, msgp
, 0);
1998 static inline abi_long
do_msgrcv(int msqid
, abi_long msgp
,
1999 unsigned int msgsz
, abi_long msgtyp
,
2002 struct target_msgbuf
*target_mb
;
2004 struct msgbuf
*host_mb
;
2007 if (!lock_user_struct(VERIFY_WRITE
, target_mb
, msgp
, 0))
2008 return -TARGET_EFAULT
;
2010 host_mb
= malloc(msgsz
+sizeof(long));
2011 ret
= get_errno(msgrcv(msqid
, host_mb
, msgsz
, tswapl(msgtyp
), msgflg
));
2014 abi_ulong target_mtext_addr
= msgp
+ sizeof(abi_ulong
);
2015 target_mtext
= lock_user(VERIFY_WRITE
, target_mtext_addr
, ret
, 0);
2016 if (!target_mtext
) {
2017 ret
= -TARGET_EFAULT
;
2020 memcpy(target_mb
->mtext
, host_mb
->mtext
, ret
);
2021 unlock_user(target_mtext
, target_mtext_addr
, ret
);
2024 target_mb
->mtype
= tswapl(host_mb
->mtype
);
2029 unlock_user_struct(target_mb
, msgp
, 1);
2033 #ifdef TARGET_NR_ipc
2034 /* ??? This only works with linear mappings. */
2035 /* do_ipc() must return target values and target errnos. */
2036 static abi_long
do_ipc(unsigned int call
, int first
,
2037 int second
, int third
,
2038 abi_long ptr
, abi_long fifth
)
2042 struct shmid_ds shm_info
;
2045 version
= call
>> 16;
2050 ret
= get_errno(semop(first
,(struct sembuf
*)g2h(ptr
), second
));
2054 ret
= get_errno(semget(first
, second
, third
));
2058 ret
= do_semctl(first
, second
, third
, ptr
);
2061 case IPCOP_semtimedop
:
2062 gemu_log("Unsupported ipc call: %d (version %d)\n", call
, version
);
2063 ret
= -TARGET_ENOSYS
;
2067 ret
= get_errno(msgget(first
, second
));
2071 ret
= do_msgsnd(first
, ptr
, second
, third
);
2075 ret
= do_msgctl(first
, second
, ptr
);
2082 struct target_ipc_kludge
{
2087 if (!lock_user_struct(VERIFY_READ
, tmp
, ptr
, 1)) {
2088 ret
= -TARGET_EFAULT
;
2092 ret
= do_msgrcv(first
, tmp
->msgp
, second
, tmp
->msgtyp
, third
);
2094 unlock_user_struct(tmp
, ptr
, 0);
2098 ret
= do_msgrcv(first
, ptr
, second
, fifth
, third
);
2106 /* SHM_* flags are the same on all linux platforms */
2107 host_addr
= shmat(first
, (void *)g2h(ptr
), second
);
2108 if (host_addr
== (void *)-1) {
2109 ret
= get_errno((long)host_addr
);
2112 raddr
= h2g((unsigned long)host_addr
);
2113 /* find out the length of the shared memory segment */
2115 ret
= get_errno(shmctl(first
, IPC_STAT
, &shm_info
));
2116 if (is_error(ret
)) {
2117 /* can't get length, bail out */
2121 page_set_flags(raddr
, raddr
+ shm_info
.shm_segsz
,
2122 PAGE_VALID
| PAGE_READ
|
2123 ((second
& SHM_RDONLY
)? 0: PAGE_WRITE
));
2124 for (i
= 0; i
< N_SHM_REGIONS
; ++i
) {
2125 if (shm_regions
[i
].start
== 0) {
2126 shm_regions
[i
].start
= raddr
;
2127 shm_regions
[i
].size
= shm_info
.shm_segsz
;
2131 if (put_user_ual(raddr
, third
))
2132 return -TARGET_EFAULT
;
2137 for (i
= 0; i
< N_SHM_REGIONS
; ++i
) {
2138 if (shm_regions
[i
].start
== ptr
) {
2139 shm_regions
[i
].start
= 0;
2140 page_set_flags(ptr
, shm_regions
[i
].size
, 0);
2144 ret
= get_errno(shmdt((void *)g2h(ptr
)));
2148 /* IPC_* flag values are the same on all linux platforms */
2149 ret
= get_errno(shmget(first
, second
, third
));
2152 /* IPC_* and SHM_* command values are the same on all linux platforms */
2158 ret
= get_errno(shmctl(first
, second
, NULL
));
2166 gemu_log("Unsupported ipc call: %d (version %d)\n", call
, version
);
2167 ret
= -TARGET_ENOSYS
;
2174 /* kernel structure types definitions */
2177 #define STRUCT(name, list...) STRUCT_ ## name,
2178 #define STRUCT_SPECIAL(name) STRUCT_ ## name,
2180 #include "syscall_types.h"
2183 #undef STRUCT_SPECIAL
2185 #define STRUCT(name, list...) static const argtype struct_ ## name ## _def[] = { list, TYPE_NULL };
2186 #define STRUCT_SPECIAL(name)
2187 #include "syscall_types.h"
2189 #undef STRUCT_SPECIAL
2191 typedef struct IOCTLEntry
{
2192 unsigned int target_cmd
;
2193 unsigned int host_cmd
;
2196 const argtype arg_type
[5];
2199 #define IOC_R 0x0001
2200 #define IOC_W 0x0002
2201 #define IOC_RW (IOC_R | IOC_W)
2203 #define MAX_STRUCT_SIZE 4096
2205 static IOCTLEntry ioctl_entries
[] = {
2206 #define IOCTL(cmd, access, types...) \
2207 { TARGET_ ## cmd, cmd, #cmd, access, { types } },
2212 /* ??? Implement proper locking for ioctls. */
2213 /* do_ioctl() Must return target values and target errnos. */
2214 static abi_long
do_ioctl(int fd
, abi_long cmd
, abi_long arg
)
2216 const IOCTLEntry
*ie
;
2217 const argtype
*arg_type
;
2219 uint8_t buf_temp
[MAX_STRUCT_SIZE
];
2225 if (ie
->target_cmd
== 0) {
2226 gemu_log("Unsupported ioctl: cmd=0x%04lx\n", (long)cmd
);
2227 return -TARGET_ENOSYS
;
2229 if (ie
->target_cmd
== cmd
)
2233 arg_type
= ie
->arg_type
;
2235 gemu_log("ioctl: cmd=0x%04lx (%s)\n", (long)cmd
, ie
->name
);
2237 switch(arg_type
[0]) {
2240 ret
= get_errno(ioctl(fd
, ie
->host_cmd
));
2245 ret
= get_errno(ioctl(fd
, ie
->host_cmd
, arg
));
2249 target_size
= thunk_type_size(arg_type
, 0);
2250 switch(ie
->access
) {
2252 ret
= get_errno(ioctl(fd
, ie
->host_cmd
, buf_temp
));
2253 if (!is_error(ret
)) {
2254 argptr
= lock_user(VERIFY_WRITE
, arg
, target_size
, 0);
2256 return -TARGET_EFAULT
;
2257 thunk_convert(argptr
, buf_temp
, arg_type
, THUNK_TARGET
);
2258 unlock_user(argptr
, arg
, target_size
);
2262 argptr
= lock_user(VERIFY_READ
, arg
, target_size
, 1);
2264 return -TARGET_EFAULT
;
2265 thunk_convert(buf_temp
, argptr
, arg_type
, THUNK_HOST
);
2266 unlock_user(argptr
, arg
, 0);
2267 ret
= get_errno(ioctl(fd
, ie
->host_cmd
, buf_temp
));
2271 argptr
= lock_user(VERIFY_READ
, arg
, target_size
, 1);
2273 return -TARGET_EFAULT
;
2274 thunk_convert(buf_temp
, argptr
, arg_type
, THUNK_HOST
);
2275 unlock_user(argptr
, arg
, 0);
2276 ret
= get_errno(ioctl(fd
, ie
->host_cmd
, buf_temp
));
2277 if (!is_error(ret
)) {
2278 argptr
= lock_user(VERIFY_WRITE
, arg
, target_size
, 0);
2280 return -TARGET_EFAULT
;
2281 thunk_convert(argptr
, buf_temp
, arg_type
, THUNK_TARGET
);
2282 unlock_user(argptr
, arg
, target_size
);
2288 gemu_log("Unsupported ioctl type: cmd=0x%04lx type=%d\n",
2289 (long)cmd
, arg_type
[0]);
2290 ret
= -TARGET_ENOSYS
;
2296 static const bitmask_transtbl iflag_tbl
[] = {
2297 { TARGET_IGNBRK
, TARGET_IGNBRK
, IGNBRK
, IGNBRK
},
2298 { TARGET_BRKINT
, TARGET_BRKINT
, BRKINT
, BRKINT
},
2299 { TARGET_IGNPAR
, TARGET_IGNPAR
, IGNPAR
, IGNPAR
},
2300 { TARGET_PARMRK
, TARGET_PARMRK
, PARMRK
, PARMRK
},
2301 { TARGET_INPCK
, TARGET_INPCK
, INPCK
, INPCK
},
2302 { TARGET_ISTRIP
, TARGET_ISTRIP
, ISTRIP
, ISTRIP
},
2303 { TARGET_INLCR
, TARGET_INLCR
, INLCR
, INLCR
},
2304 { TARGET_IGNCR
, TARGET_IGNCR
, IGNCR
, IGNCR
},
2305 { TARGET_ICRNL
, TARGET_ICRNL
, ICRNL
, ICRNL
},
2306 { TARGET_IUCLC
, TARGET_IUCLC
, IUCLC
, IUCLC
},
2307 { TARGET_IXON
, TARGET_IXON
, IXON
, IXON
},
2308 { TARGET_IXANY
, TARGET_IXANY
, IXANY
, IXANY
},
2309 { TARGET_IXOFF
, TARGET_IXOFF
, IXOFF
, IXOFF
},
2310 { TARGET_IMAXBEL
, TARGET_IMAXBEL
, IMAXBEL
, IMAXBEL
},
2314 static const bitmask_transtbl oflag_tbl
[] = {
2315 { TARGET_OPOST
, TARGET_OPOST
, OPOST
, OPOST
},
2316 { TARGET_OLCUC
, TARGET_OLCUC
, OLCUC
, OLCUC
},
2317 { TARGET_ONLCR
, TARGET_ONLCR
, ONLCR
, ONLCR
},
2318 { TARGET_OCRNL
, TARGET_OCRNL
, OCRNL
, OCRNL
},
2319 { TARGET_ONOCR
, TARGET_ONOCR
, ONOCR
, ONOCR
},
2320 { TARGET_ONLRET
, TARGET_ONLRET
, ONLRET
, ONLRET
},
2321 { TARGET_OFILL
, TARGET_OFILL
, OFILL
, OFILL
},
2322 { TARGET_OFDEL
, TARGET_OFDEL
, OFDEL
, OFDEL
},
2323 { TARGET_NLDLY
, TARGET_NL0
, NLDLY
, NL0
},
2324 { TARGET_NLDLY
, TARGET_NL1
, NLDLY
, NL1
},
2325 { TARGET_CRDLY
, TARGET_CR0
, CRDLY
, CR0
},
2326 { TARGET_CRDLY
, TARGET_CR1
, CRDLY
, CR1
},
2327 { TARGET_CRDLY
, TARGET_CR2
, CRDLY
, CR2
},
2328 { TARGET_CRDLY
, TARGET_CR3
, CRDLY
, CR3
},
2329 { TARGET_TABDLY
, TARGET_TAB0
, TABDLY
, TAB0
},
2330 { TARGET_TABDLY
, TARGET_TAB1
, TABDLY
, TAB1
},
2331 { TARGET_TABDLY
, TARGET_TAB2
, TABDLY
, TAB2
},
2332 { TARGET_TABDLY
, TARGET_TAB3
, TABDLY
, TAB3
},
2333 { TARGET_BSDLY
, TARGET_BS0
, BSDLY
, BS0
},
2334 { TARGET_BSDLY
, TARGET_BS1
, BSDLY
, BS1
},
2335 { TARGET_VTDLY
, TARGET_VT0
, VTDLY
, VT0
},
2336 { TARGET_VTDLY
, TARGET_VT1
, VTDLY
, VT1
},
2337 { TARGET_FFDLY
, TARGET_FF0
, FFDLY
, FF0
},
2338 { TARGET_FFDLY
, TARGET_FF1
, FFDLY
, FF1
},
2342 static const bitmask_transtbl cflag_tbl
[] = {
2343 { TARGET_CBAUD
, TARGET_B0
, CBAUD
, B0
},
2344 { TARGET_CBAUD
, TARGET_B50
, CBAUD
, B50
},
2345 { TARGET_CBAUD
, TARGET_B75
, CBAUD
, B75
},
2346 { TARGET_CBAUD
, TARGET_B110
, CBAUD
, B110
},
2347 { TARGET_CBAUD
, TARGET_B134
, CBAUD
, B134
},
2348 { TARGET_CBAUD
, TARGET_B150
, CBAUD
, B150
},
2349 { TARGET_CBAUD
, TARGET_B200
, CBAUD
, B200
},
2350 { TARGET_CBAUD
, TARGET_B300
, CBAUD
, B300
},
2351 { TARGET_CBAUD
, TARGET_B600
, CBAUD
, B600
},
2352 { TARGET_CBAUD
, TARGET_B1200
, CBAUD
, B1200
},
2353 { TARGET_CBAUD
, TARGET_B1800
, CBAUD
, B1800
},
2354 { TARGET_CBAUD
, TARGET_B2400
, CBAUD
, B2400
},
2355 { TARGET_CBAUD
, TARGET_B4800
, CBAUD
, B4800
},
2356 { TARGET_CBAUD
, TARGET_B9600
, CBAUD
, B9600
},
2357 { TARGET_CBAUD
, TARGET_B19200
, CBAUD
, B19200
},
2358 { TARGET_CBAUD
, TARGET_B38400
, CBAUD
, B38400
},
2359 { TARGET_CBAUD
, TARGET_B57600
, CBAUD
, B57600
},
2360 { TARGET_CBAUD
, TARGET_B115200
, CBAUD
, B115200
},
2361 { TARGET_CBAUD
, TARGET_B230400
, CBAUD
, B230400
},
2362 { TARGET_CBAUD
, TARGET_B460800
, CBAUD
, B460800
},
2363 { TARGET_CSIZE
, TARGET_CS5
, CSIZE
, CS5
},
2364 { TARGET_CSIZE
, TARGET_CS6
, CSIZE
, CS6
},
2365 { TARGET_CSIZE
, TARGET_CS7
, CSIZE
, CS7
},
2366 { TARGET_CSIZE
, TARGET_CS8
, CSIZE
, CS8
},
2367 { TARGET_CSTOPB
, TARGET_CSTOPB
, CSTOPB
, CSTOPB
},
2368 { TARGET_CREAD
, TARGET_CREAD
, CREAD
, CREAD
},
2369 { TARGET_PARENB
, TARGET_PARENB
, PARENB
, PARENB
},
2370 { TARGET_PARODD
, TARGET_PARODD
, PARODD
, PARODD
},
2371 { TARGET_HUPCL
, TARGET_HUPCL
, HUPCL
, HUPCL
},
2372 { TARGET_CLOCAL
, TARGET_CLOCAL
, CLOCAL
, CLOCAL
},
2373 { TARGET_CRTSCTS
, TARGET_CRTSCTS
, CRTSCTS
, CRTSCTS
},
2377 static const bitmask_transtbl lflag_tbl
[] = {
2378 { TARGET_ISIG
, TARGET_ISIG
, ISIG
, ISIG
},
2379 { TARGET_ICANON
, TARGET_ICANON
, ICANON
, ICANON
},
2380 { TARGET_XCASE
, TARGET_XCASE
, XCASE
, XCASE
},
2381 { TARGET_ECHO
, TARGET_ECHO
, ECHO
, ECHO
},
2382 { TARGET_ECHOE
, TARGET_ECHOE
, ECHOE
, ECHOE
},
2383 { TARGET_ECHOK
, TARGET_ECHOK
, ECHOK
, ECHOK
},
2384 { TARGET_ECHONL
, TARGET_ECHONL
, ECHONL
, ECHONL
},
2385 { TARGET_NOFLSH
, TARGET_NOFLSH
, NOFLSH
, NOFLSH
},
2386 { TARGET_TOSTOP
, TARGET_TOSTOP
, TOSTOP
, TOSTOP
},
2387 { TARGET_ECHOCTL
, TARGET_ECHOCTL
, ECHOCTL
, ECHOCTL
},
2388 { TARGET_ECHOPRT
, TARGET_ECHOPRT
, ECHOPRT
, ECHOPRT
},
2389 { TARGET_ECHOKE
, TARGET_ECHOKE
, ECHOKE
, ECHOKE
},
2390 { TARGET_FLUSHO
, TARGET_FLUSHO
, FLUSHO
, FLUSHO
},
2391 { TARGET_PENDIN
, TARGET_PENDIN
, PENDIN
, PENDIN
},
2392 { TARGET_IEXTEN
, TARGET_IEXTEN
, IEXTEN
, IEXTEN
},
2396 static void target_to_host_termios (void *dst
, const void *src
)
2398 struct host_termios
*host
= dst
;
2399 const struct target_termios
*target
= src
;
2402 target_to_host_bitmask(tswap32(target
->c_iflag
), iflag_tbl
);
2404 target_to_host_bitmask(tswap32(target
->c_oflag
), oflag_tbl
);
2406 target_to_host_bitmask(tswap32(target
->c_cflag
), cflag_tbl
);
2408 target_to_host_bitmask(tswap32(target
->c_lflag
), lflag_tbl
);
2409 host
->c_line
= target
->c_line
;
2411 host
->c_cc
[VINTR
] = target
->c_cc
[TARGET_VINTR
];
2412 host
->c_cc
[VQUIT
] = target
->c_cc
[TARGET_VQUIT
];
2413 host
->c_cc
[VERASE
] = target
->c_cc
[TARGET_VERASE
];
2414 host
->c_cc
[VKILL
] = target
->c_cc
[TARGET_VKILL
];
2415 host
->c_cc
[VEOF
] = target
->c_cc
[TARGET_VEOF
];
2416 host
->c_cc
[VTIME
] = target
->c_cc
[TARGET_VTIME
];
2417 host
->c_cc
[VMIN
] = target
->c_cc
[TARGET_VMIN
];
2418 host
->c_cc
[VSWTC
] = target
->c_cc
[TARGET_VSWTC
];
2419 host
->c_cc
[VSTART
] = target
->c_cc
[TARGET_VSTART
];
2420 host
->c_cc
[VSTOP
] = target
->c_cc
[TARGET_VSTOP
];
2421 host
->c_cc
[VSUSP
] = target
->c_cc
[TARGET_VSUSP
];
2422 host
->c_cc
[VEOL
] = target
->c_cc
[TARGET_VEOL
];
2423 host
->c_cc
[VREPRINT
] = target
->c_cc
[TARGET_VREPRINT
];
2424 host
->c_cc
[VDISCARD
] = target
->c_cc
[TARGET_VDISCARD
];
2425 host
->c_cc
[VWERASE
] = target
->c_cc
[TARGET_VWERASE
];
2426 host
->c_cc
[VLNEXT
] = target
->c_cc
[TARGET_VLNEXT
];
2427 host
->c_cc
[VEOL2
] = target
->c_cc
[TARGET_VEOL2
];
2430 static void host_to_target_termios (void *dst
, const void *src
)
2432 struct target_termios
*target
= dst
;
2433 const struct host_termios
*host
= src
;
2436 tswap32(host_to_target_bitmask(host
->c_iflag
, iflag_tbl
));
2438 tswap32(host_to_target_bitmask(host
->c_oflag
, oflag_tbl
));
2440 tswap32(host_to_target_bitmask(host
->c_cflag
, cflag_tbl
));
2442 tswap32(host_to_target_bitmask(host
->c_lflag
, lflag_tbl
));
2443 target
->c_line
= host
->c_line
;
2445 target
->c_cc
[TARGET_VINTR
] = host
->c_cc
[VINTR
];
2446 target
->c_cc
[TARGET_VQUIT
] = host
->c_cc
[VQUIT
];
2447 target
->c_cc
[TARGET_VERASE
] = host
->c_cc
[VERASE
];
2448 target
->c_cc
[TARGET_VKILL
] = host
->c_cc
[VKILL
];
2449 target
->c_cc
[TARGET_VEOF
] = host
->c_cc
[VEOF
];
2450 target
->c_cc
[TARGET_VTIME
] = host
->c_cc
[VTIME
];
2451 target
->c_cc
[TARGET_VMIN
] = host
->c_cc
[VMIN
];
2452 target
->c_cc
[TARGET_VSWTC
] = host
->c_cc
[VSWTC
];
2453 target
->c_cc
[TARGET_VSTART
] = host
->c_cc
[VSTART
];
2454 target
->c_cc
[TARGET_VSTOP
] = host
->c_cc
[VSTOP
];
2455 target
->c_cc
[TARGET_VSUSP
] = host
->c_cc
[VSUSP
];
2456 target
->c_cc
[TARGET_VEOL
] = host
->c_cc
[VEOL
];
2457 target
->c_cc
[TARGET_VREPRINT
] = host
->c_cc
[VREPRINT
];
2458 target
->c_cc
[TARGET_VDISCARD
] = host
->c_cc
[VDISCARD
];
2459 target
->c_cc
[TARGET_VWERASE
] = host
->c_cc
[VWERASE
];
2460 target
->c_cc
[TARGET_VLNEXT
] = host
->c_cc
[VLNEXT
];
2461 target
->c_cc
[TARGET_VEOL2
] = host
->c_cc
[VEOL2
];
2464 static const StructEntry struct_termios_def
= {
2465 .convert
= { host_to_target_termios
, target_to_host_termios
},
2466 .size
= { sizeof(struct target_termios
), sizeof(struct host_termios
) },
2467 .align
= { __alignof__(struct target_termios
), __alignof__(struct host_termios
) },
2470 static bitmask_transtbl mmap_flags_tbl
[] = {
2471 { TARGET_MAP_SHARED
, TARGET_MAP_SHARED
, MAP_SHARED
, MAP_SHARED
},
2472 { TARGET_MAP_PRIVATE
, TARGET_MAP_PRIVATE
, MAP_PRIVATE
, MAP_PRIVATE
},
2473 { TARGET_MAP_FIXED
, TARGET_MAP_FIXED
, MAP_FIXED
, MAP_FIXED
},
2474 { TARGET_MAP_ANONYMOUS
, TARGET_MAP_ANONYMOUS
, MAP_ANONYMOUS
, MAP_ANONYMOUS
},
2475 { TARGET_MAP_GROWSDOWN
, TARGET_MAP_GROWSDOWN
, MAP_GROWSDOWN
, MAP_GROWSDOWN
},
2476 { TARGET_MAP_DENYWRITE
, TARGET_MAP_DENYWRITE
, MAP_DENYWRITE
, MAP_DENYWRITE
},
2477 { TARGET_MAP_EXECUTABLE
, TARGET_MAP_EXECUTABLE
, MAP_EXECUTABLE
, MAP_EXECUTABLE
},
2478 { TARGET_MAP_LOCKED
, TARGET_MAP_LOCKED
, MAP_LOCKED
, MAP_LOCKED
},
2482 static bitmask_transtbl fcntl_flags_tbl
[] = {
2483 { TARGET_O_ACCMODE
, TARGET_O_WRONLY
, O_ACCMODE
, O_WRONLY
, },
2484 { TARGET_O_ACCMODE
, TARGET_O_RDWR
, O_ACCMODE
, O_RDWR
, },
2485 { TARGET_O_CREAT
, TARGET_O_CREAT
, O_CREAT
, O_CREAT
, },
2486 { TARGET_O_EXCL
, TARGET_O_EXCL
, O_EXCL
, O_EXCL
, },
2487 { TARGET_O_NOCTTY
, TARGET_O_NOCTTY
, O_NOCTTY
, O_NOCTTY
, },
2488 { TARGET_O_TRUNC
, TARGET_O_TRUNC
, O_TRUNC
, O_TRUNC
, },
2489 { TARGET_O_APPEND
, TARGET_O_APPEND
, O_APPEND
, O_APPEND
, },
2490 { TARGET_O_NONBLOCK
, TARGET_O_NONBLOCK
, O_NONBLOCK
, O_NONBLOCK
, },
2491 { TARGET_O_SYNC
, TARGET_O_SYNC
, O_SYNC
, O_SYNC
, },
2492 { TARGET_FASYNC
, TARGET_FASYNC
, FASYNC
, FASYNC
, },
2493 { TARGET_O_DIRECTORY
, TARGET_O_DIRECTORY
, O_DIRECTORY
, O_DIRECTORY
, },
2494 { TARGET_O_NOFOLLOW
, TARGET_O_NOFOLLOW
, O_NOFOLLOW
, O_NOFOLLOW
, },
2495 { TARGET_O_LARGEFILE
, TARGET_O_LARGEFILE
, O_LARGEFILE
, O_LARGEFILE
, },
2496 #if defined(O_DIRECT)
2497 { TARGET_O_DIRECT
, TARGET_O_DIRECT
, O_DIRECT
, O_DIRECT
, },
2502 #if defined(TARGET_I386)
2504 /* NOTE: there is really one LDT for all the threads */
2505 static uint8_t *ldt_table
;
2507 static abi_long
read_ldt(abi_ulong ptr
, unsigned long bytecount
)
2514 size
= TARGET_LDT_ENTRIES
* TARGET_LDT_ENTRY_SIZE
;
2515 if (size
> bytecount
)
2517 p
= lock_user(VERIFY_WRITE
, ptr
, size
, 0);
2519 return -TARGET_EFAULT
;
2520 /* ??? Should this by byteswapped? */
2521 memcpy(p
, ldt_table
, size
);
2522 unlock_user(p
, ptr
, size
);
2526 /* XXX: add locking support */
2527 static abi_long
write_ldt(CPUX86State
*env
,
2528 abi_ulong ptr
, unsigned long bytecount
, int oldmode
)
2530 struct target_modify_ldt_ldt_s ldt_info
;
2531 struct target_modify_ldt_ldt_s
*target_ldt_info
;
2532 int seg_32bit
, contents
, read_exec_only
, limit_in_pages
;
2533 int seg_not_present
, useable
, lm
;
2534 uint32_t *lp
, entry_1
, entry_2
;
2536 if (bytecount
!= sizeof(ldt_info
))
2537 return -TARGET_EINVAL
;
2538 if (!lock_user_struct(VERIFY_READ
, target_ldt_info
, ptr
, 1))
2539 return -TARGET_EFAULT
;
2540 ldt_info
.entry_number
= tswap32(target_ldt_info
->entry_number
);
2541 ldt_info
.base_addr
= tswapl(target_ldt_info
->base_addr
);
2542 ldt_info
.limit
= tswap32(target_ldt_info
->limit
);
2543 ldt_info
.flags
= tswap32(target_ldt_info
->flags
);
2544 unlock_user_struct(target_ldt_info
, ptr
, 0);
2546 if (ldt_info
.entry_number
>= TARGET_LDT_ENTRIES
)
2547 return -TARGET_EINVAL
;
2548 seg_32bit
= ldt_info
.flags
& 1;
2549 contents
= (ldt_info
.flags
>> 1) & 3;
2550 read_exec_only
= (ldt_info
.flags
>> 3) & 1;
2551 limit_in_pages
= (ldt_info
.flags
>> 4) & 1;
2552 seg_not_present
= (ldt_info
.flags
>> 5) & 1;
2553 useable
= (ldt_info
.flags
>> 6) & 1;
2557 lm
= (ldt_info
.flags
>> 7) & 1;
2559 if (contents
== 3) {
2561 return -TARGET_EINVAL
;
2562 if (seg_not_present
== 0)
2563 return -TARGET_EINVAL
;
2565 /* allocate the LDT */
2567 ldt_table
= malloc(TARGET_LDT_ENTRIES
* TARGET_LDT_ENTRY_SIZE
);
2569 return -TARGET_ENOMEM
;
2570 memset(ldt_table
, 0, TARGET_LDT_ENTRIES
* TARGET_LDT_ENTRY_SIZE
);
2571 env
->ldt
.base
= h2g((unsigned long)ldt_table
);
2572 env
->ldt
.limit
= 0xffff;
2575 /* NOTE: same code as Linux kernel */
2576 /* Allow LDTs to be cleared by the user. */
2577 if (ldt_info
.base_addr
== 0 && ldt_info
.limit
== 0) {
2580 read_exec_only
== 1 &&
2582 limit_in_pages
== 0 &&
2583 seg_not_present
== 1 &&
2591 entry_1
= ((ldt_info
.base_addr
& 0x0000ffff) << 16) |
2592 (ldt_info
.limit
& 0x0ffff);
2593 entry_2
= (ldt_info
.base_addr
& 0xff000000) |
2594 ((ldt_info
.base_addr
& 0x00ff0000) >> 16) |
2595 (ldt_info
.limit
& 0xf0000) |
2596 ((read_exec_only
^ 1) << 9) |
2598 ((seg_not_present
^ 1) << 15) |
2600 (limit_in_pages
<< 23) |
2604 entry_2
|= (useable
<< 20);
2606 /* Install the new entry ... */
2608 lp
= (uint32_t *)(ldt_table
+ (ldt_info
.entry_number
<< 3));
2609 lp
[0] = tswap32(entry_1
);
2610 lp
[1] = tswap32(entry_2
);
2614 /* specific and weird i386 syscalls */
2615 static abi_long
do_modify_ldt(CPUX86State
*env
, int func
, abi_ulong ptr
,
2616 unsigned long bytecount
)
2622 ret
= read_ldt(ptr
, bytecount
);
2625 ret
= write_ldt(env
, ptr
, bytecount
, 1);
2628 ret
= write_ldt(env
, ptr
, bytecount
, 0);
2631 ret
= -TARGET_ENOSYS
;
2637 #if defined(TARGET_I386) && defined(TARGET_ABI32)
2638 static abi_long
do_set_thread_area(CPUX86State
*env
, abi_ulong ptr
)
2640 uint64_t *gdt_table
= g2h(env
->gdt
.base
);
2641 struct target_modify_ldt_ldt_s ldt_info
;
2642 struct target_modify_ldt_ldt_s
*target_ldt_info
;
2643 int seg_32bit
, contents
, read_exec_only
, limit_in_pages
;
2644 int seg_not_present
, useable
, lm
;
2645 uint32_t *lp
, entry_1
, entry_2
;
2648 lock_user_struct(VERIFY_WRITE
, target_ldt_info
, ptr
, 1);
2649 if (!target_ldt_info
)
2650 return -TARGET_EFAULT
;
2651 ldt_info
.entry_number
= tswap32(target_ldt_info
->entry_number
);
2652 ldt_info
.base_addr
= tswapl(target_ldt_info
->base_addr
);
2653 ldt_info
.limit
= tswap32(target_ldt_info
->limit
);
2654 ldt_info
.flags
= tswap32(target_ldt_info
->flags
);
2655 if (ldt_info
.entry_number
== -1) {
2656 for (i
=TARGET_GDT_ENTRY_TLS_MIN
; i
<=TARGET_GDT_ENTRY_TLS_MAX
; i
++) {
2657 if (gdt_table
[i
] == 0) {
2658 ldt_info
.entry_number
= i
;
2659 target_ldt_info
->entry_number
= tswap32(i
);
2664 unlock_user_struct(target_ldt_info
, ptr
, 1);
2666 if (ldt_info
.entry_number
< TARGET_GDT_ENTRY_TLS_MIN
||
2667 ldt_info
.entry_number
> TARGET_GDT_ENTRY_TLS_MAX
)
2668 return -TARGET_EINVAL
;
2669 seg_32bit
= ldt_info
.flags
& 1;
2670 contents
= (ldt_info
.flags
>> 1) & 3;
2671 read_exec_only
= (ldt_info
.flags
>> 3) & 1;
2672 limit_in_pages
= (ldt_info
.flags
>> 4) & 1;
2673 seg_not_present
= (ldt_info
.flags
>> 5) & 1;
2674 useable
= (ldt_info
.flags
>> 6) & 1;
2678 lm
= (ldt_info
.flags
>> 7) & 1;
2681 if (contents
== 3) {
2682 if (seg_not_present
== 0)
2683 return -TARGET_EINVAL
;
2686 /* NOTE: same code as Linux kernel */
2687 /* Allow LDTs to be cleared by the user. */
2688 if (ldt_info
.base_addr
== 0 && ldt_info
.limit
== 0) {
2689 if ((contents
== 0 &&
2690 read_exec_only
== 1 &&
2692 limit_in_pages
== 0 &&
2693 seg_not_present
== 1 &&
2701 entry_1
= ((ldt_info
.base_addr
& 0x0000ffff) << 16) |
2702 (ldt_info
.limit
& 0x0ffff);
2703 entry_2
= (ldt_info
.base_addr
& 0xff000000) |
2704 ((ldt_info
.base_addr
& 0x00ff0000) >> 16) |
2705 (ldt_info
.limit
& 0xf0000) |
2706 ((read_exec_only
^ 1) << 9) |
2708 ((seg_not_present
^ 1) << 15) |
2710 (limit_in_pages
<< 23) |
2715 /* Install the new entry ... */
2717 lp
= (uint32_t *)(gdt_table
+ ldt_info
.entry_number
);
2718 lp
[0] = tswap32(entry_1
);
2719 lp
[1] = tswap32(entry_2
);
2723 static abi_long
do_get_thread_area(CPUX86State
*env
, abi_ulong ptr
)
2725 struct target_modify_ldt_ldt_s
*target_ldt_info
;
2726 uint64_t *gdt_table
= g2h(env
->gdt
.base
);
2727 uint32_t base_addr
, limit
, flags
;
2728 int seg_32bit
, contents
, read_exec_only
, limit_in_pages
, idx
;
2729 int seg_not_present
, useable
, lm
;
2730 uint32_t *lp
, entry_1
, entry_2
;
2732 lock_user_struct(VERIFY_WRITE
, target_ldt_info
, ptr
, 1);
2733 if (!target_ldt_info
)
2734 return -TARGET_EFAULT
;
2735 idx
= tswap32(target_ldt_info
->entry_number
);
2736 if (idx
< TARGET_GDT_ENTRY_TLS_MIN
||
2737 idx
> TARGET_GDT_ENTRY_TLS_MAX
) {
2738 unlock_user_struct(target_ldt_info
, ptr
, 1);
2739 return -TARGET_EINVAL
;
2741 lp
= (uint32_t *)(gdt_table
+ idx
);
2742 entry_1
= tswap32(lp
[0]);
2743 entry_2
= tswap32(lp
[1]);
2745 read_exec_only
= ((entry_2
>> 9) & 1) ^ 1;
2746 contents
= (entry_2
>> 10) & 3;
2747 seg_not_present
= ((entry_2
>> 15) & 1) ^ 1;
2748 seg_32bit
= (entry_2
>> 22) & 1;
2749 limit_in_pages
= (entry_2
>> 23) & 1;
2750 useable
= (entry_2
>> 20) & 1;
2754 lm
= (entry_2
>> 21) & 1;
2756 flags
= (seg_32bit
<< 0) | (contents
<< 1) |
2757 (read_exec_only
<< 3) | (limit_in_pages
<< 4) |
2758 (seg_not_present
<< 5) | (useable
<< 6) | (lm
<< 7);
2759 limit
= (entry_1
& 0xffff) | (entry_2
& 0xf0000);
2760 base_addr
= (entry_1
>> 16) |
2761 (entry_2
& 0xff000000) |
2762 ((entry_2
& 0xff) << 16);
2763 target_ldt_info
->base_addr
= tswapl(base_addr
);
2764 target_ldt_info
->limit
= tswap32(limit
);
2765 target_ldt_info
->flags
= tswap32(flags
);
2766 unlock_user_struct(target_ldt_info
, ptr
, 1);
2769 #endif /* TARGET_I386 && TARGET_ABI32 */
2771 #ifndef TARGET_ABI32
2772 static abi_long
do_arch_prctl(CPUX86State
*env
, int code
, abi_ulong addr
)
2779 case TARGET_ARCH_SET_GS
:
2780 case TARGET_ARCH_SET_FS
:
2781 if (code
== TARGET_ARCH_SET_GS
)
2785 cpu_x86_load_seg(env
, idx
, 0);
2786 env
->segs
[idx
].base
= addr
;
2788 case TARGET_ARCH_GET_GS
:
2789 case TARGET_ARCH_GET_FS
:
2790 if (code
== TARGET_ARCH_GET_GS
)
2794 val
= env
->segs
[idx
].base
;
2795 if (put_user(val
, addr
, abi_ulong
))
2796 return -TARGET_EFAULT
;
2799 ret
= -TARGET_EINVAL
;
2806 #endif /* defined(TARGET_I386) */
2808 #if defined(USE_NPTL)
2810 #define NEW_STACK_SIZE PTHREAD_STACK_MIN
2812 static pthread_mutex_t clone_lock
= PTHREAD_MUTEX_INITIALIZER
;
2815 pthread_mutex_t mutex
;
2816 pthread_cond_t cond
;
2819 abi_ulong child_tidptr
;
2820 abi_ulong parent_tidptr
;
2824 static void *clone_func(void *arg
)
2826 new_thread_info
*info
= arg
;
2831 info
->tid
= gettid();
2832 if (info
->child_tidptr
)
2833 put_user_u32(info
->tid
, info
->child_tidptr
);
2834 if (info
->parent_tidptr
)
2835 put_user_u32(info
->tid
, info
->parent_tidptr
);
2836 /* Enable signals. */
2837 sigprocmask(SIG_SETMASK
, &info
->sigmask
, NULL
);
2838 /* Signal to the parent that we're ready. */
2839 pthread_mutex_lock(&info
->mutex
);
2840 pthread_cond_broadcast(&info
->cond
);
2841 pthread_mutex_unlock(&info
->mutex
);
2842 /* Wait until the parent has finshed initializing the tls state. */
2843 pthread_mutex_lock(&clone_lock
);
2844 pthread_mutex_unlock(&clone_lock
);
2850 /* this stack is the equivalent of the kernel stack associated with a
2852 #define NEW_STACK_SIZE 8192
2854 static int clone_func(void *arg
)
2856 CPUState
*env
= arg
;
2863 /* do_fork() Must return host values and target errnos (unlike most
2864 do_*() functions). */
2865 static int do_fork(CPUState
*env
, unsigned int flags
, abi_ulong newsp
,
2866 abi_ulong parent_tidptr
, target_ulong newtls
,
2867 abi_ulong child_tidptr
)
2873 #if defined(USE_NPTL)
2874 unsigned int nptl_flags
;
2878 /* Emulate vfork() with fork() */
2879 if (flags
& CLONE_VFORK
)
2880 flags
&= ~(CLONE_VFORK
| CLONE_VM
);
2882 if (flags
& CLONE_VM
) {
2883 #if defined(USE_NPTL)
2884 new_thread_info info
;
2885 pthread_attr_t attr
;
2887 ts
= qemu_mallocz(sizeof(TaskState
) + NEW_STACK_SIZE
);
2888 init_task_state(ts
);
2889 new_stack
= ts
->stack
;
2890 /* we create a new CPU instance. */
2891 new_env
= cpu_copy(env
);
2892 /* Init regs that differ from the parent. */
2893 cpu_clone_regs(new_env
, newsp
);
2894 new_env
->opaque
= ts
;
2895 #if defined(USE_NPTL)
2897 flags
&= ~CLONE_NPTL_FLAGS2
;
2899 /* TODO: Implement CLONE_CHILD_CLEARTID. */
2900 if (nptl_flags
& CLONE_SETTLS
)
2901 cpu_set_tls (new_env
, newtls
);
2903 /* Grab a mutex so that thread setup appears atomic. */
2904 pthread_mutex_lock(&clone_lock
);
2906 memset(&info
, 0, sizeof(info
));
2907 pthread_mutex_init(&info
.mutex
, NULL
);
2908 pthread_mutex_lock(&info
.mutex
);
2909 pthread_cond_init(&info
.cond
, NULL
);
2911 if (nptl_flags
& CLONE_CHILD_SETTID
)
2912 info
.child_tidptr
= child_tidptr
;
2913 if (nptl_flags
& CLONE_PARENT_SETTID
)
2914 info
.parent_tidptr
= parent_tidptr
;
2916 ret
= pthread_attr_init(&attr
);
2917 ret
= pthread_attr_setstack(&attr
, new_stack
, NEW_STACK_SIZE
);
2918 /* It is not safe to deliver signals until the child has finished
2919 initializing, so temporarily block all signals. */
2920 sigfillset(&sigmask
);
2921 sigprocmask(SIG_BLOCK
, &sigmask
, &info
.sigmask
);
2923 ret
= pthread_create(&info
.thread
, &attr
, clone_func
, &info
);
2925 sigprocmask(SIG_SETMASK
, &info
.sigmask
, NULL
);
2926 pthread_attr_destroy(&attr
);
2928 /* Wait for the child to initialize. */
2929 pthread_cond_wait(&info
.cond
, &info
.mutex
);
2931 if (flags
& CLONE_PARENT_SETTID
)
2932 put_user_u32(ret
, parent_tidptr
);
2936 pthread_mutex_unlock(&info
.mutex
);
2937 pthread_cond_destroy(&info
.cond
);
2938 pthread_mutex_destroy(&info
.mutex
);
2939 pthread_mutex_unlock(&clone_lock
);
2941 if (flags
& CLONE_NPTL_FLAGS2
)
2943 /* This is probably going to die very quickly, but do it anyway. */
2945 ret
= __clone2(clone_func
, new_stack
+ NEW_STACK_SIZE
, flags
, new_env
);
2947 ret
= clone(clone_func
, new_stack
+ NEW_STACK_SIZE
, flags
, new_env
);
2951 /* if no CLONE_VM, we consider it is a fork */
2952 if ((flags
& ~(CSIGNAL
| CLONE_NPTL_FLAGS2
)) != 0)
2956 #if defined(USE_NPTL)
2957 /* There is a race condition here. The parent process could
2958 theoretically read the TID in the child process before the child
2959 tid is set. This would require using either ptrace
2960 (not implemented) or having *_tidptr to point at a shared memory
2961 mapping. We can't repeat the spinlock hack used above because
2962 the child process gets its own copy of the lock. */
2964 cpu_clone_regs(env
, newsp
);
2966 /* Child Process. */
2967 if (flags
& CLONE_CHILD_SETTID
)
2968 put_user_u32(gettid(), child_tidptr
);
2969 if (flags
& CLONE_PARENT_SETTID
)
2970 put_user_u32(gettid(), parent_tidptr
);
2971 ts
= (TaskState
*)env
->opaque
;
2972 if (flags
& CLONE_SETTLS
)
2973 cpu_set_tls (env
, newtls
);
2974 /* TODO: Implement CLONE_CHILD_CLEARTID. */
2980 cpu_clone_regs(env
, newsp
);
2987 static abi_long
do_fcntl(int fd
, int cmd
, abi_ulong arg
)
2990 struct target_flock
*target_fl
;
2991 struct flock64 fl64
;
2992 struct target_flock64
*target_fl64
;
2996 case TARGET_F_GETLK
:
2997 if (!lock_user_struct(VERIFY_READ
, target_fl
, arg
, 1))
2998 return -TARGET_EFAULT
;
2999 fl
.l_type
= tswap16(target_fl
->l_type
);
3000 fl
.l_whence
= tswap16(target_fl
->l_whence
);
3001 fl
.l_start
= tswapl(target_fl
->l_start
);
3002 fl
.l_len
= tswapl(target_fl
->l_len
);
3003 fl
.l_pid
= tswapl(target_fl
->l_pid
);
3004 unlock_user_struct(target_fl
, arg
, 0);
3005 ret
= get_errno(fcntl(fd
, cmd
, &fl
));
3007 if (!lock_user_struct(VERIFY_WRITE
, target_fl
, arg
, 0))
3008 return -TARGET_EFAULT
;
3009 target_fl
->l_type
= tswap16(fl
.l_type
);
3010 target_fl
->l_whence
= tswap16(fl
.l_whence
);
3011 target_fl
->l_start
= tswapl(fl
.l_start
);
3012 target_fl
->l_len
= tswapl(fl
.l_len
);
3013 target_fl
->l_pid
= tswapl(fl
.l_pid
);
3014 unlock_user_struct(target_fl
, arg
, 1);
3018 case TARGET_F_SETLK
:
3019 case TARGET_F_SETLKW
:
3020 if (!lock_user_struct(VERIFY_READ
, target_fl
, arg
, 1))
3021 return -TARGET_EFAULT
;
3022 fl
.l_type
= tswap16(target_fl
->l_type
);
3023 fl
.l_whence
= tswap16(target_fl
->l_whence
);
3024 fl
.l_start
= tswapl(target_fl
->l_start
);
3025 fl
.l_len
= tswapl(target_fl
->l_len
);
3026 fl
.l_pid
= tswapl(target_fl
->l_pid
);
3027 unlock_user_struct(target_fl
, arg
, 0);
3028 ret
= get_errno(fcntl(fd
, cmd
, &fl
));
3031 case TARGET_F_GETLK64
:
3032 if (!lock_user_struct(VERIFY_READ
, target_fl64
, arg
, 1))
3033 return -TARGET_EFAULT
;
3034 fl64
.l_type
= tswap16(target_fl64
->l_type
) >> 1;
3035 fl64
.l_whence
= tswap16(target_fl64
->l_whence
);
3036 fl64
.l_start
= tswapl(target_fl64
->l_start
);
3037 fl64
.l_len
= tswapl(target_fl64
->l_len
);
3038 fl64
.l_pid
= tswap16(target_fl64
->l_pid
);
3039 unlock_user_struct(target_fl64
, arg
, 0);
3040 ret
= get_errno(fcntl(fd
, cmd
>> 1, &fl64
));
3042 if (!lock_user_struct(VERIFY_WRITE
, target_fl64
, arg
, 0))
3043 return -TARGET_EFAULT
;
3044 target_fl64
->l_type
= tswap16(fl64
.l_type
) >> 1;
3045 target_fl64
->l_whence
= tswap16(fl64
.l_whence
);
3046 target_fl64
->l_start
= tswapl(fl64
.l_start
);
3047 target_fl64
->l_len
= tswapl(fl64
.l_len
);
3048 target_fl64
->l_pid
= tswapl(fl64
.l_pid
);
3049 unlock_user_struct(target_fl64
, arg
, 1);
3052 case TARGET_F_SETLK64
:
3053 case TARGET_F_SETLKW64
:
3054 if (!lock_user_struct(VERIFY_READ
, target_fl64
, arg
, 1))
3055 return -TARGET_EFAULT
;
3056 fl64
.l_type
= tswap16(target_fl64
->l_type
) >> 1;
3057 fl64
.l_whence
= tswap16(target_fl64
->l_whence
);
3058 fl64
.l_start
= tswapl(target_fl64
->l_start
);
3059 fl64
.l_len
= tswapl(target_fl64
->l_len
);
3060 fl64
.l_pid
= tswap16(target_fl64
->l_pid
);
3061 unlock_user_struct(target_fl64
, arg
, 0);
3062 ret
= get_errno(fcntl(fd
, cmd
>> 1, &fl64
));
3066 ret
= get_errno(fcntl(fd
, cmd
, arg
));
3068 ret
= host_to_target_bitmask(ret
, fcntl_flags_tbl
);
3073 ret
= get_errno(fcntl(fd
, cmd
, target_to_host_bitmask(arg
, fcntl_flags_tbl
)));
3077 ret
= get_errno(fcntl(fd
, cmd
, arg
));
3085 static inline int high2lowuid(int uid
)
3093 static inline int high2lowgid(int gid
)
3101 static inline int low2highuid(int uid
)
3103 if ((int16_t)uid
== -1)
3109 static inline int low2highgid(int gid
)
3111 if ((int16_t)gid
== -1)
3117 #endif /* USE_UID16 */
3119 void syscall_init(void)
3122 const argtype
*arg_type
;
3126 #define STRUCT(name, list...) thunk_register_struct(STRUCT_ ## name, #name, struct_ ## name ## _def);
3127 #define STRUCT_SPECIAL(name) thunk_register_struct_direct(STRUCT_ ## name, #name, &struct_ ## name ## _def);
3128 #include "syscall_types.h"
3130 #undef STRUCT_SPECIAL
3132 /* we patch the ioctl size if necessary. We rely on the fact that
3133 no ioctl has all the bits at '1' in the size field */
3135 while (ie
->target_cmd
!= 0) {
3136 if (((ie
->target_cmd
>> TARGET_IOC_SIZESHIFT
) & TARGET_IOC_SIZEMASK
) ==
3137 TARGET_IOC_SIZEMASK
) {
3138 arg_type
= ie
->arg_type
;
3139 if (arg_type
[0] != TYPE_PTR
) {
3140 fprintf(stderr
, "cannot patch size for ioctl 0x%x\n",
3145 size
= thunk_type_size(arg_type
, 0);
3146 ie
->target_cmd
= (ie
->target_cmd
&
3147 ~(TARGET_IOC_SIZEMASK
<< TARGET_IOC_SIZESHIFT
)) |
3148 (size
<< TARGET_IOC_SIZESHIFT
);
3151 /* Build target_to_host_errno_table[] table from
3152 * host_to_target_errno_table[]. */
3153 for (i
=0; i
< ERRNO_TABLE_SIZE
; i
++)
3154 target_to_host_errno_table
[host_to_target_errno_table
[i
]] = i
;
3156 /* automatic consistency check if same arch */
3157 #if (defined(__i386__) && defined(TARGET_I386) && defined(TARGET_ABI32)) || \
3158 (defined(__x86_64__) && defined(TARGET_X86_64))
3159 if (unlikely(ie
->target_cmd
!= ie
->host_cmd
)) {
3160 fprintf(stderr
, "ERROR: ioctl(%s): target=0x%x host=0x%x\n",
3161 ie
->name
, ie
->target_cmd
, ie
->host_cmd
);
3168 #if TARGET_ABI_BITS == 32
3169 static inline uint64_t target_offset64(uint32_t word0
, uint32_t word1
)
3171 #ifdef TARGET_WORDS_BIGENDIAN
3172 return ((uint64_t)word0
<< 32) | word1
;
3174 return ((uint64_t)word1
<< 32) | word0
;
3177 #else /* TARGET_ABI_BITS == 32 */
3178 static inline uint64_t target_offset64(uint64_t word0
, uint64_t word1
)
3182 #endif /* TARGET_ABI_BITS != 32 */
3184 #ifdef TARGET_NR_truncate64
3185 static inline abi_long
target_truncate64(void *cpu_env
, const char *arg1
,
3191 if (((CPUARMState
*)cpu_env
)->eabi
)
3197 return get_errno(truncate64(arg1
, target_offset64(arg2
, arg3
)));
3201 #ifdef TARGET_NR_ftruncate64
3202 static inline abi_long
target_ftruncate64(void *cpu_env
, abi_long arg1
,
3208 if (((CPUARMState
*)cpu_env
)->eabi
)
3214 return get_errno(ftruncate64(arg1
, target_offset64(arg2
, arg3
)));
3218 static inline abi_long
target_to_host_timespec(struct timespec
*host_ts
,
3219 abi_ulong target_addr
)
3221 struct target_timespec
*target_ts
;
3223 if (!lock_user_struct(VERIFY_READ
, target_ts
, target_addr
, 1))
3224 return -TARGET_EFAULT
;
3225 host_ts
->tv_sec
= tswapl(target_ts
->tv_sec
);
3226 host_ts
->tv_nsec
= tswapl(target_ts
->tv_nsec
);
3227 unlock_user_struct(target_ts
, target_addr
, 0);
3231 static inline abi_long
host_to_target_timespec(abi_ulong target_addr
,
3232 struct timespec
*host_ts
)
3234 struct target_timespec
*target_ts
;
3236 if (!lock_user_struct(VERIFY_WRITE
, target_ts
, target_addr
, 0))
3237 return -TARGET_EFAULT
;
3238 target_ts
->tv_sec
= tswapl(host_ts
->tv_sec
);
3239 target_ts
->tv_nsec
= tswapl(host_ts
->tv_nsec
);
3240 unlock_user_struct(target_ts
, target_addr
, 1);
3244 #ifdef TARGET_NR_stat64
3245 static inline abi_long
host_to_target_stat64(void *cpu_env
,
3246 abi_ulong target_addr
,
3247 struct stat
*host_st
)
3250 if (((CPUARMState
*)cpu_env
)->eabi
) {
3251 struct target_eabi_stat64
*target_st
;
3253 if (!lock_user_struct(VERIFY_WRITE
, target_st
, target_addr
, 0))
3254 return -TARGET_EFAULT
;
3255 memset(target_st
, 0, sizeof(struct target_eabi_stat64
));
3256 __put_user(host_st
->st_dev
, &target_st
->st_dev
);
3257 __put_user(host_st
->st_ino
, &target_st
->st_ino
);
3258 #ifdef TARGET_STAT64_HAS_BROKEN_ST_INO
3259 __put_user(host_st
->st_ino
, &target_st
->__st_ino
);
3261 __put_user(host_st
->st_mode
, &target_st
->st_mode
);
3262 __put_user(host_st
->st_nlink
, &target_st
->st_nlink
);
3263 __put_user(host_st
->st_uid
, &target_st
->st_uid
);
3264 __put_user(host_st
->st_gid
, &target_st
->st_gid
);
3265 __put_user(host_st
->st_rdev
, &target_st
->st_rdev
);
3266 __put_user(host_st
->st_size
, &target_st
->st_size
);
3267 __put_user(host_st
->st_blksize
, &target_st
->st_blksize
);
3268 __put_user(host_st
->st_blocks
, &target_st
->st_blocks
);
3269 __put_user(host_st
->st_atime
, &target_st
->target_st_atime
);
3270 __put_user(host_st
->st_mtime
, &target_st
->target_st_mtime
);
3271 __put_user(host_st
->st_ctime
, &target_st
->target_st_ctime
);
3272 unlock_user_struct(target_st
, target_addr
, 1);
3276 struct target_stat64
*target_st
;
3278 if (!lock_user_struct(VERIFY_WRITE
, target_st
, target_addr
, 0))
3279 return -TARGET_EFAULT
;
3280 memset(target_st
, 0, sizeof(struct target_stat64
));
3281 __put_user(host_st
->st_dev
, &target_st
->st_dev
);
3282 __put_user(host_st
->st_ino
, &target_st
->st_ino
);
3283 #ifdef TARGET_STAT64_HAS_BROKEN_ST_INO
3284 __put_user(host_st
->st_ino
, &target_st
->__st_ino
);
3286 __put_user(host_st
->st_mode
, &target_st
->st_mode
);
3287 __put_user(host_st
->st_nlink
, &target_st
->st_nlink
);
3288 __put_user(host_st
->st_uid
, &target_st
->st_uid
);
3289 __put_user(host_st
->st_gid
, &target_st
->st_gid
);
3290 __put_user(host_st
->st_rdev
, &target_st
->st_rdev
);
3291 /* XXX: better use of kernel struct */
3292 __put_user(host_st
->st_size
, &target_st
->st_size
);
3293 __put_user(host_st
->st_blksize
, &target_st
->st_blksize
);
3294 __put_user(host_st
->st_blocks
, &target_st
->st_blocks
);
3295 __put_user(host_st
->st_atime
, &target_st
->target_st_atime
);
3296 __put_user(host_st
->st_mtime
, &target_st
->target_st_mtime
);
3297 __put_user(host_st
->st_ctime
, &target_st
->target_st_ctime
);
3298 unlock_user_struct(target_st
, target_addr
, 1);
3305 #if defined(USE_NPTL)
3306 /* ??? Using host futex calls even when target atomic operations
3307 are not really atomic probably breaks things. However implementing
3308 futexes locally would make futexes shared between multiple processes
3309 tricky. However they're probably useless because guest atomic
3310 operations won't work either. */
3311 static int do_futex(target_ulong uaddr
, int op
, int val
, target_ulong timeout
,
3312 target_ulong uaddr2
, int val3
)
3314 struct timespec ts
, *pts
;
3316 /* ??? We assume FUTEX_* constants are the same on both host
3322 target_to_host_timespec(pts
, timeout
);
3326 return get_errno(sys_futex(g2h(uaddr
), FUTEX_WAIT
, tswap32(val
),
3329 return get_errno(sys_futex(g2h(uaddr
), FUTEX_WAKE
, val
, NULL
, NULL
, 0));
3331 return get_errno(sys_futex(g2h(uaddr
), FUTEX_FD
, val
, NULL
, NULL
, 0));
3333 return get_errno(sys_futex(g2h(uaddr
), FUTEX_REQUEUE
, val
,
3334 NULL
, g2h(uaddr2
), 0));
3335 case FUTEX_CMP_REQUEUE
:
3336 return get_errno(sys_futex(g2h(uaddr
), FUTEX_CMP_REQUEUE
, val
,
3337 NULL
, g2h(uaddr2
), tswap32(val3
)));
3339 return -TARGET_ENOSYS
;
3344 int get_osversion(void)
3346 static int osversion
;
3347 struct new_utsname buf
;
3352 if (qemu_uname_release
&& *qemu_uname_release
) {
3353 s
= qemu_uname_release
;
3355 if (sys_uname(&buf
))
3360 for (i
= 0; i
< 3; i
++) {
3362 while (*s
>= '0' && *s
<= '9') {
3367 tmp
= (tmp
<< 8) + n
;
3375 /* do_syscall() should always have a single exit point at the end so
3376 that actions, such as logging of syscall results, can be performed.
3377 All errnos that do_syscall() returns must be -TARGET_<errcode>. */
3378 abi_long
do_syscall(void *cpu_env
, int num
, abi_long arg1
,
3379 abi_long arg2
, abi_long arg3
, abi_long arg4
,
3380 abi_long arg5
, abi_long arg6
)
3388 gemu_log("syscall %d", num
);
3391 print_syscall(num
, arg1
, arg2
, arg3
, arg4
, arg5
, arg6
);
3394 case TARGET_NR_exit
:
3398 gdb_exit(cpu_env
, arg1
);
3399 /* XXX: should free thread stack and CPU env */
3401 ret
= 0; /* avoid warning */
3403 case TARGET_NR_read
:
3404 if (!(p
= lock_user(VERIFY_WRITE
, arg2
, arg3
, 0)))
3406 ret
= get_errno(read(arg1
, p
, arg3
));
3407 unlock_user(p
, arg2
, ret
);
3409 case TARGET_NR_write
:
3410 if (!(p
= lock_user(VERIFY_READ
, arg2
, arg3
, 1)))
3412 ret
= get_errno(write(arg1
, p
, arg3
));
3413 unlock_user(p
, arg2
, 0);
3415 case TARGET_NR_open
:
3416 if (!(p
= lock_user_string(arg1
)))
3418 ret
= get_errno(open(path(p
),
3419 target_to_host_bitmask(arg2
, fcntl_flags_tbl
),
3421 unlock_user(p
, arg1
, 0);
3423 #if defined(TARGET_NR_openat) && defined(__NR_openat)
3424 case TARGET_NR_openat
:
3425 if (!(p
= lock_user_string(arg2
)))
3427 ret
= get_errno(sys_openat(arg1
,
3429 target_to_host_bitmask(arg3
, fcntl_flags_tbl
),
3431 unlock_user(p
, arg2
, 0);
3434 case TARGET_NR_close
:
3435 ret
= get_errno(close(arg1
));
3440 case TARGET_NR_fork
:
3441 ret
= get_errno(do_fork(cpu_env
, SIGCHLD
, 0, 0, 0, 0));
3443 #ifdef TARGET_NR_waitpid
3444 case TARGET_NR_waitpid
:
3447 ret
= get_errno(waitpid(arg1
, &status
, arg3
));
3448 if (!is_error(ret
) && arg2
3449 && put_user_s32(status
, arg2
))
3454 #ifdef TARGET_NR_waitid
3455 case TARGET_NR_waitid
:
3459 ret
= get_errno(waitid(arg1
, arg2
, &info
, arg4
));
3460 if (!is_error(ret
) && arg3
&& info
.si_pid
!= 0) {
3461 if (!(p
= lock_user(VERIFY_WRITE
, arg3
, sizeof(target_siginfo_t
), 0)))
3463 host_to_target_siginfo(p
, &info
);
3464 unlock_user(p
, arg3
, sizeof(target_siginfo_t
));
3469 #ifdef TARGET_NR_creat /* not on alpha */
3470 case TARGET_NR_creat
:
3471 if (!(p
= lock_user_string(arg1
)))
3473 ret
= get_errno(creat(p
, arg2
));
3474 unlock_user(p
, arg1
, 0);
3477 case TARGET_NR_link
:
3480 p
= lock_user_string(arg1
);
3481 p2
= lock_user_string(arg2
);
3483 ret
= -TARGET_EFAULT
;
3485 ret
= get_errno(link(p
, p2
));
3486 unlock_user(p2
, arg2
, 0);
3487 unlock_user(p
, arg1
, 0);
3490 #if defined(TARGET_NR_linkat) && defined(__NR_linkat)
3491 case TARGET_NR_linkat
:
3496 p
= lock_user_string(arg2
);
3497 p2
= lock_user_string(arg4
);
3499 ret
= -TARGET_EFAULT
;
3501 ret
= get_errno(sys_linkat(arg1
, p
, arg3
, p2
, arg5
));
3502 unlock_user(p
, arg2
, 0);
3503 unlock_user(p2
, arg4
, 0);
3507 case TARGET_NR_unlink
:
3508 if (!(p
= lock_user_string(arg1
)))
3510 ret
= get_errno(unlink(p
));
3511 unlock_user(p
, arg1
, 0);
3513 #if defined(TARGET_NR_unlinkat) && defined(__NR_unlinkat)
3514 case TARGET_NR_unlinkat
:
3515 if (!(p
= lock_user_string(arg2
)))
3517 ret
= get_errno(sys_unlinkat(arg1
, p
, arg3
));
3518 unlock_user(p
, arg2
, 0);
3521 case TARGET_NR_execve
:
3523 char **argp
, **envp
;
3526 abi_ulong guest_argp
;
3527 abi_ulong guest_envp
;
3533 for (gp
= guest_argp
; gp
; gp
+= sizeof(abi_ulong
)) {
3534 if (get_user_ual(addr
, gp
))
3542 for (gp
= guest_envp
; gp
; gp
+= sizeof(abi_ulong
)) {
3543 if (get_user_ual(addr
, gp
))
3550 argp
= alloca((argc
+ 1) * sizeof(void *));
3551 envp
= alloca((envc
+ 1) * sizeof(void *));
3553 for (gp
= guest_argp
, q
= argp
; gp
;
3554 gp
+= sizeof(abi_ulong
), q
++) {
3555 if (get_user_ual(addr
, gp
))
3559 if (!(*q
= lock_user_string(addr
)))
3564 for (gp
= guest_envp
, q
= envp
; gp
;
3565 gp
+= sizeof(abi_ulong
), q
++) {
3566 if (get_user_ual(addr
, gp
))
3570 if (!(*q
= lock_user_string(addr
)))
3575 if (!(p
= lock_user_string(arg1
)))
3577 ret
= get_errno(execve(p
, argp
, envp
));
3578 unlock_user(p
, arg1
, 0);
3583 ret
= -TARGET_EFAULT
;
3586 for (gp
= guest_argp
, q
= argp
; *q
;
3587 gp
+= sizeof(abi_ulong
), q
++) {
3588 if (get_user_ual(addr
, gp
)
3591 unlock_user(*q
, addr
, 0);
3593 for (gp
= guest_envp
, q
= envp
; *q
;
3594 gp
+= sizeof(abi_ulong
), q
++) {
3595 if (get_user_ual(addr
, gp
)
3598 unlock_user(*q
, addr
, 0);
3602 case TARGET_NR_chdir
:
3603 if (!(p
= lock_user_string(arg1
)))
3605 ret
= get_errno(chdir(p
));
3606 unlock_user(p
, arg1
, 0);
3608 #ifdef TARGET_NR_time
3609 case TARGET_NR_time
:
3612 ret
= get_errno(time(&host_time
));
3615 && put_user_sal(host_time
, arg1
))
3620 case TARGET_NR_mknod
:
3621 if (!(p
= lock_user_string(arg1
)))
3623 ret
= get_errno(mknod(p
, arg2
, arg3
));
3624 unlock_user(p
, arg1
, 0);
3626 #if defined(TARGET_NR_mknodat) && defined(__NR_mknodat)
3627 case TARGET_NR_mknodat
:
3628 if (!(p
= lock_user_string(arg2
)))
3630 ret
= get_errno(sys_mknodat(arg1
, p
, arg3
, arg4
));
3631 unlock_user(p
, arg2
, 0);
3634 case TARGET_NR_chmod
:
3635 if (!(p
= lock_user_string(arg1
)))
3637 ret
= get_errno(chmod(p
, arg2
));
3638 unlock_user(p
, arg1
, 0);
3640 #ifdef TARGET_NR_break
3641 case TARGET_NR_break
:
3644 #ifdef TARGET_NR_oldstat
3645 case TARGET_NR_oldstat
:
3648 case TARGET_NR_lseek
:
3649 ret
= get_errno(lseek(arg1
, arg2
, arg3
));
3651 #ifdef TARGET_NR_getxpid
3652 case TARGET_NR_getxpid
:
3654 case TARGET_NR_getpid
:
3656 ret
= get_errno(getpid());
3658 case TARGET_NR_mount
:
3660 /* need to look at the data field */
3662 p
= lock_user_string(arg1
);
3663 p2
= lock_user_string(arg2
);
3664 p3
= lock_user_string(arg3
);
3665 if (!p
|| !p2
|| !p3
)
3666 ret
= -TARGET_EFAULT
;
3668 /* FIXME - arg5 should be locked, but it isn't clear how to
3669 * do that since it's not guaranteed to be a NULL-terminated
3672 ret
= get_errno(mount(p
, p2
, p3
, (unsigned long)arg4
, g2h(arg5
)));
3673 unlock_user(p
, arg1
, 0);
3674 unlock_user(p2
, arg2
, 0);
3675 unlock_user(p3
, arg3
, 0);
3678 #ifdef TARGET_NR_umount
3679 case TARGET_NR_umount
:
3680 if (!(p
= lock_user_string(arg1
)))
3682 ret
= get_errno(umount(p
));
3683 unlock_user(p
, arg1
, 0);
3686 #ifdef TARGET_NR_stime /* not on alpha */
3687 case TARGET_NR_stime
:
3690 if (get_user_sal(host_time
, arg1
))
3692 ret
= get_errno(stime(&host_time
));
3696 case TARGET_NR_ptrace
:
3698 #ifdef TARGET_NR_alarm /* not on alpha */
3699 case TARGET_NR_alarm
:
3703 #ifdef TARGET_NR_oldfstat
3704 case TARGET_NR_oldfstat
:
3707 #ifdef TARGET_NR_pause /* not on alpha */
3708 case TARGET_NR_pause
:
3709 ret
= get_errno(pause());
3712 #ifdef TARGET_NR_utime
3713 case TARGET_NR_utime
:
3715 struct utimbuf tbuf
, *host_tbuf
;
3716 struct target_utimbuf
*target_tbuf
;
3718 if (!lock_user_struct(VERIFY_READ
, target_tbuf
, arg2
, 1))
3720 tbuf
.actime
= tswapl(target_tbuf
->actime
);
3721 tbuf
.modtime
= tswapl(target_tbuf
->modtime
);
3722 unlock_user_struct(target_tbuf
, arg2
, 0);
3727 if (!(p
= lock_user_string(arg1
)))
3729 ret
= get_errno(utime(p
, host_tbuf
));
3730 unlock_user(p
, arg1
, 0);
3734 case TARGET_NR_utimes
:
3736 struct timeval
*tvp
, tv
[2];
3738 if (copy_from_user_timeval(&tv
[0], arg2
)
3739 || copy_from_user_timeval(&tv
[1],
3740 arg2
+ sizeof(struct target_timeval
)))
3746 if (!(p
= lock_user_string(arg1
)))
3748 ret
= get_errno(utimes(p
, tvp
));
3749 unlock_user(p
, arg1
, 0);
3752 #if defined(TARGET_NR_futimesat) && defined(__NR_futimesat)
3753 case TARGET_NR_futimesat
:
3755 struct timeval
*tvp
, tv
[2];
3757 if (copy_from_user_timeval(&tv
[0], arg3
)
3758 || copy_from_user_timeval(&tv
[1],
3759 arg3
+ sizeof(struct target_timeval
)))
3765 if (!(p
= lock_user_string(arg2
)))
3767 ret
= get_errno(sys_futimesat(arg1
, path(p
), tvp
));
3768 unlock_user(p
, arg2
, 0);
3772 #ifdef TARGET_NR_stty
3773 case TARGET_NR_stty
:
3776 #ifdef TARGET_NR_gtty
3777 case TARGET_NR_gtty
:
3780 case TARGET_NR_access
:
3781 if (!(p
= lock_user_string(arg1
)))
3783 ret
= get_errno(access(p
, arg2
));
3784 unlock_user(p
, arg1
, 0);
3786 #if defined(TARGET_NR_faccessat) && defined(__NR_faccessat)
3787 case TARGET_NR_faccessat
:
3788 if (!(p
= lock_user_string(arg2
)))
3790 ret
= get_errno(sys_faccessat(arg1
, p
, arg3
, arg4
));
3791 unlock_user(p
, arg2
, 0);
3794 #ifdef TARGET_NR_nice /* not on alpha */
3795 case TARGET_NR_nice
:
3796 ret
= get_errno(nice(arg1
));
3799 #ifdef TARGET_NR_ftime
3800 case TARGET_NR_ftime
:
3803 case TARGET_NR_sync
:
3807 case TARGET_NR_kill
:
3808 ret
= get_errno(kill(arg1
, target_to_host_signal(arg2
)));
3810 case TARGET_NR_rename
:
3813 p
= lock_user_string(arg1
);
3814 p2
= lock_user_string(arg2
);
3816 ret
= -TARGET_EFAULT
;
3818 ret
= get_errno(rename(p
, p2
));
3819 unlock_user(p2
, arg2
, 0);
3820 unlock_user(p
, arg1
, 0);
3823 #if defined(TARGET_NR_renameat) && defined(__NR_renameat)
3824 case TARGET_NR_renameat
:
3827 p
= lock_user_string(arg2
);
3828 p2
= lock_user_string(arg4
);
3830 ret
= -TARGET_EFAULT
;
3832 ret
= get_errno(sys_renameat(arg1
, p
, arg3
, p2
));
3833 unlock_user(p2
, arg4
, 0);
3834 unlock_user(p
, arg2
, 0);
3838 case TARGET_NR_mkdir
:
3839 if (!(p
= lock_user_string(arg1
)))
3841 ret
= get_errno(mkdir(p
, arg2
));
3842 unlock_user(p
, arg1
, 0);
3844 #if defined(TARGET_NR_mkdirat) && defined(__NR_mkdirat)
3845 case TARGET_NR_mkdirat
:
3846 if (!(p
= lock_user_string(arg2
)))
3848 ret
= get_errno(sys_mkdirat(arg1
, p
, arg3
));
3849 unlock_user(p
, arg2
, 0);
3852 case TARGET_NR_rmdir
:
3853 if (!(p
= lock_user_string(arg1
)))
3855 ret
= get_errno(rmdir(p
));
3856 unlock_user(p
, arg1
, 0);
3859 ret
= get_errno(dup(arg1
));
3861 case TARGET_NR_pipe
:
3864 ret
= get_errno(pipe(host_pipe
));
3865 if (!is_error(ret
)) {
3866 #if defined(TARGET_MIPS)
3867 CPUMIPSState
*env
= (CPUMIPSState
*)cpu_env
;
3868 env
->active_tc
.gpr
[3] = host_pipe
[1];
3870 #elif defined(TARGET_SH4)
3871 ((CPUSH4State
*)cpu_env
)->gregs
[1] = host_pipe
[1];
3874 if (put_user_s32(host_pipe
[0], arg1
)
3875 || put_user_s32(host_pipe
[1], arg1
+ sizeof(host_pipe
[0])))
3881 case TARGET_NR_times
:
3883 struct target_tms
*tmsp
;
3885 ret
= get_errno(times(&tms
));
3887 tmsp
= lock_user(VERIFY_WRITE
, arg1
, sizeof(struct target_tms
), 0);
3890 tmsp
->tms_utime
= tswapl(host_to_target_clock_t(tms
.tms_utime
));
3891 tmsp
->tms_stime
= tswapl(host_to_target_clock_t(tms
.tms_stime
));
3892 tmsp
->tms_cutime
= tswapl(host_to_target_clock_t(tms
.tms_cutime
));
3893 tmsp
->tms_cstime
= tswapl(host_to_target_clock_t(tms
.tms_cstime
));
3896 ret
= host_to_target_clock_t(ret
);
3899 #ifdef TARGET_NR_prof
3900 case TARGET_NR_prof
:
3903 #ifdef TARGET_NR_signal
3904 case TARGET_NR_signal
:
3907 case TARGET_NR_acct
:
3908 if (!(p
= lock_user_string(arg1
)))
3910 ret
= get_errno(acct(path(p
)));
3911 unlock_user(p
, arg1
, 0);
3913 #ifdef TARGET_NR_umount2 /* not on alpha */
3914 case TARGET_NR_umount2
:
3915 if (!(p
= lock_user_string(arg1
)))
3917 ret
= get_errno(umount2(p
, arg2
));
3918 unlock_user(p
, arg1
, 0);
3921 #ifdef TARGET_NR_lock
3922 case TARGET_NR_lock
:
3925 case TARGET_NR_ioctl
:
3926 ret
= do_ioctl(arg1
, arg2
, arg3
);
3928 case TARGET_NR_fcntl
:
3929 ret
= do_fcntl(arg1
, arg2
, arg3
);
3931 #ifdef TARGET_NR_mpx
3935 case TARGET_NR_setpgid
:
3936 ret
= get_errno(setpgid(arg1
, arg2
));
3938 #ifdef TARGET_NR_ulimit
3939 case TARGET_NR_ulimit
:
3942 #ifdef TARGET_NR_oldolduname
3943 case TARGET_NR_oldolduname
:
3946 case TARGET_NR_umask
:
3947 ret
= get_errno(umask(arg1
));
3949 case TARGET_NR_chroot
:
3950 if (!(p
= lock_user_string(arg1
)))
3952 ret
= get_errno(chroot(p
));
3953 unlock_user(p
, arg1
, 0);
3955 case TARGET_NR_ustat
:
3957 case TARGET_NR_dup2
:
3958 ret
= get_errno(dup2(arg1
, arg2
));
3960 #ifdef TARGET_NR_getppid /* not on alpha */
3961 case TARGET_NR_getppid
:
3962 ret
= get_errno(getppid());
3965 case TARGET_NR_getpgrp
:
3966 ret
= get_errno(getpgrp());
3968 case TARGET_NR_setsid
:
3969 ret
= get_errno(setsid());
3971 #ifdef TARGET_NR_sigaction
3972 case TARGET_NR_sigaction
:
3974 #if !defined(TARGET_MIPS)
3975 struct target_old_sigaction
*old_act
;
3976 struct target_sigaction act
, oact
, *pact
;
3978 if (!lock_user_struct(VERIFY_READ
, old_act
, arg2
, 1))
3980 act
._sa_handler
= old_act
->_sa_handler
;
3981 target_siginitset(&act
.sa_mask
, old_act
->sa_mask
);
3982 act
.sa_flags
= old_act
->sa_flags
;
3983 act
.sa_restorer
= old_act
->sa_restorer
;
3984 unlock_user_struct(old_act
, arg2
, 0);
3989 ret
= get_errno(do_sigaction(arg1
, pact
, &oact
));
3990 if (!is_error(ret
) && arg3
) {
3991 if (!lock_user_struct(VERIFY_WRITE
, old_act
, arg3
, 0))
3993 old_act
->_sa_handler
= oact
._sa_handler
;
3994 old_act
->sa_mask
= oact
.sa_mask
.sig
[0];
3995 old_act
->sa_flags
= oact
.sa_flags
;
3996 old_act
->sa_restorer
= oact
.sa_restorer
;
3997 unlock_user_struct(old_act
, arg3
, 1);
4000 struct target_sigaction act
, oact
, *pact
, *old_act
;
4003 if (!lock_user_struct(VERIFY_READ
, old_act
, arg2
, 1))
4005 act
._sa_handler
= old_act
->_sa_handler
;
4006 target_siginitset(&act
.sa_mask
, old_act
->sa_mask
.sig
[0]);
4007 act
.sa_flags
= old_act
->sa_flags
;
4008 unlock_user_struct(old_act
, arg2
, 0);
4014 ret
= get_errno(do_sigaction(arg1
, pact
, &oact
));
4016 if (!is_error(ret
) && arg3
) {
4017 if (!lock_user_struct(VERIFY_WRITE
, old_act
, arg3
, 0))
4019 old_act
->_sa_handler
= oact
._sa_handler
;
4020 old_act
->sa_flags
= oact
.sa_flags
;
4021 old_act
->sa_mask
.sig
[0] = oact
.sa_mask
.sig
[0];
4022 old_act
->sa_mask
.sig
[1] = 0;
4023 old_act
->sa_mask
.sig
[2] = 0;
4024 old_act
->sa_mask
.sig
[3] = 0;
4025 unlock_user_struct(old_act
, arg3
, 1);
4031 case TARGET_NR_rt_sigaction
:
4033 struct target_sigaction
*act
;
4034 struct target_sigaction
*oact
;
4037 if (!lock_user_struct(VERIFY_READ
, act
, arg2
, 1))
4042 if (!lock_user_struct(VERIFY_WRITE
, oact
, arg3
, 0)) {
4043 ret
= -TARGET_EFAULT
;
4044 goto rt_sigaction_fail
;
4048 ret
= get_errno(do_sigaction(arg1
, act
, oact
));
4051 unlock_user_struct(act
, arg2
, 0);
4053 unlock_user_struct(oact
, arg3
, 1);
4056 #ifdef TARGET_NR_sgetmask /* not on alpha */
4057 case TARGET_NR_sgetmask
:
4060 abi_ulong target_set
;
4061 sigprocmask(0, NULL
, &cur_set
);
4062 host_to_target_old_sigset(&target_set
, &cur_set
);
4067 #ifdef TARGET_NR_ssetmask /* not on alpha */
4068 case TARGET_NR_ssetmask
:
4070 sigset_t set
, oset
, cur_set
;
4071 abi_ulong target_set
= arg1
;
4072 sigprocmask(0, NULL
, &cur_set
);
4073 target_to_host_old_sigset(&set
, &target_set
);
4074 sigorset(&set
, &set
, &cur_set
);
4075 sigprocmask(SIG_SETMASK
, &set
, &oset
);
4076 host_to_target_old_sigset(&target_set
, &oset
);
4081 #ifdef TARGET_NR_sigprocmask
4082 case TARGET_NR_sigprocmask
:
4085 sigset_t set
, oldset
, *set_ptr
;
4089 case TARGET_SIG_BLOCK
:
4092 case TARGET_SIG_UNBLOCK
:
4095 case TARGET_SIG_SETMASK
:
4099 ret
= -TARGET_EINVAL
;
4102 if (!(p
= lock_user(VERIFY_READ
, arg2
, sizeof(target_sigset_t
), 1)))
4104 target_to_host_old_sigset(&set
, p
);
4105 unlock_user(p
, arg2
, 0);
4111 ret
= get_errno(sigprocmask(arg1
, set_ptr
, &oldset
));
4112 if (!is_error(ret
) && arg3
) {
4113 if (!(p
= lock_user(VERIFY_WRITE
, arg3
, sizeof(target_sigset_t
), 0)))
4115 host_to_target_old_sigset(p
, &oldset
);
4116 unlock_user(p
, arg3
, sizeof(target_sigset_t
));
4121 case TARGET_NR_rt_sigprocmask
:
4124 sigset_t set
, oldset
, *set_ptr
;
4128 case TARGET_SIG_BLOCK
:
4131 case TARGET_SIG_UNBLOCK
:
4134 case TARGET_SIG_SETMASK
:
4138 ret
= -TARGET_EINVAL
;
4141 if (!(p
= lock_user(VERIFY_READ
, arg2
, sizeof(target_sigset_t
), 1)))
4143 target_to_host_sigset(&set
, p
);
4144 unlock_user(p
, arg2
, 0);
4150 ret
= get_errno(sigprocmask(how
, set_ptr
, &oldset
));
4151 if (!is_error(ret
) && arg3
) {
4152 if (!(p
= lock_user(VERIFY_WRITE
, arg3
, sizeof(target_sigset_t
), 0)))
4154 host_to_target_sigset(p
, &oldset
);
4155 unlock_user(p
, arg3
, sizeof(target_sigset_t
));
4159 #ifdef TARGET_NR_sigpending
4160 case TARGET_NR_sigpending
:
4163 ret
= get_errno(sigpending(&set
));
4164 if (!is_error(ret
)) {
4165 if (!(p
= lock_user(VERIFY_WRITE
, arg1
, sizeof(target_sigset_t
), 0)))
4167 host_to_target_old_sigset(p
, &set
);
4168 unlock_user(p
, arg1
, sizeof(target_sigset_t
));
4173 case TARGET_NR_rt_sigpending
:
4176 ret
= get_errno(sigpending(&set
));
4177 if (!is_error(ret
)) {
4178 if (!(p
= lock_user(VERIFY_WRITE
, arg1
, sizeof(target_sigset_t
), 0)))
4180 host_to_target_sigset(p
, &set
);
4181 unlock_user(p
, arg1
, sizeof(target_sigset_t
));
4185 #ifdef TARGET_NR_sigsuspend
4186 case TARGET_NR_sigsuspend
:
4189 if (!(p
= lock_user(VERIFY_READ
, arg1
, sizeof(target_sigset_t
), 1)))
4191 target_to_host_old_sigset(&set
, p
);
4192 unlock_user(p
, arg1
, 0);
4193 ret
= get_errno(sigsuspend(&set
));
4197 case TARGET_NR_rt_sigsuspend
:
4200 if (!(p
= lock_user(VERIFY_READ
, arg1
, sizeof(target_sigset_t
), 1)))
4202 target_to_host_sigset(&set
, p
);
4203 unlock_user(p
, arg1
, 0);
4204 ret
= get_errno(sigsuspend(&set
));
4207 case TARGET_NR_rt_sigtimedwait
:
4210 struct timespec uts
, *puts
;
4213 if (!(p
= lock_user(VERIFY_READ
, arg1
, sizeof(target_sigset_t
), 1)))
4215 target_to_host_sigset(&set
, p
);
4216 unlock_user(p
, arg1
, 0);
4219 target_to_host_timespec(puts
, arg3
);
4223 ret
= get_errno(sigtimedwait(&set
, &uinfo
, puts
));
4224 if (!is_error(ret
) && arg2
) {
4225 if (!(p
= lock_user(VERIFY_WRITE
, arg2
, sizeof(target_siginfo_t
), 0)))
4227 host_to_target_siginfo(p
, &uinfo
);
4228 unlock_user(p
, arg2
, sizeof(target_siginfo_t
));
4232 case TARGET_NR_rt_sigqueueinfo
:
4235 if (!(p
= lock_user(VERIFY_READ
, arg3
, sizeof(target_sigset_t
), 1)))
4237 target_to_host_siginfo(&uinfo
, p
);
4238 unlock_user(p
, arg1
, 0);
4239 ret
= get_errno(sys_rt_sigqueueinfo(arg1
, arg2
, &uinfo
));
4242 #ifdef TARGET_NR_sigreturn
4243 case TARGET_NR_sigreturn
:
4244 /* NOTE: ret is eax, so not transcoding must be done */
4245 ret
= do_sigreturn(cpu_env
);
4248 case TARGET_NR_rt_sigreturn
:
4249 /* NOTE: ret is eax, so not transcoding must be done */
4250 ret
= do_rt_sigreturn(cpu_env
);
4252 case TARGET_NR_sethostname
:
4253 if (!(p
= lock_user_string(arg1
)))
4255 ret
= get_errno(sethostname(p
, arg2
));
4256 unlock_user(p
, arg1
, 0);
4258 case TARGET_NR_setrlimit
:
4260 /* XXX: convert resource ? */
4261 int resource
= arg1
;
4262 struct target_rlimit
*target_rlim
;
4264 if (!lock_user_struct(VERIFY_READ
, target_rlim
, arg2
, 1))
4266 rlim
.rlim_cur
= tswapl(target_rlim
->rlim_cur
);
4267 rlim
.rlim_max
= tswapl(target_rlim
->rlim_max
);
4268 unlock_user_struct(target_rlim
, arg2
, 0);
4269 ret
= get_errno(setrlimit(resource
, &rlim
));
4272 case TARGET_NR_getrlimit
:
4274 /* XXX: convert resource ? */
4275 int resource
= arg1
;
4276 struct target_rlimit
*target_rlim
;
4279 ret
= get_errno(getrlimit(resource
, &rlim
));
4280 if (!is_error(ret
)) {
4281 if (!lock_user_struct(VERIFY_WRITE
, target_rlim
, arg2
, 0))
4283 rlim
.rlim_cur
= tswapl(target_rlim
->rlim_cur
);
4284 rlim
.rlim_max
= tswapl(target_rlim
->rlim_max
);
4285 unlock_user_struct(target_rlim
, arg2
, 1);
4289 case TARGET_NR_getrusage
:
4291 struct rusage rusage
;
4292 ret
= get_errno(getrusage(arg1
, &rusage
));
4293 if (!is_error(ret
)) {
4294 host_to_target_rusage(arg2
, &rusage
);
4298 case TARGET_NR_gettimeofday
:
4301 ret
= get_errno(gettimeofday(&tv
, NULL
));
4302 if (!is_error(ret
)) {
4303 if (copy_to_user_timeval(arg1
, &tv
))
4308 case TARGET_NR_settimeofday
:
4311 if (copy_from_user_timeval(&tv
, arg1
))
4313 ret
= get_errno(settimeofday(&tv
, NULL
));
4316 #ifdef TARGET_NR_select
4317 case TARGET_NR_select
:
4319 struct target_sel_arg_struct
*sel
;
4320 abi_ulong inp
, outp
, exp
, tvp
;
4323 if (!lock_user_struct(VERIFY_READ
, sel
, arg1
, 1))
4325 nsel
= tswapl(sel
->n
);
4326 inp
= tswapl(sel
->inp
);
4327 outp
= tswapl(sel
->outp
);
4328 exp
= tswapl(sel
->exp
);
4329 tvp
= tswapl(sel
->tvp
);
4330 unlock_user_struct(sel
, arg1
, 0);
4331 ret
= do_select(nsel
, inp
, outp
, exp
, tvp
);
4335 case TARGET_NR_symlink
:
4338 p
= lock_user_string(arg1
);
4339 p2
= lock_user_string(arg2
);
4341 ret
= -TARGET_EFAULT
;
4343 ret
= get_errno(symlink(p
, p2
));
4344 unlock_user(p2
, arg2
, 0);
4345 unlock_user(p
, arg1
, 0);
4348 #if defined(TARGET_NR_symlinkat) && defined(__NR_symlinkat)
4349 case TARGET_NR_symlinkat
:
4352 p
= lock_user_string(arg1
);
4353 p2
= lock_user_string(arg3
);
4355 ret
= -TARGET_EFAULT
;
4357 ret
= get_errno(sys_symlinkat(p
, arg2
, p2
));
4358 unlock_user(p2
, arg3
, 0);
4359 unlock_user(p
, arg1
, 0);
4363 #ifdef TARGET_NR_oldlstat
4364 case TARGET_NR_oldlstat
:
4367 case TARGET_NR_readlink
:
4370 p
= lock_user_string(arg1
);
4371 p2
= lock_user(VERIFY_WRITE
, arg2
, arg3
, 0);
4373 ret
= -TARGET_EFAULT
;
4375 ret
= get_errno(readlink(path(p
), p2
, arg3
));
4376 unlock_user(p2
, arg2
, ret
);
4377 unlock_user(p
, arg1
, 0);
4380 #if defined(TARGET_NR_readlinkat) && defined(__NR_readlinkat)
4381 case TARGET_NR_readlinkat
:
4384 p
= lock_user_string(arg2
);
4385 p2
= lock_user(VERIFY_WRITE
, arg3
, arg4
, 0);
4387 ret
= -TARGET_EFAULT
;
4389 ret
= get_errno(sys_readlinkat(arg1
, path(p
), p2
, arg4
));
4390 unlock_user(p2
, arg3
, ret
);
4391 unlock_user(p
, arg2
, 0);
4395 #ifdef TARGET_NR_uselib
4396 case TARGET_NR_uselib
:
4399 #ifdef TARGET_NR_swapon
4400 case TARGET_NR_swapon
:
4401 if (!(p
= lock_user_string(arg1
)))
4403 ret
= get_errno(swapon(p
, arg2
));
4404 unlock_user(p
, arg1
, 0);
4407 case TARGET_NR_reboot
:
4409 #ifdef TARGET_NR_readdir
4410 case TARGET_NR_readdir
:
4413 #ifdef TARGET_NR_mmap
4414 case TARGET_NR_mmap
:
4415 #if (defined(TARGET_I386) && defined(TARGET_ABI32)) || defined(TARGET_ARM) || defined(TARGET_M68K) || defined(TARGET_CRIS)
4418 abi_ulong v1
, v2
, v3
, v4
, v5
, v6
;
4419 if (!(v
= lock_user(VERIFY_READ
, arg1
, 6 * sizeof(abi_ulong
), 1)))
4427 unlock_user(v
, arg1
, 0);
4428 ret
= get_errno(target_mmap(v1
, v2
, v3
,
4429 target_to_host_bitmask(v4
, mmap_flags_tbl
),
4433 ret
= get_errno(target_mmap(arg1
, arg2
, arg3
,
4434 target_to_host_bitmask(arg4
, mmap_flags_tbl
),
4440 #ifdef TARGET_NR_mmap2
4441 case TARGET_NR_mmap2
:
4443 #define MMAP_SHIFT 12
4445 ret
= get_errno(target_mmap(arg1
, arg2
, arg3
,
4446 target_to_host_bitmask(arg4
, mmap_flags_tbl
),
4448 arg6
<< MMAP_SHIFT
));
4451 case TARGET_NR_munmap
:
4452 ret
= get_errno(target_munmap(arg1
, arg2
));
4454 case TARGET_NR_mprotect
:
4455 ret
= get_errno(target_mprotect(arg1
, arg2
, arg3
));
4457 #ifdef TARGET_NR_mremap
4458 case TARGET_NR_mremap
:
4459 ret
= get_errno(target_mremap(arg1
, arg2
, arg3
, arg4
, arg5
));
4462 /* ??? msync/mlock/munlock are broken for softmmu. */
4463 #ifdef TARGET_NR_msync
4464 case TARGET_NR_msync
:
4465 ret
= get_errno(msync(g2h(arg1
), arg2
, arg3
));
4468 #ifdef TARGET_NR_mlock
4469 case TARGET_NR_mlock
:
4470 ret
= get_errno(mlock(g2h(arg1
), arg2
));
4473 #ifdef TARGET_NR_munlock
4474 case TARGET_NR_munlock
:
4475 ret
= get_errno(munlock(g2h(arg1
), arg2
));
4478 #ifdef TARGET_NR_mlockall
4479 case TARGET_NR_mlockall
:
4480 ret
= get_errno(mlockall(arg1
));
4483 #ifdef TARGET_NR_munlockall
4484 case TARGET_NR_munlockall
:
4485 ret
= get_errno(munlockall());
4488 case TARGET_NR_truncate
:
4489 if (!(p
= lock_user_string(arg1
)))
4491 ret
= get_errno(truncate(p
, arg2
));
4492 unlock_user(p
, arg1
, 0);
4494 case TARGET_NR_ftruncate
:
4495 ret
= get_errno(ftruncate(arg1
, arg2
));
4497 case TARGET_NR_fchmod
:
4498 ret
= get_errno(fchmod(arg1
, arg2
));
4500 #if defined(TARGET_NR_fchmodat) && defined(__NR_fchmodat)
4501 case TARGET_NR_fchmodat
:
4502 if (!(p
= lock_user_string(arg2
)))
4504 ret
= get_errno(sys_fchmodat(arg1
, p
, arg3
, arg4
));
4505 unlock_user(p
, arg2
, 0);
4508 case TARGET_NR_getpriority
:
4509 /* libc does special remapping of the return value of
4510 * sys_getpriority() so it's just easiest to call
4511 * sys_getpriority() directly rather than through libc. */
4512 ret
= sys_getpriority(arg1
, arg2
);
4514 case TARGET_NR_setpriority
:
4515 ret
= get_errno(setpriority(arg1
, arg2
, arg3
));
4517 #ifdef TARGET_NR_profil
4518 case TARGET_NR_profil
:
4521 case TARGET_NR_statfs
:
4522 if (!(p
= lock_user_string(arg1
)))
4524 ret
= get_errno(statfs(path(p
), &stfs
));
4525 unlock_user(p
, arg1
, 0);
4527 if (!is_error(ret
)) {
4528 struct target_statfs
*target_stfs
;
4530 if (!lock_user_struct(VERIFY_WRITE
, target_stfs
, arg2
, 0))
4532 __put_user(stfs
.f_type
, &target_stfs
->f_type
);
4533 __put_user(stfs
.f_bsize
, &target_stfs
->f_bsize
);
4534 __put_user(stfs
.f_blocks
, &target_stfs
->f_blocks
);
4535 __put_user(stfs
.f_bfree
, &target_stfs
->f_bfree
);
4536 __put_user(stfs
.f_bavail
, &target_stfs
->f_bavail
);
4537 __put_user(stfs
.f_files
, &target_stfs
->f_files
);
4538 __put_user(stfs
.f_ffree
, &target_stfs
->f_ffree
);
4539 __put_user(stfs
.f_fsid
.__val
[0], &target_stfs
->f_fsid
.val
[0]);
4540 __put_user(stfs
.f_fsid
.__val
[1], &target_stfs
->f_fsid
.val
[1]);
4541 __put_user(stfs
.f_namelen
, &target_stfs
->f_namelen
);
4542 unlock_user_struct(target_stfs
, arg2
, 1);
4545 case TARGET_NR_fstatfs
:
4546 ret
= get_errno(fstatfs(arg1
, &stfs
));
4547 goto convert_statfs
;
4548 #ifdef TARGET_NR_statfs64
4549 case TARGET_NR_statfs64
:
4550 if (!(p
= lock_user_string(arg1
)))
4552 ret
= get_errno(statfs(path(p
), &stfs
));
4553 unlock_user(p
, arg1
, 0);
4555 if (!is_error(ret
)) {
4556 struct target_statfs64
*target_stfs
;
4558 if (!lock_user_struct(VERIFY_WRITE
, target_stfs
, arg3
, 0))
4560 __put_user(stfs
.f_type
, &target_stfs
->f_type
);
4561 __put_user(stfs
.f_bsize
, &target_stfs
->f_bsize
);
4562 __put_user(stfs
.f_blocks
, &target_stfs
->f_blocks
);
4563 __put_user(stfs
.f_bfree
, &target_stfs
->f_bfree
);
4564 __put_user(stfs
.f_bavail
, &target_stfs
->f_bavail
);
4565 __put_user(stfs
.f_files
, &target_stfs
->f_files
);
4566 __put_user(stfs
.f_ffree
, &target_stfs
->f_ffree
);
4567 __put_user(stfs
.f_fsid
.__val
[0], &target_stfs
->f_fsid
.val
[0]);
4568 __put_user(stfs
.f_fsid
.__val
[1], &target_stfs
->f_fsid
.val
[1]);
4569 __put_user(stfs
.f_namelen
, &target_stfs
->f_namelen
);
4570 unlock_user_struct(target_stfs
, arg3
, 1);
4573 case TARGET_NR_fstatfs64
:
4574 ret
= get_errno(fstatfs(arg1
, &stfs
));
4575 goto convert_statfs64
;
4577 #ifdef TARGET_NR_ioperm
4578 case TARGET_NR_ioperm
:
4581 #ifdef TARGET_NR_socketcall
4582 case TARGET_NR_socketcall
:
4583 ret
= do_socketcall(arg1
, arg2
);
4586 #ifdef TARGET_NR_accept
4587 case TARGET_NR_accept
:
4588 ret
= do_accept(arg1
, arg2
, arg3
);
4591 #ifdef TARGET_NR_bind
4592 case TARGET_NR_bind
:
4593 ret
= do_bind(arg1
, arg2
, arg3
);
4596 #ifdef TARGET_NR_connect
4597 case TARGET_NR_connect
:
4598 ret
= do_connect(arg1
, arg2
, arg3
);
4601 #ifdef TARGET_NR_getpeername
4602 case TARGET_NR_getpeername
:
4603 ret
= do_getpeername(arg1
, arg2
, arg3
);
4606 #ifdef TARGET_NR_getsockname
4607 case TARGET_NR_getsockname
:
4608 ret
= do_getsockname(arg1
, arg2
, arg3
);
4611 #ifdef TARGET_NR_getsockopt
4612 case TARGET_NR_getsockopt
:
4613 ret
= do_getsockopt(arg1
, arg2
, arg3
, arg4
, arg5
);
4616 #ifdef TARGET_NR_listen
4617 case TARGET_NR_listen
:
4618 ret
= get_errno(listen(arg1
, arg2
));
4621 #ifdef TARGET_NR_recv
4622 case TARGET_NR_recv
:
4623 ret
= do_recvfrom(arg1
, arg2
, arg3
, arg4
, 0, 0);
4626 #ifdef TARGET_NR_recvfrom
4627 case TARGET_NR_recvfrom
:
4628 ret
= do_recvfrom(arg1
, arg2
, arg3
, arg4
, arg5
, arg6
);
4631 #ifdef TARGET_NR_recvmsg
4632 case TARGET_NR_recvmsg
:
4633 ret
= do_sendrecvmsg(arg1
, arg2
, arg3
, 0);
4636 #ifdef TARGET_NR_send
4637 case TARGET_NR_send
:
4638 ret
= do_sendto(arg1
, arg2
, arg3
, arg4
, 0, 0);
4641 #ifdef TARGET_NR_sendmsg
4642 case TARGET_NR_sendmsg
:
4643 ret
= do_sendrecvmsg(arg1
, arg2
, arg3
, 1);
4646 #ifdef TARGET_NR_sendto
4647 case TARGET_NR_sendto
:
4648 ret
= do_sendto(arg1
, arg2
, arg3
, arg4
, arg5
, arg6
);
4651 #ifdef TARGET_NR_shutdown
4652 case TARGET_NR_shutdown
:
4653 ret
= get_errno(shutdown(arg1
, arg2
));
4656 #ifdef TARGET_NR_socket
4657 case TARGET_NR_socket
:
4658 ret
= do_socket(arg1
, arg2
, arg3
);
4661 #ifdef TARGET_NR_socketpair
4662 case TARGET_NR_socketpair
:
4663 ret
= do_socketpair(arg1
, arg2
, arg3
, arg4
);
4666 #ifdef TARGET_NR_setsockopt
4667 case TARGET_NR_setsockopt
:
4668 ret
= do_setsockopt(arg1
, arg2
, arg3
, arg4
, (socklen_t
) arg5
);
4672 case TARGET_NR_syslog
:
4673 if (!(p
= lock_user_string(arg2
)))
4675 ret
= get_errno(sys_syslog((int)arg1
, p
, (int)arg3
));
4676 unlock_user(p
, arg2
, 0);
4679 case TARGET_NR_setitimer
:
4681 struct itimerval value
, ovalue
, *pvalue
;
4685 if (copy_from_user_timeval(&pvalue
->it_interval
, arg2
)
4686 || copy_from_user_timeval(&pvalue
->it_value
,
4687 arg2
+ sizeof(struct target_timeval
)))
4692 ret
= get_errno(setitimer(arg1
, pvalue
, &ovalue
));
4693 if (!is_error(ret
) && arg3
) {
4694 if (copy_to_user_timeval(arg3
,
4695 &ovalue
.it_interval
)
4696 || copy_to_user_timeval(arg3
+ sizeof(struct target_timeval
),
4702 case TARGET_NR_getitimer
:
4704 struct itimerval value
;
4706 ret
= get_errno(getitimer(arg1
, &value
));
4707 if (!is_error(ret
) && arg2
) {
4708 if (copy_to_user_timeval(arg2
,
4710 || copy_to_user_timeval(arg2
+ sizeof(struct target_timeval
),
4716 case TARGET_NR_stat
:
4717 if (!(p
= lock_user_string(arg1
)))
4719 ret
= get_errno(stat(path(p
), &st
));
4720 unlock_user(p
, arg1
, 0);
4722 case TARGET_NR_lstat
:
4723 if (!(p
= lock_user_string(arg1
)))
4725 ret
= get_errno(lstat(path(p
), &st
));
4726 unlock_user(p
, arg1
, 0);
4728 case TARGET_NR_fstat
:
4730 ret
= get_errno(fstat(arg1
, &st
));
4732 if (!is_error(ret
)) {
4733 struct target_stat
*target_st
;
4735 if (!lock_user_struct(VERIFY_WRITE
, target_st
, arg2
, 0))
4737 __put_user(st
.st_dev
, &target_st
->st_dev
);
4738 __put_user(st
.st_ino
, &target_st
->st_ino
);
4739 __put_user(st
.st_mode
, &target_st
->st_mode
);
4740 __put_user(st
.st_uid
, &target_st
->st_uid
);
4741 __put_user(st
.st_gid
, &target_st
->st_gid
);
4742 __put_user(st
.st_nlink
, &target_st
->st_nlink
);
4743 __put_user(st
.st_rdev
, &target_st
->st_rdev
);
4744 __put_user(st
.st_size
, &target_st
->st_size
);
4745 __put_user(st
.st_blksize
, &target_st
->st_blksize
);
4746 __put_user(st
.st_blocks
, &target_st
->st_blocks
);
4747 __put_user(st
.st_atime
, &target_st
->target_st_atime
);
4748 __put_user(st
.st_mtime
, &target_st
->target_st_mtime
);
4749 __put_user(st
.st_ctime
, &target_st
->target_st_ctime
);
4750 unlock_user_struct(target_st
, arg2
, 1);
4754 #ifdef TARGET_NR_olduname
4755 case TARGET_NR_olduname
:
4758 #ifdef TARGET_NR_iopl
4759 case TARGET_NR_iopl
:
4762 case TARGET_NR_vhangup
:
4763 ret
= get_errno(vhangup());
4765 #ifdef TARGET_NR_idle
4766 case TARGET_NR_idle
:
4769 #ifdef TARGET_NR_syscall
4770 case TARGET_NR_syscall
:
4771 ret
= do_syscall(cpu_env
,arg1
& 0xffff,arg2
,arg3
,arg4
,arg5
,arg6
,0);
4774 case TARGET_NR_wait4
:
4777 abi_long status_ptr
= arg2
;
4778 struct rusage rusage
, *rusage_ptr
;
4779 abi_ulong target_rusage
= arg4
;
4781 rusage_ptr
= &rusage
;
4784 ret
= get_errno(wait4(arg1
, &status
, arg3
, rusage_ptr
));
4785 if (!is_error(ret
)) {
4787 if (put_user_s32(status
, status_ptr
))
4791 host_to_target_rusage(target_rusage
, &rusage
);
4795 #ifdef TARGET_NR_swapoff
4796 case TARGET_NR_swapoff
:
4797 if (!(p
= lock_user_string(arg1
)))
4799 ret
= get_errno(swapoff(p
));
4800 unlock_user(p
, arg1
, 0);
4803 case TARGET_NR_sysinfo
:
4805 struct target_sysinfo
*target_value
;
4806 struct sysinfo value
;
4807 ret
= get_errno(sysinfo(&value
));
4808 if (!is_error(ret
) && arg1
)
4810 if (!lock_user_struct(VERIFY_WRITE
, target_value
, arg1
, 0))
4812 __put_user(value
.uptime
, &target_value
->uptime
);
4813 __put_user(value
.loads
[0], &target_value
->loads
[0]);
4814 __put_user(value
.loads
[1], &target_value
->loads
[1]);
4815 __put_user(value
.loads
[2], &target_value
->loads
[2]);
4816 __put_user(value
.totalram
, &target_value
->totalram
);
4817 __put_user(value
.freeram
, &target_value
->freeram
);
4818 __put_user(value
.sharedram
, &target_value
->sharedram
);
4819 __put_user(value
.bufferram
, &target_value
->bufferram
);
4820 __put_user(value
.totalswap
, &target_value
->totalswap
);
4821 __put_user(value
.freeswap
, &target_value
->freeswap
);
4822 __put_user(value
.procs
, &target_value
->procs
);
4823 __put_user(value
.totalhigh
, &target_value
->totalhigh
);
4824 __put_user(value
.freehigh
, &target_value
->freehigh
);
4825 __put_user(value
.mem_unit
, &target_value
->mem_unit
);
4826 unlock_user_struct(target_value
, arg1
, 1);
4830 #ifdef TARGET_NR_ipc
4832 ret
= do_ipc(arg1
, arg2
, arg3
, arg4
, arg5
, arg6
);
4836 #ifdef TARGET_NR_msgctl
4837 case TARGET_NR_msgctl
:
4838 ret
= do_msgctl(arg1
, arg2
, arg3
);
4841 #ifdef TARGET_NR_msgget
4842 case TARGET_NR_msgget
:
4843 ret
= get_errno(msgget(arg1
, arg2
));
4846 #ifdef TARGET_NR_msgrcv
4847 case TARGET_NR_msgrcv
:
4848 ret
= do_msgrcv(arg1
, arg2
, arg3
, arg4
, arg5
);
4851 #ifdef TARGET_NR_msgsnd
4852 case TARGET_NR_msgsnd
:
4853 ret
= do_msgsnd(arg1
, arg2
, arg3
, arg4
);
4856 case TARGET_NR_fsync
:
4857 ret
= get_errno(fsync(arg1
));
4859 case TARGET_NR_clone
:
4860 #if defined(TARGET_SH4)
4861 ret
= get_errno(do_fork(cpu_env
, arg1
, arg2
, arg3
, arg5
, arg4
));
4863 ret
= get_errno(do_fork(cpu_env
, arg1
, arg2
, arg3
, arg4
, arg5
));
4866 #ifdef __NR_exit_group
4867 /* new thread calls */
4868 case TARGET_NR_exit_group
:
4869 gdb_exit(cpu_env
, arg1
);
4870 ret
= get_errno(exit_group(arg1
));
4873 case TARGET_NR_setdomainname
:
4874 if (!(p
= lock_user_string(arg1
)))
4876 ret
= get_errno(setdomainname(p
, arg2
));
4877 unlock_user(p
, arg1
, 0);
4879 case TARGET_NR_uname
:
4880 /* no need to transcode because we use the linux syscall */
4882 struct new_utsname
* buf
;
4884 if (!lock_user_struct(VERIFY_WRITE
, buf
, arg1
, 0))
4886 ret
= get_errno(sys_uname(buf
));
4887 if (!is_error(ret
)) {
4888 /* Overrite the native machine name with whatever is being
4890 strcpy (buf
->machine
, UNAME_MACHINE
);
4891 /* Allow the user to override the reported release. */
4892 if (qemu_uname_release
&& *qemu_uname_release
)
4893 strcpy (buf
->release
, qemu_uname_release
);
4895 unlock_user_struct(buf
, arg1
, 1);
4899 case TARGET_NR_modify_ldt
:
4900 ret
= do_modify_ldt(cpu_env
, arg1
, arg2
, arg3
);
4902 #if !defined(TARGET_X86_64)
4903 case TARGET_NR_vm86old
:
4905 case TARGET_NR_vm86
:
4906 ret
= do_vm86(cpu_env
, arg1
, arg2
);
4910 case TARGET_NR_adjtimex
:
4912 #ifdef TARGET_NR_create_module
4913 case TARGET_NR_create_module
:
4915 case TARGET_NR_init_module
:
4916 case TARGET_NR_delete_module
:
4917 #ifdef TARGET_NR_get_kernel_syms
4918 case TARGET_NR_get_kernel_syms
:
4921 case TARGET_NR_quotactl
:
4923 case TARGET_NR_getpgid
:
4924 ret
= get_errno(getpgid(arg1
));
4926 case TARGET_NR_fchdir
:
4927 ret
= get_errno(fchdir(arg1
));
4929 #ifdef TARGET_NR_bdflush /* not on x86_64 */
4930 case TARGET_NR_bdflush
:
4933 #ifdef TARGET_NR_sysfs
4934 case TARGET_NR_sysfs
:
4937 case TARGET_NR_personality
:
4938 ret
= get_errno(personality(arg1
));
4940 #ifdef TARGET_NR_afs_syscall
4941 case TARGET_NR_afs_syscall
:
4944 #ifdef TARGET_NR__llseek /* Not on alpha */
4945 case TARGET_NR__llseek
:
4947 #if defined (__x86_64__)
4948 ret
= get_errno(lseek(arg1
, ((uint64_t )arg2
<< 32) | arg3
, arg5
));
4949 if (put_user_s64(ret
, arg4
))
4953 ret
= get_errno(_llseek(arg1
, arg2
, arg3
, &res
, arg5
));
4954 if (put_user_s64(res
, arg4
))
4960 case TARGET_NR_getdents
:
4961 #if TARGET_ABI_BITS != 32
4963 #elif TARGET_ABI_BITS == 32 && HOST_LONG_BITS == 64
4965 struct target_dirent
*target_dirp
;
4966 struct linux_dirent
*dirp
;
4967 abi_long count
= arg3
;
4969 dirp
= malloc(count
);
4971 ret
= -TARGET_ENOMEM
;
4975 ret
= get_errno(sys_getdents(arg1
, dirp
, count
));
4976 if (!is_error(ret
)) {
4977 struct linux_dirent
*de
;
4978 struct target_dirent
*tde
;
4980 int reclen
, treclen
;
4981 int count1
, tnamelen
;
4985 if (!(target_dirp
= lock_user(VERIFY_WRITE
, arg2
, count
, 0)))
4989 reclen
= de
->d_reclen
;
4990 treclen
= reclen
- (2 * (sizeof(long) - sizeof(abi_long
)));
4991 tde
->d_reclen
= tswap16(treclen
);
4992 tde
->d_ino
= tswapl(de
->d_ino
);
4993 tde
->d_off
= tswapl(de
->d_off
);
4994 tnamelen
= treclen
- (2 * sizeof(abi_long
) + 2);
4997 /* XXX: may not be correct */
4998 pstrcpy(tde
->d_name
, tnamelen
, de
->d_name
);
4999 de
= (struct linux_dirent
*)((char *)de
+ reclen
);
5001 tde
= (struct target_dirent
*)((char *)tde
+ treclen
);
5005 unlock_user(target_dirp
, arg2
, ret
);
5011 struct linux_dirent
*dirp
;
5012 abi_long count
= arg3
;
5014 if (!(dirp
= lock_user(VERIFY_WRITE
, arg2
, count
, 0)))
5016 ret
= get_errno(sys_getdents(arg1
, dirp
, count
));
5017 if (!is_error(ret
)) {
5018 struct linux_dirent
*de
;
5023 reclen
= de
->d_reclen
;
5026 de
->d_reclen
= tswap16(reclen
);
5027 tswapls(&de
->d_ino
);
5028 tswapls(&de
->d_off
);
5029 de
= (struct linux_dirent
*)((char *)de
+ reclen
);
5033 unlock_user(dirp
, arg2
, ret
);
5037 #if defined(TARGET_NR_getdents64) && defined(__NR_getdents64)
5038 case TARGET_NR_getdents64
:
5040 struct linux_dirent64
*dirp
;
5041 abi_long count
= arg3
;
5042 if (!(dirp
= lock_user(VERIFY_WRITE
, arg2
, count
, 0)))
5044 ret
= get_errno(sys_getdents64(arg1
, dirp
, count
));
5045 if (!is_error(ret
)) {
5046 struct linux_dirent64
*de
;
5051 reclen
= de
->d_reclen
;
5054 de
->d_reclen
= tswap16(reclen
);
5055 tswap64s((uint64_t *)&de
->d_ino
);
5056 tswap64s((uint64_t *)&de
->d_off
);
5057 de
= (struct linux_dirent64
*)((char *)de
+ reclen
);
5061 unlock_user(dirp
, arg2
, ret
);
5064 #endif /* TARGET_NR_getdents64 */
5065 #ifdef TARGET_NR__newselect
5066 case TARGET_NR__newselect
:
5067 ret
= do_select(arg1
, arg2
, arg3
, arg4
, arg5
);
5070 #ifdef TARGET_NR_poll
5071 case TARGET_NR_poll
:
5073 struct target_pollfd
*target_pfd
;
5074 unsigned int nfds
= arg2
;
5079 target_pfd
= lock_user(VERIFY_WRITE
, arg1
, sizeof(struct target_pollfd
) * nfds
, 1);
5082 pfd
= alloca(sizeof(struct pollfd
) * nfds
);
5083 for(i
= 0; i
< nfds
; i
++) {
5084 pfd
[i
].fd
= tswap32(target_pfd
[i
].fd
);
5085 pfd
[i
].events
= tswap16(target_pfd
[i
].events
);
5087 ret
= get_errno(poll(pfd
, nfds
, timeout
));
5088 if (!is_error(ret
)) {
5089 for(i
= 0; i
< nfds
; i
++) {
5090 target_pfd
[i
].revents
= tswap16(pfd
[i
].revents
);
5092 ret
+= nfds
* (sizeof(struct target_pollfd
)
5093 - sizeof(struct pollfd
));
5095 unlock_user(target_pfd
, arg1
, ret
);
5099 case TARGET_NR_flock
:
5100 /* NOTE: the flock constant seems to be the same for every
5102 ret
= get_errno(flock(arg1
, arg2
));
5104 case TARGET_NR_readv
:
5109 vec
= alloca(count
* sizeof(struct iovec
));
5110 if (lock_iovec(VERIFY_WRITE
, vec
, arg2
, count
, 0) < 0)
5112 ret
= get_errno(readv(arg1
, vec
, count
));
5113 unlock_iovec(vec
, arg2
, count
, 1);
5116 case TARGET_NR_writev
:
5121 vec
= alloca(count
* sizeof(struct iovec
));
5122 if (lock_iovec(VERIFY_READ
, vec
, arg2
, count
, 1) < 0)
5124 ret
= get_errno(writev(arg1
, vec
, count
));
5125 unlock_iovec(vec
, arg2
, count
, 0);
5128 case TARGET_NR_getsid
:
5129 ret
= get_errno(getsid(arg1
));
5131 #if defined(TARGET_NR_fdatasync) /* Not on alpha (osf_datasync ?) */
5132 case TARGET_NR_fdatasync
:
5133 ret
= get_errno(fdatasync(arg1
));
5136 case TARGET_NR__sysctl
:
5137 /* We don't implement this, but ENOTDIR is always a safe
5139 ret
= -TARGET_ENOTDIR
;
5141 case TARGET_NR_sched_setparam
:
5143 struct sched_param
*target_schp
;
5144 struct sched_param schp
;
5146 if (!lock_user_struct(VERIFY_READ
, target_schp
, arg2
, 1))
5148 schp
.sched_priority
= tswap32(target_schp
->sched_priority
);
5149 unlock_user_struct(target_schp
, arg2
, 0);
5150 ret
= get_errno(sched_setparam(arg1
, &schp
));
5153 case TARGET_NR_sched_getparam
:
5155 struct sched_param
*target_schp
;
5156 struct sched_param schp
;
5157 ret
= get_errno(sched_getparam(arg1
, &schp
));
5158 if (!is_error(ret
)) {
5159 if (!lock_user_struct(VERIFY_WRITE
, target_schp
, arg2
, 0))
5161 target_schp
->sched_priority
= tswap32(schp
.sched_priority
);
5162 unlock_user_struct(target_schp
, arg2
, 1);
5166 case TARGET_NR_sched_setscheduler
:
5168 struct sched_param
*target_schp
;
5169 struct sched_param schp
;
5170 if (!lock_user_struct(VERIFY_READ
, target_schp
, arg3
, 1))
5172 schp
.sched_priority
= tswap32(target_schp
->sched_priority
);
5173 unlock_user_struct(target_schp
, arg3
, 0);
5174 ret
= get_errno(sched_setscheduler(arg1
, arg2
, &schp
));
5177 case TARGET_NR_sched_getscheduler
:
5178 ret
= get_errno(sched_getscheduler(arg1
));
5180 case TARGET_NR_sched_yield
:
5181 ret
= get_errno(sched_yield());
5183 case TARGET_NR_sched_get_priority_max
:
5184 ret
= get_errno(sched_get_priority_max(arg1
));
5186 case TARGET_NR_sched_get_priority_min
:
5187 ret
= get_errno(sched_get_priority_min(arg1
));
5189 case TARGET_NR_sched_rr_get_interval
:
5192 ret
= get_errno(sched_rr_get_interval(arg1
, &ts
));
5193 if (!is_error(ret
)) {
5194 host_to_target_timespec(arg2
, &ts
);
5198 case TARGET_NR_nanosleep
:
5200 struct timespec req
, rem
;
5201 target_to_host_timespec(&req
, arg1
);
5202 ret
= get_errno(nanosleep(&req
, &rem
));
5203 if (is_error(ret
) && arg2
) {
5204 host_to_target_timespec(arg2
, &rem
);
5208 #ifdef TARGET_NR_query_module
5209 case TARGET_NR_query_module
:
5212 #ifdef TARGET_NR_nfsservctl
5213 case TARGET_NR_nfsservctl
:
5216 case TARGET_NR_prctl
:
5219 case PR_GET_PDEATHSIG
:
5222 ret
= get_errno(prctl(arg1
, &deathsig
, arg3
, arg4
, arg5
));
5223 if (!is_error(ret
) && arg2
5224 && put_user_ual(deathsig
, arg2
))
5229 ret
= get_errno(prctl(arg1
, arg2
, arg3
, arg4
, arg5
));
5233 #ifdef TARGET_NR_arch_prctl
5234 case TARGET_NR_arch_prctl
:
5235 #if defined(TARGET_I386) && !defined(TARGET_ABI32)
5236 ret
= do_arch_prctl(cpu_env
, arg1
, arg2
);
5242 #ifdef TARGET_NR_pread
5243 case TARGET_NR_pread
:
5245 if (((CPUARMState
*)cpu_env
)->eabi
)
5248 if (!(p
= lock_user(VERIFY_WRITE
, arg2
, arg3
, 0)))
5250 ret
= get_errno(pread(arg1
, p
, arg3
, arg4
));
5251 unlock_user(p
, arg2
, ret
);
5253 case TARGET_NR_pwrite
:
5255 if (((CPUARMState
*)cpu_env
)->eabi
)
5258 if (!(p
= lock_user(VERIFY_READ
, arg2
, arg3
, 1)))
5260 ret
= get_errno(pwrite(arg1
, p
, arg3
, arg4
));
5261 unlock_user(p
, arg2
, 0);
5264 #ifdef TARGET_NR_pread64
5265 case TARGET_NR_pread64
:
5266 if (!(p
= lock_user(VERIFY_WRITE
, arg2
, arg3
, 0)))
5268 ret
= get_errno(pread64(arg1
, p
, arg3
, target_offset64(arg4
, arg5
)));
5269 unlock_user(p
, arg2
, ret
);
5271 case TARGET_NR_pwrite64
:
5272 if (!(p
= lock_user(VERIFY_READ
, arg2
, arg3
, 1)))
5274 ret
= get_errno(pwrite64(arg1
, p
, arg3
, target_offset64(arg4
, arg5
)));
5275 unlock_user(p
, arg2
, 0);
5278 case TARGET_NR_getcwd
:
5279 if (!(p
= lock_user(VERIFY_WRITE
, arg1
, arg2
, 0)))
5281 ret
= get_errno(sys_getcwd1(p
, arg2
));
5282 unlock_user(p
, arg1
, ret
);
5284 case TARGET_NR_capget
:
5286 case TARGET_NR_capset
:
5288 case TARGET_NR_sigaltstack
:
5289 #if defined(TARGET_I386) || defined(TARGET_ARM) || defined(TARGET_MIPS) || \
5290 defined(TARGET_SPARC) || defined(TARGET_PPC) || defined(TARGET_ALPHA)
5291 ret
= do_sigaltstack(arg1
, arg2
, get_sp_from_cpustate((CPUState
*)cpu_env
));
5296 case TARGET_NR_sendfile
:
5298 #ifdef TARGET_NR_getpmsg
5299 case TARGET_NR_getpmsg
:
5302 #ifdef TARGET_NR_putpmsg
5303 case TARGET_NR_putpmsg
:
5306 #ifdef TARGET_NR_vfork
5307 case TARGET_NR_vfork
:
5308 ret
= get_errno(do_fork(cpu_env
, CLONE_VFORK
| CLONE_VM
| SIGCHLD
,
5312 #ifdef TARGET_NR_ugetrlimit
5313 case TARGET_NR_ugetrlimit
:
5316 ret
= get_errno(getrlimit(arg1
, &rlim
));
5317 if (!is_error(ret
)) {
5318 struct target_rlimit
*target_rlim
;
5319 if (!lock_user_struct(VERIFY_WRITE
, target_rlim
, arg2
, 0))
5321 target_rlim
->rlim_cur
= tswapl(rlim
.rlim_cur
);
5322 target_rlim
->rlim_max
= tswapl(rlim
.rlim_max
);
5323 unlock_user_struct(target_rlim
, arg2
, 1);
5328 #ifdef TARGET_NR_truncate64
5329 case TARGET_NR_truncate64
:
5330 if (!(p
= lock_user_string(arg1
)))
5332 ret
= target_truncate64(cpu_env
, p
, arg2
, arg3
, arg4
);
5333 unlock_user(p
, arg1
, 0);
5336 #ifdef TARGET_NR_ftruncate64
5337 case TARGET_NR_ftruncate64
:
5338 ret
= target_ftruncate64(cpu_env
, arg1
, arg2
, arg3
, arg4
);
5341 #ifdef TARGET_NR_stat64
5342 case TARGET_NR_stat64
:
5343 if (!(p
= lock_user_string(arg1
)))
5345 ret
= get_errno(stat(path(p
), &st
));
5346 unlock_user(p
, arg1
, 0);
5348 ret
= host_to_target_stat64(cpu_env
, arg2
, &st
);
5351 #ifdef TARGET_NR_lstat64
5352 case TARGET_NR_lstat64
:
5353 if (!(p
= lock_user_string(arg1
)))
5355 ret
= get_errno(lstat(path(p
), &st
));
5356 unlock_user(p
, arg1
, 0);
5358 ret
= host_to_target_stat64(cpu_env
, arg2
, &st
);
5361 #ifdef TARGET_NR_fstat64
5362 case TARGET_NR_fstat64
:
5363 ret
= get_errno(fstat(arg1
, &st
));
5365 ret
= host_to_target_stat64(cpu_env
, arg2
, &st
);
5368 #if defined(TARGET_NR_fstatat64) && defined(__NR_fstatat64)
5369 case TARGET_NR_fstatat64
:
5370 if (!(p
= lock_user_string(arg2
)))
5372 ret
= get_errno(sys_fstatat64(arg1
, path(p
), &st
, arg4
));
5374 ret
= host_to_target_stat64(cpu_env
, arg3
, &st
);
5378 case TARGET_NR_lchown
:
5379 if (!(p
= lock_user_string(arg1
)))
5381 ret
= get_errno(lchown(p
, low2highuid(arg2
), low2highgid(arg3
)));
5382 unlock_user(p
, arg1
, 0);
5384 case TARGET_NR_getuid
:
5385 ret
= get_errno(high2lowuid(getuid()));
5387 case TARGET_NR_getgid
:
5388 ret
= get_errno(high2lowgid(getgid()));
5390 case TARGET_NR_geteuid
:
5391 ret
= get_errno(high2lowuid(geteuid()));
5393 case TARGET_NR_getegid
:
5394 ret
= get_errno(high2lowgid(getegid()));
5396 case TARGET_NR_setreuid
:
5397 ret
= get_errno(setreuid(low2highuid(arg1
), low2highuid(arg2
)));
5399 case TARGET_NR_setregid
:
5400 ret
= get_errno(setregid(low2highgid(arg1
), low2highgid(arg2
)));
5402 case TARGET_NR_getgroups
:
5404 int gidsetsize
= arg1
;
5405 uint16_t *target_grouplist
;
5409 grouplist
= alloca(gidsetsize
* sizeof(gid_t
));
5410 ret
= get_errno(getgroups(gidsetsize
, grouplist
));
5411 if (gidsetsize
== 0)
5413 if (!is_error(ret
)) {
5414 target_grouplist
= lock_user(VERIFY_WRITE
, arg2
, gidsetsize
* 2, 0);
5415 if (!target_grouplist
)
5417 for(i
= 0;i
< ret
; i
++)
5418 target_grouplist
[i
] = tswap16(grouplist
[i
]);
5419 unlock_user(target_grouplist
, arg2
, gidsetsize
* 2);
5423 case TARGET_NR_setgroups
:
5425 int gidsetsize
= arg1
;
5426 uint16_t *target_grouplist
;
5430 grouplist
= alloca(gidsetsize
* sizeof(gid_t
));
5431 target_grouplist
= lock_user(VERIFY_READ
, arg2
, gidsetsize
* 2, 1);
5432 if (!target_grouplist
) {
5433 ret
= -TARGET_EFAULT
;
5436 for(i
= 0;i
< gidsetsize
; i
++)
5437 grouplist
[i
] = tswap16(target_grouplist
[i
]);
5438 unlock_user(target_grouplist
, arg2
, 0);
5439 ret
= get_errno(setgroups(gidsetsize
, grouplist
));
5442 case TARGET_NR_fchown
:
5443 ret
= get_errno(fchown(arg1
, low2highuid(arg2
), low2highgid(arg3
)));
5445 #if defined(TARGET_NR_fchownat) && defined(__NR_fchownat)
5446 case TARGET_NR_fchownat
:
5447 if (!(p
= lock_user_string(arg2
)))
5449 ret
= get_errno(sys_fchownat(arg1
, p
, low2highuid(arg3
), low2highgid(arg4
), arg5
));
5450 unlock_user(p
, arg2
, 0);
5453 #ifdef TARGET_NR_setresuid
5454 case TARGET_NR_setresuid
:
5455 ret
= get_errno(setresuid(low2highuid(arg1
),
5457 low2highuid(arg3
)));
5460 #ifdef TARGET_NR_getresuid
5461 case TARGET_NR_getresuid
:
5463 uid_t ruid
, euid
, suid
;
5464 ret
= get_errno(getresuid(&ruid
, &euid
, &suid
));
5465 if (!is_error(ret
)) {
5466 if (put_user_u16(high2lowuid(ruid
), arg1
)
5467 || put_user_u16(high2lowuid(euid
), arg2
)
5468 || put_user_u16(high2lowuid(suid
), arg3
))
5474 #ifdef TARGET_NR_getresgid
5475 case TARGET_NR_setresgid
:
5476 ret
= get_errno(setresgid(low2highgid(arg1
),
5478 low2highgid(arg3
)));
5481 #ifdef TARGET_NR_getresgid
5482 case TARGET_NR_getresgid
:
5484 gid_t rgid
, egid
, sgid
;
5485 ret
= get_errno(getresgid(&rgid
, &egid
, &sgid
));
5486 if (!is_error(ret
)) {
5487 if (put_user_u16(high2lowgid(rgid
), arg1
)
5488 || put_user_u16(high2lowgid(egid
), arg2
)
5489 || put_user_u16(high2lowgid(sgid
), arg3
))
5495 case TARGET_NR_chown
:
5496 if (!(p
= lock_user_string(arg1
)))
5498 ret
= get_errno(chown(p
, low2highuid(arg2
), low2highgid(arg3
)));
5499 unlock_user(p
, arg1
, 0);
5501 case TARGET_NR_setuid
:
5502 ret
= get_errno(setuid(low2highuid(arg1
)));
5504 case TARGET_NR_setgid
:
5505 ret
= get_errno(setgid(low2highgid(arg1
)));
5507 case TARGET_NR_setfsuid
:
5508 ret
= get_errno(setfsuid(arg1
));
5510 case TARGET_NR_setfsgid
:
5511 ret
= get_errno(setfsgid(arg1
));
5513 #endif /* USE_UID16 */
5515 #ifdef TARGET_NR_lchown32
5516 case TARGET_NR_lchown32
:
5517 if (!(p
= lock_user_string(arg1
)))
5519 ret
= get_errno(lchown(p
, arg2
, arg3
));
5520 unlock_user(p
, arg1
, 0);
5523 #ifdef TARGET_NR_getuid32
5524 case TARGET_NR_getuid32
:
5525 ret
= get_errno(getuid());
5528 #ifdef TARGET_NR_getgid32
5529 case TARGET_NR_getgid32
:
5530 ret
= get_errno(getgid());
5533 #ifdef TARGET_NR_geteuid32
5534 case TARGET_NR_geteuid32
:
5535 ret
= get_errno(geteuid());
5538 #ifdef TARGET_NR_getegid32
5539 case TARGET_NR_getegid32
:
5540 ret
= get_errno(getegid());
5543 #ifdef TARGET_NR_setreuid32
5544 case TARGET_NR_setreuid32
:
5545 ret
= get_errno(setreuid(arg1
, arg2
));
5548 #ifdef TARGET_NR_setregid32
5549 case TARGET_NR_setregid32
:
5550 ret
= get_errno(setregid(arg1
, arg2
));
5553 #ifdef TARGET_NR_getgroups32
5554 case TARGET_NR_getgroups32
:
5556 int gidsetsize
= arg1
;
5557 uint32_t *target_grouplist
;
5561 grouplist
= alloca(gidsetsize
* sizeof(gid_t
));
5562 ret
= get_errno(getgroups(gidsetsize
, grouplist
));
5563 if (gidsetsize
== 0)
5565 if (!is_error(ret
)) {
5566 target_grouplist
= lock_user(VERIFY_WRITE
, arg2
, gidsetsize
* 4, 0);
5567 if (!target_grouplist
) {
5568 ret
= -TARGET_EFAULT
;
5571 for(i
= 0;i
< ret
; i
++)
5572 target_grouplist
[i
] = tswap32(grouplist
[i
]);
5573 unlock_user(target_grouplist
, arg2
, gidsetsize
* 4);
5578 #ifdef TARGET_NR_setgroups32
5579 case TARGET_NR_setgroups32
:
5581 int gidsetsize
= arg1
;
5582 uint32_t *target_grouplist
;
5586 grouplist
= alloca(gidsetsize
* sizeof(gid_t
));
5587 target_grouplist
= lock_user(VERIFY_READ
, arg2
, gidsetsize
* 4, 1);
5588 if (!target_grouplist
) {
5589 ret
= -TARGET_EFAULT
;
5592 for(i
= 0;i
< gidsetsize
; i
++)
5593 grouplist
[i
] = tswap32(target_grouplist
[i
]);
5594 unlock_user(target_grouplist
, arg2
, 0);
5595 ret
= get_errno(setgroups(gidsetsize
, grouplist
));
5599 #ifdef TARGET_NR_fchown32
5600 case TARGET_NR_fchown32
:
5601 ret
= get_errno(fchown(arg1
, arg2
, arg3
));
5604 #ifdef TARGET_NR_setresuid32
5605 case TARGET_NR_setresuid32
:
5606 ret
= get_errno(setresuid(arg1
, arg2
, arg3
));
5609 #ifdef TARGET_NR_getresuid32
5610 case TARGET_NR_getresuid32
:
5612 uid_t ruid
, euid
, suid
;
5613 ret
= get_errno(getresuid(&ruid
, &euid
, &suid
));
5614 if (!is_error(ret
)) {
5615 if (put_user_u32(ruid
, arg1
)
5616 || put_user_u32(euid
, arg2
)
5617 || put_user_u32(suid
, arg3
))
5623 #ifdef TARGET_NR_setresgid32
5624 case TARGET_NR_setresgid32
:
5625 ret
= get_errno(setresgid(arg1
, arg2
, arg3
));
5628 #ifdef TARGET_NR_getresgid32
5629 case TARGET_NR_getresgid32
:
5631 gid_t rgid
, egid
, sgid
;
5632 ret
= get_errno(getresgid(&rgid
, &egid
, &sgid
));
5633 if (!is_error(ret
)) {
5634 if (put_user_u32(rgid
, arg1
)
5635 || put_user_u32(egid
, arg2
)
5636 || put_user_u32(sgid
, arg3
))
5642 #ifdef TARGET_NR_chown32
5643 case TARGET_NR_chown32
:
5644 if (!(p
= lock_user_string(arg1
)))
5646 ret
= get_errno(chown(p
, arg2
, arg3
));
5647 unlock_user(p
, arg1
, 0);
5650 #ifdef TARGET_NR_setuid32
5651 case TARGET_NR_setuid32
:
5652 ret
= get_errno(setuid(arg1
));
5655 #ifdef TARGET_NR_setgid32
5656 case TARGET_NR_setgid32
:
5657 ret
= get_errno(setgid(arg1
));
5660 #ifdef TARGET_NR_setfsuid32
5661 case TARGET_NR_setfsuid32
:
5662 ret
= get_errno(setfsuid(arg1
));
5665 #ifdef TARGET_NR_setfsgid32
5666 case TARGET_NR_setfsgid32
:
5667 ret
= get_errno(setfsgid(arg1
));
5671 case TARGET_NR_pivot_root
:
5673 #ifdef TARGET_NR_mincore
5674 case TARGET_NR_mincore
:
5677 ret
= -TARGET_EFAULT
;
5678 if (!(a
= lock_user(VERIFY_READ
, arg1
,arg2
, 0)))
5680 if (!(p
= lock_user_string(arg3
)))
5682 ret
= get_errno(mincore(a
, arg2
, p
));
5683 unlock_user(p
, arg3
, ret
);
5685 unlock_user(a
, arg1
, 0);
5689 #ifdef TARGET_NR_arm_fadvise64_64
5690 case TARGET_NR_arm_fadvise64_64
:
5693 * arm_fadvise64_64 looks like fadvise64_64 but
5694 * with different argument order
5702 #if defined(TARGET_NR_fadvise64_64) || defined(TARGET_NR_arm_fadvise64_64)
5703 #ifdef TARGET_NR_fadvise64_64
5704 case TARGET_NR_fadvise64_64
:
5706 /* This is a hint, so ignoring and returning success is ok. */
5710 #ifdef TARGET_NR_madvise
5711 case TARGET_NR_madvise
:
5712 /* A straight passthrough may not be safe because qemu sometimes
5713 turns private flie-backed mappings into anonymous mappings.
5714 This will break MADV_DONTNEED.
5715 This is a hint, so ignoring and returning success is ok. */
5719 #if TARGET_ABI_BITS == 32
5720 case TARGET_NR_fcntl64
:
5724 struct target_flock64
*target_fl
;
5726 struct target_eabi_flock64
*target_efl
;
5730 case TARGET_F_GETLK64
:
5733 case TARGET_F_SETLK64
:
5736 case TARGET_F_SETLKW64
:
5745 case TARGET_F_GETLK64
:
5747 if (((CPUARMState
*)cpu_env
)->eabi
) {
5748 if (!lock_user_struct(VERIFY_READ
, target_efl
, arg3
, 1))
5750 fl
.l_type
= tswap16(target_efl
->l_type
);
5751 fl
.l_whence
= tswap16(target_efl
->l_whence
);
5752 fl
.l_start
= tswap64(target_efl
->l_start
);
5753 fl
.l_len
= tswap64(target_efl
->l_len
);
5754 fl
.l_pid
= tswapl(target_efl
->l_pid
);
5755 unlock_user_struct(target_efl
, arg3
, 0);
5759 if (!lock_user_struct(VERIFY_READ
, target_fl
, arg3
, 1))
5761 fl
.l_type
= tswap16(target_fl
->l_type
);
5762 fl
.l_whence
= tswap16(target_fl
->l_whence
);
5763 fl
.l_start
= tswap64(target_fl
->l_start
);
5764 fl
.l_len
= tswap64(target_fl
->l_len
);
5765 fl
.l_pid
= tswapl(target_fl
->l_pid
);
5766 unlock_user_struct(target_fl
, arg3
, 0);
5768 ret
= get_errno(fcntl(arg1
, cmd
, &fl
));
5771 if (((CPUARMState
*)cpu_env
)->eabi
) {
5772 if (!lock_user_struct(VERIFY_WRITE
, target_efl
, arg3
, 0))
5774 target_efl
->l_type
= tswap16(fl
.l_type
);
5775 target_efl
->l_whence
= tswap16(fl
.l_whence
);
5776 target_efl
->l_start
= tswap64(fl
.l_start
);
5777 target_efl
->l_len
= tswap64(fl
.l_len
);
5778 target_efl
->l_pid
= tswapl(fl
.l_pid
);
5779 unlock_user_struct(target_efl
, arg3
, 1);
5783 if (!lock_user_struct(VERIFY_WRITE
, target_fl
, arg3
, 0))
5785 target_fl
->l_type
= tswap16(fl
.l_type
);
5786 target_fl
->l_whence
= tswap16(fl
.l_whence
);
5787 target_fl
->l_start
= tswap64(fl
.l_start
);
5788 target_fl
->l_len
= tswap64(fl
.l_len
);
5789 target_fl
->l_pid
= tswapl(fl
.l_pid
);
5790 unlock_user_struct(target_fl
, arg3
, 1);
5795 case TARGET_F_SETLK64
:
5796 case TARGET_F_SETLKW64
:
5798 if (((CPUARMState
*)cpu_env
)->eabi
) {
5799 if (!lock_user_struct(VERIFY_READ
, target_efl
, arg3
, 1))
5801 fl
.l_type
= tswap16(target_efl
->l_type
);
5802 fl
.l_whence
= tswap16(target_efl
->l_whence
);
5803 fl
.l_start
= tswap64(target_efl
->l_start
);
5804 fl
.l_len
= tswap64(target_efl
->l_len
);
5805 fl
.l_pid
= tswapl(target_efl
->l_pid
);
5806 unlock_user_struct(target_efl
, arg3
, 0);
5810 if (!lock_user_struct(VERIFY_READ
, target_fl
, arg3
, 1))
5812 fl
.l_type
= tswap16(target_fl
->l_type
);
5813 fl
.l_whence
= tswap16(target_fl
->l_whence
);
5814 fl
.l_start
= tswap64(target_fl
->l_start
);
5815 fl
.l_len
= tswap64(target_fl
->l_len
);
5816 fl
.l_pid
= tswapl(target_fl
->l_pid
);
5817 unlock_user_struct(target_fl
, arg3
, 0);
5819 ret
= get_errno(fcntl(arg1
, cmd
, &fl
));
5822 ret
= do_fcntl(arg1
, cmd
, arg3
);
5828 #ifdef TARGET_NR_cacheflush
5829 case TARGET_NR_cacheflush
:
5830 /* self-modifying code is handled automatically, so nothing needed */
5834 #ifdef TARGET_NR_security
5835 case TARGET_NR_security
:
5838 #ifdef TARGET_NR_getpagesize
5839 case TARGET_NR_getpagesize
:
5840 ret
= TARGET_PAGE_SIZE
;
5843 case TARGET_NR_gettid
:
5844 ret
= get_errno(gettid());
5846 #ifdef TARGET_NR_readahead
5847 case TARGET_NR_readahead
:
5848 #if TARGET_ABI_BITS == 32
5850 if (((CPUARMState
*)cpu_env
)->eabi
)
5857 ret
= get_errno(readahead(arg1
, ((off64_t
)arg3
<< 32) | arg2
, arg4
));
5859 ret
= get_errno(readahead(arg1
, arg2
, arg3
));
5863 #ifdef TARGET_NR_setxattr
5864 case TARGET_NR_setxattr
:
5865 case TARGET_NR_lsetxattr
:
5866 case TARGET_NR_fsetxattr
:
5867 case TARGET_NR_getxattr
:
5868 case TARGET_NR_lgetxattr
:
5869 case TARGET_NR_fgetxattr
:
5870 case TARGET_NR_listxattr
:
5871 case TARGET_NR_llistxattr
:
5872 case TARGET_NR_flistxattr
:
5873 case TARGET_NR_removexattr
:
5874 case TARGET_NR_lremovexattr
:
5875 case TARGET_NR_fremovexattr
:
5876 goto unimplemented_nowarn
;
5878 #ifdef TARGET_NR_set_thread_area
5879 case TARGET_NR_set_thread_area
:
5880 #if defined(TARGET_MIPS)
5881 ((CPUMIPSState
*) cpu_env
)->tls_value
= arg1
;
5884 #elif defined(TARGET_I386) && defined(TARGET_ABI32)
5885 ret
= do_set_thread_area(cpu_env
, arg1
);
5888 goto unimplemented_nowarn
;
5891 #ifdef TARGET_NR_get_thread_area
5892 case TARGET_NR_get_thread_area
:
5893 #if defined(TARGET_I386) && defined(TARGET_ABI32)
5894 ret
= do_get_thread_area(cpu_env
, arg1
);
5896 goto unimplemented_nowarn
;
5899 #ifdef TARGET_NR_getdomainname
5900 case TARGET_NR_getdomainname
:
5901 goto unimplemented_nowarn
;
5904 #ifdef TARGET_NR_clock_gettime
5905 case TARGET_NR_clock_gettime
:
5908 ret
= get_errno(clock_gettime(arg1
, &ts
));
5909 if (!is_error(ret
)) {
5910 host_to_target_timespec(arg2
, &ts
);
5915 #ifdef TARGET_NR_clock_getres
5916 case TARGET_NR_clock_getres
:
5919 ret
= get_errno(clock_getres(arg1
, &ts
));
5920 if (!is_error(ret
)) {
5921 host_to_target_timespec(arg2
, &ts
);
5926 #ifdef TARGET_NR_clock_nanosleep
5927 case TARGET_NR_clock_nanosleep
:
5930 target_to_host_timespec(&ts
, arg3
);
5931 ret
= get_errno(clock_nanosleep(arg1
, arg2
, &ts
, arg4
? &ts
: NULL
));
5933 host_to_target_timespec(arg4
, &ts
);
5938 #if defined(TARGET_NR_set_tid_address) && defined(__NR_set_tid_address)
5939 case TARGET_NR_set_tid_address
:
5940 ret
= get_errno(set_tid_address((int *)g2h(arg1
)));
5944 #if defined(TARGET_NR_tkill) && defined(__NR_tkill)
5945 case TARGET_NR_tkill
:
5946 ret
= get_errno(sys_tkill((int)arg1
, target_to_host_signal(arg2
)));
5950 #if defined(TARGET_NR_tgkill) && defined(__NR_tgkill)
5951 case TARGET_NR_tgkill
:
5952 ret
= get_errno(sys_tgkill((int)arg1
, (int)arg2
,
5953 target_to_host_signal(arg3
)));
5957 #ifdef TARGET_NR_set_robust_list
5958 case TARGET_NR_set_robust_list
:
5959 goto unimplemented_nowarn
;
5962 #if defined(TARGET_NR_utimensat) && defined(__NR_utimensat)
5963 case TARGET_NR_utimensat
:
5965 struct timespec ts
[2];
5966 target_to_host_timespec(ts
, arg3
);
5967 target_to_host_timespec(ts
+1, arg3
+sizeof(struct target_timespec
));
5969 ret
= get_errno(sys_utimensat(arg1
, NULL
, ts
, arg4
));
5971 if (!(p
= lock_user_string(arg2
))) {
5972 ret
= -TARGET_EFAULT
;
5975 ret
= get_errno(sys_utimensat(arg1
, path(p
), ts
, arg4
));
5976 unlock_user(p
, arg2
, 0);
5981 #if defined(USE_NPTL)
5982 case TARGET_NR_futex
:
5983 ret
= do_futex(arg1
, arg2
, arg3
, arg4
, arg5
, arg6
);
5986 #ifdef TARGET_NR_inotify_init
5987 case TARGET_NR_inotify_init
:
5988 ret
= get_errno(sys_inotify_init());
5991 #ifdef TARGET_NR_inotify_add_watch
5992 case TARGET_NR_inotify_add_watch
:
5993 p
= lock_user_string(arg2
);
5994 ret
= get_errno(sys_inotify_add_watch(arg1
, path(p
), arg3
));
5995 unlock_user(p
, arg2
, 0);
5998 #ifdef TARGET_NR_inotify_rm_watch
5999 case TARGET_NR_inotify_rm_watch
:
6000 ret
= get_errno(sys_inotify_rm_watch(arg1
, arg2
));
6006 gemu_log("qemu: Unsupported syscall: %d\n", num
);
6007 #if defined(TARGET_NR_setxattr) || defined(TARGET_NR_get_thread_area) || defined(TARGET_NR_getdomainname) || defined(TARGET_NR_set_robust_list)
6008 unimplemented_nowarn
:
6010 ret
= -TARGET_ENOSYS
;
6015 gemu_log(" = %ld\n", ret
);
6018 print_syscall_ret(num
, ret
);
6021 ret
= -TARGET_EFAULT
;