4 * Copyright (c) 2003 Fabrice Bellard
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
31 #include <sys/types.h>
37 #include <sys/mount.h>
38 #include <sys/prctl.h>
39 #include <sys/resource.h>
44 #include <sys/socket.h>
47 #include <sys/times.h>
50 #include <sys/statfs.h>
52 #include <sys/sysinfo.h>
53 //#include <sys/user.h>
54 #include <netinet/ip.h>
55 #include <netinet/tcp.h>
56 #include <qemu-common.h>
61 #define termios host_termios
62 #define winsize host_winsize
63 #define termio host_termio
64 #define sgttyb host_sgttyb /* same as target */
65 #define tchars host_tchars /* same as target */
66 #define ltchars host_ltchars /* same as target */
68 #include <linux/termios.h>
69 #include <linux/unistd.h>
70 #include <linux/utsname.h>
71 #include <linux/cdrom.h>
72 #include <linux/hdreg.h>
73 #include <linux/soundcard.h>
75 #include <linux/mtio.h>
76 #include "linux_loop.h"
79 #include "qemu-common.h"
82 #include <linux/futex.h>
83 #define CLONE_NPTL_FLAGS2 (CLONE_SETTLS | \
84 CLONE_PARENT_SETTID | CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID)
86 /* XXX: Hardcode the above values. */
87 #define CLONE_NPTL_FLAGS2 0
92 #if defined(TARGET_I386) || defined(TARGET_ARM) || defined(TARGET_SPARC) \
93 || defined(TARGET_M68K) || defined(TARGET_SH4) || defined(TARGET_CRIS)
94 /* 16 bit uid wrappers emulation */
98 //#include <linux/msdos_fs.h>
99 #define VFAT_IOCTL_READDIR_BOTH _IOR('r', 1, struct linux_dirent [2])
100 #define VFAT_IOCTL_READDIR_SHORT _IOR('r', 2, struct linux_dirent [2])
111 #define _syscall0(type,name) \
112 static type name (void) \
114 return syscall(__NR_##name); \
117 #define _syscall1(type,name,type1,arg1) \
118 static type name (type1 arg1) \
120 return syscall(__NR_##name, arg1); \
123 #define _syscall2(type,name,type1,arg1,type2,arg2) \
124 static type name (type1 arg1,type2 arg2) \
126 return syscall(__NR_##name, arg1, arg2); \
129 #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \
130 static type name (type1 arg1,type2 arg2,type3 arg3) \
132 return syscall(__NR_##name, arg1, arg2, arg3); \
135 #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
136 static type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4) \
138 return syscall(__NR_##name, arg1, arg2, arg3, arg4); \
141 #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
143 static type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5) \
145 return syscall(__NR_##name, arg1, arg2, arg3, arg4, arg5); \
149 #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
150 type5,arg5,type6,arg6) \
151 static type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5, \
154 return syscall(__NR_##name, arg1, arg2, arg3, arg4, arg5, arg6); \
158 #define __NR_sys_exit __NR_exit
159 #define __NR_sys_uname __NR_uname
160 #define __NR_sys_faccessat __NR_faccessat
161 #define __NR_sys_fchmodat __NR_fchmodat
162 #define __NR_sys_fchownat __NR_fchownat
163 #define __NR_sys_fstatat64 __NR_fstatat64
164 #define __NR_sys_futimesat __NR_futimesat
165 #define __NR_sys_getcwd1 __NR_getcwd
166 #define __NR_sys_getdents __NR_getdents
167 #define __NR_sys_getdents64 __NR_getdents64
168 #define __NR_sys_getpriority __NR_getpriority
169 #define __NR_sys_linkat __NR_linkat
170 #define __NR_sys_mkdirat __NR_mkdirat
171 #define __NR_sys_mknodat __NR_mknodat
172 #define __NR_sys_openat __NR_openat
173 #define __NR_sys_readlinkat __NR_readlinkat
174 #define __NR_sys_renameat __NR_renameat
175 #define __NR_sys_rt_sigqueueinfo __NR_rt_sigqueueinfo
176 #define __NR_sys_symlinkat __NR_symlinkat
177 #define __NR_sys_syslog __NR_syslog
178 #define __NR_sys_tgkill __NR_tgkill
179 #define __NR_sys_tkill __NR_tkill
180 #define __NR_sys_unlinkat __NR_unlinkat
181 #define __NR_sys_utimensat __NR_utimensat
182 #define __NR_sys_futex __NR_futex
183 #define __NR_sys_inotify_init __NR_inotify_init
184 #define __NR_sys_inotify_add_watch __NR_inotify_add_watch
185 #define __NR_sys_inotify_rm_watch __NR_inotify_rm_watch
187 #if defined(__alpha__) || defined (__ia64__) || defined(__x86_64__)
188 #define __NR__llseek __NR_lseek
192 _syscall0(int, gettid
)
194 /* This is a replacement for the host gettid() and must return a host
196 static int gettid(void) {
200 _syscall1(int,sys_exit
,int,status
)
201 _syscall1(int,sys_uname
,struct new_utsname
*,buf
)
202 #if defined(TARGET_NR_faccessat) && defined(__NR_faccessat)
203 _syscall4(int,sys_faccessat
,int,dirfd
,const char *,pathname
,int,mode
,int,flags
)
205 #if defined(TARGET_NR_fchmodat) && defined(__NR_fchmodat)
206 _syscall4(int,sys_fchmodat
,int,dirfd
,const char *,pathname
,
207 mode_t
,mode
,int,flags
)
209 #if defined(TARGET_NR_fchownat) && defined(__NR_fchownat) && defined(USE_UID16)
210 _syscall5(int,sys_fchownat
,int,dirfd
,const char *,pathname
,
211 uid_t
,owner
,gid_t
,group
,int,flags
)
213 #if defined(TARGET_NR_fstatat64) && defined(__NR_fstatat64)
214 _syscall4(int,sys_fstatat64
,int,dirfd
,const char *,pathname
,
215 struct stat
*,buf
,int,flags
)
217 #if defined(TARGET_NR_futimesat) && defined(__NR_futimesat)
218 _syscall3(int,sys_futimesat
,int,dirfd
,const char *,pathname
,
219 const struct timeval
*,times
)
221 _syscall2(int,sys_getcwd1
,char *,buf
,size_t,size
)
222 #if TARGET_ABI_BITS == 32
223 _syscall3(int, sys_getdents
, uint
, fd
, struct linux_dirent
*, dirp
, uint
, count
);
225 #if defined(TARGET_NR_getdents64) && defined(__NR_getdents64)
226 _syscall3(int, sys_getdents64
, uint
, fd
, struct linux_dirent64
*, dirp
, uint
, count
);
228 _syscall2(int, sys_getpriority
, int, which
, int, who
);
229 #if !defined (__x86_64__)
230 _syscall5(int, _llseek
, uint
, fd
, ulong
, hi
, ulong
, lo
,
231 loff_t
*, res
, uint
, wh
);
233 #if defined(TARGET_NR_linkat) && defined(__NR_linkat)
234 _syscall5(int,sys_linkat
,int,olddirfd
,const char *,oldpath
,
235 int,newdirfd
,const char *,newpath
,int,flags
)
237 #if defined(TARGET_NR_mkdirat) && defined(__NR_mkdirat)
238 _syscall3(int,sys_mkdirat
,int,dirfd
,const char *,pathname
,mode_t
,mode
)
240 #if defined(TARGET_NR_mknodat) && defined(__NR_mknodat)
241 _syscall4(int,sys_mknodat
,int,dirfd
,const char *,pathname
,
242 mode_t
,mode
,dev_t
,dev
)
244 #if defined(TARGET_NR_openat) && defined(__NR_openat)
245 _syscall4(int,sys_openat
,int,dirfd
,const char *,pathname
,int,flags
,mode_t
,mode
)
247 #if defined(TARGET_NR_readlinkat) && defined(__NR_readlinkat)
248 _syscall4(int,sys_readlinkat
,int,dirfd
,const char *,pathname
,
249 char *,buf
,size_t,bufsize
)
251 #if defined(TARGET_NR_renameat) && defined(__NR_renameat)
252 _syscall4(int,sys_renameat
,int,olddirfd
,const char *,oldpath
,
253 int,newdirfd
,const char *,newpath
)
255 _syscall3(int,sys_rt_sigqueueinfo
,int,pid
,int,sig
,siginfo_t
*,uinfo
)
256 #if defined(TARGET_NR_symlinkat) && defined(__NR_symlinkat)
257 _syscall3(int,sys_symlinkat
,const char *,oldpath
,
258 int,newdirfd
,const char *,newpath
)
260 _syscall3(int,sys_syslog
,int,type
,char*,bufp
,int,len
)
261 #if defined(TARGET_NR_tgkill) && defined(__NR_tgkill)
262 _syscall3(int,sys_tgkill
,int,tgid
,int,pid
,int,sig
)
264 #if defined(TARGET_NR_tkill) && defined(__NR_tkill)
265 _syscall2(int,sys_tkill
,int,tid
,int,sig
)
267 #ifdef __NR_exit_group
268 _syscall1(int,exit_group
,int,error_code
)
270 #if defined(TARGET_NR_set_tid_address) && defined(__NR_set_tid_address)
271 _syscall1(int,set_tid_address
,int *,tidptr
)
273 #if defined(TARGET_NR_unlinkat) && defined(__NR_unlinkat)
274 _syscall3(int,sys_unlinkat
,int,dirfd
,const char *,pathname
,int,flags
)
276 #if defined(TARGET_NR_utimensat) && defined(__NR_utimensat)
277 _syscall4(int,sys_utimensat
,int,dirfd
,const char *,pathname
,
278 const struct timespec
*,tsp
,int,flags
)
280 #if defined(TARGET_NR_inotify_init) && defined(__NR_inotify_init)
281 _syscall0(int,sys_inotify_init
)
283 #if defined(TARGET_NR_inotify_add_watch) && defined(__NR_inotify_add_watch)
284 _syscall3(int,sys_inotify_add_watch
,int,fd
,const char *,pathname
,uint32_t,mask
)
286 #if defined(TARGET_NR_inotify_rm_watch) && defined(__NR_inotify_rm_watch)
287 _syscall2(int,sys_inotify_rm_watch
,int,fd
,uint32_t,wd
)
289 #if defined(USE_NPTL)
290 #if defined(TARGET_NR_futex) && defined(__NR_futex)
291 _syscall6(int,sys_futex
,int *,uaddr
,int,op
,int,val
,
292 const struct timespec
*,timeout
,int *,uaddr2
,int,val3
)
296 extern int personality(int);
297 extern int flock(int, int);
298 extern int setfsuid(int);
299 extern int setfsgid(int);
300 extern int setgroups(int, gid_t
*);
302 #define ERRNO_TABLE_SIZE 1200
304 /* target_to_host_errno_table[] is initialized from
305 * host_to_target_errno_table[] in syscall_init(). */
306 static uint16_t target_to_host_errno_table
[ERRNO_TABLE_SIZE
] = {
310 * This list is the union of errno values overridden in asm-<arch>/errno.h
311 * minus the errnos that are not actually generic to all archs.
313 static uint16_t host_to_target_errno_table
[ERRNO_TABLE_SIZE
] = {
314 [EIDRM
] = TARGET_EIDRM
,
315 [ECHRNG
] = TARGET_ECHRNG
,
316 [EL2NSYNC
] = TARGET_EL2NSYNC
,
317 [EL3HLT
] = TARGET_EL3HLT
,
318 [EL3RST
] = TARGET_EL3RST
,
319 [ELNRNG
] = TARGET_ELNRNG
,
320 [EUNATCH
] = TARGET_EUNATCH
,
321 [ENOCSI
] = TARGET_ENOCSI
,
322 [EL2HLT
] = TARGET_EL2HLT
,
323 [EDEADLK
] = TARGET_EDEADLK
,
324 [ENOLCK
] = TARGET_ENOLCK
,
325 [EBADE
] = TARGET_EBADE
,
326 [EBADR
] = TARGET_EBADR
,
327 [EXFULL
] = TARGET_EXFULL
,
328 [ENOANO
] = TARGET_ENOANO
,
329 [EBADRQC
] = TARGET_EBADRQC
,
330 [EBADSLT
] = TARGET_EBADSLT
,
331 [EBFONT
] = TARGET_EBFONT
,
332 [ENOSTR
] = TARGET_ENOSTR
,
333 [ENODATA
] = TARGET_ENODATA
,
334 [ETIME
] = TARGET_ETIME
,
335 [ENOSR
] = TARGET_ENOSR
,
336 [ENONET
] = TARGET_ENONET
,
337 [ENOPKG
] = TARGET_ENOPKG
,
338 [EREMOTE
] = TARGET_EREMOTE
,
339 [ENOLINK
] = TARGET_ENOLINK
,
340 [EADV
] = TARGET_EADV
,
341 [ESRMNT
] = TARGET_ESRMNT
,
342 [ECOMM
] = TARGET_ECOMM
,
343 [EPROTO
] = TARGET_EPROTO
,
344 [EDOTDOT
] = TARGET_EDOTDOT
,
345 [EMULTIHOP
] = TARGET_EMULTIHOP
,
346 [EBADMSG
] = TARGET_EBADMSG
,
347 [ENAMETOOLONG
] = TARGET_ENAMETOOLONG
,
348 [EOVERFLOW
] = TARGET_EOVERFLOW
,
349 [ENOTUNIQ
] = TARGET_ENOTUNIQ
,
350 [EBADFD
] = TARGET_EBADFD
,
351 [EREMCHG
] = TARGET_EREMCHG
,
352 [ELIBACC
] = TARGET_ELIBACC
,
353 [ELIBBAD
] = TARGET_ELIBBAD
,
354 [ELIBSCN
] = TARGET_ELIBSCN
,
355 [ELIBMAX
] = TARGET_ELIBMAX
,
356 [ELIBEXEC
] = TARGET_ELIBEXEC
,
357 [EILSEQ
] = TARGET_EILSEQ
,
358 [ENOSYS
] = TARGET_ENOSYS
,
359 [ELOOP
] = TARGET_ELOOP
,
360 [ERESTART
] = TARGET_ERESTART
,
361 [ESTRPIPE
] = TARGET_ESTRPIPE
,
362 [ENOTEMPTY
] = TARGET_ENOTEMPTY
,
363 [EUSERS
] = TARGET_EUSERS
,
364 [ENOTSOCK
] = TARGET_ENOTSOCK
,
365 [EDESTADDRREQ
] = TARGET_EDESTADDRREQ
,
366 [EMSGSIZE
] = TARGET_EMSGSIZE
,
367 [EPROTOTYPE
] = TARGET_EPROTOTYPE
,
368 [ENOPROTOOPT
] = TARGET_ENOPROTOOPT
,
369 [EPROTONOSUPPORT
] = TARGET_EPROTONOSUPPORT
,
370 [ESOCKTNOSUPPORT
] = TARGET_ESOCKTNOSUPPORT
,
371 [EOPNOTSUPP
] = TARGET_EOPNOTSUPP
,
372 [EPFNOSUPPORT
] = TARGET_EPFNOSUPPORT
,
373 [EAFNOSUPPORT
] = TARGET_EAFNOSUPPORT
,
374 [EADDRINUSE
] = TARGET_EADDRINUSE
,
375 [EADDRNOTAVAIL
] = TARGET_EADDRNOTAVAIL
,
376 [ENETDOWN
] = TARGET_ENETDOWN
,
377 [ENETUNREACH
] = TARGET_ENETUNREACH
,
378 [ENETRESET
] = TARGET_ENETRESET
,
379 [ECONNABORTED
] = TARGET_ECONNABORTED
,
380 [ECONNRESET
] = TARGET_ECONNRESET
,
381 [ENOBUFS
] = TARGET_ENOBUFS
,
382 [EISCONN
] = TARGET_EISCONN
,
383 [ENOTCONN
] = TARGET_ENOTCONN
,
384 [EUCLEAN
] = TARGET_EUCLEAN
,
385 [ENOTNAM
] = TARGET_ENOTNAM
,
386 [ENAVAIL
] = TARGET_ENAVAIL
,
387 [EISNAM
] = TARGET_EISNAM
,
388 [EREMOTEIO
] = TARGET_EREMOTEIO
,
389 [ESHUTDOWN
] = TARGET_ESHUTDOWN
,
390 [ETOOMANYREFS
] = TARGET_ETOOMANYREFS
,
391 [ETIMEDOUT
] = TARGET_ETIMEDOUT
,
392 [ECONNREFUSED
] = TARGET_ECONNREFUSED
,
393 [EHOSTDOWN
] = TARGET_EHOSTDOWN
,
394 [EHOSTUNREACH
] = TARGET_EHOSTUNREACH
,
395 [EALREADY
] = TARGET_EALREADY
,
396 [EINPROGRESS
] = TARGET_EINPROGRESS
,
397 [ESTALE
] = TARGET_ESTALE
,
398 [ECANCELED
] = TARGET_ECANCELED
,
399 [ENOMEDIUM
] = TARGET_ENOMEDIUM
,
400 [EMEDIUMTYPE
] = TARGET_EMEDIUMTYPE
,
402 [ENOKEY
] = TARGET_ENOKEY
,
405 [EKEYEXPIRED
] = TARGET_EKEYEXPIRED
,
408 [EKEYREVOKED
] = TARGET_EKEYREVOKED
,
411 [EKEYREJECTED
] = TARGET_EKEYREJECTED
,
414 [EOWNERDEAD
] = TARGET_EOWNERDEAD
,
416 #ifdef ENOTRECOVERABLE
417 [ENOTRECOVERABLE
] = TARGET_ENOTRECOVERABLE
,
421 static inline int host_to_target_errno(int err
)
423 if(host_to_target_errno_table
[err
])
424 return host_to_target_errno_table
[err
];
428 static inline int target_to_host_errno(int err
)
430 if (target_to_host_errno_table
[err
])
431 return target_to_host_errno_table
[err
];
435 static inline abi_long
get_errno(abi_long ret
)
438 return -host_to_target_errno(errno
);
443 static inline int is_error(abi_long ret
)
445 return (abi_ulong
)ret
>= (abi_ulong
)(-4096);
448 char *target_strerror(int err
)
450 return strerror(target_to_host_errno(err
));
453 static abi_ulong target_brk
;
454 static abi_ulong target_original_brk
;
456 void target_set_brk(abi_ulong new_brk
)
458 target_original_brk
= target_brk
= HOST_PAGE_ALIGN(new_brk
);
461 /* do_brk() must return target values and target errnos. */
462 abi_long
do_brk(abi_ulong new_brk
)
465 abi_long mapped_addr
;
470 if (new_brk
< target_original_brk
)
473 brk_page
= HOST_PAGE_ALIGN(target_brk
);
475 /* If the new brk is less than this, set it and we're done... */
476 if (new_brk
< brk_page
) {
477 target_brk
= new_brk
;
481 /* We need to allocate more memory after the brk... */
482 new_alloc_size
= HOST_PAGE_ALIGN(new_brk
- brk_page
+ 1);
483 mapped_addr
= get_errno(target_mmap(brk_page
, new_alloc_size
,
484 PROT_READ
|PROT_WRITE
,
485 MAP_ANON
|MAP_FIXED
|MAP_PRIVATE
, 0, 0));
487 if (!is_error(mapped_addr
))
488 target_brk
= new_brk
;
493 static inline abi_long
copy_from_user_fdset(fd_set
*fds
,
494 abi_ulong target_fds_addr
,
498 abi_ulong b
, *target_fds
;
500 nw
= (n
+ TARGET_ABI_BITS
- 1) / TARGET_ABI_BITS
;
501 if (!(target_fds
= lock_user(VERIFY_READ
,
503 sizeof(abi_ulong
) * nw
,
505 return -TARGET_EFAULT
;
509 for (i
= 0; i
< nw
; i
++) {
510 /* grab the abi_ulong */
511 __get_user(b
, &target_fds
[i
]);
512 for (j
= 0; j
< TARGET_ABI_BITS
; j
++) {
513 /* check the bit inside the abi_ulong */
520 unlock_user(target_fds
, target_fds_addr
, 0);
525 static inline abi_long
copy_to_user_fdset(abi_ulong target_fds_addr
,
531 abi_ulong
*target_fds
;
533 nw
= (n
+ TARGET_ABI_BITS
- 1) / TARGET_ABI_BITS
;
534 if (!(target_fds
= lock_user(VERIFY_WRITE
,
536 sizeof(abi_ulong
) * nw
,
538 return -TARGET_EFAULT
;
541 for (i
= 0; i
< nw
; i
++) {
543 for (j
= 0; j
< TARGET_ABI_BITS
; j
++) {
544 v
|= ((FD_ISSET(k
, fds
) != 0) << j
);
547 __put_user(v
, &target_fds
[i
]);
550 unlock_user(target_fds
, target_fds_addr
, sizeof(abi_ulong
) * nw
);
555 #if defined(__alpha__)
561 static inline abi_long
host_to_target_clock_t(long ticks
)
563 #if HOST_HZ == TARGET_HZ
566 return ((int64_t)ticks
* TARGET_HZ
) / HOST_HZ
;
570 static inline abi_long
host_to_target_rusage(abi_ulong target_addr
,
571 const struct rusage
*rusage
)
573 struct target_rusage
*target_rusage
;
575 if (!lock_user_struct(VERIFY_WRITE
, target_rusage
, target_addr
, 0))
576 return -TARGET_EFAULT
;
577 target_rusage
->ru_utime
.tv_sec
= tswapl(rusage
->ru_utime
.tv_sec
);
578 target_rusage
->ru_utime
.tv_usec
= tswapl(rusage
->ru_utime
.tv_usec
);
579 target_rusage
->ru_stime
.tv_sec
= tswapl(rusage
->ru_stime
.tv_sec
);
580 target_rusage
->ru_stime
.tv_usec
= tswapl(rusage
->ru_stime
.tv_usec
);
581 target_rusage
->ru_maxrss
= tswapl(rusage
->ru_maxrss
);
582 target_rusage
->ru_ixrss
= tswapl(rusage
->ru_ixrss
);
583 target_rusage
->ru_idrss
= tswapl(rusage
->ru_idrss
);
584 target_rusage
->ru_isrss
= tswapl(rusage
->ru_isrss
);
585 target_rusage
->ru_minflt
= tswapl(rusage
->ru_minflt
);
586 target_rusage
->ru_majflt
= tswapl(rusage
->ru_majflt
);
587 target_rusage
->ru_nswap
= tswapl(rusage
->ru_nswap
);
588 target_rusage
->ru_inblock
= tswapl(rusage
->ru_inblock
);
589 target_rusage
->ru_oublock
= tswapl(rusage
->ru_oublock
);
590 target_rusage
->ru_msgsnd
= tswapl(rusage
->ru_msgsnd
);
591 target_rusage
->ru_msgrcv
= tswapl(rusage
->ru_msgrcv
);
592 target_rusage
->ru_nsignals
= tswapl(rusage
->ru_nsignals
);
593 target_rusage
->ru_nvcsw
= tswapl(rusage
->ru_nvcsw
);
594 target_rusage
->ru_nivcsw
= tswapl(rusage
->ru_nivcsw
);
595 unlock_user_struct(target_rusage
, target_addr
, 1);
600 static inline abi_long
copy_from_user_timeval(struct timeval
*tv
,
601 abi_ulong target_tv_addr
)
603 struct target_timeval
*target_tv
;
605 if (!lock_user_struct(VERIFY_READ
, target_tv
, target_tv_addr
, 1))
606 return -TARGET_EFAULT
;
608 __get_user(tv
->tv_sec
, &target_tv
->tv_sec
);
609 __get_user(tv
->tv_usec
, &target_tv
->tv_usec
);
611 unlock_user_struct(target_tv
, target_tv_addr
, 0);
616 static inline abi_long
copy_to_user_timeval(abi_ulong target_tv_addr
,
617 const struct timeval
*tv
)
619 struct target_timeval
*target_tv
;
621 if (!lock_user_struct(VERIFY_WRITE
, target_tv
, target_tv_addr
, 0))
622 return -TARGET_EFAULT
;
624 __put_user(tv
->tv_sec
, &target_tv
->tv_sec
);
625 __put_user(tv
->tv_usec
, &target_tv
->tv_usec
);
627 unlock_user_struct(target_tv
, target_tv_addr
, 1);
633 /* do_select() must return target values and target errnos. */
634 static abi_long
do_select(int n
,
635 abi_ulong rfd_addr
, abi_ulong wfd_addr
,
636 abi_ulong efd_addr
, abi_ulong target_tv_addr
)
638 fd_set rfds
, wfds
, efds
;
639 fd_set
*rfds_ptr
, *wfds_ptr
, *efds_ptr
;
640 struct timeval tv
, *tv_ptr
;
644 if (copy_from_user_fdset(&rfds
, rfd_addr
, n
))
645 return -TARGET_EFAULT
;
651 if (copy_from_user_fdset(&wfds
, wfd_addr
, n
))
652 return -TARGET_EFAULT
;
658 if (copy_from_user_fdset(&efds
, efd_addr
, n
))
659 return -TARGET_EFAULT
;
665 if (target_tv_addr
) {
666 if (copy_from_user_timeval(&tv
, target_tv_addr
))
667 return -TARGET_EFAULT
;
673 ret
= get_errno(select(n
, rfds_ptr
, wfds_ptr
, efds_ptr
, tv_ptr
));
675 if (!is_error(ret
)) {
676 if (rfd_addr
&& copy_to_user_fdset(rfd_addr
, &rfds
, n
))
677 return -TARGET_EFAULT
;
678 if (wfd_addr
&& copy_to_user_fdset(wfd_addr
, &wfds
, n
))
679 return -TARGET_EFAULT
;
680 if (efd_addr
&& copy_to_user_fdset(efd_addr
, &efds
, n
))
681 return -TARGET_EFAULT
;
683 if (target_tv_addr
&& copy_to_user_timeval(target_tv_addr
, &tv
))
684 return -TARGET_EFAULT
;
690 static inline abi_long
target_to_host_sockaddr(struct sockaddr
*addr
,
691 abi_ulong target_addr
,
694 struct target_sockaddr
*target_saddr
;
696 target_saddr
= lock_user(VERIFY_READ
, target_addr
, len
, 1);
698 return -TARGET_EFAULT
;
699 memcpy(addr
, target_saddr
, len
);
700 addr
->sa_family
= tswap16(target_saddr
->sa_family
);
701 unlock_user(target_saddr
, target_addr
, 0);
706 static inline abi_long
host_to_target_sockaddr(abi_ulong target_addr
,
707 struct sockaddr
*addr
,
710 struct target_sockaddr
*target_saddr
;
712 target_saddr
= lock_user(VERIFY_WRITE
, target_addr
, len
, 0);
714 return -TARGET_EFAULT
;
715 memcpy(target_saddr
, addr
, len
);
716 target_saddr
->sa_family
= tswap16(addr
->sa_family
);
717 unlock_user(target_saddr
, target_addr
, len
);
722 /* ??? Should this also swap msgh->name? */
723 static inline abi_long
target_to_host_cmsg(struct msghdr
*msgh
,
724 struct target_msghdr
*target_msgh
)
726 struct cmsghdr
*cmsg
= CMSG_FIRSTHDR(msgh
);
727 abi_long msg_controllen
;
728 abi_ulong target_cmsg_addr
;
729 struct target_cmsghdr
*target_cmsg
;
732 msg_controllen
= tswapl(target_msgh
->msg_controllen
);
733 if (msg_controllen
< sizeof (struct target_cmsghdr
))
735 target_cmsg_addr
= tswapl(target_msgh
->msg_control
);
736 target_cmsg
= lock_user(VERIFY_READ
, target_cmsg_addr
, msg_controllen
, 1);
738 return -TARGET_EFAULT
;
740 while (cmsg
&& target_cmsg
) {
741 void *data
= CMSG_DATA(cmsg
);
742 void *target_data
= TARGET_CMSG_DATA(target_cmsg
);
744 int len
= tswapl(target_cmsg
->cmsg_len
)
745 - TARGET_CMSG_ALIGN(sizeof (struct target_cmsghdr
));
747 space
+= CMSG_SPACE(len
);
748 if (space
> msgh
->msg_controllen
) {
749 space
-= CMSG_SPACE(len
);
750 gemu_log("Host cmsg overflow\n");
754 cmsg
->cmsg_level
= tswap32(target_cmsg
->cmsg_level
);
755 cmsg
->cmsg_type
= tswap32(target_cmsg
->cmsg_type
);
756 cmsg
->cmsg_len
= CMSG_LEN(len
);
758 if (cmsg
->cmsg_level
!= TARGET_SOL_SOCKET
|| cmsg
->cmsg_type
!= SCM_RIGHTS
) {
759 gemu_log("Unsupported ancillary data: %d/%d\n", cmsg
->cmsg_level
, cmsg
->cmsg_type
);
760 memcpy(data
, target_data
, len
);
762 int *fd
= (int *)data
;
763 int *target_fd
= (int *)target_data
;
764 int i
, numfds
= len
/ sizeof(int);
766 for (i
= 0; i
< numfds
; i
++)
767 fd
[i
] = tswap32(target_fd
[i
]);
770 cmsg
= CMSG_NXTHDR(msgh
, cmsg
);
771 target_cmsg
= TARGET_CMSG_NXTHDR(target_msgh
, target_cmsg
);
773 unlock_user(target_cmsg
, target_cmsg_addr
, 0);
775 msgh
->msg_controllen
= space
;
779 /* ??? Should this also swap msgh->name? */
780 static inline abi_long
host_to_target_cmsg(struct target_msghdr
*target_msgh
,
783 struct cmsghdr
*cmsg
= CMSG_FIRSTHDR(msgh
);
784 abi_long msg_controllen
;
785 abi_ulong target_cmsg_addr
;
786 struct target_cmsghdr
*target_cmsg
;
789 msg_controllen
= tswapl(target_msgh
->msg_controllen
);
790 if (msg_controllen
< sizeof (struct target_cmsghdr
))
792 target_cmsg_addr
= tswapl(target_msgh
->msg_control
);
793 target_cmsg
= lock_user(VERIFY_WRITE
, target_cmsg_addr
, msg_controllen
, 0);
795 return -TARGET_EFAULT
;
797 while (cmsg
&& target_cmsg
) {
798 void *data
= CMSG_DATA(cmsg
);
799 void *target_data
= TARGET_CMSG_DATA(target_cmsg
);
801 int len
= cmsg
->cmsg_len
- CMSG_ALIGN(sizeof (struct cmsghdr
));
803 space
+= TARGET_CMSG_SPACE(len
);
804 if (space
> msg_controllen
) {
805 space
-= TARGET_CMSG_SPACE(len
);
806 gemu_log("Target cmsg overflow\n");
810 target_cmsg
->cmsg_level
= tswap32(cmsg
->cmsg_level
);
811 target_cmsg
->cmsg_type
= tswap32(cmsg
->cmsg_type
);
812 target_cmsg
->cmsg_len
= tswapl(TARGET_CMSG_LEN(len
));
814 if (cmsg
->cmsg_level
!= TARGET_SOL_SOCKET
|| cmsg
->cmsg_type
!= SCM_RIGHTS
) {
815 gemu_log("Unsupported ancillary data: %d/%d\n", cmsg
->cmsg_level
, cmsg
->cmsg_type
);
816 memcpy(target_data
, data
, len
);
818 int *fd
= (int *)data
;
819 int *target_fd
= (int *)target_data
;
820 int i
, numfds
= len
/ sizeof(int);
822 for (i
= 0; i
< numfds
; i
++)
823 target_fd
[i
] = tswap32(fd
[i
]);
826 cmsg
= CMSG_NXTHDR(msgh
, cmsg
);
827 target_cmsg
= TARGET_CMSG_NXTHDR(target_msgh
, target_cmsg
);
829 unlock_user(target_cmsg
, target_cmsg_addr
, space
);
831 target_msgh
->msg_controllen
= tswapl(space
);
835 /* do_setsockopt() Must return target values and target errnos. */
836 static abi_long
do_setsockopt(int sockfd
, int level
, int optname
,
837 abi_ulong optval_addr
, socklen_t optlen
)
844 /* TCP options all take an 'int' value. */
845 if (optlen
< sizeof(uint32_t))
846 return -TARGET_EINVAL
;
848 if (get_user_u32(val
, optval_addr
))
849 return -TARGET_EFAULT
;
850 ret
= get_errno(setsockopt(sockfd
, level
, optname
, &val
, sizeof(val
)));
857 case IP_ROUTER_ALERT
:
861 case IP_MTU_DISCOVER
:
867 case IP_MULTICAST_TTL
:
868 case IP_MULTICAST_LOOP
:
870 if (optlen
>= sizeof(uint32_t)) {
871 if (get_user_u32(val
, optval_addr
))
872 return -TARGET_EFAULT
;
873 } else if (optlen
>= 1) {
874 if (get_user_u8(val
, optval_addr
))
875 return -TARGET_EFAULT
;
877 ret
= get_errno(setsockopt(sockfd
, level
, optname
, &val
, sizeof(val
)));
883 case TARGET_SOL_SOCKET
:
885 /* Options with 'int' argument. */
886 case TARGET_SO_DEBUG
:
889 case TARGET_SO_REUSEADDR
:
890 optname
= SO_REUSEADDR
;
895 case TARGET_SO_ERROR
:
898 case TARGET_SO_DONTROUTE
:
899 optname
= SO_DONTROUTE
;
901 case TARGET_SO_BROADCAST
:
902 optname
= SO_BROADCAST
;
904 case TARGET_SO_SNDBUF
:
907 case TARGET_SO_RCVBUF
:
910 case TARGET_SO_KEEPALIVE
:
911 optname
= SO_KEEPALIVE
;
913 case TARGET_SO_OOBINLINE
:
914 optname
= SO_OOBINLINE
;
916 case TARGET_SO_NO_CHECK
:
917 optname
= SO_NO_CHECK
;
919 case TARGET_SO_PRIORITY
:
920 optname
= SO_PRIORITY
;
923 case TARGET_SO_BSDCOMPAT
:
924 optname
= SO_BSDCOMPAT
;
927 case TARGET_SO_PASSCRED
:
928 optname
= SO_PASSCRED
;
930 case TARGET_SO_TIMESTAMP
:
931 optname
= SO_TIMESTAMP
;
933 case TARGET_SO_RCVLOWAT
:
934 optname
= SO_RCVLOWAT
;
936 case TARGET_SO_RCVTIMEO
:
937 optname
= SO_RCVTIMEO
;
939 case TARGET_SO_SNDTIMEO
:
940 optname
= SO_SNDTIMEO
;
946 if (optlen
< sizeof(uint32_t))
947 return -TARGET_EINVAL
;
949 if (get_user_u32(val
, optval_addr
))
950 return -TARGET_EFAULT
;
951 ret
= get_errno(setsockopt(sockfd
, SOL_SOCKET
, optname
, &val
, sizeof(val
)));
955 gemu_log("Unsupported setsockopt level=%d optname=%d \n", level
, optname
);
956 ret
= -TARGET_ENOPROTOOPT
;
961 /* do_getsockopt() Must return target values and target errnos. */
962 static abi_long
do_getsockopt(int sockfd
, int level
, int optname
,
963 abi_ulong optval_addr
, abi_ulong optlen
)
970 case TARGET_SOL_SOCKET
:
973 case TARGET_SO_LINGER
:
974 case TARGET_SO_RCVTIMEO
:
975 case TARGET_SO_SNDTIMEO
:
976 case TARGET_SO_PEERCRED
:
977 case TARGET_SO_PEERNAME
:
978 /* These don't just return a single integer */
985 /* TCP options all take an 'int' value. */
987 if (get_user_u32(len
, optlen
))
988 return -TARGET_EFAULT
;
990 return -TARGET_EINVAL
;
992 ret
= get_errno(getsockopt(sockfd
, level
, optname
, &val
, &lv
));
999 if (put_user_u32(val
, optval_addr
))
1000 return -TARGET_EFAULT
;
1002 if (put_user_u8(val
, optval_addr
))
1003 return -TARGET_EFAULT
;
1005 if (put_user_u32(len
, optlen
))
1006 return -TARGET_EFAULT
;
1013 case IP_ROUTER_ALERT
:
1017 case IP_MTU_DISCOVER
:
1023 case IP_MULTICAST_TTL
:
1024 case IP_MULTICAST_LOOP
:
1025 if (get_user_u32(len
, optlen
))
1026 return -TARGET_EFAULT
;
1028 return -TARGET_EINVAL
;
1030 ret
= get_errno(getsockopt(sockfd
, level
, optname
, &val
, &lv
));
1033 if (len
< sizeof(int) && len
> 0 && val
>= 0 && val
< 255) {
1035 if (put_user_u32(len
, optlen
)
1036 || put_user_u8(val
, optval_addr
))
1037 return -TARGET_EFAULT
;
1039 if (len
> sizeof(int))
1041 if (put_user_u32(len
, optlen
)
1042 || put_user_u32(val
, optval_addr
))
1043 return -TARGET_EFAULT
;
1047 ret
= -TARGET_ENOPROTOOPT
;
1053 gemu_log("getsockopt level=%d optname=%d not yet supported\n",
1055 ret
= -TARGET_EOPNOTSUPP
;
1062 * lock_iovec()/unlock_iovec() have a return code of 0 for success where
1063 * other lock functions have a return code of 0 for failure.
1065 static abi_long
lock_iovec(int type
, struct iovec
*vec
, abi_ulong target_addr
,
1066 int count
, int copy
)
1068 struct target_iovec
*target_vec
;
1072 target_vec
= lock_user(VERIFY_READ
, target_addr
, count
* sizeof(struct target_iovec
), 1);
1074 return -TARGET_EFAULT
;
1075 for(i
= 0;i
< count
; i
++) {
1076 base
= tswapl(target_vec
[i
].iov_base
);
1077 vec
[i
].iov_len
= tswapl(target_vec
[i
].iov_len
);
1078 if (vec
[i
].iov_len
!= 0) {
1079 vec
[i
].iov_base
= lock_user(type
, base
, vec
[i
].iov_len
, copy
);
1080 /* Don't check lock_user return value. We must call writev even
1081 if a element has invalid base address. */
1083 /* zero length pointer is ignored */
1084 vec
[i
].iov_base
= NULL
;
1087 unlock_user (target_vec
, target_addr
, 0);
1091 static abi_long
unlock_iovec(struct iovec
*vec
, abi_ulong target_addr
,
1092 int count
, int copy
)
1094 struct target_iovec
*target_vec
;
1098 target_vec
= lock_user(VERIFY_READ
, target_addr
, count
* sizeof(struct target_iovec
), 1);
1100 return -TARGET_EFAULT
;
1101 for(i
= 0;i
< count
; i
++) {
1102 if (target_vec
[i
].iov_base
) {
1103 base
= tswapl(target_vec
[i
].iov_base
);
1104 unlock_user(vec
[i
].iov_base
, base
, copy
? vec
[i
].iov_len
: 0);
1107 unlock_user (target_vec
, target_addr
, 0);
1112 /* do_socket() Must return target values and target errnos. */
1113 static abi_long
do_socket(int domain
, int type
, int protocol
)
1115 #if defined(TARGET_MIPS)
1117 case TARGET_SOCK_DGRAM
:
1120 case TARGET_SOCK_STREAM
:
1123 case TARGET_SOCK_RAW
:
1126 case TARGET_SOCK_RDM
:
1129 case TARGET_SOCK_SEQPACKET
:
1130 type
= SOCK_SEQPACKET
;
1132 case TARGET_SOCK_PACKET
:
1137 if (domain
== PF_NETLINK
)
1138 return -EAFNOSUPPORT
; /* do not NETLINK socket connections possible */
1139 return get_errno(socket(domain
, type
, protocol
));
1142 /* do_bind() Must return target values and target errnos. */
1143 static abi_long
do_bind(int sockfd
, abi_ulong target_addr
,
1146 void *addr
= alloca(addrlen
);
1148 target_to_host_sockaddr(addr
, target_addr
, addrlen
);
1149 return get_errno(bind(sockfd
, addr
, addrlen
));
1152 /* do_connect() Must return target values and target errnos. */
1153 static abi_long
do_connect(int sockfd
, abi_ulong target_addr
,
1156 void *addr
= alloca(addrlen
);
1158 target_to_host_sockaddr(addr
, target_addr
, addrlen
);
1159 return get_errno(connect(sockfd
, addr
, addrlen
));
1162 /* do_sendrecvmsg() Must return target values and target errnos. */
1163 static abi_long
do_sendrecvmsg(int fd
, abi_ulong target_msg
,
1164 int flags
, int send
)
1167 struct target_msghdr
*msgp
;
1171 abi_ulong target_vec
;
1174 if (!lock_user_struct(send
? VERIFY_READ
: VERIFY_WRITE
,
1178 return -TARGET_EFAULT
;
1179 if (msgp
->msg_name
) {
1180 msg
.msg_namelen
= tswap32(msgp
->msg_namelen
);
1181 msg
.msg_name
= alloca(msg
.msg_namelen
);
1182 target_to_host_sockaddr(msg
.msg_name
, tswapl(msgp
->msg_name
),
1185 msg
.msg_name
= NULL
;
1186 msg
.msg_namelen
= 0;
1188 msg
.msg_controllen
= 2 * tswapl(msgp
->msg_controllen
);
1189 msg
.msg_control
= alloca(msg
.msg_controllen
);
1190 msg
.msg_flags
= tswap32(msgp
->msg_flags
);
1192 count
= tswapl(msgp
->msg_iovlen
);
1193 vec
= alloca(count
* sizeof(struct iovec
));
1194 target_vec
= tswapl(msgp
->msg_iov
);
1195 lock_iovec(send
? VERIFY_READ
: VERIFY_WRITE
, vec
, target_vec
, count
, send
);
1196 msg
.msg_iovlen
= count
;
1200 ret
= target_to_host_cmsg(&msg
, msgp
);
1202 ret
= get_errno(sendmsg(fd
, &msg
, flags
));
1204 ret
= get_errno(recvmsg(fd
, &msg
, flags
));
1205 if (!is_error(ret
)) {
1207 ret
= host_to_target_cmsg(msgp
, &msg
);
1212 unlock_iovec(vec
, target_vec
, count
, !send
);
1213 unlock_user_struct(msgp
, target_msg
, send
? 0 : 1);
1217 /* do_accept() Must return target values and target errnos. */
1218 static abi_long
do_accept(int fd
, abi_ulong target_addr
,
1219 abi_ulong target_addrlen_addr
)
1225 if (get_user_u32(addrlen
, target_addrlen_addr
))
1226 return -TARGET_EFAULT
;
1228 addr
= alloca(addrlen
);
1230 ret
= get_errno(accept(fd
, addr
, &addrlen
));
1231 if (!is_error(ret
)) {
1232 host_to_target_sockaddr(target_addr
, addr
, addrlen
);
1233 if (put_user_u32(addrlen
, target_addrlen_addr
))
1234 ret
= -TARGET_EFAULT
;
1239 /* do_getpeername() Must return target values and target errnos. */
1240 static abi_long
do_getpeername(int fd
, abi_ulong target_addr
,
1241 abi_ulong target_addrlen_addr
)
1247 if (get_user_u32(addrlen
, target_addrlen_addr
))
1248 return -TARGET_EFAULT
;
1250 addr
= alloca(addrlen
);
1252 ret
= get_errno(getpeername(fd
, addr
, &addrlen
));
1253 if (!is_error(ret
)) {
1254 host_to_target_sockaddr(target_addr
, addr
, addrlen
);
1255 if (put_user_u32(addrlen
, target_addrlen_addr
))
1256 ret
= -TARGET_EFAULT
;
1261 /* do_getsockname() Must return target values and target errnos. */
1262 static abi_long
do_getsockname(int fd
, abi_ulong target_addr
,
1263 abi_ulong target_addrlen_addr
)
1269 if (get_user_u32(addrlen
, target_addrlen_addr
))
1270 return -TARGET_EFAULT
;
1272 addr
= alloca(addrlen
);
1274 ret
= get_errno(getsockname(fd
, addr
, &addrlen
));
1275 if (!is_error(ret
)) {
1276 host_to_target_sockaddr(target_addr
, addr
, addrlen
);
1277 if (put_user_u32(addrlen
, target_addrlen_addr
))
1278 ret
= -TARGET_EFAULT
;
1283 /* do_socketpair() Must return target values and target errnos. */
1284 static abi_long
do_socketpair(int domain
, int type
, int protocol
,
1285 abi_ulong target_tab_addr
)
1290 ret
= get_errno(socketpair(domain
, type
, protocol
, tab
));
1291 if (!is_error(ret
)) {
1292 if (put_user_s32(tab
[0], target_tab_addr
)
1293 || put_user_s32(tab
[1], target_tab_addr
+ sizeof(tab
[0])))
1294 ret
= -TARGET_EFAULT
;
1299 /* do_sendto() Must return target values and target errnos. */
1300 static abi_long
do_sendto(int fd
, abi_ulong msg
, size_t len
, int flags
,
1301 abi_ulong target_addr
, socklen_t addrlen
)
1307 host_msg
= lock_user(VERIFY_READ
, msg
, len
, 1);
1309 return -TARGET_EFAULT
;
1311 addr
= alloca(addrlen
);
1312 target_to_host_sockaddr(addr
, target_addr
, addrlen
);
1313 ret
= get_errno(sendto(fd
, host_msg
, len
, flags
, addr
, addrlen
));
1315 ret
= get_errno(send(fd
, host_msg
, len
, flags
));
1317 unlock_user(host_msg
, msg
, 0);
1321 /* do_recvfrom() Must return target values and target errnos. */
1322 static abi_long
do_recvfrom(int fd
, abi_ulong msg
, size_t len
, int flags
,
1323 abi_ulong target_addr
,
1324 abi_ulong target_addrlen
)
1331 host_msg
= lock_user(VERIFY_WRITE
, msg
, len
, 0);
1333 return -TARGET_EFAULT
;
1335 if (get_user_u32(addrlen
, target_addrlen
)) {
1336 ret
= -TARGET_EFAULT
;
1339 addr
= alloca(addrlen
);
1340 ret
= get_errno(recvfrom(fd
, host_msg
, len
, flags
, addr
, &addrlen
));
1342 addr
= NULL
; /* To keep compiler quiet. */
1343 ret
= get_errno(recv(fd
, host_msg
, len
, flags
));
1345 if (!is_error(ret
)) {
1347 host_to_target_sockaddr(target_addr
, addr
, addrlen
);
1348 if (put_user_u32(addrlen
, target_addrlen
)) {
1349 ret
= -TARGET_EFAULT
;
1353 unlock_user(host_msg
, msg
, len
);
1356 unlock_user(host_msg
, msg
, 0);
1361 #ifdef TARGET_NR_socketcall
1362 /* do_socketcall() Must return target values and target errnos. */
1363 static abi_long
do_socketcall(int num
, abi_ulong vptr
)
1366 const int n
= sizeof(abi_ulong
);
1371 int domain
, type
, protocol
;
1373 if (get_user_s32(domain
, vptr
)
1374 || get_user_s32(type
, vptr
+ n
)
1375 || get_user_s32(protocol
, vptr
+ 2 * n
))
1376 return -TARGET_EFAULT
;
1378 ret
= do_socket(domain
, type
, protocol
);
1384 abi_ulong target_addr
;
1387 if (get_user_s32(sockfd
, vptr
)
1388 || get_user_ual(target_addr
, vptr
+ n
)
1389 || get_user_u32(addrlen
, vptr
+ 2 * n
))
1390 return -TARGET_EFAULT
;
1392 ret
= do_bind(sockfd
, target_addr
, addrlen
);
1395 case SOCKOP_connect
:
1398 abi_ulong target_addr
;
1401 if (get_user_s32(sockfd
, vptr
)
1402 || get_user_ual(target_addr
, vptr
+ n
)
1403 || get_user_u32(addrlen
, vptr
+ 2 * n
))
1404 return -TARGET_EFAULT
;
1406 ret
= do_connect(sockfd
, target_addr
, addrlen
);
1411 int sockfd
, backlog
;
1413 if (get_user_s32(sockfd
, vptr
)
1414 || get_user_s32(backlog
, vptr
+ n
))
1415 return -TARGET_EFAULT
;
1417 ret
= get_errno(listen(sockfd
, backlog
));
1423 abi_ulong target_addr
, target_addrlen
;
1425 if (get_user_s32(sockfd
, vptr
)
1426 || get_user_ual(target_addr
, vptr
+ n
)
1427 || get_user_u32(target_addrlen
, vptr
+ 2 * n
))
1428 return -TARGET_EFAULT
;
1430 ret
= do_accept(sockfd
, target_addr
, target_addrlen
);
1433 case SOCKOP_getsockname
:
1436 abi_ulong target_addr
, target_addrlen
;
1438 if (get_user_s32(sockfd
, vptr
)
1439 || get_user_ual(target_addr
, vptr
+ n
)
1440 || get_user_u32(target_addrlen
, vptr
+ 2 * n
))
1441 return -TARGET_EFAULT
;
1443 ret
= do_getsockname(sockfd
, target_addr
, target_addrlen
);
1446 case SOCKOP_getpeername
:
1449 abi_ulong target_addr
, target_addrlen
;
1451 if (get_user_s32(sockfd
, vptr
)
1452 || get_user_ual(target_addr
, vptr
+ n
)
1453 || get_user_u32(target_addrlen
, vptr
+ 2 * n
))
1454 return -TARGET_EFAULT
;
1456 ret
= do_getpeername(sockfd
, target_addr
, target_addrlen
);
1459 case SOCKOP_socketpair
:
1461 int domain
, type
, protocol
;
1464 if (get_user_s32(domain
, vptr
)
1465 || get_user_s32(type
, vptr
+ n
)
1466 || get_user_s32(protocol
, vptr
+ 2 * n
)
1467 || get_user_ual(tab
, vptr
+ 3 * n
))
1468 return -TARGET_EFAULT
;
1470 ret
= do_socketpair(domain
, type
, protocol
, tab
);
1480 if (get_user_s32(sockfd
, vptr
)
1481 || get_user_ual(msg
, vptr
+ n
)
1482 || get_user_ual(len
, vptr
+ 2 * n
)
1483 || get_user_s32(flags
, vptr
+ 3 * n
))
1484 return -TARGET_EFAULT
;
1486 ret
= do_sendto(sockfd
, msg
, len
, flags
, 0, 0);
1496 if (get_user_s32(sockfd
, vptr
)
1497 || get_user_ual(msg
, vptr
+ n
)
1498 || get_user_ual(len
, vptr
+ 2 * n
)
1499 || get_user_s32(flags
, vptr
+ 3 * n
))
1500 return -TARGET_EFAULT
;
1502 ret
= do_recvfrom(sockfd
, msg
, len
, flags
, 0, 0);
1514 if (get_user_s32(sockfd
, vptr
)
1515 || get_user_ual(msg
, vptr
+ n
)
1516 || get_user_ual(len
, vptr
+ 2 * n
)
1517 || get_user_s32(flags
, vptr
+ 3 * n
)
1518 || get_user_ual(addr
, vptr
+ 4 * n
)
1519 || get_user_u32(addrlen
, vptr
+ 5 * n
))
1520 return -TARGET_EFAULT
;
1522 ret
= do_sendto(sockfd
, msg
, len
, flags
, addr
, addrlen
);
1525 case SOCKOP_recvfrom
:
1534 if (get_user_s32(sockfd
, vptr
)
1535 || get_user_ual(msg
, vptr
+ n
)
1536 || get_user_ual(len
, vptr
+ 2 * n
)
1537 || get_user_s32(flags
, vptr
+ 3 * n
)
1538 || get_user_ual(addr
, vptr
+ 4 * n
)
1539 || get_user_u32(addrlen
, vptr
+ 5 * n
))
1540 return -TARGET_EFAULT
;
1542 ret
= do_recvfrom(sockfd
, msg
, len
, flags
, addr
, addrlen
);
1545 case SOCKOP_shutdown
:
1549 if (get_user_s32(sockfd
, vptr
)
1550 || get_user_s32(how
, vptr
+ n
))
1551 return -TARGET_EFAULT
;
1553 ret
= get_errno(shutdown(sockfd
, how
));
1556 case SOCKOP_sendmsg
:
1557 case SOCKOP_recvmsg
:
1560 abi_ulong target_msg
;
1563 if (get_user_s32(fd
, vptr
)
1564 || get_user_ual(target_msg
, vptr
+ n
)
1565 || get_user_s32(flags
, vptr
+ 2 * n
))
1566 return -TARGET_EFAULT
;
1568 ret
= do_sendrecvmsg(fd
, target_msg
, flags
,
1569 (num
== SOCKOP_sendmsg
));
1572 case SOCKOP_setsockopt
:
1580 if (get_user_s32(sockfd
, vptr
)
1581 || get_user_s32(level
, vptr
+ n
)
1582 || get_user_s32(optname
, vptr
+ 2 * n
)
1583 || get_user_ual(optval
, vptr
+ 3 * n
)
1584 || get_user_u32(optlen
, vptr
+ 4 * n
))
1585 return -TARGET_EFAULT
;
1587 ret
= do_setsockopt(sockfd
, level
, optname
, optval
, optlen
);
1590 case SOCKOP_getsockopt
:
1598 if (get_user_s32(sockfd
, vptr
)
1599 || get_user_s32(level
, vptr
+ n
)
1600 || get_user_s32(optname
, vptr
+ 2 * n
)
1601 || get_user_ual(optval
, vptr
+ 3 * n
)
1602 || get_user_u32(optlen
, vptr
+ 4 * n
))
1603 return -TARGET_EFAULT
;
1605 ret
= do_getsockopt(sockfd
, level
, optname
, optval
, optlen
);
1609 gemu_log("Unsupported socketcall: %d\n", num
);
1610 ret
= -TARGET_ENOSYS
;
1617 #ifdef TARGET_NR_ipc
1618 #define N_SHM_REGIONS 32
1620 static struct shm_region
{
1623 } shm_regions
[N_SHM_REGIONS
];
1626 struct target_ipc_perm
1633 unsigned short int mode
;
1634 unsigned short int __pad1
;
1635 unsigned short int __seq
;
1636 unsigned short int __pad2
;
1637 abi_ulong __unused1
;
1638 abi_ulong __unused2
;
1641 struct target_semid_ds
1643 struct target_ipc_perm sem_perm
;
1644 abi_ulong sem_otime
;
1645 abi_ulong __unused1
;
1646 abi_ulong sem_ctime
;
1647 abi_ulong __unused2
;
1648 abi_ulong sem_nsems
;
1649 abi_ulong __unused3
;
1650 abi_ulong __unused4
;
1653 static inline abi_long
target_to_host_ipc_perm(struct ipc_perm
*host_ip
,
1654 abi_ulong target_addr
)
1656 struct target_ipc_perm
*target_ip
;
1657 struct target_semid_ds
*target_sd
;
1659 if (!lock_user_struct(VERIFY_READ
, target_sd
, target_addr
, 1))
1660 return -TARGET_EFAULT
;
1661 target_ip
=&(target_sd
->sem_perm
);
1662 host_ip
->__key
= tswapl(target_ip
->__key
);
1663 host_ip
->uid
= tswapl(target_ip
->uid
);
1664 host_ip
->gid
= tswapl(target_ip
->gid
);
1665 host_ip
->cuid
= tswapl(target_ip
->cuid
);
1666 host_ip
->cgid
= tswapl(target_ip
->cgid
);
1667 host_ip
->mode
= tswapl(target_ip
->mode
);
1668 unlock_user_struct(target_sd
, target_addr
, 0);
1672 static inline abi_long
host_to_target_ipc_perm(abi_ulong target_addr
,
1673 struct ipc_perm
*host_ip
)
1675 struct target_ipc_perm
*target_ip
;
1676 struct target_semid_ds
*target_sd
;
1678 if (!lock_user_struct(VERIFY_WRITE
, target_sd
, target_addr
, 0))
1679 return -TARGET_EFAULT
;
1680 target_ip
= &(target_sd
->sem_perm
);
1681 target_ip
->__key
= tswapl(host_ip
->__key
);
1682 target_ip
->uid
= tswapl(host_ip
->uid
);
1683 target_ip
->gid
= tswapl(host_ip
->gid
);
1684 target_ip
->cuid
= tswapl(host_ip
->cuid
);
1685 target_ip
->cgid
= tswapl(host_ip
->cgid
);
1686 target_ip
->mode
= tswapl(host_ip
->mode
);
1687 unlock_user_struct(target_sd
, target_addr
, 1);
1691 static inline abi_long
target_to_host_semid_ds(struct semid_ds
*host_sd
,
1692 abi_ulong target_addr
)
1694 struct target_semid_ds
*target_sd
;
1696 if (!lock_user_struct(VERIFY_READ
, target_sd
, target_addr
, 1))
1697 return -TARGET_EFAULT
;
1698 target_to_host_ipc_perm(&(host_sd
->sem_perm
),target_addr
);
1699 host_sd
->sem_nsems
= tswapl(target_sd
->sem_nsems
);
1700 host_sd
->sem_otime
= tswapl(target_sd
->sem_otime
);
1701 host_sd
->sem_ctime
= tswapl(target_sd
->sem_ctime
);
1702 unlock_user_struct(target_sd
, target_addr
, 0);
1706 static inline abi_long
host_to_target_semid_ds(abi_ulong target_addr
,
1707 struct semid_ds
*host_sd
)
1709 struct target_semid_ds
*target_sd
;
1711 if (!lock_user_struct(VERIFY_WRITE
, target_sd
, target_addr
, 0))
1712 return -TARGET_EFAULT
;
1713 host_to_target_ipc_perm(target_addr
,&(host_sd
->sem_perm
));
1714 target_sd
->sem_nsems
= tswapl(host_sd
->sem_nsems
);
1715 target_sd
->sem_otime
= tswapl(host_sd
->sem_otime
);
1716 target_sd
->sem_ctime
= tswapl(host_sd
->sem_ctime
);
1717 unlock_user_struct(target_sd
, target_addr
, 1);
1723 struct semid_ds
*buf
;
1724 unsigned short *array
;
1727 union target_semun
{
1730 unsigned short int *array
;
1733 static inline abi_long
target_to_host_semun(int cmd
,
1734 union semun
*host_su
,
1735 abi_ulong target_addr
,
1736 struct semid_ds
*ds
)
1738 union target_semun
*target_su
;
1743 if (!lock_user_struct(VERIFY_READ
, target_su
, target_addr
, 1))
1744 return -TARGET_EFAULT
;
1745 target_to_host_semid_ds(ds
,target_su
->buf
);
1747 unlock_user_struct(target_su
, target_addr
, 0);
1751 if (!lock_user_struct(VERIFY_READ
, target_su
, target_addr
, 1))
1752 return -TARGET_EFAULT
;
1753 host_su
->val
= tswapl(target_su
->val
);
1754 unlock_user_struct(target_su
, target_addr
, 0);
1758 if (!lock_user_struct(VERIFY_READ
, target_su
, target_addr
, 1))
1759 return -TARGET_EFAULT
;
1760 *host_su
->array
= tswap16(*target_su
->array
);
1761 unlock_user_struct(target_su
, target_addr
, 0);
1764 gemu_log("semun operation not fully supported: %d\n", (int)cmd
);
1769 static inline abi_long
host_to_target_semun(int cmd
,
1770 abi_ulong target_addr
,
1771 union semun
*host_su
,
1772 struct semid_ds
*ds
)
1774 union target_semun
*target_su
;
1779 if (lock_user_struct(VERIFY_WRITE
, target_su
, target_addr
, 0))
1780 return -TARGET_EFAULT
;
1781 host_to_target_semid_ds(target_su
->buf
,ds
);
1782 unlock_user_struct(target_su
, target_addr
, 1);
1786 if (lock_user_struct(VERIFY_WRITE
, target_su
, target_addr
, 0))
1787 return -TARGET_EFAULT
;
1788 target_su
->val
= tswapl(host_su
->val
);
1789 unlock_user_struct(target_su
, target_addr
, 1);
1793 if (lock_user_struct(VERIFY_WRITE
, target_su
, target_addr
, 0))
1794 return -TARGET_EFAULT
;
1795 *target_su
->array
= tswap16(*host_su
->array
);
1796 unlock_user_struct(target_su
, target_addr
, 1);
1799 gemu_log("semun operation not fully supported: %d\n", (int)cmd
);
1804 static inline abi_long
do_semctl(int first
, int second
, int third
,
1808 struct semid_ds dsarg
;
1809 int cmd
= third
&0xff;
1814 target_to_host_semun(cmd
,&arg
,ptr
,&dsarg
);
1815 ret
= get_errno(semctl(first
, second
, cmd
, arg
));
1816 host_to_target_semun(cmd
,ptr
,&arg
,&dsarg
);
1819 target_to_host_semun(cmd
,&arg
,ptr
,&dsarg
);
1820 ret
= get_errno(semctl(first
, second
, cmd
, arg
));
1821 host_to_target_semun(cmd
,ptr
,&arg
,&dsarg
);
1824 target_to_host_semun(cmd
,&arg
,ptr
,&dsarg
);
1825 ret
= get_errno(semctl(first
, second
, cmd
, arg
));
1826 host_to_target_semun(cmd
,ptr
,&arg
,&dsarg
);
1829 target_to_host_semun(cmd
,&arg
,ptr
,&dsarg
);
1830 ret
= get_errno(semctl(first
, second
, cmd
, arg
));
1831 host_to_target_semun(cmd
,ptr
,&arg
,&dsarg
);
1834 target_to_host_semun(cmd
,&arg
,ptr
,&dsarg
);
1835 ret
= get_errno(semctl(first
, second
, cmd
, arg
));
1836 host_to_target_semun(cmd
,ptr
,&arg
,&dsarg
);
1839 target_to_host_semun(cmd
,&arg
,ptr
,&dsarg
);
1840 ret
= get_errno(semctl(first
, second
, cmd
, arg
));
1841 host_to_target_semun(cmd
,ptr
,&arg
,&dsarg
);
1844 ret
= get_errno(semctl(first
, second
, cmd
, arg
));
1850 struct target_msqid_ds
1852 struct target_ipc_perm msg_perm
;
1853 abi_ulong msg_stime
;
1854 #if TARGET_ABI_BITS == 32
1855 abi_ulong __unused1
;
1857 abi_ulong msg_rtime
;
1858 #if TARGET_ABI_BITS == 32
1859 abi_ulong __unused2
;
1861 abi_ulong msg_ctime
;
1862 #if TARGET_ABI_BITS == 32
1863 abi_ulong __unused3
;
1865 abi_ulong __msg_cbytes
;
1867 abi_ulong msg_qbytes
;
1868 abi_ulong msg_lspid
;
1869 abi_ulong msg_lrpid
;
1870 abi_ulong __unused4
;
1871 abi_ulong __unused5
;
1874 static inline abi_long
target_to_host_msqid_ds(struct msqid_ds
*host_md
,
1875 abi_ulong target_addr
)
1877 struct target_msqid_ds
*target_md
;
1879 if (!lock_user_struct(VERIFY_READ
, target_md
, target_addr
, 1))
1880 return -TARGET_EFAULT
;
1881 if (target_to_host_ipc_perm(&(host_md
->msg_perm
),target_addr
))
1882 return -TARGET_EFAULT
;
1883 host_md
->msg_stime
= tswapl(target_md
->msg_stime
);
1884 host_md
->msg_rtime
= tswapl(target_md
->msg_rtime
);
1885 host_md
->msg_ctime
= tswapl(target_md
->msg_ctime
);
1886 host_md
->__msg_cbytes
= tswapl(target_md
->__msg_cbytes
);
1887 host_md
->msg_qnum
= tswapl(target_md
->msg_qnum
);
1888 host_md
->msg_qbytes
= tswapl(target_md
->msg_qbytes
);
1889 host_md
->msg_lspid
= tswapl(target_md
->msg_lspid
);
1890 host_md
->msg_lrpid
= tswapl(target_md
->msg_lrpid
);
1891 unlock_user_struct(target_md
, target_addr
, 0);
1895 static inline abi_long
host_to_target_msqid_ds(abi_ulong target_addr
,
1896 struct msqid_ds
*host_md
)
1898 struct target_msqid_ds
*target_md
;
1900 if (!lock_user_struct(VERIFY_WRITE
, target_md
, target_addr
, 0))
1901 return -TARGET_EFAULT
;
1902 if (host_to_target_ipc_perm(target_addr
,&(host_md
->msg_perm
)))
1903 return -TARGET_EFAULT
;
1904 target_md
->msg_stime
= tswapl(host_md
->msg_stime
);
1905 target_md
->msg_rtime
= tswapl(host_md
->msg_rtime
);
1906 target_md
->msg_ctime
= tswapl(host_md
->msg_ctime
);
1907 target_md
->__msg_cbytes
= tswapl(host_md
->__msg_cbytes
);
1908 target_md
->msg_qnum
= tswapl(host_md
->msg_qnum
);
1909 target_md
->msg_qbytes
= tswapl(host_md
->msg_qbytes
);
1910 target_md
->msg_lspid
= tswapl(host_md
->msg_lspid
);
1911 target_md
->msg_lrpid
= tswapl(host_md
->msg_lrpid
);
1912 unlock_user_struct(target_md
, target_addr
, 1);
1916 struct target_msginfo
{
1924 unsigned short int msgseg
;
1927 static inline abi_long
host_to_target_msginfo(abi_ulong target_addr
,
1928 struct msginfo
*host_msginfo
)
1930 struct target_msginfo
*target_msginfo
;
1931 if (!lock_user_struct(VERIFY_WRITE
, target_msginfo
, target_addr
, 0))
1932 return -TARGET_EFAULT
;
1933 __put_user(host_msginfo
->msgpool
, &target_msginfo
->msgpool
);
1934 __put_user(host_msginfo
->msgmap
, &target_msginfo
->msgmap
);
1935 __put_user(host_msginfo
->msgmax
, &target_msginfo
->msgmax
);
1936 __put_user(host_msginfo
->msgmnb
, &target_msginfo
->msgmnb
);
1937 __put_user(host_msginfo
->msgmni
, &target_msginfo
->msgmni
);
1938 __put_user(host_msginfo
->msgssz
, &target_msginfo
->msgssz
);
1939 __put_user(host_msginfo
->msgtql
, &target_msginfo
->msgtql
);
1940 __put_user(host_msginfo
->msgseg
, &target_msginfo
->msgseg
);
1941 unlock_user_struct(target_msginfo
, target_addr
, 1);
1945 static inline abi_long
do_msgctl(int msgid
, int cmd
, abi_long ptr
)
1947 struct msqid_ds dsarg
;
1948 struct msginfo msginfo
;
1949 abi_long ret
= -TARGET_EINVAL
;
1957 if (target_to_host_msqid_ds(&dsarg
,ptr
))
1958 return -TARGET_EFAULT
;
1959 ret
= get_errno(msgctl(msgid
, cmd
, &dsarg
));
1960 if (host_to_target_msqid_ds(ptr
,&dsarg
))
1961 return -TARGET_EFAULT
;
1964 ret
= get_errno(msgctl(msgid
, cmd
, NULL
));
1968 ret
= get_errno(msgctl(msgid
, cmd
, (struct msqid_ds
*)&msginfo
));
1969 if (host_to_target_msginfo(ptr
, &msginfo
))
1970 return -TARGET_EFAULT
;
1977 struct target_msgbuf
{
1982 static inline abi_long
do_msgsnd(int msqid
, abi_long msgp
,
1983 unsigned int msgsz
, int msgflg
)
1985 struct target_msgbuf
*target_mb
;
1986 struct msgbuf
*host_mb
;
1989 if (!lock_user_struct(VERIFY_READ
, target_mb
, msgp
, 0))
1990 return -TARGET_EFAULT
;
1991 host_mb
= malloc(msgsz
+sizeof(long));
1992 host_mb
->mtype
= (abi_long
) tswapl(target_mb
->mtype
);
1993 memcpy(host_mb
->mtext
, target_mb
->mtext
, msgsz
);
1994 ret
= get_errno(msgsnd(msqid
, host_mb
, msgsz
, msgflg
));
1996 unlock_user_struct(target_mb
, msgp
, 0);
2001 static inline abi_long
do_msgrcv(int msqid
, abi_long msgp
,
2002 unsigned int msgsz
, abi_long msgtyp
,
2005 struct target_msgbuf
*target_mb
;
2007 struct msgbuf
*host_mb
;
2010 if (!lock_user_struct(VERIFY_WRITE
, target_mb
, msgp
, 0))
2011 return -TARGET_EFAULT
;
2013 host_mb
= malloc(msgsz
+sizeof(long));
2014 ret
= get_errno(msgrcv(msqid
, host_mb
, msgsz
, tswapl(msgtyp
), msgflg
));
2017 abi_ulong target_mtext_addr
= msgp
+ sizeof(abi_ulong
);
2018 target_mtext
= lock_user(VERIFY_WRITE
, target_mtext_addr
, ret
, 0);
2019 if (!target_mtext
) {
2020 ret
= -TARGET_EFAULT
;
2023 memcpy(target_mb
->mtext
, host_mb
->mtext
, ret
);
2024 unlock_user(target_mtext
, target_mtext_addr
, ret
);
2027 target_mb
->mtype
= tswapl(host_mb
->mtype
);
2032 unlock_user_struct(target_mb
, msgp
, 1);
2036 #ifdef TARGET_NR_ipc
2037 /* ??? This only works with linear mappings. */
2038 /* do_ipc() must return target values and target errnos. */
2039 static abi_long
do_ipc(unsigned int call
, int first
,
2040 int second
, int third
,
2041 abi_long ptr
, abi_long fifth
)
2045 struct shmid_ds shm_info
;
2048 version
= call
>> 16;
2053 ret
= get_errno(semop(first
,(struct sembuf
*)g2h(ptr
), second
));
2057 ret
= get_errno(semget(first
, second
, third
));
2061 ret
= do_semctl(first
, second
, third
, ptr
);
2064 case IPCOP_semtimedop
:
2065 gemu_log("Unsupported ipc call: %d (version %d)\n", call
, version
);
2066 ret
= -TARGET_ENOSYS
;
2070 ret
= get_errno(msgget(first
, second
));
2074 ret
= do_msgsnd(first
, ptr
, second
, third
);
2078 ret
= do_msgctl(first
, second
, ptr
);
2085 struct target_ipc_kludge
{
2090 if (!lock_user_struct(VERIFY_READ
, tmp
, ptr
, 1)) {
2091 ret
= -TARGET_EFAULT
;
2095 ret
= do_msgrcv(first
, tmp
->msgp
, second
, tmp
->msgtyp
, third
);
2097 unlock_user_struct(tmp
, ptr
, 0);
2101 ret
= do_msgrcv(first
, ptr
, second
, fifth
, third
);
2109 /* SHM_* flags are the same on all linux platforms */
2110 host_addr
= shmat(first
, (void *)g2h(ptr
), second
);
2111 if (host_addr
== (void *)-1) {
2112 ret
= get_errno((long)host_addr
);
2115 raddr
= h2g((unsigned long)host_addr
);
2116 /* find out the length of the shared memory segment */
2118 ret
= get_errno(shmctl(first
, IPC_STAT
, &shm_info
));
2119 if (is_error(ret
)) {
2120 /* can't get length, bail out */
2124 page_set_flags(raddr
, raddr
+ shm_info
.shm_segsz
,
2125 PAGE_VALID
| PAGE_READ
|
2126 ((second
& SHM_RDONLY
)? 0: PAGE_WRITE
));
2127 for (i
= 0; i
< N_SHM_REGIONS
; ++i
) {
2128 if (shm_regions
[i
].start
== 0) {
2129 shm_regions
[i
].start
= raddr
;
2130 shm_regions
[i
].size
= shm_info
.shm_segsz
;
2134 if (put_user_ual(raddr
, third
))
2135 return -TARGET_EFAULT
;
2140 for (i
= 0; i
< N_SHM_REGIONS
; ++i
) {
2141 if (shm_regions
[i
].start
== ptr
) {
2142 shm_regions
[i
].start
= 0;
2143 page_set_flags(ptr
, shm_regions
[i
].size
, 0);
2147 ret
= get_errno(shmdt((void *)g2h(ptr
)));
2151 /* IPC_* flag values are the same on all linux platforms */
2152 ret
= get_errno(shmget(first
, second
, third
));
2155 /* IPC_* and SHM_* command values are the same on all linux platforms */
2161 ret
= get_errno(shmctl(first
, second
, NULL
));
2169 gemu_log("Unsupported ipc call: %d (version %d)\n", call
, version
);
2170 ret
= -TARGET_ENOSYS
;
2177 /* kernel structure types definitions */
2180 #define STRUCT(name, list...) STRUCT_ ## name,
2181 #define STRUCT_SPECIAL(name) STRUCT_ ## name,
2183 #include "syscall_types.h"
2186 #undef STRUCT_SPECIAL
2188 #define STRUCT(name, list...) static const argtype struct_ ## name ## _def[] = { list, TYPE_NULL };
2189 #define STRUCT_SPECIAL(name)
2190 #include "syscall_types.h"
2192 #undef STRUCT_SPECIAL
2194 typedef struct IOCTLEntry
{
2195 unsigned int target_cmd
;
2196 unsigned int host_cmd
;
2199 const argtype arg_type
[5];
2202 #define IOC_R 0x0001
2203 #define IOC_W 0x0002
2204 #define IOC_RW (IOC_R | IOC_W)
2206 #define MAX_STRUCT_SIZE 4096
2208 static IOCTLEntry ioctl_entries
[] = {
2209 #define IOCTL(cmd, access, types...) \
2210 { TARGET_ ## cmd, cmd, #cmd, access, { types } },
2215 /* ??? Implement proper locking for ioctls. */
2216 /* do_ioctl() Must return target values and target errnos. */
2217 static abi_long
do_ioctl(int fd
, abi_long cmd
, abi_long arg
)
2219 const IOCTLEntry
*ie
;
2220 const argtype
*arg_type
;
2222 uint8_t buf_temp
[MAX_STRUCT_SIZE
];
2228 if (ie
->target_cmd
== 0) {
2229 gemu_log("Unsupported ioctl: cmd=0x%04lx\n", (long)cmd
);
2230 return -TARGET_ENOSYS
;
2232 if (ie
->target_cmd
== cmd
)
2236 arg_type
= ie
->arg_type
;
2238 gemu_log("ioctl: cmd=0x%04lx (%s)\n", (long)cmd
, ie
->name
);
2240 switch(arg_type
[0]) {
2243 ret
= get_errno(ioctl(fd
, ie
->host_cmd
));
2248 ret
= get_errno(ioctl(fd
, ie
->host_cmd
, arg
));
2252 target_size
= thunk_type_size(arg_type
, 0);
2253 switch(ie
->access
) {
2255 ret
= get_errno(ioctl(fd
, ie
->host_cmd
, buf_temp
));
2256 if (!is_error(ret
)) {
2257 argptr
= lock_user(VERIFY_WRITE
, arg
, target_size
, 0);
2259 return -TARGET_EFAULT
;
2260 thunk_convert(argptr
, buf_temp
, arg_type
, THUNK_TARGET
);
2261 unlock_user(argptr
, arg
, target_size
);
2265 argptr
= lock_user(VERIFY_READ
, arg
, target_size
, 1);
2267 return -TARGET_EFAULT
;
2268 thunk_convert(buf_temp
, argptr
, arg_type
, THUNK_HOST
);
2269 unlock_user(argptr
, arg
, 0);
2270 ret
= get_errno(ioctl(fd
, ie
->host_cmd
, buf_temp
));
2274 argptr
= lock_user(VERIFY_READ
, arg
, target_size
, 1);
2276 return -TARGET_EFAULT
;
2277 thunk_convert(buf_temp
, argptr
, arg_type
, THUNK_HOST
);
2278 unlock_user(argptr
, arg
, 0);
2279 ret
= get_errno(ioctl(fd
, ie
->host_cmd
, buf_temp
));
2280 if (!is_error(ret
)) {
2281 argptr
= lock_user(VERIFY_WRITE
, arg
, target_size
, 0);
2283 return -TARGET_EFAULT
;
2284 thunk_convert(argptr
, buf_temp
, arg_type
, THUNK_TARGET
);
2285 unlock_user(argptr
, arg
, target_size
);
2291 gemu_log("Unsupported ioctl type: cmd=0x%04lx type=%d\n",
2292 (long)cmd
, arg_type
[0]);
2293 ret
= -TARGET_ENOSYS
;
2299 static const bitmask_transtbl iflag_tbl
[] = {
2300 { TARGET_IGNBRK
, TARGET_IGNBRK
, IGNBRK
, IGNBRK
},
2301 { TARGET_BRKINT
, TARGET_BRKINT
, BRKINT
, BRKINT
},
2302 { TARGET_IGNPAR
, TARGET_IGNPAR
, IGNPAR
, IGNPAR
},
2303 { TARGET_PARMRK
, TARGET_PARMRK
, PARMRK
, PARMRK
},
2304 { TARGET_INPCK
, TARGET_INPCK
, INPCK
, INPCK
},
2305 { TARGET_ISTRIP
, TARGET_ISTRIP
, ISTRIP
, ISTRIP
},
2306 { TARGET_INLCR
, TARGET_INLCR
, INLCR
, INLCR
},
2307 { TARGET_IGNCR
, TARGET_IGNCR
, IGNCR
, IGNCR
},
2308 { TARGET_ICRNL
, TARGET_ICRNL
, ICRNL
, ICRNL
},
2309 { TARGET_IUCLC
, TARGET_IUCLC
, IUCLC
, IUCLC
},
2310 { TARGET_IXON
, TARGET_IXON
, IXON
, IXON
},
2311 { TARGET_IXANY
, TARGET_IXANY
, IXANY
, IXANY
},
2312 { TARGET_IXOFF
, TARGET_IXOFF
, IXOFF
, IXOFF
},
2313 { TARGET_IMAXBEL
, TARGET_IMAXBEL
, IMAXBEL
, IMAXBEL
},
2317 static const bitmask_transtbl oflag_tbl
[] = {
2318 { TARGET_OPOST
, TARGET_OPOST
, OPOST
, OPOST
},
2319 { TARGET_OLCUC
, TARGET_OLCUC
, OLCUC
, OLCUC
},
2320 { TARGET_ONLCR
, TARGET_ONLCR
, ONLCR
, ONLCR
},
2321 { TARGET_OCRNL
, TARGET_OCRNL
, OCRNL
, OCRNL
},
2322 { TARGET_ONOCR
, TARGET_ONOCR
, ONOCR
, ONOCR
},
2323 { TARGET_ONLRET
, TARGET_ONLRET
, ONLRET
, ONLRET
},
2324 { TARGET_OFILL
, TARGET_OFILL
, OFILL
, OFILL
},
2325 { TARGET_OFDEL
, TARGET_OFDEL
, OFDEL
, OFDEL
},
2326 { TARGET_NLDLY
, TARGET_NL0
, NLDLY
, NL0
},
2327 { TARGET_NLDLY
, TARGET_NL1
, NLDLY
, NL1
},
2328 { TARGET_CRDLY
, TARGET_CR0
, CRDLY
, CR0
},
2329 { TARGET_CRDLY
, TARGET_CR1
, CRDLY
, CR1
},
2330 { TARGET_CRDLY
, TARGET_CR2
, CRDLY
, CR2
},
2331 { TARGET_CRDLY
, TARGET_CR3
, CRDLY
, CR3
},
2332 { TARGET_TABDLY
, TARGET_TAB0
, TABDLY
, TAB0
},
2333 { TARGET_TABDLY
, TARGET_TAB1
, TABDLY
, TAB1
},
2334 { TARGET_TABDLY
, TARGET_TAB2
, TABDLY
, TAB2
},
2335 { TARGET_TABDLY
, TARGET_TAB3
, TABDLY
, TAB3
},
2336 { TARGET_BSDLY
, TARGET_BS0
, BSDLY
, BS0
},
2337 { TARGET_BSDLY
, TARGET_BS1
, BSDLY
, BS1
},
2338 { TARGET_VTDLY
, TARGET_VT0
, VTDLY
, VT0
},
2339 { TARGET_VTDLY
, TARGET_VT1
, VTDLY
, VT1
},
2340 { TARGET_FFDLY
, TARGET_FF0
, FFDLY
, FF0
},
2341 { TARGET_FFDLY
, TARGET_FF1
, FFDLY
, FF1
},
2345 static const bitmask_transtbl cflag_tbl
[] = {
2346 { TARGET_CBAUD
, TARGET_B0
, CBAUD
, B0
},
2347 { TARGET_CBAUD
, TARGET_B50
, CBAUD
, B50
},
2348 { TARGET_CBAUD
, TARGET_B75
, CBAUD
, B75
},
2349 { TARGET_CBAUD
, TARGET_B110
, CBAUD
, B110
},
2350 { TARGET_CBAUD
, TARGET_B134
, CBAUD
, B134
},
2351 { TARGET_CBAUD
, TARGET_B150
, CBAUD
, B150
},
2352 { TARGET_CBAUD
, TARGET_B200
, CBAUD
, B200
},
2353 { TARGET_CBAUD
, TARGET_B300
, CBAUD
, B300
},
2354 { TARGET_CBAUD
, TARGET_B600
, CBAUD
, B600
},
2355 { TARGET_CBAUD
, TARGET_B1200
, CBAUD
, B1200
},
2356 { TARGET_CBAUD
, TARGET_B1800
, CBAUD
, B1800
},
2357 { TARGET_CBAUD
, TARGET_B2400
, CBAUD
, B2400
},
2358 { TARGET_CBAUD
, TARGET_B4800
, CBAUD
, B4800
},
2359 { TARGET_CBAUD
, TARGET_B9600
, CBAUD
, B9600
},
2360 { TARGET_CBAUD
, TARGET_B19200
, CBAUD
, B19200
},
2361 { TARGET_CBAUD
, TARGET_B38400
, CBAUD
, B38400
},
2362 { TARGET_CBAUD
, TARGET_B57600
, CBAUD
, B57600
},
2363 { TARGET_CBAUD
, TARGET_B115200
, CBAUD
, B115200
},
2364 { TARGET_CBAUD
, TARGET_B230400
, CBAUD
, B230400
},
2365 { TARGET_CBAUD
, TARGET_B460800
, CBAUD
, B460800
},
2366 { TARGET_CSIZE
, TARGET_CS5
, CSIZE
, CS5
},
2367 { TARGET_CSIZE
, TARGET_CS6
, CSIZE
, CS6
},
2368 { TARGET_CSIZE
, TARGET_CS7
, CSIZE
, CS7
},
2369 { TARGET_CSIZE
, TARGET_CS8
, CSIZE
, CS8
},
2370 { TARGET_CSTOPB
, TARGET_CSTOPB
, CSTOPB
, CSTOPB
},
2371 { TARGET_CREAD
, TARGET_CREAD
, CREAD
, CREAD
},
2372 { TARGET_PARENB
, TARGET_PARENB
, PARENB
, PARENB
},
2373 { TARGET_PARODD
, TARGET_PARODD
, PARODD
, PARODD
},
2374 { TARGET_HUPCL
, TARGET_HUPCL
, HUPCL
, HUPCL
},
2375 { TARGET_CLOCAL
, TARGET_CLOCAL
, CLOCAL
, CLOCAL
},
2376 { TARGET_CRTSCTS
, TARGET_CRTSCTS
, CRTSCTS
, CRTSCTS
},
2380 static const bitmask_transtbl lflag_tbl
[] = {
2381 { TARGET_ISIG
, TARGET_ISIG
, ISIG
, ISIG
},
2382 { TARGET_ICANON
, TARGET_ICANON
, ICANON
, ICANON
},
2383 { TARGET_XCASE
, TARGET_XCASE
, XCASE
, XCASE
},
2384 { TARGET_ECHO
, TARGET_ECHO
, ECHO
, ECHO
},
2385 { TARGET_ECHOE
, TARGET_ECHOE
, ECHOE
, ECHOE
},
2386 { TARGET_ECHOK
, TARGET_ECHOK
, ECHOK
, ECHOK
},
2387 { TARGET_ECHONL
, TARGET_ECHONL
, ECHONL
, ECHONL
},
2388 { TARGET_NOFLSH
, TARGET_NOFLSH
, NOFLSH
, NOFLSH
},
2389 { TARGET_TOSTOP
, TARGET_TOSTOP
, TOSTOP
, TOSTOP
},
2390 { TARGET_ECHOCTL
, TARGET_ECHOCTL
, ECHOCTL
, ECHOCTL
},
2391 { TARGET_ECHOPRT
, TARGET_ECHOPRT
, ECHOPRT
, ECHOPRT
},
2392 { TARGET_ECHOKE
, TARGET_ECHOKE
, ECHOKE
, ECHOKE
},
2393 { TARGET_FLUSHO
, TARGET_FLUSHO
, FLUSHO
, FLUSHO
},
2394 { TARGET_PENDIN
, TARGET_PENDIN
, PENDIN
, PENDIN
},
2395 { TARGET_IEXTEN
, TARGET_IEXTEN
, IEXTEN
, IEXTEN
},
2399 static void target_to_host_termios (void *dst
, const void *src
)
2401 struct host_termios
*host
= dst
;
2402 const struct target_termios
*target
= src
;
2405 target_to_host_bitmask(tswap32(target
->c_iflag
), iflag_tbl
);
2407 target_to_host_bitmask(tswap32(target
->c_oflag
), oflag_tbl
);
2409 target_to_host_bitmask(tswap32(target
->c_cflag
), cflag_tbl
);
2411 target_to_host_bitmask(tswap32(target
->c_lflag
), lflag_tbl
);
2412 host
->c_line
= target
->c_line
;
2414 host
->c_cc
[VINTR
] = target
->c_cc
[TARGET_VINTR
];
2415 host
->c_cc
[VQUIT
] = target
->c_cc
[TARGET_VQUIT
];
2416 host
->c_cc
[VERASE
] = target
->c_cc
[TARGET_VERASE
];
2417 host
->c_cc
[VKILL
] = target
->c_cc
[TARGET_VKILL
];
2418 host
->c_cc
[VEOF
] = target
->c_cc
[TARGET_VEOF
];
2419 host
->c_cc
[VTIME
] = target
->c_cc
[TARGET_VTIME
];
2420 host
->c_cc
[VMIN
] = target
->c_cc
[TARGET_VMIN
];
2421 host
->c_cc
[VSWTC
] = target
->c_cc
[TARGET_VSWTC
];
2422 host
->c_cc
[VSTART
] = target
->c_cc
[TARGET_VSTART
];
2423 host
->c_cc
[VSTOP
] = target
->c_cc
[TARGET_VSTOP
];
2424 host
->c_cc
[VSUSP
] = target
->c_cc
[TARGET_VSUSP
];
2425 host
->c_cc
[VEOL
] = target
->c_cc
[TARGET_VEOL
];
2426 host
->c_cc
[VREPRINT
] = target
->c_cc
[TARGET_VREPRINT
];
2427 host
->c_cc
[VDISCARD
] = target
->c_cc
[TARGET_VDISCARD
];
2428 host
->c_cc
[VWERASE
] = target
->c_cc
[TARGET_VWERASE
];
2429 host
->c_cc
[VLNEXT
] = target
->c_cc
[TARGET_VLNEXT
];
2430 host
->c_cc
[VEOL2
] = target
->c_cc
[TARGET_VEOL2
];
2433 static void host_to_target_termios (void *dst
, const void *src
)
2435 struct target_termios
*target
= dst
;
2436 const struct host_termios
*host
= src
;
2439 tswap32(host_to_target_bitmask(host
->c_iflag
, iflag_tbl
));
2441 tswap32(host_to_target_bitmask(host
->c_oflag
, oflag_tbl
));
2443 tswap32(host_to_target_bitmask(host
->c_cflag
, cflag_tbl
));
2445 tswap32(host_to_target_bitmask(host
->c_lflag
, lflag_tbl
));
2446 target
->c_line
= host
->c_line
;
2448 target
->c_cc
[TARGET_VINTR
] = host
->c_cc
[VINTR
];
2449 target
->c_cc
[TARGET_VQUIT
] = host
->c_cc
[VQUIT
];
2450 target
->c_cc
[TARGET_VERASE
] = host
->c_cc
[VERASE
];
2451 target
->c_cc
[TARGET_VKILL
] = host
->c_cc
[VKILL
];
2452 target
->c_cc
[TARGET_VEOF
] = host
->c_cc
[VEOF
];
2453 target
->c_cc
[TARGET_VTIME
] = host
->c_cc
[VTIME
];
2454 target
->c_cc
[TARGET_VMIN
] = host
->c_cc
[VMIN
];
2455 target
->c_cc
[TARGET_VSWTC
] = host
->c_cc
[VSWTC
];
2456 target
->c_cc
[TARGET_VSTART
] = host
->c_cc
[VSTART
];
2457 target
->c_cc
[TARGET_VSTOP
] = host
->c_cc
[VSTOP
];
2458 target
->c_cc
[TARGET_VSUSP
] = host
->c_cc
[VSUSP
];
2459 target
->c_cc
[TARGET_VEOL
] = host
->c_cc
[VEOL
];
2460 target
->c_cc
[TARGET_VREPRINT
] = host
->c_cc
[VREPRINT
];
2461 target
->c_cc
[TARGET_VDISCARD
] = host
->c_cc
[VDISCARD
];
2462 target
->c_cc
[TARGET_VWERASE
] = host
->c_cc
[VWERASE
];
2463 target
->c_cc
[TARGET_VLNEXT
] = host
->c_cc
[VLNEXT
];
2464 target
->c_cc
[TARGET_VEOL2
] = host
->c_cc
[VEOL2
];
2467 static const StructEntry struct_termios_def
= {
2468 .convert
= { host_to_target_termios
, target_to_host_termios
},
2469 .size
= { sizeof(struct target_termios
), sizeof(struct host_termios
) },
2470 .align
= { __alignof__(struct target_termios
), __alignof__(struct host_termios
) },
2473 static bitmask_transtbl mmap_flags_tbl
[] = {
2474 { TARGET_MAP_SHARED
, TARGET_MAP_SHARED
, MAP_SHARED
, MAP_SHARED
},
2475 { TARGET_MAP_PRIVATE
, TARGET_MAP_PRIVATE
, MAP_PRIVATE
, MAP_PRIVATE
},
2476 { TARGET_MAP_FIXED
, TARGET_MAP_FIXED
, MAP_FIXED
, MAP_FIXED
},
2477 { TARGET_MAP_ANONYMOUS
, TARGET_MAP_ANONYMOUS
, MAP_ANONYMOUS
, MAP_ANONYMOUS
},
2478 { TARGET_MAP_GROWSDOWN
, TARGET_MAP_GROWSDOWN
, MAP_GROWSDOWN
, MAP_GROWSDOWN
},
2479 { TARGET_MAP_DENYWRITE
, TARGET_MAP_DENYWRITE
, MAP_DENYWRITE
, MAP_DENYWRITE
},
2480 { TARGET_MAP_EXECUTABLE
, TARGET_MAP_EXECUTABLE
, MAP_EXECUTABLE
, MAP_EXECUTABLE
},
2481 { TARGET_MAP_LOCKED
, TARGET_MAP_LOCKED
, MAP_LOCKED
, MAP_LOCKED
},
2485 static bitmask_transtbl fcntl_flags_tbl
[] = {
2486 { TARGET_O_ACCMODE
, TARGET_O_WRONLY
, O_ACCMODE
, O_WRONLY
, },
2487 { TARGET_O_ACCMODE
, TARGET_O_RDWR
, O_ACCMODE
, O_RDWR
, },
2488 { TARGET_O_CREAT
, TARGET_O_CREAT
, O_CREAT
, O_CREAT
, },
2489 { TARGET_O_EXCL
, TARGET_O_EXCL
, O_EXCL
, O_EXCL
, },
2490 { TARGET_O_NOCTTY
, TARGET_O_NOCTTY
, O_NOCTTY
, O_NOCTTY
, },
2491 { TARGET_O_TRUNC
, TARGET_O_TRUNC
, O_TRUNC
, O_TRUNC
, },
2492 { TARGET_O_APPEND
, TARGET_O_APPEND
, O_APPEND
, O_APPEND
, },
2493 { TARGET_O_NONBLOCK
, TARGET_O_NONBLOCK
, O_NONBLOCK
, O_NONBLOCK
, },
2494 { TARGET_O_SYNC
, TARGET_O_SYNC
, O_SYNC
, O_SYNC
, },
2495 { TARGET_FASYNC
, TARGET_FASYNC
, FASYNC
, FASYNC
, },
2496 { TARGET_O_DIRECTORY
, TARGET_O_DIRECTORY
, O_DIRECTORY
, O_DIRECTORY
, },
2497 { TARGET_O_NOFOLLOW
, TARGET_O_NOFOLLOW
, O_NOFOLLOW
, O_NOFOLLOW
, },
2498 { TARGET_O_LARGEFILE
, TARGET_O_LARGEFILE
, O_LARGEFILE
, O_LARGEFILE
, },
2499 #if defined(O_DIRECT)
2500 { TARGET_O_DIRECT
, TARGET_O_DIRECT
, O_DIRECT
, O_DIRECT
, },
2505 #if defined(TARGET_I386)
2507 /* NOTE: there is really one LDT for all the threads */
2508 static uint8_t *ldt_table
;
2510 static abi_long
read_ldt(abi_ulong ptr
, unsigned long bytecount
)
2517 size
= TARGET_LDT_ENTRIES
* TARGET_LDT_ENTRY_SIZE
;
2518 if (size
> bytecount
)
2520 p
= lock_user(VERIFY_WRITE
, ptr
, size
, 0);
2522 return -TARGET_EFAULT
;
2523 /* ??? Should this by byteswapped? */
2524 memcpy(p
, ldt_table
, size
);
2525 unlock_user(p
, ptr
, size
);
2529 /* XXX: add locking support */
2530 static abi_long
write_ldt(CPUX86State
*env
,
2531 abi_ulong ptr
, unsigned long bytecount
, int oldmode
)
2533 struct target_modify_ldt_ldt_s ldt_info
;
2534 struct target_modify_ldt_ldt_s
*target_ldt_info
;
2535 int seg_32bit
, contents
, read_exec_only
, limit_in_pages
;
2536 int seg_not_present
, useable
, lm
;
2537 uint32_t *lp
, entry_1
, entry_2
;
2539 if (bytecount
!= sizeof(ldt_info
))
2540 return -TARGET_EINVAL
;
2541 if (!lock_user_struct(VERIFY_READ
, target_ldt_info
, ptr
, 1))
2542 return -TARGET_EFAULT
;
2543 ldt_info
.entry_number
= tswap32(target_ldt_info
->entry_number
);
2544 ldt_info
.base_addr
= tswapl(target_ldt_info
->base_addr
);
2545 ldt_info
.limit
= tswap32(target_ldt_info
->limit
);
2546 ldt_info
.flags
= tswap32(target_ldt_info
->flags
);
2547 unlock_user_struct(target_ldt_info
, ptr
, 0);
2549 if (ldt_info
.entry_number
>= TARGET_LDT_ENTRIES
)
2550 return -TARGET_EINVAL
;
2551 seg_32bit
= ldt_info
.flags
& 1;
2552 contents
= (ldt_info
.flags
>> 1) & 3;
2553 read_exec_only
= (ldt_info
.flags
>> 3) & 1;
2554 limit_in_pages
= (ldt_info
.flags
>> 4) & 1;
2555 seg_not_present
= (ldt_info
.flags
>> 5) & 1;
2556 useable
= (ldt_info
.flags
>> 6) & 1;
2560 lm
= (ldt_info
.flags
>> 7) & 1;
2562 if (contents
== 3) {
2564 return -TARGET_EINVAL
;
2565 if (seg_not_present
== 0)
2566 return -TARGET_EINVAL
;
2568 /* allocate the LDT */
2570 env
->ldt
.base
= target_mmap(0,
2571 TARGET_LDT_ENTRIES
* TARGET_LDT_ENTRY_SIZE
,
2572 PROT_READ
|PROT_WRITE
,
2573 MAP_ANONYMOUS
|MAP_PRIVATE
, -1, 0);
2574 if (env
->ldt
.base
== -1)
2575 return -TARGET_ENOMEM
;
2576 memset(g2h(env
->ldt
.base
), 0,
2577 TARGET_LDT_ENTRIES
* TARGET_LDT_ENTRY_SIZE
);
2578 env
->ldt
.limit
= 0xffff;
2579 ldt_table
= g2h(env
->ldt
.base
);
2582 /* NOTE: same code as Linux kernel */
2583 /* Allow LDTs to be cleared by the user. */
2584 if (ldt_info
.base_addr
== 0 && ldt_info
.limit
== 0) {
2587 read_exec_only
== 1 &&
2589 limit_in_pages
== 0 &&
2590 seg_not_present
== 1 &&
2598 entry_1
= ((ldt_info
.base_addr
& 0x0000ffff) << 16) |
2599 (ldt_info
.limit
& 0x0ffff);
2600 entry_2
= (ldt_info
.base_addr
& 0xff000000) |
2601 ((ldt_info
.base_addr
& 0x00ff0000) >> 16) |
2602 (ldt_info
.limit
& 0xf0000) |
2603 ((read_exec_only
^ 1) << 9) |
2605 ((seg_not_present
^ 1) << 15) |
2607 (limit_in_pages
<< 23) |
2611 entry_2
|= (useable
<< 20);
2613 /* Install the new entry ... */
2615 lp
= (uint32_t *)(ldt_table
+ (ldt_info
.entry_number
<< 3));
2616 lp
[0] = tswap32(entry_1
);
2617 lp
[1] = tswap32(entry_2
);
2621 /* specific and weird i386 syscalls */
2622 static abi_long
do_modify_ldt(CPUX86State
*env
, int func
, abi_ulong ptr
,
2623 unsigned long bytecount
)
2629 ret
= read_ldt(ptr
, bytecount
);
2632 ret
= write_ldt(env
, ptr
, bytecount
, 1);
2635 ret
= write_ldt(env
, ptr
, bytecount
, 0);
2638 ret
= -TARGET_ENOSYS
;
2644 #if defined(TARGET_I386) && defined(TARGET_ABI32)
2645 static abi_long
do_set_thread_area(CPUX86State
*env
, abi_ulong ptr
)
2647 uint64_t *gdt_table
= g2h(env
->gdt
.base
);
2648 struct target_modify_ldt_ldt_s ldt_info
;
2649 struct target_modify_ldt_ldt_s
*target_ldt_info
;
2650 int seg_32bit
, contents
, read_exec_only
, limit_in_pages
;
2651 int seg_not_present
, useable
, lm
;
2652 uint32_t *lp
, entry_1
, entry_2
;
2655 lock_user_struct(VERIFY_WRITE
, target_ldt_info
, ptr
, 1);
2656 if (!target_ldt_info
)
2657 return -TARGET_EFAULT
;
2658 ldt_info
.entry_number
= tswap32(target_ldt_info
->entry_number
);
2659 ldt_info
.base_addr
= tswapl(target_ldt_info
->base_addr
);
2660 ldt_info
.limit
= tswap32(target_ldt_info
->limit
);
2661 ldt_info
.flags
= tswap32(target_ldt_info
->flags
);
2662 if (ldt_info
.entry_number
== -1) {
2663 for (i
=TARGET_GDT_ENTRY_TLS_MIN
; i
<=TARGET_GDT_ENTRY_TLS_MAX
; i
++) {
2664 if (gdt_table
[i
] == 0) {
2665 ldt_info
.entry_number
= i
;
2666 target_ldt_info
->entry_number
= tswap32(i
);
2671 unlock_user_struct(target_ldt_info
, ptr
, 1);
2673 if (ldt_info
.entry_number
< TARGET_GDT_ENTRY_TLS_MIN
||
2674 ldt_info
.entry_number
> TARGET_GDT_ENTRY_TLS_MAX
)
2675 return -TARGET_EINVAL
;
2676 seg_32bit
= ldt_info
.flags
& 1;
2677 contents
= (ldt_info
.flags
>> 1) & 3;
2678 read_exec_only
= (ldt_info
.flags
>> 3) & 1;
2679 limit_in_pages
= (ldt_info
.flags
>> 4) & 1;
2680 seg_not_present
= (ldt_info
.flags
>> 5) & 1;
2681 useable
= (ldt_info
.flags
>> 6) & 1;
2685 lm
= (ldt_info
.flags
>> 7) & 1;
2688 if (contents
== 3) {
2689 if (seg_not_present
== 0)
2690 return -TARGET_EINVAL
;
2693 /* NOTE: same code as Linux kernel */
2694 /* Allow LDTs to be cleared by the user. */
2695 if (ldt_info
.base_addr
== 0 && ldt_info
.limit
== 0) {
2696 if ((contents
== 0 &&
2697 read_exec_only
== 1 &&
2699 limit_in_pages
== 0 &&
2700 seg_not_present
== 1 &&
2708 entry_1
= ((ldt_info
.base_addr
& 0x0000ffff) << 16) |
2709 (ldt_info
.limit
& 0x0ffff);
2710 entry_2
= (ldt_info
.base_addr
& 0xff000000) |
2711 ((ldt_info
.base_addr
& 0x00ff0000) >> 16) |
2712 (ldt_info
.limit
& 0xf0000) |
2713 ((read_exec_only
^ 1) << 9) |
2715 ((seg_not_present
^ 1) << 15) |
2717 (limit_in_pages
<< 23) |
2722 /* Install the new entry ... */
2724 lp
= (uint32_t *)(gdt_table
+ ldt_info
.entry_number
);
2725 lp
[0] = tswap32(entry_1
);
2726 lp
[1] = tswap32(entry_2
);
2730 static abi_long
do_get_thread_area(CPUX86State
*env
, abi_ulong ptr
)
2732 struct target_modify_ldt_ldt_s
*target_ldt_info
;
2733 uint64_t *gdt_table
= g2h(env
->gdt
.base
);
2734 uint32_t base_addr
, limit
, flags
;
2735 int seg_32bit
, contents
, read_exec_only
, limit_in_pages
, idx
;
2736 int seg_not_present
, useable
, lm
;
2737 uint32_t *lp
, entry_1
, entry_2
;
2739 lock_user_struct(VERIFY_WRITE
, target_ldt_info
, ptr
, 1);
2740 if (!target_ldt_info
)
2741 return -TARGET_EFAULT
;
2742 idx
= tswap32(target_ldt_info
->entry_number
);
2743 if (idx
< TARGET_GDT_ENTRY_TLS_MIN
||
2744 idx
> TARGET_GDT_ENTRY_TLS_MAX
) {
2745 unlock_user_struct(target_ldt_info
, ptr
, 1);
2746 return -TARGET_EINVAL
;
2748 lp
= (uint32_t *)(gdt_table
+ idx
);
2749 entry_1
= tswap32(lp
[0]);
2750 entry_2
= tswap32(lp
[1]);
2752 read_exec_only
= ((entry_2
>> 9) & 1) ^ 1;
2753 contents
= (entry_2
>> 10) & 3;
2754 seg_not_present
= ((entry_2
>> 15) & 1) ^ 1;
2755 seg_32bit
= (entry_2
>> 22) & 1;
2756 limit_in_pages
= (entry_2
>> 23) & 1;
2757 useable
= (entry_2
>> 20) & 1;
2761 lm
= (entry_2
>> 21) & 1;
2763 flags
= (seg_32bit
<< 0) | (contents
<< 1) |
2764 (read_exec_only
<< 3) | (limit_in_pages
<< 4) |
2765 (seg_not_present
<< 5) | (useable
<< 6) | (lm
<< 7);
2766 limit
= (entry_1
& 0xffff) | (entry_2
& 0xf0000);
2767 base_addr
= (entry_1
>> 16) |
2768 (entry_2
& 0xff000000) |
2769 ((entry_2
& 0xff) << 16);
2770 target_ldt_info
->base_addr
= tswapl(base_addr
);
2771 target_ldt_info
->limit
= tswap32(limit
);
2772 target_ldt_info
->flags
= tswap32(flags
);
2773 unlock_user_struct(target_ldt_info
, ptr
, 1);
2776 #endif /* TARGET_I386 && TARGET_ABI32 */
2778 #ifndef TARGET_ABI32
2779 static abi_long
do_arch_prctl(CPUX86State
*env
, int code
, abi_ulong addr
)
2786 case TARGET_ARCH_SET_GS
:
2787 case TARGET_ARCH_SET_FS
:
2788 if (code
== TARGET_ARCH_SET_GS
)
2792 cpu_x86_load_seg(env
, idx
, 0);
2793 env
->segs
[idx
].base
= addr
;
2795 case TARGET_ARCH_GET_GS
:
2796 case TARGET_ARCH_GET_FS
:
2797 if (code
== TARGET_ARCH_GET_GS
)
2801 val
= env
->segs
[idx
].base
;
2802 if (put_user(val
, addr
, abi_ulong
))
2803 return -TARGET_EFAULT
;
2806 ret
= -TARGET_EINVAL
;
2813 #endif /* defined(TARGET_I386) */
2815 #if defined(USE_NPTL)
2817 #define NEW_STACK_SIZE PTHREAD_STACK_MIN
2819 static pthread_mutex_t clone_lock
= PTHREAD_MUTEX_INITIALIZER
;
2822 pthread_mutex_t mutex
;
2823 pthread_cond_t cond
;
2826 abi_ulong child_tidptr
;
2827 abi_ulong parent_tidptr
;
2831 static void *clone_func(void *arg
)
2833 new_thread_info
*info
= arg
;
2838 info
->tid
= gettid();
2839 if (info
->child_tidptr
)
2840 put_user_u32(info
->tid
, info
->child_tidptr
);
2841 if (info
->parent_tidptr
)
2842 put_user_u32(info
->tid
, info
->parent_tidptr
);
2843 /* Enable signals. */
2844 sigprocmask(SIG_SETMASK
, &info
->sigmask
, NULL
);
2845 /* Signal to the parent that we're ready. */
2846 pthread_mutex_lock(&info
->mutex
);
2847 pthread_cond_broadcast(&info
->cond
);
2848 pthread_mutex_unlock(&info
->mutex
);
2849 /* Wait until the parent has finshed initializing the tls state. */
2850 pthread_mutex_lock(&clone_lock
);
2851 pthread_mutex_unlock(&clone_lock
);
2857 /* this stack is the equivalent of the kernel stack associated with a
2859 #define NEW_STACK_SIZE 8192
2861 static int clone_func(void *arg
)
2863 CPUState
*env
= arg
;
2870 /* do_fork() Must return host values and target errnos (unlike most
2871 do_*() functions). */
2872 static int do_fork(CPUState
*env
, unsigned int flags
, abi_ulong newsp
,
2873 abi_ulong parent_tidptr
, target_ulong newtls
,
2874 abi_ulong child_tidptr
)
2880 #if defined(USE_NPTL)
2881 unsigned int nptl_flags
;
2885 /* Emulate vfork() with fork() */
2886 if (flags
& CLONE_VFORK
)
2887 flags
&= ~(CLONE_VFORK
| CLONE_VM
);
2889 if (flags
& CLONE_VM
) {
2890 #if defined(USE_NPTL)
2891 new_thread_info info
;
2892 pthread_attr_t attr
;
2894 ts
= qemu_mallocz(sizeof(TaskState
) + NEW_STACK_SIZE
);
2895 init_task_state(ts
);
2896 new_stack
= ts
->stack
;
2897 /* we create a new CPU instance. */
2898 new_env
= cpu_copy(env
);
2899 /* Init regs that differ from the parent. */
2900 cpu_clone_regs(new_env
, newsp
);
2901 new_env
->opaque
= ts
;
2902 #if defined(USE_NPTL)
2904 flags
&= ~CLONE_NPTL_FLAGS2
;
2906 /* TODO: Implement CLONE_CHILD_CLEARTID. */
2907 if (nptl_flags
& CLONE_SETTLS
)
2908 cpu_set_tls (new_env
, newtls
);
2910 /* Grab a mutex so that thread setup appears atomic. */
2911 pthread_mutex_lock(&clone_lock
);
2913 memset(&info
, 0, sizeof(info
));
2914 pthread_mutex_init(&info
.mutex
, NULL
);
2915 pthread_mutex_lock(&info
.mutex
);
2916 pthread_cond_init(&info
.cond
, NULL
);
2918 if (nptl_flags
& CLONE_CHILD_SETTID
)
2919 info
.child_tidptr
= child_tidptr
;
2920 if (nptl_flags
& CLONE_PARENT_SETTID
)
2921 info
.parent_tidptr
= parent_tidptr
;
2923 ret
= pthread_attr_init(&attr
);
2924 ret
= pthread_attr_setstack(&attr
, new_stack
, NEW_STACK_SIZE
);
2925 /* It is not safe to deliver signals until the child has finished
2926 initializing, so temporarily block all signals. */
2927 sigfillset(&sigmask
);
2928 sigprocmask(SIG_BLOCK
, &sigmask
, &info
.sigmask
);
2930 ret
= pthread_create(&info
.thread
, &attr
, clone_func
, &info
);
2932 sigprocmask(SIG_SETMASK
, &info
.sigmask
, NULL
);
2933 pthread_attr_destroy(&attr
);
2935 /* Wait for the child to initialize. */
2936 pthread_cond_wait(&info
.cond
, &info
.mutex
);
2938 if (flags
& CLONE_PARENT_SETTID
)
2939 put_user_u32(ret
, parent_tidptr
);
2943 pthread_mutex_unlock(&info
.mutex
);
2944 pthread_cond_destroy(&info
.cond
);
2945 pthread_mutex_destroy(&info
.mutex
);
2946 pthread_mutex_unlock(&clone_lock
);
2948 if (flags
& CLONE_NPTL_FLAGS2
)
2950 /* This is probably going to die very quickly, but do it anyway. */
2952 ret
= __clone2(clone_func
, new_stack
+ NEW_STACK_SIZE
, flags
, new_env
);
2954 ret
= clone(clone_func
, new_stack
+ NEW_STACK_SIZE
, flags
, new_env
);
2958 /* if no CLONE_VM, we consider it is a fork */
2959 if ((flags
& ~(CSIGNAL
| CLONE_NPTL_FLAGS2
)) != 0)
2964 /* Child Process. */
2965 cpu_clone_regs(env
, newsp
);
2967 #if defined(USE_NPTL)
2968 /* There is a race condition here. The parent process could
2969 theoretically read the TID in the child process before the child
2970 tid is set. This would require using either ptrace
2971 (not implemented) or having *_tidptr to point at a shared memory
2972 mapping. We can't repeat the spinlock hack used above because
2973 the child process gets its own copy of the lock. */
2974 if (flags
& CLONE_CHILD_SETTID
)
2975 put_user_u32(gettid(), child_tidptr
);
2976 if (flags
& CLONE_PARENT_SETTID
)
2977 put_user_u32(gettid(), parent_tidptr
);
2978 ts
= (TaskState
*)env
->opaque
;
2979 if (flags
& CLONE_SETTLS
)
2980 cpu_set_tls (env
, newtls
);
2981 /* TODO: Implement CLONE_CHILD_CLEARTID. */
2990 static abi_long
do_fcntl(int fd
, int cmd
, abi_ulong arg
)
2993 struct target_flock
*target_fl
;
2994 struct flock64 fl64
;
2995 struct target_flock64
*target_fl64
;
2999 case TARGET_F_GETLK
:
3000 if (!lock_user_struct(VERIFY_READ
, target_fl
, arg
, 1))
3001 return -TARGET_EFAULT
;
3002 fl
.l_type
= tswap16(target_fl
->l_type
);
3003 fl
.l_whence
= tswap16(target_fl
->l_whence
);
3004 fl
.l_start
= tswapl(target_fl
->l_start
);
3005 fl
.l_len
= tswapl(target_fl
->l_len
);
3006 fl
.l_pid
= tswapl(target_fl
->l_pid
);
3007 unlock_user_struct(target_fl
, arg
, 0);
3008 ret
= get_errno(fcntl(fd
, cmd
, &fl
));
3010 if (!lock_user_struct(VERIFY_WRITE
, target_fl
, arg
, 0))
3011 return -TARGET_EFAULT
;
3012 target_fl
->l_type
= tswap16(fl
.l_type
);
3013 target_fl
->l_whence
= tswap16(fl
.l_whence
);
3014 target_fl
->l_start
= tswapl(fl
.l_start
);
3015 target_fl
->l_len
= tswapl(fl
.l_len
);
3016 target_fl
->l_pid
= tswapl(fl
.l_pid
);
3017 unlock_user_struct(target_fl
, arg
, 1);
3021 case TARGET_F_SETLK
:
3022 case TARGET_F_SETLKW
:
3023 if (!lock_user_struct(VERIFY_READ
, target_fl
, arg
, 1))
3024 return -TARGET_EFAULT
;
3025 fl
.l_type
= tswap16(target_fl
->l_type
);
3026 fl
.l_whence
= tswap16(target_fl
->l_whence
);
3027 fl
.l_start
= tswapl(target_fl
->l_start
);
3028 fl
.l_len
= tswapl(target_fl
->l_len
);
3029 fl
.l_pid
= tswapl(target_fl
->l_pid
);
3030 unlock_user_struct(target_fl
, arg
, 0);
3031 ret
= get_errno(fcntl(fd
, cmd
, &fl
));
3034 case TARGET_F_GETLK64
:
3035 if (!lock_user_struct(VERIFY_READ
, target_fl64
, arg
, 1))
3036 return -TARGET_EFAULT
;
3037 fl64
.l_type
= tswap16(target_fl64
->l_type
) >> 1;
3038 fl64
.l_whence
= tswap16(target_fl64
->l_whence
);
3039 fl64
.l_start
= tswapl(target_fl64
->l_start
);
3040 fl64
.l_len
= tswapl(target_fl64
->l_len
);
3041 fl64
.l_pid
= tswap16(target_fl64
->l_pid
);
3042 unlock_user_struct(target_fl64
, arg
, 0);
3043 ret
= get_errno(fcntl(fd
, cmd
>> 1, &fl64
));
3045 if (!lock_user_struct(VERIFY_WRITE
, target_fl64
, arg
, 0))
3046 return -TARGET_EFAULT
;
3047 target_fl64
->l_type
= tswap16(fl64
.l_type
) >> 1;
3048 target_fl64
->l_whence
= tswap16(fl64
.l_whence
);
3049 target_fl64
->l_start
= tswapl(fl64
.l_start
);
3050 target_fl64
->l_len
= tswapl(fl64
.l_len
);
3051 target_fl64
->l_pid
= tswapl(fl64
.l_pid
);
3052 unlock_user_struct(target_fl64
, arg
, 1);
3055 case TARGET_F_SETLK64
:
3056 case TARGET_F_SETLKW64
:
3057 if (!lock_user_struct(VERIFY_READ
, target_fl64
, arg
, 1))
3058 return -TARGET_EFAULT
;
3059 fl64
.l_type
= tswap16(target_fl64
->l_type
) >> 1;
3060 fl64
.l_whence
= tswap16(target_fl64
->l_whence
);
3061 fl64
.l_start
= tswapl(target_fl64
->l_start
);
3062 fl64
.l_len
= tswapl(target_fl64
->l_len
);
3063 fl64
.l_pid
= tswap16(target_fl64
->l_pid
);
3064 unlock_user_struct(target_fl64
, arg
, 0);
3065 ret
= get_errno(fcntl(fd
, cmd
>> 1, &fl64
));
3069 ret
= get_errno(fcntl(fd
, cmd
, arg
));
3071 ret
= host_to_target_bitmask(ret
, fcntl_flags_tbl
);
3076 ret
= get_errno(fcntl(fd
, cmd
, target_to_host_bitmask(arg
, fcntl_flags_tbl
)));
3080 ret
= get_errno(fcntl(fd
, cmd
, arg
));
3088 static inline int high2lowuid(int uid
)
3096 static inline int high2lowgid(int gid
)
3104 static inline int low2highuid(int uid
)
3106 if ((int16_t)uid
== -1)
3112 static inline int low2highgid(int gid
)
3114 if ((int16_t)gid
== -1)
3120 #endif /* USE_UID16 */
3122 void syscall_init(void)
3125 const argtype
*arg_type
;
3129 #define STRUCT(name, list...) thunk_register_struct(STRUCT_ ## name, #name, struct_ ## name ## _def);
3130 #define STRUCT_SPECIAL(name) thunk_register_struct_direct(STRUCT_ ## name, #name, &struct_ ## name ## _def);
3131 #include "syscall_types.h"
3133 #undef STRUCT_SPECIAL
3135 /* we patch the ioctl size if necessary. We rely on the fact that
3136 no ioctl has all the bits at '1' in the size field */
3138 while (ie
->target_cmd
!= 0) {
3139 if (((ie
->target_cmd
>> TARGET_IOC_SIZESHIFT
) & TARGET_IOC_SIZEMASK
) ==
3140 TARGET_IOC_SIZEMASK
) {
3141 arg_type
= ie
->arg_type
;
3142 if (arg_type
[0] != TYPE_PTR
) {
3143 fprintf(stderr
, "cannot patch size for ioctl 0x%x\n",
3148 size
= thunk_type_size(arg_type
, 0);
3149 ie
->target_cmd
= (ie
->target_cmd
&
3150 ~(TARGET_IOC_SIZEMASK
<< TARGET_IOC_SIZESHIFT
)) |
3151 (size
<< TARGET_IOC_SIZESHIFT
);
3154 /* Build target_to_host_errno_table[] table from
3155 * host_to_target_errno_table[]. */
3156 for (i
=0; i
< ERRNO_TABLE_SIZE
; i
++)
3157 target_to_host_errno_table
[host_to_target_errno_table
[i
]] = i
;
3159 /* automatic consistency check if same arch */
3160 #if (defined(__i386__) && defined(TARGET_I386) && defined(TARGET_ABI32)) || \
3161 (defined(__x86_64__) && defined(TARGET_X86_64))
3162 if (unlikely(ie
->target_cmd
!= ie
->host_cmd
)) {
3163 fprintf(stderr
, "ERROR: ioctl(%s): target=0x%x host=0x%x\n",
3164 ie
->name
, ie
->target_cmd
, ie
->host_cmd
);
3171 #if TARGET_ABI_BITS == 32
3172 static inline uint64_t target_offset64(uint32_t word0
, uint32_t word1
)
3174 #ifdef TARGET_WORDS_BIGENDIAN
3175 return ((uint64_t)word0
<< 32) | word1
;
3177 return ((uint64_t)word1
<< 32) | word0
;
3180 #else /* TARGET_ABI_BITS == 32 */
3181 static inline uint64_t target_offset64(uint64_t word0
, uint64_t word1
)
3185 #endif /* TARGET_ABI_BITS != 32 */
3187 #ifdef TARGET_NR_truncate64
3188 static inline abi_long
target_truncate64(void *cpu_env
, const char *arg1
,
3194 if (((CPUARMState
*)cpu_env
)->eabi
)
3200 return get_errno(truncate64(arg1
, target_offset64(arg2
, arg3
)));
3204 #ifdef TARGET_NR_ftruncate64
3205 static inline abi_long
target_ftruncate64(void *cpu_env
, abi_long arg1
,
3211 if (((CPUARMState
*)cpu_env
)->eabi
)
3217 return get_errno(ftruncate64(arg1
, target_offset64(arg2
, arg3
)));
3221 static inline abi_long
target_to_host_timespec(struct timespec
*host_ts
,
3222 abi_ulong target_addr
)
3224 struct target_timespec
*target_ts
;
3226 if (!lock_user_struct(VERIFY_READ
, target_ts
, target_addr
, 1))
3227 return -TARGET_EFAULT
;
3228 host_ts
->tv_sec
= tswapl(target_ts
->tv_sec
);
3229 host_ts
->tv_nsec
= tswapl(target_ts
->tv_nsec
);
3230 unlock_user_struct(target_ts
, target_addr
, 0);
3234 static inline abi_long
host_to_target_timespec(abi_ulong target_addr
,
3235 struct timespec
*host_ts
)
3237 struct target_timespec
*target_ts
;
3239 if (!lock_user_struct(VERIFY_WRITE
, target_ts
, target_addr
, 0))
3240 return -TARGET_EFAULT
;
3241 target_ts
->tv_sec
= tswapl(host_ts
->tv_sec
);
3242 target_ts
->tv_nsec
= tswapl(host_ts
->tv_nsec
);
3243 unlock_user_struct(target_ts
, target_addr
, 1);
3247 #ifdef TARGET_NR_stat64
3248 static inline abi_long
host_to_target_stat64(void *cpu_env
,
3249 abi_ulong target_addr
,
3250 struct stat
*host_st
)
3253 if (((CPUARMState
*)cpu_env
)->eabi
) {
3254 struct target_eabi_stat64
*target_st
;
3256 if (!lock_user_struct(VERIFY_WRITE
, target_st
, target_addr
, 0))
3257 return -TARGET_EFAULT
;
3258 memset(target_st
, 0, sizeof(struct target_eabi_stat64
));
3259 __put_user(host_st
->st_dev
, &target_st
->st_dev
);
3260 __put_user(host_st
->st_ino
, &target_st
->st_ino
);
3261 #ifdef TARGET_STAT64_HAS_BROKEN_ST_INO
3262 __put_user(host_st
->st_ino
, &target_st
->__st_ino
);
3264 __put_user(host_st
->st_mode
, &target_st
->st_mode
);
3265 __put_user(host_st
->st_nlink
, &target_st
->st_nlink
);
3266 __put_user(host_st
->st_uid
, &target_st
->st_uid
);
3267 __put_user(host_st
->st_gid
, &target_st
->st_gid
);
3268 __put_user(host_st
->st_rdev
, &target_st
->st_rdev
);
3269 __put_user(host_st
->st_size
, &target_st
->st_size
);
3270 __put_user(host_st
->st_blksize
, &target_st
->st_blksize
);
3271 __put_user(host_st
->st_blocks
, &target_st
->st_blocks
);
3272 __put_user(host_st
->st_atime
, &target_st
->target_st_atime
);
3273 __put_user(host_st
->st_mtime
, &target_st
->target_st_mtime
);
3274 __put_user(host_st
->st_ctime
, &target_st
->target_st_ctime
);
3275 unlock_user_struct(target_st
, target_addr
, 1);
3279 struct target_stat64
*target_st
;
3281 if (!lock_user_struct(VERIFY_WRITE
, target_st
, target_addr
, 0))
3282 return -TARGET_EFAULT
;
3283 memset(target_st
, 0, sizeof(struct target_stat64
));
3284 __put_user(host_st
->st_dev
, &target_st
->st_dev
);
3285 __put_user(host_st
->st_ino
, &target_st
->st_ino
);
3286 #ifdef TARGET_STAT64_HAS_BROKEN_ST_INO
3287 __put_user(host_st
->st_ino
, &target_st
->__st_ino
);
3289 __put_user(host_st
->st_mode
, &target_st
->st_mode
);
3290 __put_user(host_st
->st_nlink
, &target_st
->st_nlink
);
3291 __put_user(host_st
->st_uid
, &target_st
->st_uid
);
3292 __put_user(host_st
->st_gid
, &target_st
->st_gid
);
3293 __put_user(host_st
->st_rdev
, &target_st
->st_rdev
);
3294 /* XXX: better use of kernel struct */
3295 __put_user(host_st
->st_size
, &target_st
->st_size
);
3296 __put_user(host_st
->st_blksize
, &target_st
->st_blksize
);
3297 __put_user(host_st
->st_blocks
, &target_st
->st_blocks
);
3298 __put_user(host_st
->st_atime
, &target_st
->target_st_atime
);
3299 __put_user(host_st
->st_mtime
, &target_st
->target_st_mtime
);
3300 __put_user(host_st
->st_ctime
, &target_st
->target_st_ctime
);
3301 unlock_user_struct(target_st
, target_addr
, 1);
3308 #if defined(USE_NPTL)
3309 /* ??? Using host futex calls even when target atomic operations
3310 are not really atomic probably breaks things. However implementing
3311 futexes locally would make futexes shared between multiple processes
3312 tricky. However they're probably useless because guest atomic
3313 operations won't work either. */
3314 static int do_futex(target_ulong uaddr
, int op
, int val
, target_ulong timeout
,
3315 target_ulong uaddr2
, int val3
)
3317 struct timespec ts
, *pts
;
3319 /* ??? We assume FUTEX_* constants are the same on both host
3325 target_to_host_timespec(pts
, timeout
);
3329 return get_errno(sys_futex(g2h(uaddr
), FUTEX_WAIT
, tswap32(val
),
3332 return get_errno(sys_futex(g2h(uaddr
), FUTEX_WAKE
, val
, NULL
, NULL
, 0));
3334 return get_errno(sys_futex(g2h(uaddr
), FUTEX_FD
, val
, NULL
, NULL
, 0));
3336 return get_errno(sys_futex(g2h(uaddr
), FUTEX_REQUEUE
, val
,
3337 NULL
, g2h(uaddr2
), 0));
3338 case FUTEX_CMP_REQUEUE
:
3339 return get_errno(sys_futex(g2h(uaddr
), FUTEX_CMP_REQUEUE
, val
,
3340 NULL
, g2h(uaddr2
), tswap32(val3
)));
3342 return -TARGET_ENOSYS
;
3347 int get_osversion(void)
3349 static int osversion
;
3350 struct new_utsname buf
;
3355 if (qemu_uname_release
&& *qemu_uname_release
) {
3356 s
= qemu_uname_release
;
3358 if (sys_uname(&buf
))
3363 for (i
= 0; i
< 3; i
++) {
3365 while (*s
>= '0' && *s
<= '9') {
3370 tmp
= (tmp
<< 8) + n
;
3378 /* do_syscall() should always have a single exit point at the end so
3379 that actions, such as logging of syscall results, can be performed.
3380 All errnos that do_syscall() returns must be -TARGET_<errcode>. */
3381 abi_long
do_syscall(void *cpu_env
, int num
, abi_long arg1
,
3382 abi_long arg2
, abi_long arg3
, abi_long arg4
,
3383 abi_long arg5
, abi_long arg6
)
3391 gemu_log("syscall %d", num
);
3394 print_syscall(num
, arg1
, arg2
, arg3
, arg4
, arg5
, arg6
);
3397 case TARGET_NR_exit
:
3401 gdb_exit(cpu_env
, arg1
);
3402 /* XXX: should free thread stack and CPU env */
3404 ret
= 0; /* avoid warning */
3406 case TARGET_NR_read
:
3407 if (!(p
= lock_user(VERIFY_WRITE
, arg2
, arg3
, 0)))
3409 ret
= get_errno(read(arg1
, p
, arg3
));
3410 unlock_user(p
, arg2
, ret
);
3412 case TARGET_NR_write
:
3413 if (!(p
= lock_user(VERIFY_READ
, arg2
, arg3
, 1)))
3415 ret
= get_errno(write(arg1
, p
, arg3
));
3416 unlock_user(p
, arg2
, 0);
3418 case TARGET_NR_open
:
3419 if (!(p
= lock_user_string(arg1
)))
3421 ret
= get_errno(open(path(p
),
3422 target_to_host_bitmask(arg2
, fcntl_flags_tbl
),
3424 unlock_user(p
, arg1
, 0);
3426 #if defined(TARGET_NR_openat) && defined(__NR_openat)
3427 case TARGET_NR_openat
:
3428 if (!(p
= lock_user_string(arg2
)))
3430 ret
= get_errno(sys_openat(arg1
,
3432 target_to_host_bitmask(arg3
, fcntl_flags_tbl
),
3434 unlock_user(p
, arg2
, 0);
3437 case TARGET_NR_close
:
3438 ret
= get_errno(close(arg1
));
3443 case TARGET_NR_fork
:
3444 ret
= get_errno(do_fork(cpu_env
, SIGCHLD
, 0, 0, 0, 0));
3446 #ifdef TARGET_NR_waitpid
3447 case TARGET_NR_waitpid
:
3450 ret
= get_errno(waitpid(arg1
, &status
, arg3
));
3451 if (!is_error(ret
) && arg2
3452 && put_user_s32(status
, arg2
))
3457 #ifdef TARGET_NR_waitid
3458 case TARGET_NR_waitid
:
3462 ret
= get_errno(waitid(arg1
, arg2
, &info
, arg4
));
3463 if (!is_error(ret
) && arg3
&& info
.si_pid
!= 0) {
3464 if (!(p
= lock_user(VERIFY_WRITE
, arg3
, sizeof(target_siginfo_t
), 0)))
3466 host_to_target_siginfo(p
, &info
);
3467 unlock_user(p
, arg3
, sizeof(target_siginfo_t
));
3472 #ifdef TARGET_NR_creat /* not on alpha */
3473 case TARGET_NR_creat
:
3474 if (!(p
= lock_user_string(arg1
)))
3476 ret
= get_errno(creat(p
, arg2
));
3477 unlock_user(p
, arg1
, 0);
3480 case TARGET_NR_link
:
3483 p
= lock_user_string(arg1
);
3484 p2
= lock_user_string(arg2
);
3486 ret
= -TARGET_EFAULT
;
3488 ret
= get_errno(link(p
, p2
));
3489 unlock_user(p2
, arg2
, 0);
3490 unlock_user(p
, arg1
, 0);
3493 #if defined(TARGET_NR_linkat) && defined(__NR_linkat)
3494 case TARGET_NR_linkat
:
3499 p
= lock_user_string(arg2
);
3500 p2
= lock_user_string(arg4
);
3502 ret
= -TARGET_EFAULT
;
3504 ret
= get_errno(sys_linkat(arg1
, p
, arg3
, p2
, arg5
));
3505 unlock_user(p
, arg2
, 0);
3506 unlock_user(p2
, arg4
, 0);
3510 case TARGET_NR_unlink
:
3511 if (!(p
= lock_user_string(arg1
)))
3513 ret
= get_errno(unlink(p
));
3514 unlock_user(p
, arg1
, 0);
3516 #if defined(TARGET_NR_unlinkat) && defined(__NR_unlinkat)
3517 case TARGET_NR_unlinkat
:
3518 if (!(p
= lock_user_string(arg2
)))
3520 ret
= get_errno(sys_unlinkat(arg1
, p
, arg3
));
3521 unlock_user(p
, arg2
, 0);
3524 case TARGET_NR_execve
:
3526 char **argp
, **envp
;
3529 abi_ulong guest_argp
;
3530 abi_ulong guest_envp
;
3536 for (gp
= guest_argp
; gp
; gp
+= sizeof(abi_ulong
)) {
3537 if (get_user_ual(addr
, gp
))
3545 for (gp
= guest_envp
; gp
; gp
+= sizeof(abi_ulong
)) {
3546 if (get_user_ual(addr
, gp
))
3553 argp
= alloca((argc
+ 1) * sizeof(void *));
3554 envp
= alloca((envc
+ 1) * sizeof(void *));
3556 for (gp
= guest_argp
, q
= argp
; gp
;
3557 gp
+= sizeof(abi_ulong
), q
++) {
3558 if (get_user_ual(addr
, gp
))
3562 if (!(*q
= lock_user_string(addr
)))
3567 for (gp
= guest_envp
, q
= envp
; gp
;
3568 gp
+= sizeof(abi_ulong
), q
++) {
3569 if (get_user_ual(addr
, gp
))
3573 if (!(*q
= lock_user_string(addr
)))
3578 if (!(p
= lock_user_string(arg1
)))
3580 ret
= get_errno(execve(p
, argp
, envp
));
3581 unlock_user(p
, arg1
, 0);
3586 ret
= -TARGET_EFAULT
;
3589 for (gp
= guest_argp
, q
= argp
; *q
;
3590 gp
+= sizeof(abi_ulong
), q
++) {
3591 if (get_user_ual(addr
, gp
)
3594 unlock_user(*q
, addr
, 0);
3596 for (gp
= guest_envp
, q
= envp
; *q
;
3597 gp
+= sizeof(abi_ulong
), q
++) {
3598 if (get_user_ual(addr
, gp
)
3601 unlock_user(*q
, addr
, 0);
3605 case TARGET_NR_chdir
:
3606 if (!(p
= lock_user_string(arg1
)))
3608 ret
= get_errno(chdir(p
));
3609 unlock_user(p
, arg1
, 0);
3611 #ifdef TARGET_NR_time
3612 case TARGET_NR_time
:
3615 ret
= get_errno(time(&host_time
));
3618 && put_user_sal(host_time
, arg1
))
3623 case TARGET_NR_mknod
:
3624 if (!(p
= lock_user_string(arg1
)))
3626 ret
= get_errno(mknod(p
, arg2
, arg3
));
3627 unlock_user(p
, arg1
, 0);
3629 #if defined(TARGET_NR_mknodat) && defined(__NR_mknodat)
3630 case TARGET_NR_mknodat
:
3631 if (!(p
= lock_user_string(arg2
)))
3633 ret
= get_errno(sys_mknodat(arg1
, p
, arg3
, arg4
));
3634 unlock_user(p
, arg2
, 0);
3637 case TARGET_NR_chmod
:
3638 if (!(p
= lock_user_string(arg1
)))
3640 ret
= get_errno(chmod(p
, arg2
));
3641 unlock_user(p
, arg1
, 0);
3643 #ifdef TARGET_NR_break
3644 case TARGET_NR_break
:
3647 #ifdef TARGET_NR_oldstat
3648 case TARGET_NR_oldstat
:
3651 case TARGET_NR_lseek
:
3652 ret
= get_errno(lseek(arg1
, arg2
, arg3
));
3654 #ifdef TARGET_NR_getxpid
3655 case TARGET_NR_getxpid
:
3657 case TARGET_NR_getpid
:
3659 ret
= get_errno(getpid());
3661 case TARGET_NR_mount
:
3663 /* need to look at the data field */
3665 p
= lock_user_string(arg1
);
3666 p2
= lock_user_string(arg2
);
3667 p3
= lock_user_string(arg3
);
3668 if (!p
|| !p2
|| !p3
)
3669 ret
= -TARGET_EFAULT
;
3671 /* FIXME - arg5 should be locked, but it isn't clear how to
3672 * do that since it's not guaranteed to be a NULL-terminated
3675 ret
= get_errno(mount(p
, p2
, p3
, (unsigned long)arg4
, g2h(arg5
)));
3676 unlock_user(p
, arg1
, 0);
3677 unlock_user(p2
, arg2
, 0);
3678 unlock_user(p3
, arg3
, 0);
3681 #ifdef TARGET_NR_umount
3682 case TARGET_NR_umount
:
3683 if (!(p
= lock_user_string(arg1
)))
3685 ret
= get_errno(umount(p
));
3686 unlock_user(p
, arg1
, 0);
3689 #ifdef TARGET_NR_stime /* not on alpha */
3690 case TARGET_NR_stime
:
3693 if (get_user_sal(host_time
, arg1
))
3695 ret
= get_errno(stime(&host_time
));
3699 case TARGET_NR_ptrace
:
3701 #ifdef TARGET_NR_alarm /* not on alpha */
3702 case TARGET_NR_alarm
:
3706 #ifdef TARGET_NR_oldfstat
3707 case TARGET_NR_oldfstat
:
3710 #ifdef TARGET_NR_pause /* not on alpha */
3711 case TARGET_NR_pause
:
3712 ret
= get_errno(pause());
3715 #ifdef TARGET_NR_utime
3716 case TARGET_NR_utime
:
3718 struct utimbuf tbuf
, *host_tbuf
;
3719 struct target_utimbuf
*target_tbuf
;
3721 if (!lock_user_struct(VERIFY_READ
, target_tbuf
, arg2
, 1))
3723 tbuf
.actime
= tswapl(target_tbuf
->actime
);
3724 tbuf
.modtime
= tswapl(target_tbuf
->modtime
);
3725 unlock_user_struct(target_tbuf
, arg2
, 0);
3730 if (!(p
= lock_user_string(arg1
)))
3732 ret
= get_errno(utime(p
, host_tbuf
));
3733 unlock_user(p
, arg1
, 0);
3737 case TARGET_NR_utimes
:
3739 struct timeval
*tvp
, tv
[2];
3741 if (copy_from_user_timeval(&tv
[0], arg2
)
3742 || copy_from_user_timeval(&tv
[1],
3743 arg2
+ sizeof(struct target_timeval
)))
3749 if (!(p
= lock_user_string(arg1
)))
3751 ret
= get_errno(utimes(p
, tvp
));
3752 unlock_user(p
, arg1
, 0);
3755 #if defined(TARGET_NR_futimesat) && defined(__NR_futimesat)
3756 case TARGET_NR_futimesat
:
3758 struct timeval
*tvp
, tv
[2];
3760 if (copy_from_user_timeval(&tv
[0], arg3
)
3761 || copy_from_user_timeval(&tv
[1],
3762 arg3
+ sizeof(struct target_timeval
)))
3768 if (!(p
= lock_user_string(arg2
)))
3770 ret
= get_errno(sys_futimesat(arg1
, path(p
), tvp
));
3771 unlock_user(p
, arg2
, 0);
3775 #ifdef TARGET_NR_stty
3776 case TARGET_NR_stty
:
3779 #ifdef TARGET_NR_gtty
3780 case TARGET_NR_gtty
:
3783 case TARGET_NR_access
:
3784 if (!(p
= lock_user_string(arg1
)))
3786 ret
= get_errno(access(p
, arg2
));
3787 unlock_user(p
, arg1
, 0);
3789 #if defined(TARGET_NR_faccessat) && defined(__NR_faccessat)
3790 case TARGET_NR_faccessat
:
3791 if (!(p
= lock_user_string(arg2
)))
3793 ret
= get_errno(sys_faccessat(arg1
, p
, arg3
, arg4
));
3794 unlock_user(p
, arg2
, 0);
3797 #ifdef TARGET_NR_nice /* not on alpha */
3798 case TARGET_NR_nice
:
3799 ret
= get_errno(nice(arg1
));
3802 #ifdef TARGET_NR_ftime
3803 case TARGET_NR_ftime
:
3806 case TARGET_NR_sync
:
3810 case TARGET_NR_kill
:
3811 ret
= get_errno(kill(arg1
, target_to_host_signal(arg2
)));
3813 case TARGET_NR_rename
:
3816 p
= lock_user_string(arg1
);
3817 p2
= lock_user_string(arg2
);
3819 ret
= -TARGET_EFAULT
;
3821 ret
= get_errno(rename(p
, p2
));
3822 unlock_user(p2
, arg2
, 0);
3823 unlock_user(p
, arg1
, 0);
3826 #if defined(TARGET_NR_renameat) && defined(__NR_renameat)
3827 case TARGET_NR_renameat
:
3830 p
= lock_user_string(arg2
);
3831 p2
= lock_user_string(arg4
);
3833 ret
= -TARGET_EFAULT
;
3835 ret
= get_errno(sys_renameat(arg1
, p
, arg3
, p2
));
3836 unlock_user(p2
, arg4
, 0);
3837 unlock_user(p
, arg2
, 0);
3841 case TARGET_NR_mkdir
:
3842 if (!(p
= lock_user_string(arg1
)))
3844 ret
= get_errno(mkdir(p
, arg2
));
3845 unlock_user(p
, arg1
, 0);
3847 #if defined(TARGET_NR_mkdirat) && defined(__NR_mkdirat)
3848 case TARGET_NR_mkdirat
:
3849 if (!(p
= lock_user_string(arg2
)))
3851 ret
= get_errno(sys_mkdirat(arg1
, p
, arg3
));
3852 unlock_user(p
, arg2
, 0);
3855 case TARGET_NR_rmdir
:
3856 if (!(p
= lock_user_string(arg1
)))
3858 ret
= get_errno(rmdir(p
));
3859 unlock_user(p
, arg1
, 0);
3862 ret
= get_errno(dup(arg1
));
3864 case TARGET_NR_pipe
:
3867 ret
= get_errno(pipe(host_pipe
));
3868 if (!is_error(ret
)) {
3869 #if defined(TARGET_MIPS)
3870 CPUMIPSState
*env
= (CPUMIPSState
*)cpu_env
;
3871 env
->active_tc
.gpr
[3] = host_pipe
[1];
3873 #elif defined(TARGET_SH4)
3874 ((CPUSH4State
*)cpu_env
)->gregs
[1] = host_pipe
[1];
3877 if (put_user_s32(host_pipe
[0], arg1
)
3878 || put_user_s32(host_pipe
[1], arg1
+ sizeof(host_pipe
[0])))
3884 case TARGET_NR_times
:
3886 struct target_tms
*tmsp
;
3888 ret
= get_errno(times(&tms
));
3890 tmsp
= lock_user(VERIFY_WRITE
, arg1
, sizeof(struct target_tms
), 0);
3893 tmsp
->tms_utime
= tswapl(host_to_target_clock_t(tms
.tms_utime
));
3894 tmsp
->tms_stime
= tswapl(host_to_target_clock_t(tms
.tms_stime
));
3895 tmsp
->tms_cutime
= tswapl(host_to_target_clock_t(tms
.tms_cutime
));
3896 tmsp
->tms_cstime
= tswapl(host_to_target_clock_t(tms
.tms_cstime
));
3899 ret
= host_to_target_clock_t(ret
);
3902 #ifdef TARGET_NR_prof
3903 case TARGET_NR_prof
:
3906 #ifdef TARGET_NR_signal
3907 case TARGET_NR_signal
:
3910 case TARGET_NR_acct
:
3911 if (!(p
= lock_user_string(arg1
)))
3913 ret
= get_errno(acct(path(p
)));
3914 unlock_user(p
, arg1
, 0);
3916 #ifdef TARGET_NR_umount2 /* not on alpha */
3917 case TARGET_NR_umount2
:
3918 if (!(p
= lock_user_string(arg1
)))
3920 ret
= get_errno(umount2(p
, arg2
));
3921 unlock_user(p
, arg1
, 0);
3924 #ifdef TARGET_NR_lock
3925 case TARGET_NR_lock
:
3928 case TARGET_NR_ioctl
:
3929 ret
= do_ioctl(arg1
, arg2
, arg3
);
3931 case TARGET_NR_fcntl
:
3932 ret
= do_fcntl(arg1
, arg2
, arg3
);
3934 #ifdef TARGET_NR_mpx
3938 case TARGET_NR_setpgid
:
3939 ret
= get_errno(setpgid(arg1
, arg2
));
3941 #ifdef TARGET_NR_ulimit
3942 case TARGET_NR_ulimit
:
3945 #ifdef TARGET_NR_oldolduname
3946 case TARGET_NR_oldolduname
:
3949 case TARGET_NR_umask
:
3950 ret
= get_errno(umask(arg1
));
3952 case TARGET_NR_chroot
:
3953 if (!(p
= lock_user_string(arg1
)))
3955 ret
= get_errno(chroot(p
));
3956 unlock_user(p
, arg1
, 0);
3958 case TARGET_NR_ustat
:
3960 case TARGET_NR_dup2
:
3961 ret
= get_errno(dup2(arg1
, arg2
));
3963 #ifdef TARGET_NR_getppid /* not on alpha */
3964 case TARGET_NR_getppid
:
3965 ret
= get_errno(getppid());
3968 case TARGET_NR_getpgrp
:
3969 ret
= get_errno(getpgrp());
3971 case TARGET_NR_setsid
:
3972 ret
= get_errno(setsid());
3974 #ifdef TARGET_NR_sigaction
3975 case TARGET_NR_sigaction
:
3977 #if !defined(TARGET_MIPS)
3978 struct target_old_sigaction
*old_act
;
3979 struct target_sigaction act
, oact
, *pact
;
3981 if (!lock_user_struct(VERIFY_READ
, old_act
, arg2
, 1))
3983 act
._sa_handler
= old_act
->_sa_handler
;
3984 target_siginitset(&act
.sa_mask
, old_act
->sa_mask
);
3985 act
.sa_flags
= old_act
->sa_flags
;
3986 act
.sa_restorer
= old_act
->sa_restorer
;
3987 unlock_user_struct(old_act
, arg2
, 0);
3992 ret
= get_errno(do_sigaction(arg1
, pact
, &oact
));
3993 if (!is_error(ret
) && arg3
) {
3994 if (!lock_user_struct(VERIFY_WRITE
, old_act
, arg3
, 0))
3996 old_act
->_sa_handler
= oact
._sa_handler
;
3997 old_act
->sa_mask
= oact
.sa_mask
.sig
[0];
3998 old_act
->sa_flags
= oact
.sa_flags
;
3999 old_act
->sa_restorer
= oact
.sa_restorer
;
4000 unlock_user_struct(old_act
, arg3
, 1);
4003 struct target_sigaction act
, oact
, *pact
, *old_act
;
4006 if (!lock_user_struct(VERIFY_READ
, old_act
, arg2
, 1))
4008 act
._sa_handler
= old_act
->_sa_handler
;
4009 target_siginitset(&act
.sa_mask
, old_act
->sa_mask
.sig
[0]);
4010 act
.sa_flags
= old_act
->sa_flags
;
4011 unlock_user_struct(old_act
, arg2
, 0);
4017 ret
= get_errno(do_sigaction(arg1
, pact
, &oact
));
4019 if (!is_error(ret
) && arg3
) {
4020 if (!lock_user_struct(VERIFY_WRITE
, old_act
, arg3
, 0))
4022 old_act
->_sa_handler
= oact
._sa_handler
;
4023 old_act
->sa_flags
= oact
.sa_flags
;
4024 old_act
->sa_mask
.sig
[0] = oact
.sa_mask
.sig
[0];
4025 old_act
->sa_mask
.sig
[1] = 0;
4026 old_act
->sa_mask
.sig
[2] = 0;
4027 old_act
->sa_mask
.sig
[3] = 0;
4028 unlock_user_struct(old_act
, arg3
, 1);
4034 case TARGET_NR_rt_sigaction
:
4036 struct target_sigaction
*act
;
4037 struct target_sigaction
*oact
;
4040 if (!lock_user_struct(VERIFY_READ
, act
, arg2
, 1))
4045 if (!lock_user_struct(VERIFY_WRITE
, oact
, arg3
, 0)) {
4046 ret
= -TARGET_EFAULT
;
4047 goto rt_sigaction_fail
;
4051 ret
= get_errno(do_sigaction(arg1
, act
, oact
));
4054 unlock_user_struct(act
, arg2
, 0);
4056 unlock_user_struct(oact
, arg3
, 1);
4059 #ifdef TARGET_NR_sgetmask /* not on alpha */
4060 case TARGET_NR_sgetmask
:
4063 abi_ulong target_set
;
4064 sigprocmask(0, NULL
, &cur_set
);
4065 host_to_target_old_sigset(&target_set
, &cur_set
);
4070 #ifdef TARGET_NR_ssetmask /* not on alpha */
4071 case TARGET_NR_ssetmask
:
4073 sigset_t set
, oset
, cur_set
;
4074 abi_ulong target_set
= arg1
;
4075 sigprocmask(0, NULL
, &cur_set
);
4076 target_to_host_old_sigset(&set
, &target_set
);
4077 sigorset(&set
, &set
, &cur_set
);
4078 sigprocmask(SIG_SETMASK
, &set
, &oset
);
4079 host_to_target_old_sigset(&target_set
, &oset
);
4084 #ifdef TARGET_NR_sigprocmask
4085 case TARGET_NR_sigprocmask
:
4088 sigset_t set
, oldset
, *set_ptr
;
4092 case TARGET_SIG_BLOCK
:
4095 case TARGET_SIG_UNBLOCK
:
4098 case TARGET_SIG_SETMASK
:
4102 ret
= -TARGET_EINVAL
;
4105 if (!(p
= lock_user(VERIFY_READ
, arg2
, sizeof(target_sigset_t
), 1)))
4107 target_to_host_old_sigset(&set
, p
);
4108 unlock_user(p
, arg2
, 0);
4114 ret
= get_errno(sigprocmask(arg1
, set_ptr
, &oldset
));
4115 if (!is_error(ret
) && arg3
) {
4116 if (!(p
= lock_user(VERIFY_WRITE
, arg3
, sizeof(target_sigset_t
), 0)))
4118 host_to_target_old_sigset(p
, &oldset
);
4119 unlock_user(p
, arg3
, sizeof(target_sigset_t
));
4124 case TARGET_NR_rt_sigprocmask
:
4127 sigset_t set
, oldset
, *set_ptr
;
4131 case TARGET_SIG_BLOCK
:
4134 case TARGET_SIG_UNBLOCK
:
4137 case TARGET_SIG_SETMASK
:
4141 ret
= -TARGET_EINVAL
;
4144 if (!(p
= lock_user(VERIFY_READ
, arg2
, sizeof(target_sigset_t
), 1)))
4146 target_to_host_sigset(&set
, p
);
4147 unlock_user(p
, arg2
, 0);
4153 ret
= get_errno(sigprocmask(how
, set_ptr
, &oldset
));
4154 if (!is_error(ret
) && arg3
) {
4155 if (!(p
= lock_user(VERIFY_WRITE
, arg3
, sizeof(target_sigset_t
), 0)))
4157 host_to_target_sigset(p
, &oldset
);
4158 unlock_user(p
, arg3
, sizeof(target_sigset_t
));
4162 #ifdef TARGET_NR_sigpending
4163 case TARGET_NR_sigpending
:
4166 ret
= get_errno(sigpending(&set
));
4167 if (!is_error(ret
)) {
4168 if (!(p
= lock_user(VERIFY_WRITE
, arg1
, sizeof(target_sigset_t
), 0)))
4170 host_to_target_old_sigset(p
, &set
);
4171 unlock_user(p
, arg1
, sizeof(target_sigset_t
));
4176 case TARGET_NR_rt_sigpending
:
4179 ret
= get_errno(sigpending(&set
));
4180 if (!is_error(ret
)) {
4181 if (!(p
= lock_user(VERIFY_WRITE
, arg1
, sizeof(target_sigset_t
), 0)))
4183 host_to_target_sigset(p
, &set
);
4184 unlock_user(p
, arg1
, sizeof(target_sigset_t
));
4188 #ifdef TARGET_NR_sigsuspend
4189 case TARGET_NR_sigsuspend
:
4192 if (!(p
= lock_user(VERIFY_READ
, arg1
, sizeof(target_sigset_t
), 1)))
4194 target_to_host_old_sigset(&set
, p
);
4195 unlock_user(p
, arg1
, 0);
4196 ret
= get_errno(sigsuspend(&set
));
4200 case TARGET_NR_rt_sigsuspend
:
4203 if (!(p
= lock_user(VERIFY_READ
, arg1
, sizeof(target_sigset_t
), 1)))
4205 target_to_host_sigset(&set
, p
);
4206 unlock_user(p
, arg1
, 0);
4207 ret
= get_errno(sigsuspend(&set
));
4210 case TARGET_NR_rt_sigtimedwait
:
4213 struct timespec uts
, *puts
;
4216 if (!(p
= lock_user(VERIFY_READ
, arg1
, sizeof(target_sigset_t
), 1)))
4218 target_to_host_sigset(&set
, p
);
4219 unlock_user(p
, arg1
, 0);
4222 target_to_host_timespec(puts
, arg3
);
4226 ret
= get_errno(sigtimedwait(&set
, &uinfo
, puts
));
4227 if (!is_error(ret
) && arg2
) {
4228 if (!(p
= lock_user(VERIFY_WRITE
, arg2
, sizeof(target_siginfo_t
), 0)))
4230 host_to_target_siginfo(p
, &uinfo
);
4231 unlock_user(p
, arg2
, sizeof(target_siginfo_t
));
4235 case TARGET_NR_rt_sigqueueinfo
:
4238 if (!(p
= lock_user(VERIFY_READ
, arg3
, sizeof(target_sigset_t
), 1)))
4240 target_to_host_siginfo(&uinfo
, p
);
4241 unlock_user(p
, arg1
, 0);
4242 ret
= get_errno(sys_rt_sigqueueinfo(arg1
, arg2
, &uinfo
));
4245 #ifdef TARGET_NR_sigreturn
4246 case TARGET_NR_sigreturn
:
4247 /* NOTE: ret is eax, so not transcoding must be done */
4248 ret
= do_sigreturn(cpu_env
);
4251 case TARGET_NR_rt_sigreturn
:
4252 /* NOTE: ret is eax, so not transcoding must be done */
4253 ret
= do_rt_sigreturn(cpu_env
);
4255 case TARGET_NR_sethostname
:
4256 if (!(p
= lock_user_string(arg1
)))
4258 ret
= get_errno(sethostname(p
, arg2
));
4259 unlock_user(p
, arg1
, 0);
4261 case TARGET_NR_setrlimit
:
4263 /* XXX: convert resource ? */
4264 int resource
= arg1
;
4265 struct target_rlimit
*target_rlim
;
4267 if (!lock_user_struct(VERIFY_READ
, target_rlim
, arg2
, 1))
4269 rlim
.rlim_cur
= tswapl(target_rlim
->rlim_cur
);
4270 rlim
.rlim_max
= tswapl(target_rlim
->rlim_max
);
4271 unlock_user_struct(target_rlim
, arg2
, 0);
4272 ret
= get_errno(setrlimit(resource
, &rlim
));
4275 case TARGET_NR_getrlimit
:
4277 /* XXX: convert resource ? */
4278 int resource
= arg1
;
4279 struct target_rlimit
*target_rlim
;
4282 ret
= get_errno(getrlimit(resource
, &rlim
));
4283 if (!is_error(ret
)) {
4284 if (!lock_user_struct(VERIFY_WRITE
, target_rlim
, arg2
, 0))
4286 rlim
.rlim_cur
= tswapl(target_rlim
->rlim_cur
);
4287 rlim
.rlim_max
= tswapl(target_rlim
->rlim_max
);
4288 unlock_user_struct(target_rlim
, arg2
, 1);
4292 case TARGET_NR_getrusage
:
4294 struct rusage rusage
;
4295 ret
= get_errno(getrusage(arg1
, &rusage
));
4296 if (!is_error(ret
)) {
4297 host_to_target_rusage(arg2
, &rusage
);
4301 case TARGET_NR_gettimeofday
:
4304 ret
= get_errno(gettimeofday(&tv
, NULL
));
4305 if (!is_error(ret
)) {
4306 if (copy_to_user_timeval(arg1
, &tv
))
4311 case TARGET_NR_settimeofday
:
4314 if (copy_from_user_timeval(&tv
, arg1
))
4316 ret
= get_errno(settimeofday(&tv
, NULL
));
4319 #ifdef TARGET_NR_select
4320 case TARGET_NR_select
:
4322 struct target_sel_arg_struct
*sel
;
4323 abi_ulong inp
, outp
, exp
, tvp
;
4326 if (!lock_user_struct(VERIFY_READ
, sel
, arg1
, 1))
4328 nsel
= tswapl(sel
->n
);
4329 inp
= tswapl(sel
->inp
);
4330 outp
= tswapl(sel
->outp
);
4331 exp
= tswapl(sel
->exp
);
4332 tvp
= tswapl(sel
->tvp
);
4333 unlock_user_struct(sel
, arg1
, 0);
4334 ret
= do_select(nsel
, inp
, outp
, exp
, tvp
);
4338 case TARGET_NR_symlink
:
4341 p
= lock_user_string(arg1
);
4342 p2
= lock_user_string(arg2
);
4344 ret
= -TARGET_EFAULT
;
4346 ret
= get_errno(symlink(p
, p2
));
4347 unlock_user(p2
, arg2
, 0);
4348 unlock_user(p
, arg1
, 0);
4351 #if defined(TARGET_NR_symlinkat) && defined(__NR_symlinkat)
4352 case TARGET_NR_symlinkat
:
4355 p
= lock_user_string(arg1
);
4356 p2
= lock_user_string(arg3
);
4358 ret
= -TARGET_EFAULT
;
4360 ret
= get_errno(sys_symlinkat(p
, arg2
, p2
));
4361 unlock_user(p2
, arg3
, 0);
4362 unlock_user(p
, arg1
, 0);
4366 #ifdef TARGET_NR_oldlstat
4367 case TARGET_NR_oldlstat
:
4370 case TARGET_NR_readlink
:
4373 p
= lock_user_string(arg1
);
4374 p2
= lock_user(VERIFY_WRITE
, arg2
, arg3
, 0);
4376 ret
= -TARGET_EFAULT
;
4378 ret
= get_errno(readlink(path(p
), p2
, arg3
));
4379 unlock_user(p2
, arg2
, ret
);
4380 unlock_user(p
, arg1
, 0);
4383 #if defined(TARGET_NR_readlinkat) && defined(__NR_readlinkat)
4384 case TARGET_NR_readlinkat
:
4387 p
= lock_user_string(arg2
);
4388 p2
= lock_user(VERIFY_WRITE
, arg3
, arg4
, 0);
4390 ret
= -TARGET_EFAULT
;
4392 ret
= get_errno(sys_readlinkat(arg1
, path(p
), p2
, arg4
));
4393 unlock_user(p2
, arg3
, ret
);
4394 unlock_user(p
, arg2
, 0);
4398 #ifdef TARGET_NR_uselib
4399 case TARGET_NR_uselib
:
4402 #ifdef TARGET_NR_swapon
4403 case TARGET_NR_swapon
:
4404 if (!(p
= lock_user_string(arg1
)))
4406 ret
= get_errno(swapon(p
, arg2
));
4407 unlock_user(p
, arg1
, 0);
4410 case TARGET_NR_reboot
:
4412 #ifdef TARGET_NR_readdir
4413 case TARGET_NR_readdir
:
4416 #ifdef TARGET_NR_mmap
4417 case TARGET_NR_mmap
:
4418 #if (defined(TARGET_I386) && defined(TARGET_ABI32)) || defined(TARGET_ARM) || defined(TARGET_M68K) || defined(TARGET_CRIS)
4421 abi_ulong v1
, v2
, v3
, v4
, v5
, v6
;
4422 if (!(v
= lock_user(VERIFY_READ
, arg1
, 6 * sizeof(abi_ulong
), 1)))
4430 unlock_user(v
, arg1
, 0);
4431 ret
= get_errno(target_mmap(v1
, v2
, v3
,
4432 target_to_host_bitmask(v4
, mmap_flags_tbl
),
4436 ret
= get_errno(target_mmap(arg1
, arg2
, arg3
,
4437 target_to_host_bitmask(arg4
, mmap_flags_tbl
),
4443 #ifdef TARGET_NR_mmap2
4444 case TARGET_NR_mmap2
:
4446 #define MMAP_SHIFT 12
4448 ret
= get_errno(target_mmap(arg1
, arg2
, arg3
,
4449 target_to_host_bitmask(arg4
, mmap_flags_tbl
),
4451 arg6
<< MMAP_SHIFT
));
4454 case TARGET_NR_munmap
:
4455 ret
= get_errno(target_munmap(arg1
, arg2
));
4457 case TARGET_NR_mprotect
:
4458 ret
= get_errno(target_mprotect(arg1
, arg2
, arg3
));
4460 #ifdef TARGET_NR_mremap
4461 case TARGET_NR_mremap
:
4462 ret
= get_errno(target_mremap(arg1
, arg2
, arg3
, arg4
, arg5
));
4465 /* ??? msync/mlock/munlock are broken for softmmu. */
4466 #ifdef TARGET_NR_msync
4467 case TARGET_NR_msync
:
4468 ret
= get_errno(msync(g2h(arg1
), arg2
, arg3
));
4471 #ifdef TARGET_NR_mlock
4472 case TARGET_NR_mlock
:
4473 ret
= get_errno(mlock(g2h(arg1
), arg2
));
4476 #ifdef TARGET_NR_munlock
4477 case TARGET_NR_munlock
:
4478 ret
= get_errno(munlock(g2h(arg1
), arg2
));
4481 #ifdef TARGET_NR_mlockall
4482 case TARGET_NR_mlockall
:
4483 ret
= get_errno(mlockall(arg1
));
4486 #ifdef TARGET_NR_munlockall
4487 case TARGET_NR_munlockall
:
4488 ret
= get_errno(munlockall());
4491 case TARGET_NR_truncate
:
4492 if (!(p
= lock_user_string(arg1
)))
4494 ret
= get_errno(truncate(p
, arg2
));
4495 unlock_user(p
, arg1
, 0);
4497 case TARGET_NR_ftruncate
:
4498 ret
= get_errno(ftruncate(arg1
, arg2
));
4500 case TARGET_NR_fchmod
:
4501 ret
= get_errno(fchmod(arg1
, arg2
));
4503 #if defined(TARGET_NR_fchmodat) && defined(__NR_fchmodat)
4504 case TARGET_NR_fchmodat
:
4505 if (!(p
= lock_user_string(arg2
)))
4507 ret
= get_errno(sys_fchmodat(arg1
, p
, arg3
, arg4
));
4508 unlock_user(p
, arg2
, 0);
4511 case TARGET_NR_getpriority
:
4512 /* libc does special remapping of the return value of
4513 * sys_getpriority() so it's just easiest to call
4514 * sys_getpriority() directly rather than through libc. */
4515 ret
= sys_getpriority(arg1
, arg2
);
4517 case TARGET_NR_setpriority
:
4518 ret
= get_errno(setpriority(arg1
, arg2
, arg3
));
4520 #ifdef TARGET_NR_profil
4521 case TARGET_NR_profil
:
4524 case TARGET_NR_statfs
:
4525 if (!(p
= lock_user_string(arg1
)))
4527 ret
= get_errno(statfs(path(p
), &stfs
));
4528 unlock_user(p
, arg1
, 0);
4530 if (!is_error(ret
)) {
4531 struct target_statfs
*target_stfs
;
4533 if (!lock_user_struct(VERIFY_WRITE
, target_stfs
, arg2
, 0))
4535 __put_user(stfs
.f_type
, &target_stfs
->f_type
);
4536 __put_user(stfs
.f_bsize
, &target_stfs
->f_bsize
);
4537 __put_user(stfs
.f_blocks
, &target_stfs
->f_blocks
);
4538 __put_user(stfs
.f_bfree
, &target_stfs
->f_bfree
);
4539 __put_user(stfs
.f_bavail
, &target_stfs
->f_bavail
);
4540 __put_user(stfs
.f_files
, &target_stfs
->f_files
);
4541 __put_user(stfs
.f_ffree
, &target_stfs
->f_ffree
);
4542 __put_user(stfs
.f_fsid
.__val
[0], &target_stfs
->f_fsid
.val
[0]);
4543 __put_user(stfs
.f_fsid
.__val
[1], &target_stfs
->f_fsid
.val
[1]);
4544 __put_user(stfs
.f_namelen
, &target_stfs
->f_namelen
);
4545 unlock_user_struct(target_stfs
, arg2
, 1);
4548 case TARGET_NR_fstatfs
:
4549 ret
= get_errno(fstatfs(arg1
, &stfs
));
4550 goto convert_statfs
;
4551 #ifdef TARGET_NR_statfs64
4552 case TARGET_NR_statfs64
:
4553 if (!(p
= lock_user_string(arg1
)))
4555 ret
= get_errno(statfs(path(p
), &stfs
));
4556 unlock_user(p
, arg1
, 0);
4558 if (!is_error(ret
)) {
4559 struct target_statfs64
*target_stfs
;
4561 if (!lock_user_struct(VERIFY_WRITE
, target_stfs
, arg3
, 0))
4563 __put_user(stfs
.f_type
, &target_stfs
->f_type
);
4564 __put_user(stfs
.f_bsize
, &target_stfs
->f_bsize
);
4565 __put_user(stfs
.f_blocks
, &target_stfs
->f_blocks
);
4566 __put_user(stfs
.f_bfree
, &target_stfs
->f_bfree
);
4567 __put_user(stfs
.f_bavail
, &target_stfs
->f_bavail
);
4568 __put_user(stfs
.f_files
, &target_stfs
->f_files
);
4569 __put_user(stfs
.f_ffree
, &target_stfs
->f_ffree
);
4570 __put_user(stfs
.f_fsid
.__val
[0], &target_stfs
->f_fsid
.val
[0]);
4571 __put_user(stfs
.f_fsid
.__val
[1], &target_stfs
->f_fsid
.val
[1]);
4572 __put_user(stfs
.f_namelen
, &target_stfs
->f_namelen
);
4573 unlock_user_struct(target_stfs
, arg3
, 1);
4576 case TARGET_NR_fstatfs64
:
4577 ret
= get_errno(fstatfs(arg1
, &stfs
));
4578 goto convert_statfs64
;
4580 #ifdef TARGET_NR_ioperm
4581 case TARGET_NR_ioperm
:
4584 #ifdef TARGET_NR_socketcall
4585 case TARGET_NR_socketcall
:
4586 ret
= do_socketcall(arg1
, arg2
);
4589 #ifdef TARGET_NR_accept
4590 case TARGET_NR_accept
:
4591 ret
= do_accept(arg1
, arg2
, arg3
);
4594 #ifdef TARGET_NR_bind
4595 case TARGET_NR_bind
:
4596 ret
= do_bind(arg1
, arg2
, arg3
);
4599 #ifdef TARGET_NR_connect
4600 case TARGET_NR_connect
:
4601 ret
= do_connect(arg1
, arg2
, arg3
);
4604 #ifdef TARGET_NR_getpeername
4605 case TARGET_NR_getpeername
:
4606 ret
= do_getpeername(arg1
, arg2
, arg3
);
4609 #ifdef TARGET_NR_getsockname
4610 case TARGET_NR_getsockname
:
4611 ret
= do_getsockname(arg1
, arg2
, arg3
);
4614 #ifdef TARGET_NR_getsockopt
4615 case TARGET_NR_getsockopt
:
4616 ret
= do_getsockopt(arg1
, arg2
, arg3
, arg4
, arg5
);
4619 #ifdef TARGET_NR_listen
4620 case TARGET_NR_listen
:
4621 ret
= get_errno(listen(arg1
, arg2
));
4624 #ifdef TARGET_NR_recv
4625 case TARGET_NR_recv
:
4626 ret
= do_recvfrom(arg1
, arg2
, arg3
, arg4
, 0, 0);
4629 #ifdef TARGET_NR_recvfrom
4630 case TARGET_NR_recvfrom
:
4631 ret
= do_recvfrom(arg1
, arg2
, arg3
, arg4
, arg5
, arg6
);
4634 #ifdef TARGET_NR_recvmsg
4635 case TARGET_NR_recvmsg
:
4636 ret
= do_sendrecvmsg(arg1
, arg2
, arg3
, 0);
4639 #ifdef TARGET_NR_send
4640 case TARGET_NR_send
:
4641 ret
= do_sendto(arg1
, arg2
, arg3
, arg4
, 0, 0);
4644 #ifdef TARGET_NR_sendmsg
4645 case TARGET_NR_sendmsg
:
4646 ret
= do_sendrecvmsg(arg1
, arg2
, arg3
, 1);
4649 #ifdef TARGET_NR_sendto
4650 case TARGET_NR_sendto
:
4651 ret
= do_sendto(arg1
, arg2
, arg3
, arg4
, arg5
, arg6
);
4654 #ifdef TARGET_NR_shutdown
4655 case TARGET_NR_shutdown
:
4656 ret
= get_errno(shutdown(arg1
, arg2
));
4659 #ifdef TARGET_NR_socket
4660 case TARGET_NR_socket
:
4661 ret
= do_socket(arg1
, arg2
, arg3
);
4664 #ifdef TARGET_NR_socketpair
4665 case TARGET_NR_socketpair
:
4666 ret
= do_socketpair(arg1
, arg2
, arg3
, arg4
);
4669 #ifdef TARGET_NR_setsockopt
4670 case TARGET_NR_setsockopt
:
4671 ret
= do_setsockopt(arg1
, arg2
, arg3
, arg4
, (socklen_t
) arg5
);
4675 case TARGET_NR_syslog
:
4676 if (!(p
= lock_user_string(arg2
)))
4678 ret
= get_errno(sys_syslog((int)arg1
, p
, (int)arg3
));
4679 unlock_user(p
, arg2
, 0);
4682 case TARGET_NR_setitimer
:
4684 struct itimerval value
, ovalue
, *pvalue
;
4688 if (copy_from_user_timeval(&pvalue
->it_interval
, arg2
)
4689 || copy_from_user_timeval(&pvalue
->it_value
,
4690 arg2
+ sizeof(struct target_timeval
)))
4695 ret
= get_errno(setitimer(arg1
, pvalue
, &ovalue
));
4696 if (!is_error(ret
) && arg3
) {
4697 if (copy_to_user_timeval(arg3
,
4698 &ovalue
.it_interval
)
4699 || copy_to_user_timeval(arg3
+ sizeof(struct target_timeval
),
4705 case TARGET_NR_getitimer
:
4707 struct itimerval value
;
4709 ret
= get_errno(getitimer(arg1
, &value
));
4710 if (!is_error(ret
) && arg2
) {
4711 if (copy_to_user_timeval(arg2
,
4713 || copy_to_user_timeval(arg2
+ sizeof(struct target_timeval
),
4719 case TARGET_NR_stat
:
4720 if (!(p
= lock_user_string(arg1
)))
4722 ret
= get_errno(stat(path(p
), &st
));
4723 unlock_user(p
, arg1
, 0);
4725 case TARGET_NR_lstat
:
4726 if (!(p
= lock_user_string(arg1
)))
4728 ret
= get_errno(lstat(path(p
), &st
));
4729 unlock_user(p
, arg1
, 0);
4731 case TARGET_NR_fstat
:
4733 ret
= get_errno(fstat(arg1
, &st
));
4735 if (!is_error(ret
)) {
4736 struct target_stat
*target_st
;
4738 if (!lock_user_struct(VERIFY_WRITE
, target_st
, arg2
, 0))
4740 __put_user(st
.st_dev
, &target_st
->st_dev
);
4741 __put_user(st
.st_ino
, &target_st
->st_ino
);
4742 __put_user(st
.st_mode
, &target_st
->st_mode
);
4743 __put_user(st
.st_uid
, &target_st
->st_uid
);
4744 __put_user(st
.st_gid
, &target_st
->st_gid
);
4745 __put_user(st
.st_nlink
, &target_st
->st_nlink
);
4746 __put_user(st
.st_rdev
, &target_st
->st_rdev
);
4747 __put_user(st
.st_size
, &target_st
->st_size
);
4748 __put_user(st
.st_blksize
, &target_st
->st_blksize
);
4749 __put_user(st
.st_blocks
, &target_st
->st_blocks
);
4750 __put_user(st
.st_atime
, &target_st
->target_st_atime
);
4751 __put_user(st
.st_mtime
, &target_st
->target_st_mtime
);
4752 __put_user(st
.st_ctime
, &target_st
->target_st_ctime
);
4753 unlock_user_struct(target_st
, arg2
, 1);
4757 #ifdef TARGET_NR_olduname
4758 case TARGET_NR_olduname
:
4761 #ifdef TARGET_NR_iopl
4762 case TARGET_NR_iopl
:
4765 case TARGET_NR_vhangup
:
4766 ret
= get_errno(vhangup());
4768 #ifdef TARGET_NR_idle
4769 case TARGET_NR_idle
:
4772 #ifdef TARGET_NR_syscall
4773 case TARGET_NR_syscall
:
4774 ret
= do_syscall(cpu_env
,arg1
& 0xffff,arg2
,arg3
,arg4
,arg5
,arg6
,0);
4777 case TARGET_NR_wait4
:
4780 abi_long status_ptr
= arg2
;
4781 struct rusage rusage
, *rusage_ptr
;
4782 abi_ulong target_rusage
= arg4
;
4784 rusage_ptr
= &rusage
;
4787 ret
= get_errno(wait4(arg1
, &status
, arg3
, rusage_ptr
));
4788 if (!is_error(ret
)) {
4790 if (put_user_s32(status
, status_ptr
))
4794 host_to_target_rusage(target_rusage
, &rusage
);
4798 #ifdef TARGET_NR_swapoff
4799 case TARGET_NR_swapoff
:
4800 if (!(p
= lock_user_string(arg1
)))
4802 ret
= get_errno(swapoff(p
));
4803 unlock_user(p
, arg1
, 0);
4806 case TARGET_NR_sysinfo
:
4808 struct target_sysinfo
*target_value
;
4809 struct sysinfo value
;
4810 ret
= get_errno(sysinfo(&value
));
4811 if (!is_error(ret
) && arg1
)
4813 if (!lock_user_struct(VERIFY_WRITE
, target_value
, arg1
, 0))
4815 __put_user(value
.uptime
, &target_value
->uptime
);
4816 __put_user(value
.loads
[0], &target_value
->loads
[0]);
4817 __put_user(value
.loads
[1], &target_value
->loads
[1]);
4818 __put_user(value
.loads
[2], &target_value
->loads
[2]);
4819 __put_user(value
.totalram
, &target_value
->totalram
);
4820 __put_user(value
.freeram
, &target_value
->freeram
);
4821 __put_user(value
.sharedram
, &target_value
->sharedram
);
4822 __put_user(value
.bufferram
, &target_value
->bufferram
);
4823 __put_user(value
.totalswap
, &target_value
->totalswap
);
4824 __put_user(value
.freeswap
, &target_value
->freeswap
);
4825 __put_user(value
.procs
, &target_value
->procs
);
4826 __put_user(value
.totalhigh
, &target_value
->totalhigh
);
4827 __put_user(value
.freehigh
, &target_value
->freehigh
);
4828 __put_user(value
.mem_unit
, &target_value
->mem_unit
);
4829 unlock_user_struct(target_value
, arg1
, 1);
4833 #ifdef TARGET_NR_ipc
4835 ret
= do_ipc(arg1
, arg2
, arg3
, arg4
, arg5
, arg6
);
4839 #ifdef TARGET_NR_msgctl
4840 case TARGET_NR_msgctl
:
4841 ret
= do_msgctl(arg1
, arg2
, arg3
);
4844 #ifdef TARGET_NR_msgget
4845 case TARGET_NR_msgget
:
4846 ret
= get_errno(msgget(arg1
, arg2
));
4849 #ifdef TARGET_NR_msgrcv
4850 case TARGET_NR_msgrcv
:
4851 ret
= do_msgrcv(arg1
, arg2
, arg3
, arg4
, arg5
);
4854 #ifdef TARGET_NR_msgsnd
4855 case TARGET_NR_msgsnd
:
4856 ret
= do_msgsnd(arg1
, arg2
, arg3
, arg4
);
4859 case TARGET_NR_fsync
:
4860 ret
= get_errno(fsync(arg1
));
4862 case TARGET_NR_clone
:
4863 #if defined(TARGET_SH4)
4864 ret
= get_errno(do_fork(cpu_env
, arg1
, arg2
, arg3
, arg5
, arg4
));
4866 ret
= get_errno(do_fork(cpu_env
, arg1
, arg2
, arg3
, arg4
, arg5
));
4869 #ifdef __NR_exit_group
4870 /* new thread calls */
4871 case TARGET_NR_exit_group
:
4875 gdb_exit(cpu_env
, arg1
);
4876 ret
= get_errno(exit_group(arg1
));
4879 case TARGET_NR_setdomainname
:
4880 if (!(p
= lock_user_string(arg1
)))
4882 ret
= get_errno(setdomainname(p
, arg2
));
4883 unlock_user(p
, arg1
, 0);
4885 case TARGET_NR_uname
:
4886 /* no need to transcode because we use the linux syscall */
4888 struct new_utsname
* buf
;
4890 if (!lock_user_struct(VERIFY_WRITE
, buf
, arg1
, 0))
4892 ret
= get_errno(sys_uname(buf
));
4893 if (!is_error(ret
)) {
4894 /* Overrite the native machine name with whatever is being
4896 strcpy (buf
->machine
, UNAME_MACHINE
);
4897 /* Allow the user to override the reported release. */
4898 if (qemu_uname_release
&& *qemu_uname_release
)
4899 strcpy (buf
->release
, qemu_uname_release
);
4901 unlock_user_struct(buf
, arg1
, 1);
4905 case TARGET_NR_modify_ldt
:
4906 ret
= do_modify_ldt(cpu_env
, arg1
, arg2
, arg3
);
4908 #if !defined(TARGET_X86_64)
4909 case TARGET_NR_vm86old
:
4911 case TARGET_NR_vm86
:
4912 ret
= do_vm86(cpu_env
, arg1
, arg2
);
4916 case TARGET_NR_adjtimex
:
4918 #ifdef TARGET_NR_create_module
4919 case TARGET_NR_create_module
:
4921 case TARGET_NR_init_module
:
4922 case TARGET_NR_delete_module
:
4923 #ifdef TARGET_NR_get_kernel_syms
4924 case TARGET_NR_get_kernel_syms
:
4927 case TARGET_NR_quotactl
:
4929 case TARGET_NR_getpgid
:
4930 ret
= get_errno(getpgid(arg1
));
4932 case TARGET_NR_fchdir
:
4933 ret
= get_errno(fchdir(arg1
));
4935 #ifdef TARGET_NR_bdflush /* not on x86_64 */
4936 case TARGET_NR_bdflush
:
4939 #ifdef TARGET_NR_sysfs
4940 case TARGET_NR_sysfs
:
4943 case TARGET_NR_personality
:
4944 ret
= get_errno(personality(arg1
));
4946 #ifdef TARGET_NR_afs_syscall
4947 case TARGET_NR_afs_syscall
:
4950 #ifdef TARGET_NR__llseek /* Not on alpha */
4951 case TARGET_NR__llseek
:
4953 #if defined (__x86_64__)
4954 ret
= get_errno(lseek(arg1
, ((uint64_t )arg2
<< 32) | arg3
, arg5
));
4955 if (put_user_s64(ret
, arg4
))
4959 ret
= get_errno(_llseek(arg1
, arg2
, arg3
, &res
, arg5
));
4960 if (put_user_s64(res
, arg4
))
4966 case TARGET_NR_getdents
:
4967 #if TARGET_ABI_BITS != 32
4969 #elif TARGET_ABI_BITS == 32 && HOST_LONG_BITS == 64
4971 struct target_dirent
*target_dirp
;
4972 struct linux_dirent
*dirp
;
4973 abi_long count
= arg3
;
4975 dirp
= malloc(count
);
4977 ret
= -TARGET_ENOMEM
;
4981 ret
= get_errno(sys_getdents(arg1
, dirp
, count
));
4982 if (!is_error(ret
)) {
4983 struct linux_dirent
*de
;
4984 struct target_dirent
*tde
;
4986 int reclen
, treclen
;
4987 int count1
, tnamelen
;
4991 if (!(target_dirp
= lock_user(VERIFY_WRITE
, arg2
, count
, 0)))
4995 reclen
= de
->d_reclen
;
4996 treclen
= reclen
- (2 * (sizeof(long) - sizeof(abi_long
)));
4997 tde
->d_reclen
= tswap16(treclen
);
4998 tde
->d_ino
= tswapl(de
->d_ino
);
4999 tde
->d_off
= tswapl(de
->d_off
);
5000 tnamelen
= treclen
- (2 * sizeof(abi_long
) + 2);
5003 /* XXX: may not be correct */
5004 pstrcpy(tde
->d_name
, tnamelen
, de
->d_name
);
5005 de
= (struct linux_dirent
*)((char *)de
+ reclen
);
5007 tde
= (struct target_dirent
*)((char *)tde
+ treclen
);
5011 unlock_user(target_dirp
, arg2
, ret
);
5017 struct linux_dirent
*dirp
;
5018 abi_long count
= arg3
;
5020 if (!(dirp
= lock_user(VERIFY_WRITE
, arg2
, count
, 0)))
5022 ret
= get_errno(sys_getdents(arg1
, dirp
, count
));
5023 if (!is_error(ret
)) {
5024 struct linux_dirent
*de
;
5029 reclen
= de
->d_reclen
;
5032 de
->d_reclen
= tswap16(reclen
);
5033 tswapls(&de
->d_ino
);
5034 tswapls(&de
->d_off
);
5035 de
= (struct linux_dirent
*)((char *)de
+ reclen
);
5039 unlock_user(dirp
, arg2
, ret
);
5043 #if defined(TARGET_NR_getdents64) && defined(__NR_getdents64)
5044 case TARGET_NR_getdents64
:
5046 struct linux_dirent64
*dirp
;
5047 abi_long count
= arg3
;
5048 if (!(dirp
= lock_user(VERIFY_WRITE
, arg2
, count
, 0)))
5050 ret
= get_errno(sys_getdents64(arg1
, dirp
, count
));
5051 if (!is_error(ret
)) {
5052 struct linux_dirent64
*de
;
5057 reclen
= de
->d_reclen
;
5060 de
->d_reclen
= tswap16(reclen
);
5061 tswap64s((uint64_t *)&de
->d_ino
);
5062 tswap64s((uint64_t *)&de
->d_off
);
5063 de
= (struct linux_dirent64
*)((char *)de
+ reclen
);
5067 unlock_user(dirp
, arg2
, ret
);
5070 #endif /* TARGET_NR_getdents64 */
5071 #ifdef TARGET_NR__newselect
5072 case TARGET_NR__newselect
:
5073 ret
= do_select(arg1
, arg2
, arg3
, arg4
, arg5
);
5076 #ifdef TARGET_NR_poll
5077 case TARGET_NR_poll
:
5079 struct target_pollfd
*target_pfd
;
5080 unsigned int nfds
= arg2
;
5085 target_pfd
= lock_user(VERIFY_WRITE
, arg1
, sizeof(struct target_pollfd
) * nfds
, 1);
5088 pfd
= alloca(sizeof(struct pollfd
) * nfds
);
5089 for(i
= 0; i
< nfds
; i
++) {
5090 pfd
[i
].fd
= tswap32(target_pfd
[i
].fd
);
5091 pfd
[i
].events
= tswap16(target_pfd
[i
].events
);
5093 ret
= get_errno(poll(pfd
, nfds
, timeout
));
5094 if (!is_error(ret
)) {
5095 for(i
= 0; i
< nfds
; i
++) {
5096 target_pfd
[i
].revents
= tswap16(pfd
[i
].revents
);
5098 ret
+= nfds
* (sizeof(struct target_pollfd
)
5099 - sizeof(struct pollfd
));
5101 unlock_user(target_pfd
, arg1
, ret
);
5105 case TARGET_NR_flock
:
5106 /* NOTE: the flock constant seems to be the same for every
5108 ret
= get_errno(flock(arg1
, arg2
));
5110 case TARGET_NR_readv
:
5115 vec
= alloca(count
* sizeof(struct iovec
));
5116 if (lock_iovec(VERIFY_WRITE
, vec
, arg2
, count
, 0) < 0)
5118 ret
= get_errno(readv(arg1
, vec
, count
));
5119 unlock_iovec(vec
, arg2
, count
, 1);
5122 case TARGET_NR_writev
:
5127 vec
= alloca(count
* sizeof(struct iovec
));
5128 if (lock_iovec(VERIFY_READ
, vec
, arg2
, count
, 1) < 0)
5130 ret
= get_errno(writev(arg1
, vec
, count
));
5131 unlock_iovec(vec
, arg2
, count
, 0);
5134 case TARGET_NR_getsid
:
5135 ret
= get_errno(getsid(arg1
));
5137 #if defined(TARGET_NR_fdatasync) /* Not on alpha (osf_datasync ?) */
5138 case TARGET_NR_fdatasync
:
5139 ret
= get_errno(fdatasync(arg1
));
5142 case TARGET_NR__sysctl
:
5143 /* We don't implement this, but ENOTDIR is always a safe
5145 ret
= -TARGET_ENOTDIR
;
5147 case TARGET_NR_sched_setparam
:
5149 struct sched_param
*target_schp
;
5150 struct sched_param schp
;
5152 if (!lock_user_struct(VERIFY_READ
, target_schp
, arg2
, 1))
5154 schp
.sched_priority
= tswap32(target_schp
->sched_priority
);
5155 unlock_user_struct(target_schp
, arg2
, 0);
5156 ret
= get_errno(sched_setparam(arg1
, &schp
));
5159 case TARGET_NR_sched_getparam
:
5161 struct sched_param
*target_schp
;
5162 struct sched_param schp
;
5163 ret
= get_errno(sched_getparam(arg1
, &schp
));
5164 if (!is_error(ret
)) {
5165 if (!lock_user_struct(VERIFY_WRITE
, target_schp
, arg2
, 0))
5167 target_schp
->sched_priority
= tswap32(schp
.sched_priority
);
5168 unlock_user_struct(target_schp
, arg2
, 1);
5172 case TARGET_NR_sched_setscheduler
:
5174 struct sched_param
*target_schp
;
5175 struct sched_param schp
;
5176 if (!lock_user_struct(VERIFY_READ
, target_schp
, arg3
, 1))
5178 schp
.sched_priority
= tswap32(target_schp
->sched_priority
);
5179 unlock_user_struct(target_schp
, arg3
, 0);
5180 ret
= get_errno(sched_setscheduler(arg1
, arg2
, &schp
));
5183 case TARGET_NR_sched_getscheduler
:
5184 ret
= get_errno(sched_getscheduler(arg1
));
5186 case TARGET_NR_sched_yield
:
5187 ret
= get_errno(sched_yield());
5189 case TARGET_NR_sched_get_priority_max
:
5190 ret
= get_errno(sched_get_priority_max(arg1
));
5192 case TARGET_NR_sched_get_priority_min
:
5193 ret
= get_errno(sched_get_priority_min(arg1
));
5195 case TARGET_NR_sched_rr_get_interval
:
5198 ret
= get_errno(sched_rr_get_interval(arg1
, &ts
));
5199 if (!is_error(ret
)) {
5200 host_to_target_timespec(arg2
, &ts
);
5204 case TARGET_NR_nanosleep
:
5206 struct timespec req
, rem
;
5207 target_to_host_timespec(&req
, arg1
);
5208 ret
= get_errno(nanosleep(&req
, &rem
));
5209 if (is_error(ret
) && arg2
) {
5210 host_to_target_timespec(arg2
, &rem
);
5214 #ifdef TARGET_NR_query_module
5215 case TARGET_NR_query_module
:
5218 #ifdef TARGET_NR_nfsservctl
5219 case TARGET_NR_nfsservctl
:
5222 case TARGET_NR_prctl
:
5225 case PR_GET_PDEATHSIG
:
5228 ret
= get_errno(prctl(arg1
, &deathsig
, arg3
, arg4
, arg5
));
5229 if (!is_error(ret
) && arg2
5230 && put_user_ual(deathsig
, arg2
))
5235 ret
= get_errno(prctl(arg1
, arg2
, arg3
, arg4
, arg5
));
5239 #ifdef TARGET_NR_arch_prctl
5240 case TARGET_NR_arch_prctl
:
5241 #if defined(TARGET_I386) && !defined(TARGET_ABI32)
5242 ret
= do_arch_prctl(cpu_env
, arg1
, arg2
);
5248 #ifdef TARGET_NR_pread
5249 case TARGET_NR_pread
:
5251 if (((CPUARMState
*)cpu_env
)->eabi
)
5254 if (!(p
= lock_user(VERIFY_WRITE
, arg2
, arg3
, 0)))
5256 ret
= get_errno(pread(arg1
, p
, arg3
, arg4
));
5257 unlock_user(p
, arg2
, ret
);
5259 case TARGET_NR_pwrite
:
5261 if (((CPUARMState
*)cpu_env
)->eabi
)
5264 if (!(p
= lock_user(VERIFY_READ
, arg2
, arg3
, 1)))
5266 ret
= get_errno(pwrite(arg1
, p
, arg3
, arg4
));
5267 unlock_user(p
, arg2
, 0);
5270 #ifdef TARGET_NR_pread64
5271 case TARGET_NR_pread64
:
5272 if (!(p
= lock_user(VERIFY_WRITE
, arg2
, arg3
, 0)))
5274 ret
= get_errno(pread64(arg1
, p
, arg3
, target_offset64(arg4
, arg5
)));
5275 unlock_user(p
, arg2
, ret
);
5277 case TARGET_NR_pwrite64
:
5278 if (!(p
= lock_user(VERIFY_READ
, arg2
, arg3
, 1)))
5280 ret
= get_errno(pwrite64(arg1
, p
, arg3
, target_offset64(arg4
, arg5
)));
5281 unlock_user(p
, arg2
, 0);
5284 case TARGET_NR_getcwd
:
5285 if (!(p
= lock_user(VERIFY_WRITE
, arg1
, arg2
, 0)))
5287 ret
= get_errno(sys_getcwd1(p
, arg2
));
5288 unlock_user(p
, arg1
, ret
);
5290 case TARGET_NR_capget
:
5292 case TARGET_NR_capset
:
5294 case TARGET_NR_sigaltstack
:
5295 #if defined(TARGET_I386) || defined(TARGET_ARM) || defined(TARGET_MIPS) || \
5296 defined(TARGET_SPARC) || defined(TARGET_PPC) || defined(TARGET_ALPHA)
5297 ret
= do_sigaltstack(arg1
, arg2
, get_sp_from_cpustate((CPUState
*)cpu_env
));
5302 case TARGET_NR_sendfile
:
5304 #ifdef TARGET_NR_getpmsg
5305 case TARGET_NR_getpmsg
:
5308 #ifdef TARGET_NR_putpmsg
5309 case TARGET_NR_putpmsg
:
5312 #ifdef TARGET_NR_vfork
5313 case TARGET_NR_vfork
:
5314 ret
= get_errno(do_fork(cpu_env
, CLONE_VFORK
| CLONE_VM
| SIGCHLD
,
5318 #ifdef TARGET_NR_ugetrlimit
5319 case TARGET_NR_ugetrlimit
:
5322 ret
= get_errno(getrlimit(arg1
, &rlim
));
5323 if (!is_error(ret
)) {
5324 struct target_rlimit
*target_rlim
;
5325 if (!lock_user_struct(VERIFY_WRITE
, target_rlim
, arg2
, 0))
5327 target_rlim
->rlim_cur
= tswapl(rlim
.rlim_cur
);
5328 target_rlim
->rlim_max
= tswapl(rlim
.rlim_max
);
5329 unlock_user_struct(target_rlim
, arg2
, 1);
5334 #ifdef TARGET_NR_truncate64
5335 case TARGET_NR_truncate64
:
5336 if (!(p
= lock_user_string(arg1
)))
5338 ret
= target_truncate64(cpu_env
, p
, arg2
, arg3
, arg4
);
5339 unlock_user(p
, arg1
, 0);
5342 #ifdef TARGET_NR_ftruncate64
5343 case TARGET_NR_ftruncate64
:
5344 ret
= target_ftruncate64(cpu_env
, arg1
, arg2
, arg3
, arg4
);
5347 #ifdef TARGET_NR_stat64
5348 case TARGET_NR_stat64
:
5349 if (!(p
= lock_user_string(arg1
)))
5351 ret
= get_errno(stat(path(p
), &st
));
5352 unlock_user(p
, arg1
, 0);
5354 ret
= host_to_target_stat64(cpu_env
, arg2
, &st
);
5357 #ifdef TARGET_NR_lstat64
5358 case TARGET_NR_lstat64
:
5359 if (!(p
= lock_user_string(arg1
)))
5361 ret
= get_errno(lstat(path(p
), &st
));
5362 unlock_user(p
, arg1
, 0);
5364 ret
= host_to_target_stat64(cpu_env
, arg2
, &st
);
5367 #ifdef TARGET_NR_fstat64
5368 case TARGET_NR_fstat64
:
5369 ret
= get_errno(fstat(arg1
, &st
));
5371 ret
= host_to_target_stat64(cpu_env
, arg2
, &st
);
5374 #if defined(TARGET_NR_fstatat64) && defined(__NR_fstatat64)
5375 case TARGET_NR_fstatat64
:
5376 if (!(p
= lock_user_string(arg2
)))
5378 ret
= get_errno(sys_fstatat64(arg1
, path(p
), &st
, arg4
));
5380 ret
= host_to_target_stat64(cpu_env
, arg3
, &st
);
5384 case TARGET_NR_lchown
:
5385 if (!(p
= lock_user_string(arg1
)))
5387 ret
= get_errno(lchown(p
, low2highuid(arg2
), low2highgid(arg3
)));
5388 unlock_user(p
, arg1
, 0);
5390 case TARGET_NR_getuid
:
5391 ret
= get_errno(high2lowuid(getuid()));
5393 case TARGET_NR_getgid
:
5394 ret
= get_errno(high2lowgid(getgid()));
5396 case TARGET_NR_geteuid
:
5397 ret
= get_errno(high2lowuid(geteuid()));
5399 case TARGET_NR_getegid
:
5400 ret
= get_errno(high2lowgid(getegid()));
5402 case TARGET_NR_setreuid
:
5403 ret
= get_errno(setreuid(low2highuid(arg1
), low2highuid(arg2
)));
5405 case TARGET_NR_setregid
:
5406 ret
= get_errno(setregid(low2highgid(arg1
), low2highgid(arg2
)));
5408 case TARGET_NR_getgroups
:
5410 int gidsetsize
= arg1
;
5411 uint16_t *target_grouplist
;
5415 grouplist
= alloca(gidsetsize
* sizeof(gid_t
));
5416 ret
= get_errno(getgroups(gidsetsize
, grouplist
));
5417 if (gidsetsize
== 0)
5419 if (!is_error(ret
)) {
5420 target_grouplist
= lock_user(VERIFY_WRITE
, arg2
, gidsetsize
* 2, 0);
5421 if (!target_grouplist
)
5423 for(i
= 0;i
< ret
; i
++)
5424 target_grouplist
[i
] = tswap16(grouplist
[i
]);
5425 unlock_user(target_grouplist
, arg2
, gidsetsize
* 2);
5429 case TARGET_NR_setgroups
:
5431 int gidsetsize
= arg1
;
5432 uint16_t *target_grouplist
;
5436 grouplist
= alloca(gidsetsize
* sizeof(gid_t
));
5437 target_grouplist
= lock_user(VERIFY_READ
, arg2
, gidsetsize
* 2, 1);
5438 if (!target_grouplist
) {
5439 ret
= -TARGET_EFAULT
;
5442 for(i
= 0;i
< gidsetsize
; i
++)
5443 grouplist
[i
] = tswap16(target_grouplist
[i
]);
5444 unlock_user(target_grouplist
, arg2
, 0);
5445 ret
= get_errno(setgroups(gidsetsize
, grouplist
));
5448 case TARGET_NR_fchown
:
5449 ret
= get_errno(fchown(arg1
, low2highuid(arg2
), low2highgid(arg3
)));
5451 #if defined(TARGET_NR_fchownat) && defined(__NR_fchownat)
5452 case TARGET_NR_fchownat
:
5453 if (!(p
= lock_user_string(arg2
)))
5455 ret
= get_errno(sys_fchownat(arg1
, p
, low2highuid(arg3
), low2highgid(arg4
), arg5
));
5456 unlock_user(p
, arg2
, 0);
5459 #ifdef TARGET_NR_setresuid
5460 case TARGET_NR_setresuid
:
5461 ret
= get_errno(setresuid(low2highuid(arg1
),
5463 low2highuid(arg3
)));
5466 #ifdef TARGET_NR_getresuid
5467 case TARGET_NR_getresuid
:
5469 uid_t ruid
, euid
, suid
;
5470 ret
= get_errno(getresuid(&ruid
, &euid
, &suid
));
5471 if (!is_error(ret
)) {
5472 if (put_user_u16(high2lowuid(ruid
), arg1
)
5473 || put_user_u16(high2lowuid(euid
), arg2
)
5474 || put_user_u16(high2lowuid(suid
), arg3
))
5480 #ifdef TARGET_NR_getresgid
5481 case TARGET_NR_setresgid
:
5482 ret
= get_errno(setresgid(low2highgid(arg1
),
5484 low2highgid(arg3
)));
5487 #ifdef TARGET_NR_getresgid
5488 case TARGET_NR_getresgid
:
5490 gid_t rgid
, egid
, sgid
;
5491 ret
= get_errno(getresgid(&rgid
, &egid
, &sgid
));
5492 if (!is_error(ret
)) {
5493 if (put_user_u16(high2lowgid(rgid
), arg1
)
5494 || put_user_u16(high2lowgid(egid
), arg2
)
5495 || put_user_u16(high2lowgid(sgid
), arg3
))
5501 case TARGET_NR_chown
:
5502 if (!(p
= lock_user_string(arg1
)))
5504 ret
= get_errno(chown(p
, low2highuid(arg2
), low2highgid(arg3
)));
5505 unlock_user(p
, arg1
, 0);
5507 case TARGET_NR_setuid
:
5508 ret
= get_errno(setuid(low2highuid(arg1
)));
5510 case TARGET_NR_setgid
:
5511 ret
= get_errno(setgid(low2highgid(arg1
)));
5513 case TARGET_NR_setfsuid
:
5514 ret
= get_errno(setfsuid(arg1
));
5516 case TARGET_NR_setfsgid
:
5517 ret
= get_errno(setfsgid(arg1
));
5519 #endif /* USE_UID16 */
5521 #ifdef TARGET_NR_lchown32
5522 case TARGET_NR_lchown32
:
5523 if (!(p
= lock_user_string(arg1
)))
5525 ret
= get_errno(lchown(p
, arg2
, arg3
));
5526 unlock_user(p
, arg1
, 0);
5529 #ifdef TARGET_NR_getuid32
5530 case TARGET_NR_getuid32
:
5531 ret
= get_errno(getuid());
5535 #if defined(TARGET_NR_getxuid) && defined(TARGET_ALPHA)
5536 /* Alpha specific */
5537 case TARGET_NR_getxuid
:
5541 ((CPUAlphaState
*)cpu_env
)->ir
[IR_A4
]=euid
;
5543 ret
= get_errno(getuid());
5546 #if defined(TARGET_NR_getxgid) && defined(TARGET_ALPHA)
5547 /* Alpha specific */
5548 case TARGET_NR_getxgid
:
5552 ((CPUAlphaState
*)cpu_env
)->ir
[IR_A4
]=egid
;
5554 ret
= get_errno(getgid());
5558 #ifdef TARGET_NR_getgid32
5559 case TARGET_NR_getgid32
:
5560 ret
= get_errno(getgid());
5563 #ifdef TARGET_NR_geteuid32
5564 case TARGET_NR_geteuid32
:
5565 ret
= get_errno(geteuid());
5568 #ifdef TARGET_NR_getegid32
5569 case TARGET_NR_getegid32
:
5570 ret
= get_errno(getegid());
5573 #ifdef TARGET_NR_setreuid32
5574 case TARGET_NR_setreuid32
:
5575 ret
= get_errno(setreuid(arg1
, arg2
));
5578 #ifdef TARGET_NR_setregid32
5579 case TARGET_NR_setregid32
:
5580 ret
= get_errno(setregid(arg1
, arg2
));
5583 #ifdef TARGET_NR_getgroups32
5584 case TARGET_NR_getgroups32
:
5586 int gidsetsize
= arg1
;
5587 uint32_t *target_grouplist
;
5591 grouplist
= alloca(gidsetsize
* sizeof(gid_t
));
5592 ret
= get_errno(getgroups(gidsetsize
, grouplist
));
5593 if (gidsetsize
== 0)
5595 if (!is_error(ret
)) {
5596 target_grouplist
= lock_user(VERIFY_WRITE
, arg2
, gidsetsize
* 4, 0);
5597 if (!target_grouplist
) {
5598 ret
= -TARGET_EFAULT
;
5601 for(i
= 0;i
< ret
; i
++)
5602 target_grouplist
[i
] = tswap32(grouplist
[i
]);
5603 unlock_user(target_grouplist
, arg2
, gidsetsize
* 4);
5608 #ifdef TARGET_NR_setgroups32
5609 case TARGET_NR_setgroups32
:
5611 int gidsetsize
= arg1
;
5612 uint32_t *target_grouplist
;
5616 grouplist
= alloca(gidsetsize
* sizeof(gid_t
));
5617 target_grouplist
= lock_user(VERIFY_READ
, arg2
, gidsetsize
* 4, 1);
5618 if (!target_grouplist
) {
5619 ret
= -TARGET_EFAULT
;
5622 for(i
= 0;i
< gidsetsize
; i
++)
5623 grouplist
[i
] = tswap32(target_grouplist
[i
]);
5624 unlock_user(target_grouplist
, arg2
, 0);
5625 ret
= get_errno(setgroups(gidsetsize
, grouplist
));
5629 #ifdef TARGET_NR_fchown32
5630 case TARGET_NR_fchown32
:
5631 ret
= get_errno(fchown(arg1
, arg2
, arg3
));
5634 #ifdef TARGET_NR_setresuid32
5635 case TARGET_NR_setresuid32
:
5636 ret
= get_errno(setresuid(arg1
, arg2
, arg3
));
5639 #ifdef TARGET_NR_getresuid32
5640 case TARGET_NR_getresuid32
:
5642 uid_t ruid
, euid
, suid
;
5643 ret
= get_errno(getresuid(&ruid
, &euid
, &suid
));
5644 if (!is_error(ret
)) {
5645 if (put_user_u32(ruid
, arg1
)
5646 || put_user_u32(euid
, arg2
)
5647 || put_user_u32(suid
, arg3
))
5653 #ifdef TARGET_NR_setresgid32
5654 case TARGET_NR_setresgid32
:
5655 ret
= get_errno(setresgid(arg1
, arg2
, arg3
));
5658 #ifdef TARGET_NR_getresgid32
5659 case TARGET_NR_getresgid32
:
5661 gid_t rgid
, egid
, sgid
;
5662 ret
= get_errno(getresgid(&rgid
, &egid
, &sgid
));
5663 if (!is_error(ret
)) {
5664 if (put_user_u32(rgid
, arg1
)
5665 || put_user_u32(egid
, arg2
)
5666 || put_user_u32(sgid
, arg3
))
5672 #ifdef TARGET_NR_chown32
5673 case TARGET_NR_chown32
:
5674 if (!(p
= lock_user_string(arg1
)))
5676 ret
= get_errno(chown(p
, arg2
, arg3
));
5677 unlock_user(p
, arg1
, 0);
5680 #ifdef TARGET_NR_setuid32
5681 case TARGET_NR_setuid32
:
5682 ret
= get_errno(setuid(arg1
));
5685 #ifdef TARGET_NR_setgid32
5686 case TARGET_NR_setgid32
:
5687 ret
= get_errno(setgid(arg1
));
5690 #ifdef TARGET_NR_setfsuid32
5691 case TARGET_NR_setfsuid32
:
5692 ret
= get_errno(setfsuid(arg1
));
5695 #ifdef TARGET_NR_setfsgid32
5696 case TARGET_NR_setfsgid32
:
5697 ret
= get_errno(setfsgid(arg1
));
5701 case TARGET_NR_pivot_root
:
5703 #ifdef TARGET_NR_mincore
5704 case TARGET_NR_mincore
:
5707 ret
= -TARGET_EFAULT
;
5708 if (!(a
= lock_user(VERIFY_READ
, arg1
,arg2
, 0)))
5710 if (!(p
= lock_user_string(arg3
)))
5712 ret
= get_errno(mincore(a
, arg2
, p
));
5713 unlock_user(p
, arg3
, ret
);
5715 unlock_user(a
, arg1
, 0);
5719 #ifdef TARGET_NR_arm_fadvise64_64
5720 case TARGET_NR_arm_fadvise64_64
:
5723 * arm_fadvise64_64 looks like fadvise64_64 but
5724 * with different argument order
5732 #if defined(TARGET_NR_fadvise64_64) || defined(TARGET_NR_arm_fadvise64_64)
5733 #ifdef TARGET_NR_fadvise64_64
5734 case TARGET_NR_fadvise64_64
:
5736 /* This is a hint, so ignoring and returning success is ok. */
5740 #ifdef TARGET_NR_madvise
5741 case TARGET_NR_madvise
:
5742 /* A straight passthrough may not be safe because qemu sometimes
5743 turns private flie-backed mappings into anonymous mappings.
5744 This will break MADV_DONTNEED.
5745 This is a hint, so ignoring and returning success is ok. */
5749 #if TARGET_ABI_BITS == 32
5750 case TARGET_NR_fcntl64
:
5754 struct target_flock64
*target_fl
;
5756 struct target_eabi_flock64
*target_efl
;
5760 case TARGET_F_GETLK64
:
5763 case TARGET_F_SETLK64
:
5766 case TARGET_F_SETLKW64
:
5775 case TARGET_F_GETLK64
:
5777 if (((CPUARMState
*)cpu_env
)->eabi
) {
5778 if (!lock_user_struct(VERIFY_READ
, target_efl
, arg3
, 1))
5780 fl
.l_type
= tswap16(target_efl
->l_type
);
5781 fl
.l_whence
= tswap16(target_efl
->l_whence
);
5782 fl
.l_start
= tswap64(target_efl
->l_start
);
5783 fl
.l_len
= tswap64(target_efl
->l_len
);
5784 fl
.l_pid
= tswapl(target_efl
->l_pid
);
5785 unlock_user_struct(target_efl
, arg3
, 0);
5789 if (!lock_user_struct(VERIFY_READ
, target_fl
, arg3
, 1))
5791 fl
.l_type
= tswap16(target_fl
->l_type
);
5792 fl
.l_whence
= tswap16(target_fl
->l_whence
);
5793 fl
.l_start
= tswap64(target_fl
->l_start
);
5794 fl
.l_len
= tswap64(target_fl
->l_len
);
5795 fl
.l_pid
= tswapl(target_fl
->l_pid
);
5796 unlock_user_struct(target_fl
, arg3
, 0);
5798 ret
= get_errno(fcntl(arg1
, cmd
, &fl
));
5801 if (((CPUARMState
*)cpu_env
)->eabi
) {
5802 if (!lock_user_struct(VERIFY_WRITE
, target_efl
, arg3
, 0))
5804 target_efl
->l_type
= tswap16(fl
.l_type
);
5805 target_efl
->l_whence
= tswap16(fl
.l_whence
);
5806 target_efl
->l_start
= tswap64(fl
.l_start
);
5807 target_efl
->l_len
= tswap64(fl
.l_len
);
5808 target_efl
->l_pid
= tswapl(fl
.l_pid
);
5809 unlock_user_struct(target_efl
, arg3
, 1);
5813 if (!lock_user_struct(VERIFY_WRITE
, target_fl
, arg3
, 0))
5815 target_fl
->l_type
= tswap16(fl
.l_type
);
5816 target_fl
->l_whence
= tswap16(fl
.l_whence
);
5817 target_fl
->l_start
= tswap64(fl
.l_start
);
5818 target_fl
->l_len
= tswap64(fl
.l_len
);
5819 target_fl
->l_pid
= tswapl(fl
.l_pid
);
5820 unlock_user_struct(target_fl
, arg3
, 1);
5825 case TARGET_F_SETLK64
:
5826 case TARGET_F_SETLKW64
:
5828 if (((CPUARMState
*)cpu_env
)->eabi
) {
5829 if (!lock_user_struct(VERIFY_READ
, target_efl
, arg3
, 1))
5831 fl
.l_type
= tswap16(target_efl
->l_type
);
5832 fl
.l_whence
= tswap16(target_efl
->l_whence
);
5833 fl
.l_start
= tswap64(target_efl
->l_start
);
5834 fl
.l_len
= tswap64(target_efl
->l_len
);
5835 fl
.l_pid
= tswapl(target_efl
->l_pid
);
5836 unlock_user_struct(target_efl
, arg3
, 0);
5840 if (!lock_user_struct(VERIFY_READ
, target_fl
, arg3
, 1))
5842 fl
.l_type
= tswap16(target_fl
->l_type
);
5843 fl
.l_whence
= tswap16(target_fl
->l_whence
);
5844 fl
.l_start
= tswap64(target_fl
->l_start
);
5845 fl
.l_len
= tswap64(target_fl
->l_len
);
5846 fl
.l_pid
= tswapl(target_fl
->l_pid
);
5847 unlock_user_struct(target_fl
, arg3
, 0);
5849 ret
= get_errno(fcntl(arg1
, cmd
, &fl
));
5852 ret
= do_fcntl(arg1
, cmd
, arg3
);
5858 #ifdef TARGET_NR_cacheflush
5859 case TARGET_NR_cacheflush
:
5860 /* self-modifying code is handled automatically, so nothing needed */
5864 #ifdef TARGET_NR_security
5865 case TARGET_NR_security
:
5868 #ifdef TARGET_NR_getpagesize
5869 case TARGET_NR_getpagesize
:
5870 ret
= TARGET_PAGE_SIZE
;
5873 case TARGET_NR_gettid
:
5874 ret
= get_errno(gettid());
5876 #ifdef TARGET_NR_readahead
5877 case TARGET_NR_readahead
:
5878 #if TARGET_ABI_BITS == 32
5880 if (((CPUARMState
*)cpu_env
)->eabi
)
5887 ret
= get_errno(readahead(arg1
, ((off64_t
)arg3
<< 32) | arg2
, arg4
));
5889 ret
= get_errno(readahead(arg1
, arg2
, arg3
));
5893 #ifdef TARGET_NR_setxattr
5894 case TARGET_NR_setxattr
:
5895 case TARGET_NR_lsetxattr
:
5896 case TARGET_NR_fsetxattr
:
5897 case TARGET_NR_getxattr
:
5898 case TARGET_NR_lgetxattr
:
5899 case TARGET_NR_fgetxattr
:
5900 case TARGET_NR_listxattr
:
5901 case TARGET_NR_llistxattr
:
5902 case TARGET_NR_flistxattr
:
5903 case TARGET_NR_removexattr
:
5904 case TARGET_NR_lremovexattr
:
5905 case TARGET_NR_fremovexattr
:
5906 goto unimplemented_nowarn
;
5908 #ifdef TARGET_NR_set_thread_area
5909 case TARGET_NR_set_thread_area
:
5910 #if defined(TARGET_MIPS)
5911 ((CPUMIPSState
*) cpu_env
)->tls_value
= arg1
;
5914 #elif defined(TARGET_I386) && defined(TARGET_ABI32)
5915 ret
= do_set_thread_area(cpu_env
, arg1
);
5918 goto unimplemented_nowarn
;
5921 #ifdef TARGET_NR_get_thread_area
5922 case TARGET_NR_get_thread_area
:
5923 #if defined(TARGET_I386) && defined(TARGET_ABI32)
5924 ret
= do_get_thread_area(cpu_env
, arg1
);
5926 goto unimplemented_nowarn
;
5929 #ifdef TARGET_NR_getdomainname
5930 case TARGET_NR_getdomainname
:
5931 goto unimplemented_nowarn
;
5934 #ifdef TARGET_NR_clock_gettime
5935 case TARGET_NR_clock_gettime
:
5938 ret
= get_errno(clock_gettime(arg1
, &ts
));
5939 if (!is_error(ret
)) {
5940 host_to_target_timespec(arg2
, &ts
);
5945 #ifdef TARGET_NR_clock_getres
5946 case TARGET_NR_clock_getres
:
5949 ret
= get_errno(clock_getres(arg1
, &ts
));
5950 if (!is_error(ret
)) {
5951 host_to_target_timespec(arg2
, &ts
);
5956 #ifdef TARGET_NR_clock_nanosleep
5957 case TARGET_NR_clock_nanosleep
:
5960 target_to_host_timespec(&ts
, arg3
);
5961 ret
= get_errno(clock_nanosleep(arg1
, arg2
, &ts
, arg4
? &ts
: NULL
));
5963 host_to_target_timespec(arg4
, &ts
);
5968 #if defined(TARGET_NR_set_tid_address) && defined(__NR_set_tid_address)
5969 case TARGET_NR_set_tid_address
:
5970 ret
= get_errno(set_tid_address((int *)g2h(arg1
)));
5974 #if defined(TARGET_NR_tkill) && defined(__NR_tkill)
5975 case TARGET_NR_tkill
:
5976 ret
= get_errno(sys_tkill((int)arg1
, target_to_host_signal(arg2
)));
5980 #if defined(TARGET_NR_tgkill) && defined(__NR_tgkill)
5981 case TARGET_NR_tgkill
:
5982 ret
= get_errno(sys_tgkill((int)arg1
, (int)arg2
,
5983 target_to_host_signal(arg3
)));
5987 #ifdef TARGET_NR_set_robust_list
5988 case TARGET_NR_set_robust_list
:
5989 goto unimplemented_nowarn
;
5992 #if defined(TARGET_NR_utimensat) && defined(__NR_utimensat)
5993 case TARGET_NR_utimensat
:
5995 struct timespec ts
[2];
5996 target_to_host_timespec(ts
, arg3
);
5997 target_to_host_timespec(ts
+1, arg3
+sizeof(struct target_timespec
));
5999 ret
= get_errno(sys_utimensat(arg1
, NULL
, ts
, arg4
));
6001 if (!(p
= lock_user_string(arg2
))) {
6002 ret
= -TARGET_EFAULT
;
6005 ret
= get_errno(sys_utimensat(arg1
, path(p
), ts
, arg4
));
6006 unlock_user(p
, arg2
, 0);
6011 #if defined(USE_NPTL)
6012 case TARGET_NR_futex
:
6013 ret
= do_futex(arg1
, arg2
, arg3
, arg4
, arg5
, arg6
);
6016 #ifdef TARGET_NR_inotify_init
6017 case TARGET_NR_inotify_init
:
6018 ret
= get_errno(sys_inotify_init());
6021 #ifdef TARGET_NR_inotify_add_watch
6022 case TARGET_NR_inotify_add_watch
:
6023 p
= lock_user_string(arg2
);
6024 ret
= get_errno(sys_inotify_add_watch(arg1
, path(p
), arg3
));
6025 unlock_user(p
, arg2
, 0);
6028 #ifdef TARGET_NR_inotify_rm_watch
6029 case TARGET_NR_inotify_rm_watch
:
6030 ret
= get_errno(sys_inotify_rm_watch(arg1
, arg2
));
6036 gemu_log("qemu: Unsupported syscall: %d\n", num
);
6037 #if defined(TARGET_NR_setxattr) || defined(TARGET_NR_get_thread_area) || defined(TARGET_NR_getdomainname) || defined(TARGET_NR_set_robust_list)
6038 unimplemented_nowarn
:
6040 ret
= -TARGET_ENOSYS
;
6045 gemu_log(" = %ld\n", ret
);
6048 print_syscall_ret(num
, ret
);
6051 ret
= -TARGET_EFAULT
;