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)
2963 #if defined(USE_NPTL)
2964 /* There is a race condition here. The parent process could
2965 theoretically read the TID in the child process before the child
2966 tid is set. This would require using either ptrace
2967 (not implemented) or having *_tidptr to point at a shared memory
2968 mapping. We can't repeat the spinlock hack used above because
2969 the child process gets its own copy of the lock. */
2971 cpu_clone_regs(env
, newsp
);
2973 /* Child Process. */
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. */
2987 cpu_clone_regs(env
, newsp
);
2994 static abi_long
do_fcntl(int fd
, int cmd
, abi_ulong arg
)
2997 struct target_flock
*target_fl
;
2998 struct flock64 fl64
;
2999 struct target_flock64
*target_fl64
;
3003 case TARGET_F_GETLK
:
3004 if (!lock_user_struct(VERIFY_READ
, target_fl
, arg
, 1))
3005 return -TARGET_EFAULT
;
3006 fl
.l_type
= tswap16(target_fl
->l_type
);
3007 fl
.l_whence
= tswap16(target_fl
->l_whence
);
3008 fl
.l_start
= tswapl(target_fl
->l_start
);
3009 fl
.l_len
= tswapl(target_fl
->l_len
);
3010 fl
.l_pid
= tswapl(target_fl
->l_pid
);
3011 unlock_user_struct(target_fl
, arg
, 0);
3012 ret
= get_errno(fcntl(fd
, cmd
, &fl
));
3014 if (!lock_user_struct(VERIFY_WRITE
, target_fl
, arg
, 0))
3015 return -TARGET_EFAULT
;
3016 target_fl
->l_type
= tswap16(fl
.l_type
);
3017 target_fl
->l_whence
= tswap16(fl
.l_whence
);
3018 target_fl
->l_start
= tswapl(fl
.l_start
);
3019 target_fl
->l_len
= tswapl(fl
.l_len
);
3020 target_fl
->l_pid
= tswapl(fl
.l_pid
);
3021 unlock_user_struct(target_fl
, arg
, 1);
3025 case TARGET_F_SETLK
:
3026 case TARGET_F_SETLKW
:
3027 if (!lock_user_struct(VERIFY_READ
, target_fl
, arg
, 1))
3028 return -TARGET_EFAULT
;
3029 fl
.l_type
= tswap16(target_fl
->l_type
);
3030 fl
.l_whence
= tswap16(target_fl
->l_whence
);
3031 fl
.l_start
= tswapl(target_fl
->l_start
);
3032 fl
.l_len
= tswapl(target_fl
->l_len
);
3033 fl
.l_pid
= tswapl(target_fl
->l_pid
);
3034 unlock_user_struct(target_fl
, arg
, 0);
3035 ret
= get_errno(fcntl(fd
, cmd
, &fl
));
3038 case TARGET_F_GETLK64
:
3039 if (!lock_user_struct(VERIFY_READ
, target_fl64
, arg
, 1))
3040 return -TARGET_EFAULT
;
3041 fl64
.l_type
= tswap16(target_fl64
->l_type
) >> 1;
3042 fl64
.l_whence
= tswap16(target_fl64
->l_whence
);
3043 fl64
.l_start
= tswapl(target_fl64
->l_start
);
3044 fl64
.l_len
= tswapl(target_fl64
->l_len
);
3045 fl64
.l_pid
= tswap16(target_fl64
->l_pid
);
3046 unlock_user_struct(target_fl64
, arg
, 0);
3047 ret
= get_errno(fcntl(fd
, cmd
>> 1, &fl64
));
3049 if (!lock_user_struct(VERIFY_WRITE
, target_fl64
, arg
, 0))
3050 return -TARGET_EFAULT
;
3051 target_fl64
->l_type
= tswap16(fl64
.l_type
) >> 1;
3052 target_fl64
->l_whence
= tswap16(fl64
.l_whence
);
3053 target_fl64
->l_start
= tswapl(fl64
.l_start
);
3054 target_fl64
->l_len
= tswapl(fl64
.l_len
);
3055 target_fl64
->l_pid
= tswapl(fl64
.l_pid
);
3056 unlock_user_struct(target_fl64
, arg
, 1);
3059 case TARGET_F_SETLK64
:
3060 case TARGET_F_SETLKW64
:
3061 if (!lock_user_struct(VERIFY_READ
, target_fl64
, arg
, 1))
3062 return -TARGET_EFAULT
;
3063 fl64
.l_type
= tswap16(target_fl64
->l_type
) >> 1;
3064 fl64
.l_whence
= tswap16(target_fl64
->l_whence
);
3065 fl64
.l_start
= tswapl(target_fl64
->l_start
);
3066 fl64
.l_len
= tswapl(target_fl64
->l_len
);
3067 fl64
.l_pid
= tswap16(target_fl64
->l_pid
);
3068 unlock_user_struct(target_fl64
, arg
, 0);
3069 ret
= get_errno(fcntl(fd
, cmd
>> 1, &fl64
));
3073 ret
= get_errno(fcntl(fd
, cmd
, arg
));
3075 ret
= host_to_target_bitmask(ret
, fcntl_flags_tbl
);
3080 ret
= get_errno(fcntl(fd
, cmd
, target_to_host_bitmask(arg
, fcntl_flags_tbl
)));
3084 ret
= get_errno(fcntl(fd
, cmd
, arg
));
3092 static inline int high2lowuid(int uid
)
3100 static inline int high2lowgid(int gid
)
3108 static inline int low2highuid(int uid
)
3110 if ((int16_t)uid
== -1)
3116 static inline int low2highgid(int gid
)
3118 if ((int16_t)gid
== -1)
3124 #endif /* USE_UID16 */
3126 void syscall_init(void)
3129 const argtype
*arg_type
;
3133 #define STRUCT(name, list...) thunk_register_struct(STRUCT_ ## name, #name, struct_ ## name ## _def);
3134 #define STRUCT_SPECIAL(name) thunk_register_struct_direct(STRUCT_ ## name, #name, &struct_ ## name ## _def);
3135 #include "syscall_types.h"
3137 #undef STRUCT_SPECIAL
3139 /* we patch the ioctl size if necessary. We rely on the fact that
3140 no ioctl has all the bits at '1' in the size field */
3142 while (ie
->target_cmd
!= 0) {
3143 if (((ie
->target_cmd
>> TARGET_IOC_SIZESHIFT
) & TARGET_IOC_SIZEMASK
) ==
3144 TARGET_IOC_SIZEMASK
) {
3145 arg_type
= ie
->arg_type
;
3146 if (arg_type
[0] != TYPE_PTR
) {
3147 fprintf(stderr
, "cannot patch size for ioctl 0x%x\n",
3152 size
= thunk_type_size(arg_type
, 0);
3153 ie
->target_cmd
= (ie
->target_cmd
&
3154 ~(TARGET_IOC_SIZEMASK
<< TARGET_IOC_SIZESHIFT
)) |
3155 (size
<< TARGET_IOC_SIZESHIFT
);
3158 /* Build target_to_host_errno_table[] table from
3159 * host_to_target_errno_table[]. */
3160 for (i
=0; i
< ERRNO_TABLE_SIZE
; i
++)
3161 target_to_host_errno_table
[host_to_target_errno_table
[i
]] = i
;
3163 /* automatic consistency check if same arch */
3164 #if (defined(__i386__) && defined(TARGET_I386) && defined(TARGET_ABI32)) || \
3165 (defined(__x86_64__) && defined(TARGET_X86_64))
3166 if (unlikely(ie
->target_cmd
!= ie
->host_cmd
)) {
3167 fprintf(stderr
, "ERROR: ioctl(%s): target=0x%x host=0x%x\n",
3168 ie
->name
, ie
->target_cmd
, ie
->host_cmd
);
3175 #if TARGET_ABI_BITS == 32
3176 static inline uint64_t target_offset64(uint32_t word0
, uint32_t word1
)
3178 #ifdef TARGET_WORDS_BIGENDIAN
3179 return ((uint64_t)word0
<< 32) | word1
;
3181 return ((uint64_t)word1
<< 32) | word0
;
3184 #else /* TARGET_ABI_BITS == 32 */
3185 static inline uint64_t target_offset64(uint64_t word0
, uint64_t word1
)
3189 #endif /* TARGET_ABI_BITS != 32 */
3191 #ifdef TARGET_NR_truncate64
3192 static inline abi_long
target_truncate64(void *cpu_env
, const char *arg1
,
3198 if (((CPUARMState
*)cpu_env
)->eabi
)
3204 return get_errno(truncate64(arg1
, target_offset64(arg2
, arg3
)));
3208 #ifdef TARGET_NR_ftruncate64
3209 static inline abi_long
target_ftruncate64(void *cpu_env
, abi_long arg1
,
3215 if (((CPUARMState
*)cpu_env
)->eabi
)
3221 return get_errno(ftruncate64(arg1
, target_offset64(arg2
, arg3
)));
3225 static inline abi_long
target_to_host_timespec(struct timespec
*host_ts
,
3226 abi_ulong target_addr
)
3228 struct target_timespec
*target_ts
;
3230 if (!lock_user_struct(VERIFY_READ
, target_ts
, target_addr
, 1))
3231 return -TARGET_EFAULT
;
3232 host_ts
->tv_sec
= tswapl(target_ts
->tv_sec
);
3233 host_ts
->tv_nsec
= tswapl(target_ts
->tv_nsec
);
3234 unlock_user_struct(target_ts
, target_addr
, 0);
3238 static inline abi_long
host_to_target_timespec(abi_ulong target_addr
,
3239 struct timespec
*host_ts
)
3241 struct target_timespec
*target_ts
;
3243 if (!lock_user_struct(VERIFY_WRITE
, target_ts
, target_addr
, 0))
3244 return -TARGET_EFAULT
;
3245 target_ts
->tv_sec
= tswapl(host_ts
->tv_sec
);
3246 target_ts
->tv_nsec
= tswapl(host_ts
->tv_nsec
);
3247 unlock_user_struct(target_ts
, target_addr
, 1);
3251 #ifdef TARGET_NR_stat64
3252 static inline abi_long
host_to_target_stat64(void *cpu_env
,
3253 abi_ulong target_addr
,
3254 struct stat
*host_st
)
3257 if (((CPUARMState
*)cpu_env
)->eabi
) {
3258 struct target_eabi_stat64
*target_st
;
3260 if (!lock_user_struct(VERIFY_WRITE
, target_st
, target_addr
, 0))
3261 return -TARGET_EFAULT
;
3262 memset(target_st
, 0, sizeof(struct target_eabi_stat64
));
3263 __put_user(host_st
->st_dev
, &target_st
->st_dev
);
3264 __put_user(host_st
->st_ino
, &target_st
->st_ino
);
3265 #ifdef TARGET_STAT64_HAS_BROKEN_ST_INO
3266 __put_user(host_st
->st_ino
, &target_st
->__st_ino
);
3268 __put_user(host_st
->st_mode
, &target_st
->st_mode
);
3269 __put_user(host_st
->st_nlink
, &target_st
->st_nlink
);
3270 __put_user(host_st
->st_uid
, &target_st
->st_uid
);
3271 __put_user(host_st
->st_gid
, &target_st
->st_gid
);
3272 __put_user(host_st
->st_rdev
, &target_st
->st_rdev
);
3273 __put_user(host_st
->st_size
, &target_st
->st_size
);
3274 __put_user(host_st
->st_blksize
, &target_st
->st_blksize
);
3275 __put_user(host_st
->st_blocks
, &target_st
->st_blocks
);
3276 __put_user(host_st
->st_atime
, &target_st
->target_st_atime
);
3277 __put_user(host_st
->st_mtime
, &target_st
->target_st_mtime
);
3278 __put_user(host_st
->st_ctime
, &target_st
->target_st_ctime
);
3279 unlock_user_struct(target_st
, target_addr
, 1);
3283 struct target_stat64
*target_st
;
3285 if (!lock_user_struct(VERIFY_WRITE
, target_st
, target_addr
, 0))
3286 return -TARGET_EFAULT
;
3287 memset(target_st
, 0, sizeof(struct target_stat64
));
3288 __put_user(host_st
->st_dev
, &target_st
->st_dev
);
3289 __put_user(host_st
->st_ino
, &target_st
->st_ino
);
3290 #ifdef TARGET_STAT64_HAS_BROKEN_ST_INO
3291 __put_user(host_st
->st_ino
, &target_st
->__st_ino
);
3293 __put_user(host_st
->st_mode
, &target_st
->st_mode
);
3294 __put_user(host_st
->st_nlink
, &target_st
->st_nlink
);
3295 __put_user(host_st
->st_uid
, &target_st
->st_uid
);
3296 __put_user(host_st
->st_gid
, &target_st
->st_gid
);
3297 __put_user(host_st
->st_rdev
, &target_st
->st_rdev
);
3298 /* XXX: better use of kernel struct */
3299 __put_user(host_st
->st_size
, &target_st
->st_size
);
3300 __put_user(host_st
->st_blksize
, &target_st
->st_blksize
);
3301 __put_user(host_st
->st_blocks
, &target_st
->st_blocks
);
3302 __put_user(host_st
->st_atime
, &target_st
->target_st_atime
);
3303 __put_user(host_st
->st_mtime
, &target_st
->target_st_mtime
);
3304 __put_user(host_st
->st_ctime
, &target_st
->target_st_ctime
);
3305 unlock_user_struct(target_st
, target_addr
, 1);
3312 #if defined(USE_NPTL)
3313 /* ??? Using host futex calls even when target atomic operations
3314 are not really atomic probably breaks things. However implementing
3315 futexes locally would make futexes shared between multiple processes
3316 tricky. However they're probably useless because guest atomic
3317 operations won't work either. */
3318 static int do_futex(target_ulong uaddr
, int op
, int val
, target_ulong timeout
,
3319 target_ulong uaddr2
, int val3
)
3321 struct timespec ts
, *pts
;
3323 /* ??? We assume FUTEX_* constants are the same on both host
3329 target_to_host_timespec(pts
, timeout
);
3333 return get_errno(sys_futex(g2h(uaddr
), FUTEX_WAIT
, tswap32(val
),
3336 return get_errno(sys_futex(g2h(uaddr
), FUTEX_WAKE
, val
, NULL
, NULL
, 0));
3338 return get_errno(sys_futex(g2h(uaddr
), FUTEX_FD
, val
, NULL
, NULL
, 0));
3340 return get_errno(sys_futex(g2h(uaddr
), FUTEX_REQUEUE
, val
,
3341 NULL
, g2h(uaddr2
), 0));
3342 case FUTEX_CMP_REQUEUE
:
3343 return get_errno(sys_futex(g2h(uaddr
), FUTEX_CMP_REQUEUE
, val
,
3344 NULL
, g2h(uaddr2
), tswap32(val3
)));
3346 return -TARGET_ENOSYS
;
3351 int get_osversion(void)
3353 static int osversion
;
3354 struct new_utsname buf
;
3359 if (qemu_uname_release
&& *qemu_uname_release
) {
3360 s
= qemu_uname_release
;
3362 if (sys_uname(&buf
))
3367 for (i
= 0; i
< 3; i
++) {
3369 while (*s
>= '0' && *s
<= '9') {
3374 tmp
= (tmp
<< 8) + n
;
3382 /* do_syscall() should always have a single exit point at the end so
3383 that actions, such as logging of syscall results, can be performed.
3384 All errnos that do_syscall() returns must be -TARGET_<errcode>. */
3385 abi_long
do_syscall(void *cpu_env
, int num
, abi_long arg1
,
3386 abi_long arg2
, abi_long arg3
, abi_long arg4
,
3387 abi_long arg5
, abi_long arg6
)
3395 gemu_log("syscall %d", num
);
3398 print_syscall(num
, arg1
, arg2
, arg3
, arg4
, arg5
, arg6
);
3401 case TARGET_NR_exit
:
3405 gdb_exit(cpu_env
, arg1
);
3406 /* XXX: should free thread stack and CPU env */
3408 ret
= 0; /* avoid warning */
3410 case TARGET_NR_read
:
3411 if (!(p
= lock_user(VERIFY_WRITE
, arg2
, arg3
, 0)))
3413 ret
= get_errno(read(arg1
, p
, arg3
));
3414 unlock_user(p
, arg2
, ret
);
3416 case TARGET_NR_write
:
3417 if (!(p
= lock_user(VERIFY_READ
, arg2
, arg3
, 1)))
3419 ret
= get_errno(write(arg1
, p
, arg3
));
3420 unlock_user(p
, arg2
, 0);
3422 case TARGET_NR_open
:
3423 if (!(p
= lock_user_string(arg1
)))
3425 ret
= get_errno(open(path(p
),
3426 target_to_host_bitmask(arg2
, fcntl_flags_tbl
),
3428 unlock_user(p
, arg1
, 0);
3430 #if defined(TARGET_NR_openat) && defined(__NR_openat)
3431 case TARGET_NR_openat
:
3432 if (!(p
= lock_user_string(arg2
)))
3434 ret
= get_errno(sys_openat(arg1
,
3436 target_to_host_bitmask(arg3
, fcntl_flags_tbl
),
3438 unlock_user(p
, arg2
, 0);
3441 case TARGET_NR_close
:
3442 ret
= get_errno(close(arg1
));
3447 case TARGET_NR_fork
:
3448 ret
= get_errno(do_fork(cpu_env
, SIGCHLD
, 0, 0, 0, 0));
3450 #ifdef TARGET_NR_waitpid
3451 case TARGET_NR_waitpid
:
3454 ret
= get_errno(waitpid(arg1
, &status
, arg3
));
3455 if (!is_error(ret
) && arg2
3456 && put_user_s32(status
, arg2
))
3461 #ifdef TARGET_NR_waitid
3462 case TARGET_NR_waitid
:
3466 ret
= get_errno(waitid(arg1
, arg2
, &info
, arg4
));
3467 if (!is_error(ret
) && arg3
&& info
.si_pid
!= 0) {
3468 if (!(p
= lock_user(VERIFY_WRITE
, arg3
, sizeof(target_siginfo_t
), 0)))
3470 host_to_target_siginfo(p
, &info
);
3471 unlock_user(p
, arg3
, sizeof(target_siginfo_t
));
3476 #ifdef TARGET_NR_creat /* not on alpha */
3477 case TARGET_NR_creat
:
3478 if (!(p
= lock_user_string(arg1
)))
3480 ret
= get_errno(creat(p
, arg2
));
3481 unlock_user(p
, arg1
, 0);
3484 case TARGET_NR_link
:
3487 p
= lock_user_string(arg1
);
3488 p2
= lock_user_string(arg2
);
3490 ret
= -TARGET_EFAULT
;
3492 ret
= get_errno(link(p
, p2
));
3493 unlock_user(p2
, arg2
, 0);
3494 unlock_user(p
, arg1
, 0);
3497 #if defined(TARGET_NR_linkat) && defined(__NR_linkat)
3498 case TARGET_NR_linkat
:
3503 p
= lock_user_string(arg2
);
3504 p2
= lock_user_string(arg4
);
3506 ret
= -TARGET_EFAULT
;
3508 ret
= get_errno(sys_linkat(arg1
, p
, arg3
, p2
, arg5
));
3509 unlock_user(p
, arg2
, 0);
3510 unlock_user(p2
, arg4
, 0);
3514 case TARGET_NR_unlink
:
3515 if (!(p
= lock_user_string(arg1
)))
3517 ret
= get_errno(unlink(p
));
3518 unlock_user(p
, arg1
, 0);
3520 #if defined(TARGET_NR_unlinkat) && defined(__NR_unlinkat)
3521 case TARGET_NR_unlinkat
:
3522 if (!(p
= lock_user_string(arg2
)))
3524 ret
= get_errno(sys_unlinkat(arg1
, p
, arg3
));
3525 unlock_user(p
, arg2
, 0);
3528 case TARGET_NR_execve
:
3530 char **argp
, **envp
;
3533 abi_ulong guest_argp
;
3534 abi_ulong guest_envp
;
3540 for (gp
= guest_argp
; gp
; gp
+= sizeof(abi_ulong
)) {
3541 if (get_user_ual(addr
, gp
))
3549 for (gp
= guest_envp
; gp
; gp
+= sizeof(abi_ulong
)) {
3550 if (get_user_ual(addr
, gp
))
3557 argp
= alloca((argc
+ 1) * sizeof(void *));
3558 envp
= alloca((envc
+ 1) * sizeof(void *));
3560 for (gp
= guest_argp
, q
= argp
; gp
;
3561 gp
+= sizeof(abi_ulong
), q
++) {
3562 if (get_user_ual(addr
, gp
))
3566 if (!(*q
= lock_user_string(addr
)))
3571 for (gp
= guest_envp
, q
= envp
; gp
;
3572 gp
+= sizeof(abi_ulong
), q
++) {
3573 if (get_user_ual(addr
, gp
))
3577 if (!(*q
= lock_user_string(addr
)))
3582 if (!(p
= lock_user_string(arg1
)))
3584 ret
= get_errno(execve(p
, argp
, envp
));
3585 unlock_user(p
, arg1
, 0);
3590 ret
= -TARGET_EFAULT
;
3593 for (gp
= guest_argp
, q
= argp
; *q
;
3594 gp
+= sizeof(abi_ulong
), q
++) {
3595 if (get_user_ual(addr
, gp
)
3598 unlock_user(*q
, addr
, 0);
3600 for (gp
= guest_envp
, q
= envp
; *q
;
3601 gp
+= sizeof(abi_ulong
), q
++) {
3602 if (get_user_ual(addr
, gp
)
3605 unlock_user(*q
, addr
, 0);
3609 case TARGET_NR_chdir
:
3610 if (!(p
= lock_user_string(arg1
)))
3612 ret
= get_errno(chdir(p
));
3613 unlock_user(p
, arg1
, 0);
3615 #ifdef TARGET_NR_time
3616 case TARGET_NR_time
:
3619 ret
= get_errno(time(&host_time
));
3622 && put_user_sal(host_time
, arg1
))
3627 case TARGET_NR_mknod
:
3628 if (!(p
= lock_user_string(arg1
)))
3630 ret
= get_errno(mknod(p
, arg2
, arg3
));
3631 unlock_user(p
, arg1
, 0);
3633 #if defined(TARGET_NR_mknodat) && defined(__NR_mknodat)
3634 case TARGET_NR_mknodat
:
3635 if (!(p
= lock_user_string(arg2
)))
3637 ret
= get_errno(sys_mknodat(arg1
, p
, arg3
, arg4
));
3638 unlock_user(p
, arg2
, 0);
3641 case TARGET_NR_chmod
:
3642 if (!(p
= lock_user_string(arg1
)))
3644 ret
= get_errno(chmod(p
, arg2
));
3645 unlock_user(p
, arg1
, 0);
3647 #ifdef TARGET_NR_break
3648 case TARGET_NR_break
:
3651 #ifdef TARGET_NR_oldstat
3652 case TARGET_NR_oldstat
:
3655 case TARGET_NR_lseek
:
3656 ret
= get_errno(lseek(arg1
, arg2
, arg3
));
3658 #ifdef TARGET_NR_getxpid
3659 case TARGET_NR_getxpid
:
3661 case TARGET_NR_getpid
:
3663 ret
= get_errno(getpid());
3665 case TARGET_NR_mount
:
3667 /* need to look at the data field */
3669 p
= lock_user_string(arg1
);
3670 p2
= lock_user_string(arg2
);
3671 p3
= lock_user_string(arg3
);
3672 if (!p
|| !p2
|| !p3
)
3673 ret
= -TARGET_EFAULT
;
3675 /* FIXME - arg5 should be locked, but it isn't clear how to
3676 * do that since it's not guaranteed to be a NULL-terminated
3679 ret
= get_errno(mount(p
, p2
, p3
, (unsigned long)arg4
, g2h(arg5
)));
3680 unlock_user(p
, arg1
, 0);
3681 unlock_user(p2
, arg2
, 0);
3682 unlock_user(p3
, arg3
, 0);
3685 #ifdef TARGET_NR_umount
3686 case TARGET_NR_umount
:
3687 if (!(p
= lock_user_string(arg1
)))
3689 ret
= get_errno(umount(p
));
3690 unlock_user(p
, arg1
, 0);
3693 #ifdef TARGET_NR_stime /* not on alpha */
3694 case TARGET_NR_stime
:
3697 if (get_user_sal(host_time
, arg1
))
3699 ret
= get_errno(stime(&host_time
));
3703 case TARGET_NR_ptrace
:
3705 #ifdef TARGET_NR_alarm /* not on alpha */
3706 case TARGET_NR_alarm
:
3710 #ifdef TARGET_NR_oldfstat
3711 case TARGET_NR_oldfstat
:
3714 #ifdef TARGET_NR_pause /* not on alpha */
3715 case TARGET_NR_pause
:
3716 ret
= get_errno(pause());
3719 #ifdef TARGET_NR_utime
3720 case TARGET_NR_utime
:
3722 struct utimbuf tbuf
, *host_tbuf
;
3723 struct target_utimbuf
*target_tbuf
;
3725 if (!lock_user_struct(VERIFY_READ
, target_tbuf
, arg2
, 1))
3727 tbuf
.actime
= tswapl(target_tbuf
->actime
);
3728 tbuf
.modtime
= tswapl(target_tbuf
->modtime
);
3729 unlock_user_struct(target_tbuf
, arg2
, 0);
3734 if (!(p
= lock_user_string(arg1
)))
3736 ret
= get_errno(utime(p
, host_tbuf
));
3737 unlock_user(p
, arg1
, 0);
3741 case TARGET_NR_utimes
:
3743 struct timeval
*tvp
, tv
[2];
3745 if (copy_from_user_timeval(&tv
[0], arg2
)
3746 || copy_from_user_timeval(&tv
[1],
3747 arg2
+ sizeof(struct target_timeval
)))
3753 if (!(p
= lock_user_string(arg1
)))
3755 ret
= get_errno(utimes(p
, tvp
));
3756 unlock_user(p
, arg1
, 0);
3759 #if defined(TARGET_NR_futimesat) && defined(__NR_futimesat)
3760 case TARGET_NR_futimesat
:
3762 struct timeval
*tvp
, tv
[2];
3764 if (copy_from_user_timeval(&tv
[0], arg3
)
3765 || copy_from_user_timeval(&tv
[1],
3766 arg3
+ sizeof(struct target_timeval
)))
3772 if (!(p
= lock_user_string(arg2
)))
3774 ret
= get_errno(sys_futimesat(arg1
, path(p
), tvp
));
3775 unlock_user(p
, arg2
, 0);
3779 #ifdef TARGET_NR_stty
3780 case TARGET_NR_stty
:
3783 #ifdef TARGET_NR_gtty
3784 case TARGET_NR_gtty
:
3787 case TARGET_NR_access
:
3788 if (!(p
= lock_user_string(arg1
)))
3790 ret
= get_errno(access(p
, arg2
));
3791 unlock_user(p
, arg1
, 0);
3793 #if defined(TARGET_NR_faccessat) && defined(__NR_faccessat)
3794 case TARGET_NR_faccessat
:
3795 if (!(p
= lock_user_string(arg2
)))
3797 ret
= get_errno(sys_faccessat(arg1
, p
, arg3
, arg4
));
3798 unlock_user(p
, arg2
, 0);
3801 #ifdef TARGET_NR_nice /* not on alpha */
3802 case TARGET_NR_nice
:
3803 ret
= get_errno(nice(arg1
));
3806 #ifdef TARGET_NR_ftime
3807 case TARGET_NR_ftime
:
3810 case TARGET_NR_sync
:
3814 case TARGET_NR_kill
:
3815 ret
= get_errno(kill(arg1
, target_to_host_signal(arg2
)));
3817 case TARGET_NR_rename
:
3820 p
= lock_user_string(arg1
);
3821 p2
= lock_user_string(arg2
);
3823 ret
= -TARGET_EFAULT
;
3825 ret
= get_errno(rename(p
, p2
));
3826 unlock_user(p2
, arg2
, 0);
3827 unlock_user(p
, arg1
, 0);
3830 #if defined(TARGET_NR_renameat) && defined(__NR_renameat)
3831 case TARGET_NR_renameat
:
3834 p
= lock_user_string(arg2
);
3835 p2
= lock_user_string(arg4
);
3837 ret
= -TARGET_EFAULT
;
3839 ret
= get_errno(sys_renameat(arg1
, p
, arg3
, p2
));
3840 unlock_user(p2
, arg4
, 0);
3841 unlock_user(p
, arg2
, 0);
3845 case TARGET_NR_mkdir
:
3846 if (!(p
= lock_user_string(arg1
)))
3848 ret
= get_errno(mkdir(p
, arg2
));
3849 unlock_user(p
, arg1
, 0);
3851 #if defined(TARGET_NR_mkdirat) && defined(__NR_mkdirat)
3852 case TARGET_NR_mkdirat
:
3853 if (!(p
= lock_user_string(arg2
)))
3855 ret
= get_errno(sys_mkdirat(arg1
, p
, arg3
));
3856 unlock_user(p
, arg2
, 0);
3859 case TARGET_NR_rmdir
:
3860 if (!(p
= lock_user_string(arg1
)))
3862 ret
= get_errno(rmdir(p
));
3863 unlock_user(p
, arg1
, 0);
3866 ret
= get_errno(dup(arg1
));
3868 case TARGET_NR_pipe
:
3871 ret
= get_errno(pipe(host_pipe
));
3872 if (!is_error(ret
)) {
3873 #if defined(TARGET_MIPS)
3874 CPUMIPSState
*env
= (CPUMIPSState
*)cpu_env
;
3875 env
->active_tc
.gpr
[3] = host_pipe
[1];
3877 #elif defined(TARGET_SH4)
3878 ((CPUSH4State
*)cpu_env
)->gregs
[1] = host_pipe
[1];
3881 if (put_user_s32(host_pipe
[0], arg1
)
3882 || put_user_s32(host_pipe
[1], arg1
+ sizeof(host_pipe
[0])))
3888 case TARGET_NR_times
:
3890 struct target_tms
*tmsp
;
3892 ret
= get_errno(times(&tms
));
3894 tmsp
= lock_user(VERIFY_WRITE
, arg1
, sizeof(struct target_tms
), 0);
3897 tmsp
->tms_utime
= tswapl(host_to_target_clock_t(tms
.tms_utime
));
3898 tmsp
->tms_stime
= tswapl(host_to_target_clock_t(tms
.tms_stime
));
3899 tmsp
->tms_cutime
= tswapl(host_to_target_clock_t(tms
.tms_cutime
));
3900 tmsp
->tms_cstime
= tswapl(host_to_target_clock_t(tms
.tms_cstime
));
3903 ret
= host_to_target_clock_t(ret
);
3906 #ifdef TARGET_NR_prof
3907 case TARGET_NR_prof
:
3910 #ifdef TARGET_NR_signal
3911 case TARGET_NR_signal
:
3914 case TARGET_NR_acct
:
3915 if (!(p
= lock_user_string(arg1
)))
3917 ret
= get_errno(acct(path(p
)));
3918 unlock_user(p
, arg1
, 0);
3920 #ifdef TARGET_NR_umount2 /* not on alpha */
3921 case TARGET_NR_umount2
:
3922 if (!(p
= lock_user_string(arg1
)))
3924 ret
= get_errno(umount2(p
, arg2
));
3925 unlock_user(p
, arg1
, 0);
3928 #ifdef TARGET_NR_lock
3929 case TARGET_NR_lock
:
3932 case TARGET_NR_ioctl
:
3933 ret
= do_ioctl(arg1
, arg2
, arg3
);
3935 case TARGET_NR_fcntl
:
3936 ret
= do_fcntl(arg1
, arg2
, arg3
);
3938 #ifdef TARGET_NR_mpx
3942 case TARGET_NR_setpgid
:
3943 ret
= get_errno(setpgid(arg1
, arg2
));
3945 #ifdef TARGET_NR_ulimit
3946 case TARGET_NR_ulimit
:
3949 #ifdef TARGET_NR_oldolduname
3950 case TARGET_NR_oldolduname
:
3953 case TARGET_NR_umask
:
3954 ret
= get_errno(umask(arg1
));
3956 case TARGET_NR_chroot
:
3957 if (!(p
= lock_user_string(arg1
)))
3959 ret
= get_errno(chroot(p
));
3960 unlock_user(p
, arg1
, 0);
3962 case TARGET_NR_ustat
:
3964 case TARGET_NR_dup2
:
3965 ret
= get_errno(dup2(arg1
, arg2
));
3967 #ifdef TARGET_NR_getppid /* not on alpha */
3968 case TARGET_NR_getppid
:
3969 ret
= get_errno(getppid());
3972 case TARGET_NR_getpgrp
:
3973 ret
= get_errno(getpgrp());
3975 case TARGET_NR_setsid
:
3976 ret
= get_errno(setsid());
3978 #ifdef TARGET_NR_sigaction
3979 case TARGET_NR_sigaction
:
3981 #if !defined(TARGET_MIPS)
3982 struct target_old_sigaction
*old_act
;
3983 struct target_sigaction act
, oact
, *pact
;
3985 if (!lock_user_struct(VERIFY_READ
, old_act
, arg2
, 1))
3987 act
._sa_handler
= old_act
->_sa_handler
;
3988 target_siginitset(&act
.sa_mask
, old_act
->sa_mask
);
3989 act
.sa_flags
= old_act
->sa_flags
;
3990 act
.sa_restorer
= old_act
->sa_restorer
;
3991 unlock_user_struct(old_act
, arg2
, 0);
3996 ret
= get_errno(do_sigaction(arg1
, pact
, &oact
));
3997 if (!is_error(ret
) && arg3
) {
3998 if (!lock_user_struct(VERIFY_WRITE
, old_act
, arg3
, 0))
4000 old_act
->_sa_handler
= oact
._sa_handler
;
4001 old_act
->sa_mask
= oact
.sa_mask
.sig
[0];
4002 old_act
->sa_flags
= oact
.sa_flags
;
4003 old_act
->sa_restorer
= oact
.sa_restorer
;
4004 unlock_user_struct(old_act
, arg3
, 1);
4007 struct target_sigaction act
, oact
, *pact
, *old_act
;
4010 if (!lock_user_struct(VERIFY_READ
, old_act
, arg2
, 1))
4012 act
._sa_handler
= old_act
->_sa_handler
;
4013 target_siginitset(&act
.sa_mask
, old_act
->sa_mask
.sig
[0]);
4014 act
.sa_flags
= old_act
->sa_flags
;
4015 unlock_user_struct(old_act
, arg2
, 0);
4021 ret
= get_errno(do_sigaction(arg1
, pact
, &oact
));
4023 if (!is_error(ret
) && arg3
) {
4024 if (!lock_user_struct(VERIFY_WRITE
, old_act
, arg3
, 0))
4026 old_act
->_sa_handler
= oact
._sa_handler
;
4027 old_act
->sa_flags
= oact
.sa_flags
;
4028 old_act
->sa_mask
.sig
[0] = oact
.sa_mask
.sig
[0];
4029 old_act
->sa_mask
.sig
[1] = 0;
4030 old_act
->sa_mask
.sig
[2] = 0;
4031 old_act
->sa_mask
.sig
[3] = 0;
4032 unlock_user_struct(old_act
, arg3
, 1);
4038 case TARGET_NR_rt_sigaction
:
4040 struct target_sigaction
*act
;
4041 struct target_sigaction
*oact
;
4044 if (!lock_user_struct(VERIFY_READ
, act
, arg2
, 1))
4049 if (!lock_user_struct(VERIFY_WRITE
, oact
, arg3
, 0)) {
4050 ret
= -TARGET_EFAULT
;
4051 goto rt_sigaction_fail
;
4055 ret
= get_errno(do_sigaction(arg1
, act
, oact
));
4058 unlock_user_struct(act
, arg2
, 0);
4060 unlock_user_struct(oact
, arg3
, 1);
4063 #ifdef TARGET_NR_sgetmask /* not on alpha */
4064 case TARGET_NR_sgetmask
:
4067 abi_ulong target_set
;
4068 sigprocmask(0, NULL
, &cur_set
);
4069 host_to_target_old_sigset(&target_set
, &cur_set
);
4074 #ifdef TARGET_NR_ssetmask /* not on alpha */
4075 case TARGET_NR_ssetmask
:
4077 sigset_t set
, oset
, cur_set
;
4078 abi_ulong target_set
= arg1
;
4079 sigprocmask(0, NULL
, &cur_set
);
4080 target_to_host_old_sigset(&set
, &target_set
);
4081 sigorset(&set
, &set
, &cur_set
);
4082 sigprocmask(SIG_SETMASK
, &set
, &oset
);
4083 host_to_target_old_sigset(&target_set
, &oset
);
4088 #ifdef TARGET_NR_sigprocmask
4089 case TARGET_NR_sigprocmask
:
4092 sigset_t set
, oldset
, *set_ptr
;
4096 case TARGET_SIG_BLOCK
:
4099 case TARGET_SIG_UNBLOCK
:
4102 case TARGET_SIG_SETMASK
:
4106 ret
= -TARGET_EINVAL
;
4109 if (!(p
= lock_user(VERIFY_READ
, arg2
, sizeof(target_sigset_t
), 1)))
4111 target_to_host_old_sigset(&set
, p
);
4112 unlock_user(p
, arg2
, 0);
4118 ret
= get_errno(sigprocmask(arg1
, set_ptr
, &oldset
));
4119 if (!is_error(ret
) && arg3
) {
4120 if (!(p
= lock_user(VERIFY_WRITE
, arg3
, sizeof(target_sigset_t
), 0)))
4122 host_to_target_old_sigset(p
, &oldset
);
4123 unlock_user(p
, arg3
, sizeof(target_sigset_t
));
4128 case TARGET_NR_rt_sigprocmask
:
4131 sigset_t set
, oldset
, *set_ptr
;
4135 case TARGET_SIG_BLOCK
:
4138 case TARGET_SIG_UNBLOCK
:
4141 case TARGET_SIG_SETMASK
:
4145 ret
= -TARGET_EINVAL
;
4148 if (!(p
= lock_user(VERIFY_READ
, arg2
, sizeof(target_sigset_t
), 1)))
4150 target_to_host_sigset(&set
, p
);
4151 unlock_user(p
, arg2
, 0);
4157 ret
= get_errno(sigprocmask(how
, set_ptr
, &oldset
));
4158 if (!is_error(ret
) && arg3
) {
4159 if (!(p
= lock_user(VERIFY_WRITE
, arg3
, sizeof(target_sigset_t
), 0)))
4161 host_to_target_sigset(p
, &oldset
);
4162 unlock_user(p
, arg3
, sizeof(target_sigset_t
));
4166 #ifdef TARGET_NR_sigpending
4167 case TARGET_NR_sigpending
:
4170 ret
= get_errno(sigpending(&set
));
4171 if (!is_error(ret
)) {
4172 if (!(p
= lock_user(VERIFY_WRITE
, arg1
, sizeof(target_sigset_t
), 0)))
4174 host_to_target_old_sigset(p
, &set
);
4175 unlock_user(p
, arg1
, sizeof(target_sigset_t
));
4180 case TARGET_NR_rt_sigpending
:
4183 ret
= get_errno(sigpending(&set
));
4184 if (!is_error(ret
)) {
4185 if (!(p
= lock_user(VERIFY_WRITE
, arg1
, sizeof(target_sigset_t
), 0)))
4187 host_to_target_sigset(p
, &set
);
4188 unlock_user(p
, arg1
, sizeof(target_sigset_t
));
4192 #ifdef TARGET_NR_sigsuspend
4193 case TARGET_NR_sigsuspend
:
4196 if (!(p
= lock_user(VERIFY_READ
, arg1
, sizeof(target_sigset_t
), 1)))
4198 target_to_host_old_sigset(&set
, p
);
4199 unlock_user(p
, arg1
, 0);
4200 ret
= get_errno(sigsuspend(&set
));
4204 case TARGET_NR_rt_sigsuspend
:
4207 if (!(p
= lock_user(VERIFY_READ
, arg1
, sizeof(target_sigset_t
), 1)))
4209 target_to_host_sigset(&set
, p
);
4210 unlock_user(p
, arg1
, 0);
4211 ret
= get_errno(sigsuspend(&set
));
4214 case TARGET_NR_rt_sigtimedwait
:
4217 struct timespec uts
, *puts
;
4220 if (!(p
= lock_user(VERIFY_READ
, arg1
, sizeof(target_sigset_t
), 1)))
4222 target_to_host_sigset(&set
, p
);
4223 unlock_user(p
, arg1
, 0);
4226 target_to_host_timespec(puts
, arg3
);
4230 ret
= get_errno(sigtimedwait(&set
, &uinfo
, puts
));
4231 if (!is_error(ret
) && arg2
) {
4232 if (!(p
= lock_user(VERIFY_WRITE
, arg2
, sizeof(target_siginfo_t
), 0)))
4234 host_to_target_siginfo(p
, &uinfo
);
4235 unlock_user(p
, arg2
, sizeof(target_siginfo_t
));
4239 case TARGET_NR_rt_sigqueueinfo
:
4242 if (!(p
= lock_user(VERIFY_READ
, arg3
, sizeof(target_sigset_t
), 1)))
4244 target_to_host_siginfo(&uinfo
, p
);
4245 unlock_user(p
, arg1
, 0);
4246 ret
= get_errno(sys_rt_sigqueueinfo(arg1
, arg2
, &uinfo
));
4249 #ifdef TARGET_NR_sigreturn
4250 case TARGET_NR_sigreturn
:
4251 /* NOTE: ret is eax, so not transcoding must be done */
4252 ret
= do_sigreturn(cpu_env
);
4255 case TARGET_NR_rt_sigreturn
:
4256 /* NOTE: ret is eax, so not transcoding must be done */
4257 ret
= do_rt_sigreturn(cpu_env
);
4259 case TARGET_NR_sethostname
:
4260 if (!(p
= lock_user_string(arg1
)))
4262 ret
= get_errno(sethostname(p
, arg2
));
4263 unlock_user(p
, arg1
, 0);
4265 case TARGET_NR_setrlimit
:
4267 /* XXX: convert resource ? */
4268 int resource
= arg1
;
4269 struct target_rlimit
*target_rlim
;
4271 if (!lock_user_struct(VERIFY_READ
, target_rlim
, arg2
, 1))
4273 rlim
.rlim_cur
= tswapl(target_rlim
->rlim_cur
);
4274 rlim
.rlim_max
= tswapl(target_rlim
->rlim_max
);
4275 unlock_user_struct(target_rlim
, arg2
, 0);
4276 ret
= get_errno(setrlimit(resource
, &rlim
));
4279 case TARGET_NR_getrlimit
:
4281 /* XXX: convert resource ? */
4282 int resource
= arg1
;
4283 struct target_rlimit
*target_rlim
;
4286 ret
= get_errno(getrlimit(resource
, &rlim
));
4287 if (!is_error(ret
)) {
4288 if (!lock_user_struct(VERIFY_WRITE
, target_rlim
, arg2
, 0))
4290 rlim
.rlim_cur
= tswapl(target_rlim
->rlim_cur
);
4291 rlim
.rlim_max
= tswapl(target_rlim
->rlim_max
);
4292 unlock_user_struct(target_rlim
, arg2
, 1);
4296 case TARGET_NR_getrusage
:
4298 struct rusage rusage
;
4299 ret
= get_errno(getrusage(arg1
, &rusage
));
4300 if (!is_error(ret
)) {
4301 host_to_target_rusage(arg2
, &rusage
);
4305 case TARGET_NR_gettimeofday
:
4308 ret
= get_errno(gettimeofday(&tv
, NULL
));
4309 if (!is_error(ret
)) {
4310 if (copy_to_user_timeval(arg1
, &tv
))
4315 case TARGET_NR_settimeofday
:
4318 if (copy_from_user_timeval(&tv
, arg1
))
4320 ret
= get_errno(settimeofday(&tv
, NULL
));
4323 #ifdef TARGET_NR_select
4324 case TARGET_NR_select
:
4326 struct target_sel_arg_struct
*sel
;
4327 abi_ulong inp
, outp
, exp
, tvp
;
4330 if (!lock_user_struct(VERIFY_READ
, sel
, arg1
, 1))
4332 nsel
= tswapl(sel
->n
);
4333 inp
= tswapl(sel
->inp
);
4334 outp
= tswapl(sel
->outp
);
4335 exp
= tswapl(sel
->exp
);
4336 tvp
= tswapl(sel
->tvp
);
4337 unlock_user_struct(sel
, arg1
, 0);
4338 ret
= do_select(nsel
, inp
, outp
, exp
, tvp
);
4342 case TARGET_NR_symlink
:
4345 p
= lock_user_string(arg1
);
4346 p2
= lock_user_string(arg2
);
4348 ret
= -TARGET_EFAULT
;
4350 ret
= get_errno(symlink(p
, p2
));
4351 unlock_user(p2
, arg2
, 0);
4352 unlock_user(p
, arg1
, 0);
4355 #if defined(TARGET_NR_symlinkat) && defined(__NR_symlinkat)
4356 case TARGET_NR_symlinkat
:
4359 p
= lock_user_string(arg1
);
4360 p2
= lock_user_string(arg3
);
4362 ret
= -TARGET_EFAULT
;
4364 ret
= get_errno(sys_symlinkat(p
, arg2
, p2
));
4365 unlock_user(p2
, arg3
, 0);
4366 unlock_user(p
, arg1
, 0);
4370 #ifdef TARGET_NR_oldlstat
4371 case TARGET_NR_oldlstat
:
4374 case TARGET_NR_readlink
:
4377 p
= lock_user_string(arg1
);
4378 p2
= lock_user(VERIFY_WRITE
, arg2
, arg3
, 0);
4380 ret
= -TARGET_EFAULT
;
4382 ret
= get_errno(readlink(path(p
), p2
, arg3
));
4383 unlock_user(p2
, arg2
, ret
);
4384 unlock_user(p
, arg1
, 0);
4387 #if defined(TARGET_NR_readlinkat) && defined(__NR_readlinkat)
4388 case TARGET_NR_readlinkat
:
4391 p
= lock_user_string(arg2
);
4392 p2
= lock_user(VERIFY_WRITE
, arg3
, arg4
, 0);
4394 ret
= -TARGET_EFAULT
;
4396 ret
= get_errno(sys_readlinkat(arg1
, path(p
), p2
, arg4
));
4397 unlock_user(p2
, arg3
, ret
);
4398 unlock_user(p
, arg2
, 0);
4402 #ifdef TARGET_NR_uselib
4403 case TARGET_NR_uselib
:
4406 #ifdef TARGET_NR_swapon
4407 case TARGET_NR_swapon
:
4408 if (!(p
= lock_user_string(arg1
)))
4410 ret
= get_errno(swapon(p
, arg2
));
4411 unlock_user(p
, arg1
, 0);
4414 case TARGET_NR_reboot
:
4416 #ifdef TARGET_NR_readdir
4417 case TARGET_NR_readdir
:
4420 #ifdef TARGET_NR_mmap
4421 case TARGET_NR_mmap
:
4422 #if (defined(TARGET_I386) && defined(TARGET_ABI32)) || defined(TARGET_ARM) || defined(TARGET_M68K) || defined(TARGET_CRIS)
4425 abi_ulong v1
, v2
, v3
, v4
, v5
, v6
;
4426 if (!(v
= lock_user(VERIFY_READ
, arg1
, 6 * sizeof(abi_ulong
), 1)))
4434 unlock_user(v
, arg1
, 0);
4435 ret
= get_errno(target_mmap(v1
, v2
, v3
,
4436 target_to_host_bitmask(v4
, mmap_flags_tbl
),
4440 ret
= get_errno(target_mmap(arg1
, arg2
, arg3
,
4441 target_to_host_bitmask(arg4
, mmap_flags_tbl
),
4447 #ifdef TARGET_NR_mmap2
4448 case TARGET_NR_mmap2
:
4450 #define MMAP_SHIFT 12
4452 ret
= get_errno(target_mmap(arg1
, arg2
, arg3
,
4453 target_to_host_bitmask(arg4
, mmap_flags_tbl
),
4455 arg6
<< MMAP_SHIFT
));
4458 case TARGET_NR_munmap
:
4459 ret
= get_errno(target_munmap(arg1
, arg2
));
4461 case TARGET_NR_mprotect
:
4462 ret
= get_errno(target_mprotect(arg1
, arg2
, arg3
));
4464 #ifdef TARGET_NR_mremap
4465 case TARGET_NR_mremap
:
4466 ret
= get_errno(target_mremap(arg1
, arg2
, arg3
, arg4
, arg5
));
4469 /* ??? msync/mlock/munlock are broken for softmmu. */
4470 #ifdef TARGET_NR_msync
4471 case TARGET_NR_msync
:
4472 ret
= get_errno(msync(g2h(arg1
), arg2
, arg3
));
4475 #ifdef TARGET_NR_mlock
4476 case TARGET_NR_mlock
:
4477 ret
= get_errno(mlock(g2h(arg1
), arg2
));
4480 #ifdef TARGET_NR_munlock
4481 case TARGET_NR_munlock
:
4482 ret
= get_errno(munlock(g2h(arg1
), arg2
));
4485 #ifdef TARGET_NR_mlockall
4486 case TARGET_NR_mlockall
:
4487 ret
= get_errno(mlockall(arg1
));
4490 #ifdef TARGET_NR_munlockall
4491 case TARGET_NR_munlockall
:
4492 ret
= get_errno(munlockall());
4495 case TARGET_NR_truncate
:
4496 if (!(p
= lock_user_string(arg1
)))
4498 ret
= get_errno(truncate(p
, arg2
));
4499 unlock_user(p
, arg1
, 0);
4501 case TARGET_NR_ftruncate
:
4502 ret
= get_errno(ftruncate(arg1
, arg2
));
4504 case TARGET_NR_fchmod
:
4505 ret
= get_errno(fchmod(arg1
, arg2
));
4507 #if defined(TARGET_NR_fchmodat) && defined(__NR_fchmodat)
4508 case TARGET_NR_fchmodat
:
4509 if (!(p
= lock_user_string(arg2
)))
4511 ret
= get_errno(sys_fchmodat(arg1
, p
, arg3
, arg4
));
4512 unlock_user(p
, arg2
, 0);
4515 case TARGET_NR_getpriority
:
4516 /* libc does special remapping of the return value of
4517 * sys_getpriority() so it's just easiest to call
4518 * sys_getpriority() directly rather than through libc. */
4519 ret
= sys_getpriority(arg1
, arg2
);
4521 case TARGET_NR_setpriority
:
4522 ret
= get_errno(setpriority(arg1
, arg2
, arg3
));
4524 #ifdef TARGET_NR_profil
4525 case TARGET_NR_profil
:
4528 case TARGET_NR_statfs
:
4529 if (!(p
= lock_user_string(arg1
)))
4531 ret
= get_errno(statfs(path(p
), &stfs
));
4532 unlock_user(p
, arg1
, 0);
4534 if (!is_error(ret
)) {
4535 struct target_statfs
*target_stfs
;
4537 if (!lock_user_struct(VERIFY_WRITE
, target_stfs
, arg2
, 0))
4539 __put_user(stfs
.f_type
, &target_stfs
->f_type
);
4540 __put_user(stfs
.f_bsize
, &target_stfs
->f_bsize
);
4541 __put_user(stfs
.f_blocks
, &target_stfs
->f_blocks
);
4542 __put_user(stfs
.f_bfree
, &target_stfs
->f_bfree
);
4543 __put_user(stfs
.f_bavail
, &target_stfs
->f_bavail
);
4544 __put_user(stfs
.f_files
, &target_stfs
->f_files
);
4545 __put_user(stfs
.f_ffree
, &target_stfs
->f_ffree
);
4546 __put_user(stfs
.f_fsid
.__val
[0], &target_stfs
->f_fsid
.val
[0]);
4547 __put_user(stfs
.f_fsid
.__val
[1], &target_stfs
->f_fsid
.val
[1]);
4548 __put_user(stfs
.f_namelen
, &target_stfs
->f_namelen
);
4549 unlock_user_struct(target_stfs
, arg2
, 1);
4552 case TARGET_NR_fstatfs
:
4553 ret
= get_errno(fstatfs(arg1
, &stfs
));
4554 goto convert_statfs
;
4555 #ifdef TARGET_NR_statfs64
4556 case TARGET_NR_statfs64
:
4557 if (!(p
= lock_user_string(arg1
)))
4559 ret
= get_errno(statfs(path(p
), &stfs
));
4560 unlock_user(p
, arg1
, 0);
4562 if (!is_error(ret
)) {
4563 struct target_statfs64
*target_stfs
;
4565 if (!lock_user_struct(VERIFY_WRITE
, target_stfs
, arg3
, 0))
4567 __put_user(stfs
.f_type
, &target_stfs
->f_type
);
4568 __put_user(stfs
.f_bsize
, &target_stfs
->f_bsize
);
4569 __put_user(stfs
.f_blocks
, &target_stfs
->f_blocks
);
4570 __put_user(stfs
.f_bfree
, &target_stfs
->f_bfree
);
4571 __put_user(stfs
.f_bavail
, &target_stfs
->f_bavail
);
4572 __put_user(stfs
.f_files
, &target_stfs
->f_files
);
4573 __put_user(stfs
.f_ffree
, &target_stfs
->f_ffree
);
4574 __put_user(stfs
.f_fsid
.__val
[0], &target_stfs
->f_fsid
.val
[0]);
4575 __put_user(stfs
.f_fsid
.__val
[1], &target_stfs
->f_fsid
.val
[1]);
4576 __put_user(stfs
.f_namelen
, &target_stfs
->f_namelen
);
4577 unlock_user_struct(target_stfs
, arg3
, 1);
4580 case TARGET_NR_fstatfs64
:
4581 ret
= get_errno(fstatfs(arg1
, &stfs
));
4582 goto convert_statfs64
;
4584 #ifdef TARGET_NR_ioperm
4585 case TARGET_NR_ioperm
:
4588 #ifdef TARGET_NR_socketcall
4589 case TARGET_NR_socketcall
:
4590 ret
= do_socketcall(arg1
, arg2
);
4593 #ifdef TARGET_NR_accept
4594 case TARGET_NR_accept
:
4595 ret
= do_accept(arg1
, arg2
, arg3
);
4598 #ifdef TARGET_NR_bind
4599 case TARGET_NR_bind
:
4600 ret
= do_bind(arg1
, arg2
, arg3
);
4603 #ifdef TARGET_NR_connect
4604 case TARGET_NR_connect
:
4605 ret
= do_connect(arg1
, arg2
, arg3
);
4608 #ifdef TARGET_NR_getpeername
4609 case TARGET_NR_getpeername
:
4610 ret
= do_getpeername(arg1
, arg2
, arg3
);
4613 #ifdef TARGET_NR_getsockname
4614 case TARGET_NR_getsockname
:
4615 ret
= do_getsockname(arg1
, arg2
, arg3
);
4618 #ifdef TARGET_NR_getsockopt
4619 case TARGET_NR_getsockopt
:
4620 ret
= do_getsockopt(arg1
, arg2
, arg3
, arg4
, arg5
);
4623 #ifdef TARGET_NR_listen
4624 case TARGET_NR_listen
:
4625 ret
= get_errno(listen(arg1
, arg2
));
4628 #ifdef TARGET_NR_recv
4629 case TARGET_NR_recv
:
4630 ret
= do_recvfrom(arg1
, arg2
, arg3
, arg4
, 0, 0);
4633 #ifdef TARGET_NR_recvfrom
4634 case TARGET_NR_recvfrom
:
4635 ret
= do_recvfrom(arg1
, arg2
, arg3
, arg4
, arg5
, arg6
);
4638 #ifdef TARGET_NR_recvmsg
4639 case TARGET_NR_recvmsg
:
4640 ret
= do_sendrecvmsg(arg1
, arg2
, arg3
, 0);
4643 #ifdef TARGET_NR_send
4644 case TARGET_NR_send
:
4645 ret
= do_sendto(arg1
, arg2
, arg3
, arg4
, 0, 0);
4648 #ifdef TARGET_NR_sendmsg
4649 case TARGET_NR_sendmsg
:
4650 ret
= do_sendrecvmsg(arg1
, arg2
, arg3
, 1);
4653 #ifdef TARGET_NR_sendto
4654 case TARGET_NR_sendto
:
4655 ret
= do_sendto(arg1
, arg2
, arg3
, arg4
, arg5
, arg6
);
4658 #ifdef TARGET_NR_shutdown
4659 case TARGET_NR_shutdown
:
4660 ret
= get_errno(shutdown(arg1
, arg2
));
4663 #ifdef TARGET_NR_socket
4664 case TARGET_NR_socket
:
4665 ret
= do_socket(arg1
, arg2
, arg3
);
4668 #ifdef TARGET_NR_socketpair
4669 case TARGET_NR_socketpair
:
4670 ret
= do_socketpair(arg1
, arg2
, arg3
, arg4
);
4673 #ifdef TARGET_NR_setsockopt
4674 case TARGET_NR_setsockopt
:
4675 ret
= do_setsockopt(arg1
, arg2
, arg3
, arg4
, (socklen_t
) arg5
);
4679 case TARGET_NR_syslog
:
4680 if (!(p
= lock_user_string(arg2
)))
4682 ret
= get_errno(sys_syslog((int)arg1
, p
, (int)arg3
));
4683 unlock_user(p
, arg2
, 0);
4686 case TARGET_NR_setitimer
:
4688 struct itimerval value
, ovalue
, *pvalue
;
4692 if (copy_from_user_timeval(&pvalue
->it_interval
, arg2
)
4693 || copy_from_user_timeval(&pvalue
->it_value
,
4694 arg2
+ sizeof(struct target_timeval
)))
4699 ret
= get_errno(setitimer(arg1
, pvalue
, &ovalue
));
4700 if (!is_error(ret
) && arg3
) {
4701 if (copy_to_user_timeval(arg3
,
4702 &ovalue
.it_interval
)
4703 || copy_to_user_timeval(arg3
+ sizeof(struct target_timeval
),
4709 case TARGET_NR_getitimer
:
4711 struct itimerval value
;
4713 ret
= get_errno(getitimer(arg1
, &value
));
4714 if (!is_error(ret
) && arg2
) {
4715 if (copy_to_user_timeval(arg2
,
4717 || copy_to_user_timeval(arg2
+ sizeof(struct target_timeval
),
4723 case TARGET_NR_stat
:
4724 if (!(p
= lock_user_string(arg1
)))
4726 ret
= get_errno(stat(path(p
), &st
));
4727 unlock_user(p
, arg1
, 0);
4729 case TARGET_NR_lstat
:
4730 if (!(p
= lock_user_string(arg1
)))
4732 ret
= get_errno(lstat(path(p
), &st
));
4733 unlock_user(p
, arg1
, 0);
4735 case TARGET_NR_fstat
:
4737 ret
= get_errno(fstat(arg1
, &st
));
4739 if (!is_error(ret
)) {
4740 struct target_stat
*target_st
;
4742 if (!lock_user_struct(VERIFY_WRITE
, target_st
, arg2
, 0))
4744 __put_user(st
.st_dev
, &target_st
->st_dev
);
4745 __put_user(st
.st_ino
, &target_st
->st_ino
);
4746 __put_user(st
.st_mode
, &target_st
->st_mode
);
4747 __put_user(st
.st_uid
, &target_st
->st_uid
);
4748 __put_user(st
.st_gid
, &target_st
->st_gid
);
4749 __put_user(st
.st_nlink
, &target_st
->st_nlink
);
4750 __put_user(st
.st_rdev
, &target_st
->st_rdev
);
4751 __put_user(st
.st_size
, &target_st
->st_size
);
4752 __put_user(st
.st_blksize
, &target_st
->st_blksize
);
4753 __put_user(st
.st_blocks
, &target_st
->st_blocks
);
4754 __put_user(st
.st_atime
, &target_st
->target_st_atime
);
4755 __put_user(st
.st_mtime
, &target_st
->target_st_mtime
);
4756 __put_user(st
.st_ctime
, &target_st
->target_st_ctime
);
4757 unlock_user_struct(target_st
, arg2
, 1);
4761 #ifdef TARGET_NR_olduname
4762 case TARGET_NR_olduname
:
4765 #ifdef TARGET_NR_iopl
4766 case TARGET_NR_iopl
:
4769 case TARGET_NR_vhangup
:
4770 ret
= get_errno(vhangup());
4772 #ifdef TARGET_NR_idle
4773 case TARGET_NR_idle
:
4776 #ifdef TARGET_NR_syscall
4777 case TARGET_NR_syscall
:
4778 ret
= do_syscall(cpu_env
,arg1
& 0xffff,arg2
,arg3
,arg4
,arg5
,arg6
,0);
4781 case TARGET_NR_wait4
:
4784 abi_long status_ptr
= arg2
;
4785 struct rusage rusage
, *rusage_ptr
;
4786 abi_ulong target_rusage
= arg4
;
4788 rusage_ptr
= &rusage
;
4791 ret
= get_errno(wait4(arg1
, &status
, arg3
, rusage_ptr
));
4792 if (!is_error(ret
)) {
4794 if (put_user_s32(status
, status_ptr
))
4798 host_to_target_rusage(target_rusage
, &rusage
);
4802 #ifdef TARGET_NR_swapoff
4803 case TARGET_NR_swapoff
:
4804 if (!(p
= lock_user_string(arg1
)))
4806 ret
= get_errno(swapoff(p
));
4807 unlock_user(p
, arg1
, 0);
4810 case TARGET_NR_sysinfo
:
4812 struct target_sysinfo
*target_value
;
4813 struct sysinfo value
;
4814 ret
= get_errno(sysinfo(&value
));
4815 if (!is_error(ret
) && arg1
)
4817 if (!lock_user_struct(VERIFY_WRITE
, target_value
, arg1
, 0))
4819 __put_user(value
.uptime
, &target_value
->uptime
);
4820 __put_user(value
.loads
[0], &target_value
->loads
[0]);
4821 __put_user(value
.loads
[1], &target_value
->loads
[1]);
4822 __put_user(value
.loads
[2], &target_value
->loads
[2]);
4823 __put_user(value
.totalram
, &target_value
->totalram
);
4824 __put_user(value
.freeram
, &target_value
->freeram
);
4825 __put_user(value
.sharedram
, &target_value
->sharedram
);
4826 __put_user(value
.bufferram
, &target_value
->bufferram
);
4827 __put_user(value
.totalswap
, &target_value
->totalswap
);
4828 __put_user(value
.freeswap
, &target_value
->freeswap
);
4829 __put_user(value
.procs
, &target_value
->procs
);
4830 __put_user(value
.totalhigh
, &target_value
->totalhigh
);
4831 __put_user(value
.freehigh
, &target_value
->freehigh
);
4832 __put_user(value
.mem_unit
, &target_value
->mem_unit
);
4833 unlock_user_struct(target_value
, arg1
, 1);
4837 #ifdef TARGET_NR_ipc
4839 ret
= do_ipc(arg1
, arg2
, arg3
, arg4
, arg5
, arg6
);
4843 #ifdef TARGET_NR_msgctl
4844 case TARGET_NR_msgctl
:
4845 ret
= do_msgctl(arg1
, arg2
, arg3
);
4848 #ifdef TARGET_NR_msgget
4849 case TARGET_NR_msgget
:
4850 ret
= get_errno(msgget(arg1
, arg2
));
4853 #ifdef TARGET_NR_msgrcv
4854 case TARGET_NR_msgrcv
:
4855 ret
= do_msgrcv(arg1
, arg2
, arg3
, arg4
, arg5
);
4858 #ifdef TARGET_NR_msgsnd
4859 case TARGET_NR_msgsnd
:
4860 ret
= do_msgsnd(arg1
, arg2
, arg3
, arg4
);
4863 case TARGET_NR_fsync
:
4864 ret
= get_errno(fsync(arg1
));
4866 case TARGET_NR_clone
:
4867 #if defined(TARGET_SH4)
4868 ret
= get_errno(do_fork(cpu_env
, arg1
, arg2
, arg3
, arg5
, arg4
));
4870 ret
= get_errno(do_fork(cpu_env
, arg1
, arg2
, arg3
, arg4
, arg5
));
4873 #ifdef __NR_exit_group
4874 /* new thread calls */
4875 case TARGET_NR_exit_group
:
4879 gdb_exit(cpu_env
, arg1
);
4880 ret
= get_errno(exit_group(arg1
));
4883 case TARGET_NR_setdomainname
:
4884 if (!(p
= lock_user_string(arg1
)))
4886 ret
= get_errno(setdomainname(p
, arg2
));
4887 unlock_user(p
, arg1
, 0);
4889 case TARGET_NR_uname
:
4890 /* no need to transcode because we use the linux syscall */
4892 struct new_utsname
* buf
;
4894 if (!lock_user_struct(VERIFY_WRITE
, buf
, arg1
, 0))
4896 ret
= get_errno(sys_uname(buf
));
4897 if (!is_error(ret
)) {
4898 /* Overrite the native machine name with whatever is being
4900 strcpy (buf
->machine
, UNAME_MACHINE
);
4901 /* Allow the user to override the reported release. */
4902 if (qemu_uname_release
&& *qemu_uname_release
)
4903 strcpy (buf
->release
, qemu_uname_release
);
4905 unlock_user_struct(buf
, arg1
, 1);
4909 case TARGET_NR_modify_ldt
:
4910 ret
= do_modify_ldt(cpu_env
, arg1
, arg2
, arg3
);
4912 #if !defined(TARGET_X86_64)
4913 case TARGET_NR_vm86old
:
4915 case TARGET_NR_vm86
:
4916 ret
= do_vm86(cpu_env
, arg1
, arg2
);
4920 case TARGET_NR_adjtimex
:
4922 #ifdef TARGET_NR_create_module
4923 case TARGET_NR_create_module
:
4925 case TARGET_NR_init_module
:
4926 case TARGET_NR_delete_module
:
4927 #ifdef TARGET_NR_get_kernel_syms
4928 case TARGET_NR_get_kernel_syms
:
4931 case TARGET_NR_quotactl
:
4933 case TARGET_NR_getpgid
:
4934 ret
= get_errno(getpgid(arg1
));
4936 case TARGET_NR_fchdir
:
4937 ret
= get_errno(fchdir(arg1
));
4939 #ifdef TARGET_NR_bdflush /* not on x86_64 */
4940 case TARGET_NR_bdflush
:
4943 #ifdef TARGET_NR_sysfs
4944 case TARGET_NR_sysfs
:
4947 case TARGET_NR_personality
:
4948 ret
= get_errno(personality(arg1
));
4950 #ifdef TARGET_NR_afs_syscall
4951 case TARGET_NR_afs_syscall
:
4954 #ifdef TARGET_NR__llseek /* Not on alpha */
4955 case TARGET_NR__llseek
:
4957 #if defined (__x86_64__)
4958 ret
= get_errno(lseek(arg1
, ((uint64_t )arg2
<< 32) | arg3
, arg5
));
4959 if (put_user_s64(ret
, arg4
))
4963 ret
= get_errno(_llseek(arg1
, arg2
, arg3
, &res
, arg5
));
4964 if (put_user_s64(res
, arg4
))
4970 case TARGET_NR_getdents
:
4971 #if TARGET_ABI_BITS != 32
4973 #elif TARGET_ABI_BITS == 32 && HOST_LONG_BITS == 64
4975 struct target_dirent
*target_dirp
;
4976 struct linux_dirent
*dirp
;
4977 abi_long count
= arg3
;
4979 dirp
= malloc(count
);
4981 ret
= -TARGET_ENOMEM
;
4985 ret
= get_errno(sys_getdents(arg1
, dirp
, count
));
4986 if (!is_error(ret
)) {
4987 struct linux_dirent
*de
;
4988 struct target_dirent
*tde
;
4990 int reclen
, treclen
;
4991 int count1
, tnamelen
;
4995 if (!(target_dirp
= lock_user(VERIFY_WRITE
, arg2
, count
, 0)))
4999 reclen
= de
->d_reclen
;
5000 treclen
= reclen
- (2 * (sizeof(long) - sizeof(abi_long
)));
5001 tde
->d_reclen
= tswap16(treclen
);
5002 tde
->d_ino
= tswapl(de
->d_ino
);
5003 tde
->d_off
= tswapl(de
->d_off
);
5004 tnamelen
= treclen
- (2 * sizeof(abi_long
) + 2);
5007 /* XXX: may not be correct */
5008 pstrcpy(tde
->d_name
, tnamelen
, de
->d_name
);
5009 de
= (struct linux_dirent
*)((char *)de
+ reclen
);
5011 tde
= (struct target_dirent
*)((char *)tde
+ treclen
);
5015 unlock_user(target_dirp
, arg2
, ret
);
5021 struct linux_dirent
*dirp
;
5022 abi_long count
= arg3
;
5024 if (!(dirp
= lock_user(VERIFY_WRITE
, arg2
, count
, 0)))
5026 ret
= get_errno(sys_getdents(arg1
, dirp
, count
));
5027 if (!is_error(ret
)) {
5028 struct linux_dirent
*de
;
5033 reclen
= de
->d_reclen
;
5036 de
->d_reclen
= tswap16(reclen
);
5037 tswapls(&de
->d_ino
);
5038 tswapls(&de
->d_off
);
5039 de
= (struct linux_dirent
*)((char *)de
+ reclen
);
5043 unlock_user(dirp
, arg2
, ret
);
5047 #if defined(TARGET_NR_getdents64) && defined(__NR_getdents64)
5048 case TARGET_NR_getdents64
:
5050 struct linux_dirent64
*dirp
;
5051 abi_long count
= arg3
;
5052 if (!(dirp
= lock_user(VERIFY_WRITE
, arg2
, count
, 0)))
5054 ret
= get_errno(sys_getdents64(arg1
, dirp
, count
));
5055 if (!is_error(ret
)) {
5056 struct linux_dirent64
*de
;
5061 reclen
= de
->d_reclen
;
5064 de
->d_reclen
= tswap16(reclen
);
5065 tswap64s((uint64_t *)&de
->d_ino
);
5066 tswap64s((uint64_t *)&de
->d_off
);
5067 de
= (struct linux_dirent64
*)((char *)de
+ reclen
);
5071 unlock_user(dirp
, arg2
, ret
);
5074 #endif /* TARGET_NR_getdents64 */
5075 #ifdef TARGET_NR__newselect
5076 case TARGET_NR__newselect
:
5077 ret
= do_select(arg1
, arg2
, arg3
, arg4
, arg5
);
5080 #ifdef TARGET_NR_poll
5081 case TARGET_NR_poll
:
5083 struct target_pollfd
*target_pfd
;
5084 unsigned int nfds
= arg2
;
5089 target_pfd
= lock_user(VERIFY_WRITE
, arg1
, sizeof(struct target_pollfd
) * nfds
, 1);
5092 pfd
= alloca(sizeof(struct pollfd
) * nfds
);
5093 for(i
= 0; i
< nfds
; i
++) {
5094 pfd
[i
].fd
= tswap32(target_pfd
[i
].fd
);
5095 pfd
[i
].events
= tswap16(target_pfd
[i
].events
);
5097 ret
= get_errno(poll(pfd
, nfds
, timeout
));
5098 if (!is_error(ret
)) {
5099 for(i
= 0; i
< nfds
; i
++) {
5100 target_pfd
[i
].revents
= tswap16(pfd
[i
].revents
);
5102 ret
+= nfds
* (sizeof(struct target_pollfd
)
5103 - sizeof(struct pollfd
));
5105 unlock_user(target_pfd
, arg1
, ret
);
5109 case TARGET_NR_flock
:
5110 /* NOTE: the flock constant seems to be the same for every
5112 ret
= get_errno(flock(arg1
, arg2
));
5114 case TARGET_NR_readv
:
5119 vec
= alloca(count
* sizeof(struct iovec
));
5120 if (lock_iovec(VERIFY_WRITE
, vec
, arg2
, count
, 0) < 0)
5122 ret
= get_errno(readv(arg1
, vec
, count
));
5123 unlock_iovec(vec
, arg2
, count
, 1);
5126 case TARGET_NR_writev
:
5131 vec
= alloca(count
* sizeof(struct iovec
));
5132 if (lock_iovec(VERIFY_READ
, vec
, arg2
, count
, 1) < 0)
5134 ret
= get_errno(writev(arg1
, vec
, count
));
5135 unlock_iovec(vec
, arg2
, count
, 0);
5138 case TARGET_NR_getsid
:
5139 ret
= get_errno(getsid(arg1
));
5141 #if defined(TARGET_NR_fdatasync) /* Not on alpha (osf_datasync ?) */
5142 case TARGET_NR_fdatasync
:
5143 ret
= get_errno(fdatasync(arg1
));
5146 case TARGET_NR__sysctl
:
5147 /* We don't implement this, but ENOTDIR is always a safe
5149 ret
= -TARGET_ENOTDIR
;
5151 case TARGET_NR_sched_setparam
:
5153 struct sched_param
*target_schp
;
5154 struct sched_param schp
;
5156 if (!lock_user_struct(VERIFY_READ
, target_schp
, arg2
, 1))
5158 schp
.sched_priority
= tswap32(target_schp
->sched_priority
);
5159 unlock_user_struct(target_schp
, arg2
, 0);
5160 ret
= get_errno(sched_setparam(arg1
, &schp
));
5163 case TARGET_NR_sched_getparam
:
5165 struct sched_param
*target_schp
;
5166 struct sched_param schp
;
5167 ret
= get_errno(sched_getparam(arg1
, &schp
));
5168 if (!is_error(ret
)) {
5169 if (!lock_user_struct(VERIFY_WRITE
, target_schp
, arg2
, 0))
5171 target_schp
->sched_priority
= tswap32(schp
.sched_priority
);
5172 unlock_user_struct(target_schp
, arg2
, 1);
5176 case TARGET_NR_sched_setscheduler
:
5178 struct sched_param
*target_schp
;
5179 struct sched_param schp
;
5180 if (!lock_user_struct(VERIFY_READ
, target_schp
, arg3
, 1))
5182 schp
.sched_priority
= tswap32(target_schp
->sched_priority
);
5183 unlock_user_struct(target_schp
, arg3
, 0);
5184 ret
= get_errno(sched_setscheduler(arg1
, arg2
, &schp
));
5187 case TARGET_NR_sched_getscheduler
:
5188 ret
= get_errno(sched_getscheduler(arg1
));
5190 case TARGET_NR_sched_yield
:
5191 ret
= get_errno(sched_yield());
5193 case TARGET_NR_sched_get_priority_max
:
5194 ret
= get_errno(sched_get_priority_max(arg1
));
5196 case TARGET_NR_sched_get_priority_min
:
5197 ret
= get_errno(sched_get_priority_min(arg1
));
5199 case TARGET_NR_sched_rr_get_interval
:
5202 ret
= get_errno(sched_rr_get_interval(arg1
, &ts
));
5203 if (!is_error(ret
)) {
5204 host_to_target_timespec(arg2
, &ts
);
5208 case TARGET_NR_nanosleep
:
5210 struct timespec req
, rem
;
5211 target_to_host_timespec(&req
, arg1
);
5212 ret
= get_errno(nanosleep(&req
, &rem
));
5213 if (is_error(ret
) && arg2
) {
5214 host_to_target_timespec(arg2
, &rem
);
5218 #ifdef TARGET_NR_query_module
5219 case TARGET_NR_query_module
:
5222 #ifdef TARGET_NR_nfsservctl
5223 case TARGET_NR_nfsservctl
:
5226 case TARGET_NR_prctl
:
5229 case PR_GET_PDEATHSIG
:
5232 ret
= get_errno(prctl(arg1
, &deathsig
, arg3
, arg4
, arg5
));
5233 if (!is_error(ret
) && arg2
5234 && put_user_ual(deathsig
, arg2
))
5239 ret
= get_errno(prctl(arg1
, arg2
, arg3
, arg4
, arg5
));
5243 #ifdef TARGET_NR_arch_prctl
5244 case TARGET_NR_arch_prctl
:
5245 #if defined(TARGET_I386) && !defined(TARGET_ABI32)
5246 ret
= do_arch_prctl(cpu_env
, arg1
, arg2
);
5252 #ifdef TARGET_NR_pread
5253 case TARGET_NR_pread
:
5255 if (((CPUARMState
*)cpu_env
)->eabi
)
5258 if (!(p
= lock_user(VERIFY_WRITE
, arg2
, arg3
, 0)))
5260 ret
= get_errno(pread(arg1
, p
, arg3
, arg4
));
5261 unlock_user(p
, arg2
, ret
);
5263 case TARGET_NR_pwrite
:
5265 if (((CPUARMState
*)cpu_env
)->eabi
)
5268 if (!(p
= lock_user(VERIFY_READ
, arg2
, arg3
, 1)))
5270 ret
= get_errno(pwrite(arg1
, p
, arg3
, arg4
));
5271 unlock_user(p
, arg2
, 0);
5274 #ifdef TARGET_NR_pread64
5275 case TARGET_NR_pread64
:
5276 if (!(p
= lock_user(VERIFY_WRITE
, arg2
, arg3
, 0)))
5278 ret
= get_errno(pread64(arg1
, p
, arg3
, target_offset64(arg4
, arg5
)));
5279 unlock_user(p
, arg2
, ret
);
5281 case TARGET_NR_pwrite64
:
5282 if (!(p
= lock_user(VERIFY_READ
, arg2
, arg3
, 1)))
5284 ret
= get_errno(pwrite64(arg1
, p
, arg3
, target_offset64(arg4
, arg5
)));
5285 unlock_user(p
, arg2
, 0);
5288 case TARGET_NR_getcwd
:
5289 if (!(p
= lock_user(VERIFY_WRITE
, arg1
, arg2
, 0)))
5291 ret
= get_errno(sys_getcwd1(p
, arg2
));
5292 unlock_user(p
, arg1
, ret
);
5294 case TARGET_NR_capget
:
5296 case TARGET_NR_capset
:
5298 case TARGET_NR_sigaltstack
:
5299 #if defined(TARGET_I386) || defined(TARGET_ARM) || defined(TARGET_MIPS) || \
5300 defined(TARGET_SPARC) || defined(TARGET_PPC) || defined(TARGET_ALPHA)
5301 ret
= do_sigaltstack(arg1
, arg2
, get_sp_from_cpustate((CPUState
*)cpu_env
));
5306 case TARGET_NR_sendfile
:
5308 #ifdef TARGET_NR_getpmsg
5309 case TARGET_NR_getpmsg
:
5312 #ifdef TARGET_NR_putpmsg
5313 case TARGET_NR_putpmsg
:
5316 #ifdef TARGET_NR_vfork
5317 case TARGET_NR_vfork
:
5318 ret
= get_errno(do_fork(cpu_env
, CLONE_VFORK
| CLONE_VM
| SIGCHLD
,
5322 #ifdef TARGET_NR_ugetrlimit
5323 case TARGET_NR_ugetrlimit
:
5326 ret
= get_errno(getrlimit(arg1
, &rlim
));
5327 if (!is_error(ret
)) {
5328 struct target_rlimit
*target_rlim
;
5329 if (!lock_user_struct(VERIFY_WRITE
, target_rlim
, arg2
, 0))
5331 target_rlim
->rlim_cur
= tswapl(rlim
.rlim_cur
);
5332 target_rlim
->rlim_max
= tswapl(rlim
.rlim_max
);
5333 unlock_user_struct(target_rlim
, arg2
, 1);
5338 #ifdef TARGET_NR_truncate64
5339 case TARGET_NR_truncate64
:
5340 if (!(p
= lock_user_string(arg1
)))
5342 ret
= target_truncate64(cpu_env
, p
, arg2
, arg3
, arg4
);
5343 unlock_user(p
, arg1
, 0);
5346 #ifdef TARGET_NR_ftruncate64
5347 case TARGET_NR_ftruncate64
:
5348 ret
= target_ftruncate64(cpu_env
, arg1
, arg2
, arg3
, arg4
);
5351 #ifdef TARGET_NR_stat64
5352 case TARGET_NR_stat64
:
5353 if (!(p
= lock_user_string(arg1
)))
5355 ret
= get_errno(stat(path(p
), &st
));
5356 unlock_user(p
, arg1
, 0);
5358 ret
= host_to_target_stat64(cpu_env
, arg2
, &st
);
5361 #ifdef TARGET_NR_lstat64
5362 case TARGET_NR_lstat64
:
5363 if (!(p
= lock_user_string(arg1
)))
5365 ret
= get_errno(lstat(path(p
), &st
));
5366 unlock_user(p
, arg1
, 0);
5368 ret
= host_to_target_stat64(cpu_env
, arg2
, &st
);
5371 #ifdef TARGET_NR_fstat64
5372 case TARGET_NR_fstat64
:
5373 ret
= get_errno(fstat(arg1
, &st
));
5375 ret
= host_to_target_stat64(cpu_env
, arg2
, &st
);
5378 #if defined(TARGET_NR_fstatat64) && defined(__NR_fstatat64)
5379 case TARGET_NR_fstatat64
:
5380 if (!(p
= lock_user_string(arg2
)))
5382 ret
= get_errno(sys_fstatat64(arg1
, path(p
), &st
, arg4
));
5384 ret
= host_to_target_stat64(cpu_env
, arg3
, &st
);
5388 case TARGET_NR_lchown
:
5389 if (!(p
= lock_user_string(arg1
)))
5391 ret
= get_errno(lchown(p
, low2highuid(arg2
), low2highgid(arg3
)));
5392 unlock_user(p
, arg1
, 0);
5394 case TARGET_NR_getuid
:
5395 ret
= get_errno(high2lowuid(getuid()));
5397 case TARGET_NR_getgid
:
5398 ret
= get_errno(high2lowgid(getgid()));
5400 case TARGET_NR_geteuid
:
5401 ret
= get_errno(high2lowuid(geteuid()));
5403 case TARGET_NR_getegid
:
5404 ret
= get_errno(high2lowgid(getegid()));
5406 case TARGET_NR_setreuid
:
5407 ret
= get_errno(setreuid(low2highuid(arg1
), low2highuid(arg2
)));
5409 case TARGET_NR_setregid
:
5410 ret
= get_errno(setregid(low2highgid(arg1
), low2highgid(arg2
)));
5412 case TARGET_NR_getgroups
:
5414 int gidsetsize
= arg1
;
5415 uint16_t *target_grouplist
;
5419 grouplist
= alloca(gidsetsize
* sizeof(gid_t
));
5420 ret
= get_errno(getgroups(gidsetsize
, grouplist
));
5421 if (gidsetsize
== 0)
5423 if (!is_error(ret
)) {
5424 target_grouplist
= lock_user(VERIFY_WRITE
, arg2
, gidsetsize
* 2, 0);
5425 if (!target_grouplist
)
5427 for(i
= 0;i
< ret
; i
++)
5428 target_grouplist
[i
] = tswap16(grouplist
[i
]);
5429 unlock_user(target_grouplist
, arg2
, gidsetsize
* 2);
5433 case TARGET_NR_setgroups
:
5435 int gidsetsize
= arg1
;
5436 uint16_t *target_grouplist
;
5440 grouplist
= alloca(gidsetsize
* sizeof(gid_t
));
5441 target_grouplist
= lock_user(VERIFY_READ
, arg2
, gidsetsize
* 2, 1);
5442 if (!target_grouplist
) {
5443 ret
= -TARGET_EFAULT
;
5446 for(i
= 0;i
< gidsetsize
; i
++)
5447 grouplist
[i
] = tswap16(target_grouplist
[i
]);
5448 unlock_user(target_grouplist
, arg2
, 0);
5449 ret
= get_errno(setgroups(gidsetsize
, grouplist
));
5452 case TARGET_NR_fchown
:
5453 ret
= get_errno(fchown(arg1
, low2highuid(arg2
), low2highgid(arg3
)));
5455 #if defined(TARGET_NR_fchownat) && defined(__NR_fchownat)
5456 case TARGET_NR_fchownat
:
5457 if (!(p
= lock_user_string(arg2
)))
5459 ret
= get_errno(sys_fchownat(arg1
, p
, low2highuid(arg3
), low2highgid(arg4
), arg5
));
5460 unlock_user(p
, arg2
, 0);
5463 #ifdef TARGET_NR_setresuid
5464 case TARGET_NR_setresuid
:
5465 ret
= get_errno(setresuid(low2highuid(arg1
),
5467 low2highuid(arg3
)));
5470 #ifdef TARGET_NR_getresuid
5471 case TARGET_NR_getresuid
:
5473 uid_t ruid
, euid
, suid
;
5474 ret
= get_errno(getresuid(&ruid
, &euid
, &suid
));
5475 if (!is_error(ret
)) {
5476 if (put_user_u16(high2lowuid(ruid
), arg1
)
5477 || put_user_u16(high2lowuid(euid
), arg2
)
5478 || put_user_u16(high2lowuid(suid
), arg3
))
5484 #ifdef TARGET_NR_getresgid
5485 case TARGET_NR_setresgid
:
5486 ret
= get_errno(setresgid(low2highgid(arg1
),
5488 low2highgid(arg3
)));
5491 #ifdef TARGET_NR_getresgid
5492 case TARGET_NR_getresgid
:
5494 gid_t rgid
, egid
, sgid
;
5495 ret
= get_errno(getresgid(&rgid
, &egid
, &sgid
));
5496 if (!is_error(ret
)) {
5497 if (put_user_u16(high2lowgid(rgid
), arg1
)
5498 || put_user_u16(high2lowgid(egid
), arg2
)
5499 || put_user_u16(high2lowgid(sgid
), arg3
))
5505 case TARGET_NR_chown
:
5506 if (!(p
= lock_user_string(arg1
)))
5508 ret
= get_errno(chown(p
, low2highuid(arg2
), low2highgid(arg3
)));
5509 unlock_user(p
, arg1
, 0);
5511 case TARGET_NR_setuid
:
5512 ret
= get_errno(setuid(low2highuid(arg1
)));
5514 case TARGET_NR_setgid
:
5515 ret
= get_errno(setgid(low2highgid(arg1
)));
5517 case TARGET_NR_setfsuid
:
5518 ret
= get_errno(setfsuid(arg1
));
5520 case TARGET_NR_setfsgid
:
5521 ret
= get_errno(setfsgid(arg1
));
5523 #endif /* USE_UID16 */
5525 #ifdef TARGET_NR_lchown32
5526 case TARGET_NR_lchown32
:
5527 if (!(p
= lock_user_string(arg1
)))
5529 ret
= get_errno(lchown(p
, arg2
, arg3
));
5530 unlock_user(p
, arg1
, 0);
5533 #ifdef TARGET_NR_getuid32
5534 case TARGET_NR_getuid32
:
5535 ret
= get_errno(getuid());
5539 #if defined(TARGET_NR_getxuid) && defined(TARGET_ALPHA)
5540 /* Alpha specific */
5541 case TARGET_NR_getxuid
:
5545 ((CPUAlphaState
*)cpu_env
)->ir
[IR_A4
]=euid
;
5547 ret
= get_errno(getuid());
5550 #if defined(TARGET_NR_getxgid) && defined(TARGET_ALPHA)
5551 /* Alpha specific */
5552 case TARGET_NR_getxgid
:
5556 ((CPUAlphaState
*)cpu_env
)->ir
[IR_A4
]=egid
;
5558 ret
= get_errno(getgid());
5562 #ifdef TARGET_NR_getgid32
5563 case TARGET_NR_getgid32
:
5564 ret
= get_errno(getgid());
5567 #ifdef TARGET_NR_geteuid32
5568 case TARGET_NR_geteuid32
:
5569 ret
= get_errno(geteuid());
5572 #ifdef TARGET_NR_getegid32
5573 case TARGET_NR_getegid32
:
5574 ret
= get_errno(getegid());
5577 #ifdef TARGET_NR_setreuid32
5578 case TARGET_NR_setreuid32
:
5579 ret
= get_errno(setreuid(arg1
, arg2
));
5582 #ifdef TARGET_NR_setregid32
5583 case TARGET_NR_setregid32
:
5584 ret
= get_errno(setregid(arg1
, arg2
));
5587 #ifdef TARGET_NR_getgroups32
5588 case TARGET_NR_getgroups32
:
5590 int gidsetsize
= arg1
;
5591 uint32_t *target_grouplist
;
5595 grouplist
= alloca(gidsetsize
* sizeof(gid_t
));
5596 ret
= get_errno(getgroups(gidsetsize
, grouplist
));
5597 if (gidsetsize
== 0)
5599 if (!is_error(ret
)) {
5600 target_grouplist
= lock_user(VERIFY_WRITE
, arg2
, gidsetsize
* 4, 0);
5601 if (!target_grouplist
) {
5602 ret
= -TARGET_EFAULT
;
5605 for(i
= 0;i
< ret
; i
++)
5606 target_grouplist
[i
] = tswap32(grouplist
[i
]);
5607 unlock_user(target_grouplist
, arg2
, gidsetsize
* 4);
5612 #ifdef TARGET_NR_setgroups32
5613 case TARGET_NR_setgroups32
:
5615 int gidsetsize
= arg1
;
5616 uint32_t *target_grouplist
;
5620 grouplist
= alloca(gidsetsize
* sizeof(gid_t
));
5621 target_grouplist
= lock_user(VERIFY_READ
, arg2
, gidsetsize
* 4, 1);
5622 if (!target_grouplist
) {
5623 ret
= -TARGET_EFAULT
;
5626 for(i
= 0;i
< gidsetsize
; i
++)
5627 grouplist
[i
] = tswap32(target_grouplist
[i
]);
5628 unlock_user(target_grouplist
, arg2
, 0);
5629 ret
= get_errno(setgroups(gidsetsize
, grouplist
));
5633 #ifdef TARGET_NR_fchown32
5634 case TARGET_NR_fchown32
:
5635 ret
= get_errno(fchown(arg1
, arg2
, arg3
));
5638 #ifdef TARGET_NR_setresuid32
5639 case TARGET_NR_setresuid32
:
5640 ret
= get_errno(setresuid(arg1
, arg2
, arg3
));
5643 #ifdef TARGET_NR_getresuid32
5644 case TARGET_NR_getresuid32
:
5646 uid_t ruid
, euid
, suid
;
5647 ret
= get_errno(getresuid(&ruid
, &euid
, &suid
));
5648 if (!is_error(ret
)) {
5649 if (put_user_u32(ruid
, arg1
)
5650 || put_user_u32(euid
, arg2
)
5651 || put_user_u32(suid
, arg3
))
5657 #ifdef TARGET_NR_setresgid32
5658 case TARGET_NR_setresgid32
:
5659 ret
= get_errno(setresgid(arg1
, arg2
, arg3
));
5662 #ifdef TARGET_NR_getresgid32
5663 case TARGET_NR_getresgid32
:
5665 gid_t rgid
, egid
, sgid
;
5666 ret
= get_errno(getresgid(&rgid
, &egid
, &sgid
));
5667 if (!is_error(ret
)) {
5668 if (put_user_u32(rgid
, arg1
)
5669 || put_user_u32(egid
, arg2
)
5670 || put_user_u32(sgid
, arg3
))
5676 #ifdef TARGET_NR_chown32
5677 case TARGET_NR_chown32
:
5678 if (!(p
= lock_user_string(arg1
)))
5680 ret
= get_errno(chown(p
, arg2
, arg3
));
5681 unlock_user(p
, arg1
, 0);
5684 #ifdef TARGET_NR_setuid32
5685 case TARGET_NR_setuid32
:
5686 ret
= get_errno(setuid(arg1
));
5689 #ifdef TARGET_NR_setgid32
5690 case TARGET_NR_setgid32
:
5691 ret
= get_errno(setgid(arg1
));
5694 #ifdef TARGET_NR_setfsuid32
5695 case TARGET_NR_setfsuid32
:
5696 ret
= get_errno(setfsuid(arg1
));
5699 #ifdef TARGET_NR_setfsgid32
5700 case TARGET_NR_setfsgid32
:
5701 ret
= get_errno(setfsgid(arg1
));
5705 case TARGET_NR_pivot_root
:
5707 #ifdef TARGET_NR_mincore
5708 case TARGET_NR_mincore
:
5711 ret
= -TARGET_EFAULT
;
5712 if (!(a
= lock_user(VERIFY_READ
, arg1
,arg2
, 0)))
5714 if (!(p
= lock_user_string(arg3
)))
5716 ret
= get_errno(mincore(a
, arg2
, p
));
5717 unlock_user(p
, arg3
, ret
);
5719 unlock_user(a
, arg1
, 0);
5723 #ifdef TARGET_NR_arm_fadvise64_64
5724 case TARGET_NR_arm_fadvise64_64
:
5727 * arm_fadvise64_64 looks like fadvise64_64 but
5728 * with different argument order
5736 #if defined(TARGET_NR_fadvise64_64) || defined(TARGET_NR_arm_fadvise64_64)
5737 #ifdef TARGET_NR_fadvise64_64
5738 case TARGET_NR_fadvise64_64
:
5740 /* This is a hint, so ignoring and returning success is ok. */
5744 #ifdef TARGET_NR_madvise
5745 case TARGET_NR_madvise
:
5746 /* A straight passthrough may not be safe because qemu sometimes
5747 turns private flie-backed mappings into anonymous mappings.
5748 This will break MADV_DONTNEED.
5749 This is a hint, so ignoring and returning success is ok. */
5753 #if TARGET_ABI_BITS == 32
5754 case TARGET_NR_fcntl64
:
5758 struct target_flock64
*target_fl
;
5760 struct target_eabi_flock64
*target_efl
;
5764 case TARGET_F_GETLK64
:
5767 case TARGET_F_SETLK64
:
5770 case TARGET_F_SETLKW64
:
5779 case TARGET_F_GETLK64
:
5781 if (((CPUARMState
*)cpu_env
)->eabi
) {
5782 if (!lock_user_struct(VERIFY_READ
, target_efl
, arg3
, 1))
5784 fl
.l_type
= tswap16(target_efl
->l_type
);
5785 fl
.l_whence
= tswap16(target_efl
->l_whence
);
5786 fl
.l_start
= tswap64(target_efl
->l_start
);
5787 fl
.l_len
= tswap64(target_efl
->l_len
);
5788 fl
.l_pid
= tswapl(target_efl
->l_pid
);
5789 unlock_user_struct(target_efl
, arg3
, 0);
5793 if (!lock_user_struct(VERIFY_READ
, target_fl
, arg3
, 1))
5795 fl
.l_type
= tswap16(target_fl
->l_type
);
5796 fl
.l_whence
= tswap16(target_fl
->l_whence
);
5797 fl
.l_start
= tswap64(target_fl
->l_start
);
5798 fl
.l_len
= tswap64(target_fl
->l_len
);
5799 fl
.l_pid
= tswapl(target_fl
->l_pid
);
5800 unlock_user_struct(target_fl
, arg3
, 0);
5802 ret
= get_errno(fcntl(arg1
, cmd
, &fl
));
5805 if (((CPUARMState
*)cpu_env
)->eabi
) {
5806 if (!lock_user_struct(VERIFY_WRITE
, target_efl
, arg3
, 0))
5808 target_efl
->l_type
= tswap16(fl
.l_type
);
5809 target_efl
->l_whence
= tswap16(fl
.l_whence
);
5810 target_efl
->l_start
= tswap64(fl
.l_start
);
5811 target_efl
->l_len
= tswap64(fl
.l_len
);
5812 target_efl
->l_pid
= tswapl(fl
.l_pid
);
5813 unlock_user_struct(target_efl
, arg3
, 1);
5817 if (!lock_user_struct(VERIFY_WRITE
, target_fl
, arg3
, 0))
5819 target_fl
->l_type
= tswap16(fl
.l_type
);
5820 target_fl
->l_whence
= tswap16(fl
.l_whence
);
5821 target_fl
->l_start
= tswap64(fl
.l_start
);
5822 target_fl
->l_len
= tswap64(fl
.l_len
);
5823 target_fl
->l_pid
= tswapl(fl
.l_pid
);
5824 unlock_user_struct(target_fl
, arg3
, 1);
5829 case TARGET_F_SETLK64
:
5830 case TARGET_F_SETLKW64
:
5832 if (((CPUARMState
*)cpu_env
)->eabi
) {
5833 if (!lock_user_struct(VERIFY_READ
, target_efl
, arg3
, 1))
5835 fl
.l_type
= tswap16(target_efl
->l_type
);
5836 fl
.l_whence
= tswap16(target_efl
->l_whence
);
5837 fl
.l_start
= tswap64(target_efl
->l_start
);
5838 fl
.l_len
= tswap64(target_efl
->l_len
);
5839 fl
.l_pid
= tswapl(target_efl
->l_pid
);
5840 unlock_user_struct(target_efl
, arg3
, 0);
5844 if (!lock_user_struct(VERIFY_READ
, target_fl
, arg3
, 1))
5846 fl
.l_type
= tswap16(target_fl
->l_type
);
5847 fl
.l_whence
= tswap16(target_fl
->l_whence
);
5848 fl
.l_start
= tswap64(target_fl
->l_start
);
5849 fl
.l_len
= tswap64(target_fl
->l_len
);
5850 fl
.l_pid
= tswapl(target_fl
->l_pid
);
5851 unlock_user_struct(target_fl
, arg3
, 0);
5853 ret
= get_errno(fcntl(arg1
, cmd
, &fl
));
5856 ret
= do_fcntl(arg1
, cmd
, arg3
);
5862 #ifdef TARGET_NR_cacheflush
5863 case TARGET_NR_cacheflush
:
5864 /* self-modifying code is handled automatically, so nothing needed */
5868 #ifdef TARGET_NR_security
5869 case TARGET_NR_security
:
5872 #ifdef TARGET_NR_getpagesize
5873 case TARGET_NR_getpagesize
:
5874 ret
= TARGET_PAGE_SIZE
;
5877 case TARGET_NR_gettid
:
5878 ret
= get_errno(gettid());
5880 #ifdef TARGET_NR_readahead
5881 case TARGET_NR_readahead
:
5882 #if TARGET_ABI_BITS == 32
5884 if (((CPUARMState
*)cpu_env
)->eabi
)
5891 ret
= get_errno(readahead(arg1
, ((off64_t
)arg3
<< 32) | arg2
, arg4
));
5893 ret
= get_errno(readahead(arg1
, arg2
, arg3
));
5897 #ifdef TARGET_NR_setxattr
5898 case TARGET_NR_setxattr
:
5899 case TARGET_NR_lsetxattr
:
5900 case TARGET_NR_fsetxattr
:
5901 case TARGET_NR_getxattr
:
5902 case TARGET_NR_lgetxattr
:
5903 case TARGET_NR_fgetxattr
:
5904 case TARGET_NR_listxattr
:
5905 case TARGET_NR_llistxattr
:
5906 case TARGET_NR_flistxattr
:
5907 case TARGET_NR_removexattr
:
5908 case TARGET_NR_lremovexattr
:
5909 case TARGET_NR_fremovexattr
:
5910 goto unimplemented_nowarn
;
5912 #ifdef TARGET_NR_set_thread_area
5913 case TARGET_NR_set_thread_area
:
5914 #if defined(TARGET_MIPS)
5915 ((CPUMIPSState
*) cpu_env
)->tls_value
= arg1
;
5918 #elif defined(TARGET_I386) && defined(TARGET_ABI32)
5919 ret
= do_set_thread_area(cpu_env
, arg1
);
5922 goto unimplemented_nowarn
;
5925 #ifdef TARGET_NR_get_thread_area
5926 case TARGET_NR_get_thread_area
:
5927 #if defined(TARGET_I386) && defined(TARGET_ABI32)
5928 ret
= do_get_thread_area(cpu_env
, arg1
);
5930 goto unimplemented_nowarn
;
5933 #ifdef TARGET_NR_getdomainname
5934 case TARGET_NR_getdomainname
:
5935 goto unimplemented_nowarn
;
5938 #ifdef TARGET_NR_clock_gettime
5939 case TARGET_NR_clock_gettime
:
5942 ret
= get_errno(clock_gettime(arg1
, &ts
));
5943 if (!is_error(ret
)) {
5944 host_to_target_timespec(arg2
, &ts
);
5949 #ifdef TARGET_NR_clock_getres
5950 case TARGET_NR_clock_getres
:
5953 ret
= get_errno(clock_getres(arg1
, &ts
));
5954 if (!is_error(ret
)) {
5955 host_to_target_timespec(arg2
, &ts
);
5960 #ifdef TARGET_NR_clock_nanosleep
5961 case TARGET_NR_clock_nanosleep
:
5964 target_to_host_timespec(&ts
, arg3
);
5965 ret
= get_errno(clock_nanosleep(arg1
, arg2
, &ts
, arg4
? &ts
: NULL
));
5967 host_to_target_timespec(arg4
, &ts
);
5972 #if defined(TARGET_NR_set_tid_address) && defined(__NR_set_tid_address)
5973 case TARGET_NR_set_tid_address
:
5974 ret
= get_errno(set_tid_address((int *)g2h(arg1
)));
5978 #if defined(TARGET_NR_tkill) && defined(__NR_tkill)
5979 case TARGET_NR_tkill
:
5980 ret
= get_errno(sys_tkill((int)arg1
, target_to_host_signal(arg2
)));
5984 #if defined(TARGET_NR_tgkill) && defined(__NR_tgkill)
5985 case TARGET_NR_tgkill
:
5986 ret
= get_errno(sys_tgkill((int)arg1
, (int)arg2
,
5987 target_to_host_signal(arg3
)));
5991 #ifdef TARGET_NR_set_robust_list
5992 case TARGET_NR_set_robust_list
:
5993 goto unimplemented_nowarn
;
5996 #if defined(TARGET_NR_utimensat) && defined(__NR_utimensat)
5997 case TARGET_NR_utimensat
:
5999 struct timespec ts
[2];
6000 target_to_host_timespec(ts
, arg3
);
6001 target_to_host_timespec(ts
+1, arg3
+sizeof(struct target_timespec
));
6003 ret
= get_errno(sys_utimensat(arg1
, NULL
, ts
, arg4
));
6005 if (!(p
= lock_user_string(arg2
))) {
6006 ret
= -TARGET_EFAULT
;
6009 ret
= get_errno(sys_utimensat(arg1
, path(p
), ts
, arg4
));
6010 unlock_user(p
, arg2
, 0);
6015 #if defined(USE_NPTL)
6016 case TARGET_NR_futex
:
6017 ret
= do_futex(arg1
, arg2
, arg3
, arg4
, arg5
, arg6
);
6020 #ifdef TARGET_NR_inotify_init
6021 case TARGET_NR_inotify_init
:
6022 ret
= get_errno(sys_inotify_init());
6025 #ifdef TARGET_NR_inotify_add_watch
6026 case TARGET_NR_inotify_add_watch
:
6027 p
= lock_user_string(arg2
);
6028 ret
= get_errno(sys_inotify_add_watch(arg1
, path(p
), arg3
));
6029 unlock_user(p
, arg2
, 0);
6032 #ifdef TARGET_NR_inotify_rm_watch
6033 case TARGET_NR_inotify_rm_watch
:
6034 ret
= get_errno(sys_inotify_rm_watch(arg1
, arg2
));
6040 gemu_log("qemu: Unsupported syscall: %d\n", num
);
6041 #if defined(TARGET_NR_setxattr) || defined(TARGET_NR_get_thread_area) || defined(TARGET_NR_getdomainname) || defined(TARGET_NR_set_robust_list)
6042 unimplemented_nowarn
:
6044 ret
= -TARGET_ENOSYS
;
6049 gemu_log(" = %ld\n", ret
);
6052 print_syscall_ret(num
, ret
);
6055 ret
= -TARGET_EFAULT
;