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, see <http://www.gnu.org/licenses/>.
19 #define _ATFILE_SOURCE
20 #include "qemu/osdep.h"
21 #include "qemu/cutils.h"
22 #include "qemu/path.h"
29 #include <sys/mount.h>
31 #include <sys/fsuid.h>
32 #include <sys/personality.h>
33 #include <sys/prctl.h>
34 #include <sys/resource.h>
36 #include <linux/capability.h>
38 #include <sys/timex.h>
40 int __clone2(int (*fn
)(void *), void *child_stack_base
,
41 size_t stack_size
, int flags
, void *arg
, ...);
43 #include <sys/socket.h>
47 #include <sys/times.h>
50 #include <sys/statfs.h>
53 #include <sys/sysinfo.h>
54 #include <sys/signalfd.h>
55 //#include <sys/user.h>
56 #include <netinet/ip.h>
57 #include <netinet/tcp.h>
58 #include <linux/wireless.h>
59 #include <linux/icmp.h>
60 #include <linux/icmpv6.h>
61 #include <linux/errqueue.h>
62 #include "qemu-common.h"
64 #include <sys/timerfd.h>
70 #include <sys/eventfd.h>
73 #include <sys/epoll.h>
76 #include "qemu/xattr.h"
78 #ifdef CONFIG_SENDFILE
79 #include <sys/sendfile.h>
82 #define termios host_termios
83 #define winsize host_winsize
84 #define termio host_termio
85 #define sgttyb host_sgttyb /* same as target */
86 #define tchars host_tchars /* same as target */
87 #define ltchars host_ltchars /* same as target */
89 #include <linux/termios.h>
90 #include <linux/unistd.h>
91 #include <linux/cdrom.h>
92 #include <linux/hdreg.h>
93 #include <linux/soundcard.h>
95 #include <linux/mtio.h>
97 #if defined(CONFIG_FIEMAP)
98 #include <linux/fiemap.h>
100 #include <linux/fb.h>
101 #include <linux/vt.h>
102 #include <linux/dm-ioctl.h>
103 #include <linux/reboot.h>
104 #include <linux/route.h>
105 #include <linux/filter.h>
106 #include <linux/blkpg.h>
107 #include <netpacket/packet.h>
108 #include <linux/netlink.h>
109 #ifdef CONFIG_RTNETLINK
110 #include <linux/rtnetlink.h>
111 #include <linux/if_bridge.h>
113 #include <linux/audit.h>
114 #include "linux_loop.h"
120 #define CLONE_IO 0x80000000 /* Clone io context */
123 /* We can't directly call the host clone syscall, because this will
124 * badly confuse libc (breaking mutexes, for example). So we must
125 * divide clone flags into:
126 * * flag combinations that look like pthread_create()
127 * * flag combinations that look like fork()
128 * * flags we can implement within QEMU itself
129 * * flags we can't support and will return an error for
131 /* For thread creation, all these flags must be present; for
132 * fork, none must be present.
134 #define CLONE_THREAD_FLAGS \
135 (CLONE_VM | CLONE_FS | CLONE_FILES | \
136 CLONE_SIGHAND | CLONE_THREAD | CLONE_SYSVSEM)
138 /* These flags are ignored:
139 * CLONE_DETACHED is now ignored by the kernel;
140 * CLONE_IO is just an optimisation hint to the I/O scheduler
142 #define CLONE_IGNORED_FLAGS \
143 (CLONE_DETACHED | CLONE_IO)
145 /* Flags for fork which we can implement within QEMU itself */
146 #define CLONE_OPTIONAL_FORK_FLAGS \
147 (CLONE_SETTLS | CLONE_PARENT_SETTID | \
148 CLONE_CHILD_CLEARTID | CLONE_CHILD_SETTID)
150 /* Flags for thread creation which we can implement within QEMU itself */
151 #define CLONE_OPTIONAL_THREAD_FLAGS \
152 (CLONE_SETTLS | CLONE_PARENT_SETTID | \
153 CLONE_CHILD_CLEARTID | CLONE_CHILD_SETTID | CLONE_PARENT)
155 #define CLONE_INVALID_FORK_FLAGS \
156 (~(CSIGNAL | CLONE_OPTIONAL_FORK_FLAGS | CLONE_IGNORED_FLAGS))
158 #define CLONE_INVALID_THREAD_FLAGS \
159 (~(CSIGNAL | CLONE_THREAD_FLAGS | CLONE_OPTIONAL_THREAD_FLAGS | \
160 CLONE_IGNORED_FLAGS))
162 /* CLONE_VFORK is special cased early in do_fork(). The other flag bits
163 * have almost all been allocated. We cannot support any of
164 * CLONE_NEWNS, CLONE_NEWCGROUP, CLONE_NEWUTS, CLONE_NEWIPC,
165 * CLONE_NEWUSER, CLONE_NEWPID, CLONE_NEWNET, CLONE_PTRACE, CLONE_UNTRACED.
166 * The checks against the invalid thread masks above will catch these.
167 * (The one remaining unallocated bit is 0x1000 which used to be CLONE_PID.)
171 /* Define DEBUG_ERESTARTSYS to force every syscall to be restarted
172 * once. This exercises the codepaths for restart.
174 //#define DEBUG_ERESTARTSYS
176 //#include <linux/msdos_fs.h>
177 #define VFAT_IOCTL_READDIR_BOTH _IOR('r', 1, struct linux_dirent [2])
178 #define VFAT_IOCTL_READDIR_SHORT _IOR('r', 2, struct linux_dirent [2])
188 #define _syscall0(type,name) \
189 static type name (void) \
191 return syscall(__NR_##name); \
194 #define _syscall1(type,name,type1,arg1) \
195 static type name (type1 arg1) \
197 return syscall(__NR_##name, arg1); \
200 #define _syscall2(type,name,type1,arg1,type2,arg2) \
201 static type name (type1 arg1,type2 arg2) \
203 return syscall(__NR_##name, arg1, arg2); \
206 #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \
207 static type name (type1 arg1,type2 arg2,type3 arg3) \
209 return syscall(__NR_##name, arg1, arg2, arg3); \
212 #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
213 static type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4) \
215 return syscall(__NR_##name, arg1, arg2, arg3, arg4); \
218 #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
220 static type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5) \
222 return syscall(__NR_##name, arg1, arg2, arg3, arg4, arg5); \
226 #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
227 type5,arg5,type6,arg6) \
228 static type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5, \
231 return syscall(__NR_##name, arg1, arg2, arg3, arg4, arg5, arg6); \
235 #define __NR_sys_uname __NR_uname
236 #define __NR_sys_getcwd1 __NR_getcwd
237 #define __NR_sys_getdents __NR_getdents
238 #define __NR_sys_getdents64 __NR_getdents64
239 #define __NR_sys_getpriority __NR_getpriority
240 #define __NR_sys_rt_sigqueueinfo __NR_rt_sigqueueinfo
241 #define __NR_sys_rt_tgsigqueueinfo __NR_rt_tgsigqueueinfo
242 #define __NR_sys_syslog __NR_syslog
243 #define __NR_sys_futex __NR_futex
244 #define __NR_sys_inotify_init __NR_inotify_init
245 #define __NR_sys_inotify_add_watch __NR_inotify_add_watch
246 #define __NR_sys_inotify_rm_watch __NR_inotify_rm_watch
248 #if defined(__alpha__) || defined (__ia64__) || defined(__x86_64__) || \
250 #define __NR__llseek __NR_lseek
253 /* Newer kernel ports have llseek() instead of _llseek() */
254 #if defined(TARGET_NR_llseek) && !defined(TARGET_NR__llseek)
255 #define TARGET_NR__llseek TARGET_NR_llseek
259 _syscall0(int, gettid
)
261 /* This is a replacement for the host gettid() and must return a host
263 static int gettid(void) {
267 #if defined(TARGET_NR_getdents) && defined(__NR_getdents)
268 _syscall3(int, sys_getdents
, uint
, fd
, struct linux_dirent
*, dirp
, uint
, count
);
270 #if !defined(__NR_getdents) || \
271 (defined(TARGET_NR_getdents64) && defined(__NR_getdents64))
272 _syscall3(int, sys_getdents64
, uint
, fd
, struct linux_dirent64
*, dirp
, uint
, count
);
274 #if defined(TARGET_NR__llseek) && defined(__NR_llseek)
275 _syscall5(int, _llseek
, uint
, fd
, ulong
, hi
, ulong
, lo
,
276 loff_t
*, res
, uint
, wh
);
278 _syscall3(int, sys_rt_sigqueueinfo
, pid_t
, pid
, int, sig
, siginfo_t
*, uinfo
)
279 _syscall4(int, sys_rt_tgsigqueueinfo
, pid_t
, pid
, pid_t
, tid
, int, sig
,
281 _syscall3(int,sys_syslog
,int,type
,char*,bufp
,int,len
)
282 #ifdef __NR_exit_group
283 _syscall1(int,exit_group
,int,error_code
)
285 #if defined(TARGET_NR_set_tid_address) && defined(__NR_set_tid_address)
286 _syscall1(int,set_tid_address
,int *,tidptr
)
288 #if defined(TARGET_NR_futex) && defined(__NR_futex)
289 _syscall6(int,sys_futex
,int *,uaddr
,int,op
,int,val
,
290 const struct timespec
*,timeout
,int *,uaddr2
,int,val3
)
292 #define __NR_sys_sched_getaffinity __NR_sched_getaffinity
293 _syscall3(int, sys_sched_getaffinity
, pid_t
, pid
, unsigned int, len
,
294 unsigned long *, user_mask_ptr
);
295 #define __NR_sys_sched_setaffinity __NR_sched_setaffinity
296 _syscall3(int, sys_sched_setaffinity
, pid_t
, pid
, unsigned int, len
,
297 unsigned long *, user_mask_ptr
);
298 _syscall4(int, reboot
, int, magic1
, int, magic2
, unsigned int, cmd
,
300 _syscall2(int, capget
, struct __user_cap_header_struct
*, header
,
301 struct __user_cap_data_struct
*, data
);
302 _syscall2(int, capset
, struct __user_cap_header_struct
*, header
,
303 struct __user_cap_data_struct
*, data
);
304 #if defined(TARGET_NR_ioprio_get) && defined(__NR_ioprio_get)
305 _syscall2(int, ioprio_get
, int, which
, int, who
)
307 #if defined(TARGET_NR_ioprio_set) && defined(__NR_ioprio_set)
308 _syscall3(int, ioprio_set
, int, which
, int, who
, int, ioprio
)
310 #if defined(TARGET_NR_getrandom) && defined(__NR_getrandom)
311 _syscall3(int, getrandom
, void *, buf
, size_t, buflen
, unsigned int, flags
)
314 #if defined(TARGET_NR_kcmp) && defined(__NR_kcmp)
315 _syscall5(int, kcmp
, pid_t
, pid1
, pid_t
, pid2
, int, type
,
316 unsigned long, idx1
, unsigned long, idx2
)
319 static bitmask_transtbl fcntl_flags_tbl
[] = {
320 { TARGET_O_ACCMODE
, TARGET_O_WRONLY
, O_ACCMODE
, O_WRONLY
, },
321 { TARGET_O_ACCMODE
, TARGET_O_RDWR
, O_ACCMODE
, O_RDWR
, },
322 { TARGET_O_CREAT
, TARGET_O_CREAT
, O_CREAT
, O_CREAT
, },
323 { TARGET_O_EXCL
, TARGET_O_EXCL
, O_EXCL
, O_EXCL
, },
324 { TARGET_O_NOCTTY
, TARGET_O_NOCTTY
, O_NOCTTY
, O_NOCTTY
, },
325 { TARGET_O_TRUNC
, TARGET_O_TRUNC
, O_TRUNC
, O_TRUNC
, },
326 { TARGET_O_APPEND
, TARGET_O_APPEND
, O_APPEND
, O_APPEND
, },
327 { TARGET_O_NONBLOCK
, TARGET_O_NONBLOCK
, O_NONBLOCK
, O_NONBLOCK
, },
328 { TARGET_O_SYNC
, TARGET_O_DSYNC
, O_SYNC
, O_DSYNC
, },
329 { TARGET_O_SYNC
, TARGET_O_SYNC
, O_SYNC
, O_SYNC
, },
330 { TARGET_FASYNC
, TARGET_FASYNC
, FASYNC
, FASYNC
, },
331 { TARGET_O_DIRECTORY
, TARGET_O_DIRECTORY
, O_DIRECTORY
, O_DIRECTORY
, },
332 { TARGET_O_NOFOLLOW
, TARGET_O_NOFOLLOW
, O_NOFOLLOW
, O_NOFOLLOW
, },
333 #if defined(O_DIRECT)
334 { TARGET_O_DIRECT
, TARGET_O_DIRECT
, O_DIRECT
, O_DIRECT
, },
336 #if defined(O_NOATIME)
337 { TARGET_O_NOATIME
, TARGET_O_NOATIME
, O_NOATIME
, O_NOATIME
},
339 #if defined(O_CLOEXEC)
340 { TARGET_O_CLOEXEC
, TARGET_O_CLOEXEC
, O_CLOEXEC
, O_CLOEXEC
},
343 { TARGET_O_PATH
, TARGET_O_PATH
, O_PATH
, O_PATH
},
345 /* Don't terminate the list prematurely on 64-bit host+guest. */
346 #if TARGET_O_LARGEFILE != 0 || O_LARGEFILE != 0
347 { TARGET_O_LARGEFILE
, TARGET_O_LARGEFILE
, O_LARGEFILE
, O_LARGEFILE
, },
354 QEMU_IFLA_BR_FORWARD_DELAY
,
355 QEMU_IFLA_BR_HELLO_TIME
,
356 QEMU_IFLA_BR_MAX_AGE
,
357 QEMU_IFLA_BR_AGEING_TIME
,
358 QEMU_IFLA_BR_STP_STATE
,
359 QEMU_IFLA_BR_PRIORITY
,
360 QEMU_IFLA_BR_VLAN_FILTERING
,
361 QEMU_IFLA_BR_VLAN_PROTOCOL
,
362 QEMU_IFLA_BR_GROUP_FWD_MASK
,
363 QEMU_IFLA_BR_ROOT_ID
,
364 QEMU_IFLA_BR_BRIDGE_ID
,
365 QEMU_IFLA_BR_ROOT_PORT
,
366 QEMU_IFLA_BR_ROOT_PATH_COST
,
367 QEMU_IFLA_BR_TOPOLOGY_CHANGE
,
368 QEMU_IFLA_BR_TOPOLOGY_CHANGE_DETECTED
,
369 QEMU_IFLA_BR_HELLO_TIMER
,
370 QEMU_IFLA_BR_TCN_TIMER
,
371 QEMU_IFLA_BR_TOPOLOGY_CHANGE_TIMER
,
372 QEMU_IFLA_BR_GC_TIMER
,
373 QEMU_IFLA_BR_GROUP_ADDR
,
374 QEMU_IFLA_BR_FDB_FLUSH
,
375 QEMU_IFLA_BR_MCAST_ROUTER
,
376 QEMU_IFLA_BR_MCAST_SNOOPING
,
377 QEMU_IFLA_BR_MCAST_QUERY_USE_IFADDR
,
378 QEMU_IFLA_BR_MCAST_QUERIER
,
379 QEMU_IFLA_BR_MCAST_HASH_ELASTICITY
,
380 QEMU_IFLA_BR_MCAST_HASH_MAX
,
381 QEMU_IFLA_BR_MCAST_LAST_MEMBER_CNT
,
382 QEMU_IFLA_BR_MCAST_STARTUP_QUERY_CNT
,
383 QEMU_IFLA_BR_MCAST_LAST_MEMBER_INTVL
,
384 QEMU_IFLA_BR_MCAST_MEMBERSHIP_INTVL
,
385 QEMU_IFLA_BR_MCAST_QUERIER_INTVL
,
386 QEMU_IFLA_BR_MCAST_QUERY_INTVL
,
387 QEMU_IFLA_BR_MCAST_QUERY_RESPONSE_INTVL
,
388 QEMU_IFLA_BR_MCAST_STARTUP_QUERY_INTVL
,
389 QEMU_IFLA_BR_NF_CALL_IPTABLES
,
390 QEMU_IFLA_BR_NF_CALL_IP6TABLES
,
391 QEMU_IFLA_BR_NF_CALL_ARPTABLES
,
392 QEMU_IFLA_BR_VLAN_DEFAULT_PVID
,
394 QEMU_IFLA_BR_VLAN_STATS_ENABLED
,
395 QEMU_IFLA_BR_MCAST_STATS_ENABLED
,
419 QEMU_IFLA_NET_NS_PID
,
422 QEMU_IFLA_VFINFO_LIST
,
430 QEMU_IFLA_PROMISCUITY
,
431 QEMU_IFLA_NUM_TX_QUEUES
,
432 QEMU_IFLA_NUM_RX_QUEUES
,
434 QEMU_IFLA_PHYS_PORT_ID
,
435 QEMU_IFLA_CARRIER_CHANGES
,
436 QEMU_IFLA_PHYS_SWITCH_ID
,
437 QEMU_IFLA_LINK_NETNSID
,
438 QEMU_IFLA_PHYS_PORT_NAME
,
439 QEMU_IFLA_PROTO_DOWN
,
440 QEMU_IFLA_GSO_MAX_SEGS
,
441 QEMU_IFLA_GSO_MAX_SIZE
,
448 QEMU_IFLA_BRPORT_UNSPEC
,
449 QEMU_IFLA_BRPORT_STATE
,
450 QEMU_IFLA_BRPORT_PRIORITY
,
451 QEMU_IFLA_BRPORT_COST
,
452 QEMU_IFLA_BRPORT_MODE
,
453 QEMU_IFLA_BRPORT_GUARD
,
454 QEMU_IFLA_BRPORT_PROTECT
,
455 QEMU_IFLA_BRPORT_FAST_LEAVE
,
456 QEMU_IFLA_BRPORT_LEARNING
,
457 QEMU_IFLA_BRPORT_UNICAST_FLOOD
,
458 QEMU_IFLA_BRPORT_PROXYARP
,
459 QEMU_IFLA_BRPORT_LEARNING_SYNC
,
460 QEMU_IFLA_BRPORT_PROXYARP_WIFI
,
461 QEMU_IFLA_BRPORT_ROOT_ID
,
462 QEMU_IFLA_BRPORT_BRIDGE_ID
,
463 QEMU_IFLA_BRPORT_DESIGNATED_PORT
,
464 QEMU_IFLA_BRPORT_DESIGNATED_COST
,
467 QEMU_IFLA_BRPORT_TOPOLOGY_CHANGE_ACK
,
468 QEMU_IFLA_BRPORT_CONFIG_PENDING
,
469 QEMU_IFLA_BRPORT_MESSAGE_AGE_TIMER
,
470 QEMU_IFLA_BRPORT_FORWARD_DELAY_TIMER
,
471 QEMU_IFLA_BRPORT_HOLD_TIMER
,
472 QEMU_IFLA_BRPORT_FLUSH
,
473 QEMU_IFLA_BRPORT_MULTICAST_ROUTER
,
474 QEMU_IFLA_BRPORT_PAD
,
475 QEMU___IFLA_BRPORT_MAX
479 QEMU_IFLA_INFO_UNSPEC
,
482 QEMU_IFLA_INFO_XSTATS
,
483 QEMU_IFLA_INFO_SLAVE_KIND
,
484 QEMU_IFLA_INFO_SLAVE_DATA
,
485 QEMU___IFLA_INFO_MAX
,
489 QEMU_IFLA_INET_UNSPEC
,
491 QEMU___IFLA_INET_MAX
,
495 QEMU_IFLA_INET6_UNSPEC
,
496 QEMU_IFLA_INET6_FLAGS
,
497 QEMU_IFLA_INET6_CONF
,
498 QEMU_IFLA_INET6_STATS
,
499 QEMU_IFLA_INET6_MCAST
,
500 QEMU_IFLA_INET6_CACHEINFO
,
501 QEMU_IFLA_INET6_ICMP6STATS
,
502 QEMU_IFLA_INET6_TOKEN
,
503 QEMU_IFLA_INET6_ADDR_GEN_MODE
,
504 QEMU___IFLA_INET6_MAX
507 typedef abi_long (*TargetFdDataFunc
)(void *, size_t);
508 typedef abi_long (*TargetFdAddrFunc
)(void *, abi_ulong
, socklen_t
);
509 typedef struct TargetFdTrans
{
510 TargetFdDataFunc host_to_target_data
;
511 TargetFdDataFunc target_to_host_data
;
512 TargetFdAddrFunc target_to_host_addr
;
515 static TargetFdTrans
**target_fd_trans
;
517 static unsigned int target_fd_max
;
519 static TargetFdDataFunc
fd_trans_target_to_host_data(int fd
)
521 if (fd
>= 0 && fd
< target_fd_max
&& target_fd_trans
[fd
]) {
522 return target_fd_trans
[fd
]->target_to_host_data
;
527 static TargetFdDataFunc
fd_trans_host_to_target_data(int fd
)
529 if (fd
>= 0 && fd
< target_fd_max
&& target_fd_trans
[fd
]) {
530 return target_fd_trans
[fd
]->host_to_target_data
;
535 static TargetFdAddrFunc
fd_trans_target_to_host_addr(int fd
)
537 if (fd
>= 0 && fd
< target_fd_max
&& target_fd_trans
[fd
]) {
538 return target_fd_trans
[fd
]->target_to_host_addr
;
543 static void fd_trans_register(int fd
, TargetFdTrans
*trans
)
547 if (fd
>= target_fd_max
) {
548 oldmax
= target_fd_max
;
549 target_fd_max
= ((fd
>> 6) + 1) << 6; /* by slice of 64 entries */
550 target_fd_trans
= g_renew(TargetFdTrans
*,
551 target_fd_trans
, target_fd_max
);
552 memset((void *)(target_fd_trans
+ oldmax
), 0,
553 (target_fd_max
- oldmax
) * sizeof(TargetFdTrans
*));
555 target_fd_trans
[fd
] = trans
;
558 static void fd_trans_unregister(int fd
)
560 if (fd
>= 0 && fd
< target_fd_max
) {
561 target_fd_trans
[fd
] = NULL
;
565 static void fd_trans_dup(int oldfd
, int newfd
)
567 fd_trans_unregister(newfd
);
568 if (oldfd
< target_fd_max
&& target_fd_trans
[oldfd
]) {
569 fd_trans_register(newfd
, target_fd_trans
[oldfd
]);
573 static int sys_getcwd1(char *buf
, size_t size
)
575 if (getcwd(buf
, size
) == NULL
) {
576 /* getcwd() sets errno */
579 return strlen(buf
)+1;
582 #ifdef TARGET_NR_utimensat
583 #if defined(__NR_utimensat)
584 #define __NR_sys_utimensat __NR_utimensat
585 _syscall4(int,sys_utimensat
,int,dirfd
,const char *,pathname
,
586 const struct timespec
*,tsp
,int,flags
)
588 static int sys_utimensat(int dirfd
, const char *pathname
,
589 const struct timespec times
[2], int flags
)
595 #endif /* TARGET_NR_utimensat */
597 #ifdef CONFIG_INOTIFY
598 #include <sys/inotify.h>
600 #if defined(TARGET_NR_inotify_init) && defined(__NR_inotify_init)
601 static int sys_inotify_init(void)
603 return (inotify_init());
606 #if defined(TARGET_NR_inotify_add_watch) && defined(__NR_inotify_add_watch)
607 static int sys_inotify_add_watch(int fd
,const char *pathname
, int32_t mask
)
609 return (inotify_add_watch(fd
, pathname
, mask
));
612 #if defined(TARGET_NR_inotify_rm_watch) && defined(__NR_inotify_rm_watch)
613 static int sys_inotify_rm_watch(int fd
, int32_t wd
)
615 return (inotify_rm_watch(fd
, wd
));
618 #ifdef CONFIG_INOTIFY1
619 #if defined(TARGET_NR_inotify_init1) && defined(__NR_inotify_init1)
620 static int sys_inotify_init1(int flags
)
622 return (inotify_init1(flags
));
627 /* Userspace can usually survive runtime without inotify */
628 #undef TARGET_NR_inotify_init
629 #undef TARGET_NR_inotify_init1
630 #undef TARGET_NR_inotify_add_watch
631 #undef TARGET_NR_inotify_rm_watch
632 #endif /* CONFIG_INOTIFY */
634 #if defined(TARGET_NR_prlimit64)
635 #ifndef __NR_prlimit64
636 # define __NR_prlimit64 -1
638 #define __NR_sys_prlimit64 __NR_prlimit64
639 /* The glibc rlimit structure may not be that used by the underlying syscall */
640 struct host_rlimit64
{
644 _syscall4(int, sys_prlimit64
, pid_t
, pid
, int, resource
,
645 const struct host_rlimit64
*, new_limit
,
646 struct host_rlimit64
*, old_limit
)
650 #if defined(TARGET_NR_timer_create)
651 /* Maxiumum of 32 active POSIX timers allowed at any one time. */
652 static timer_t g_posix_timers
[32] = { 0, } ;
654 static inline int next_free_host_timer(void)
657 /* FIXME: Does finding the next free slot require a lock? */
658 for (k
= 0; k
< ARRAY_SIZE(g_posix_timers
); k
++) {
659 if (g_posix_timers
[k
] == 0) {
660 g_posix_timers
[k
] = (timer_t
) 1;
668 /* ARM EABI and MIPS expect 64bit types aligned even on pairs or registers */
670 static inline int regpairs_aligned(void *cpu_env
) {
671 return ((((CPUARMState
*)cpu_env
)->eabi
) == 1) ;
673 #elif defined(TARGET_MIPS) && (TARGET_ABI_BITS == 32)
674 static inline int regpairs_aligned(void *cpu_env
) { return 1; }
675 #elif defined(TARGET_PPC) && !defined(TARGET_PPC64)
676 /* SysV AVI for PPC32 expects 64bit parameters to be passed on odd/even pairs
677 * of registers which translates to the same as ARM/MIPS, because we start with
679 static inline int regpairs_aligned(void *cpu_env
) { return 1; }
681 static inline int regpairs_aligned(void *cpu_env
) { return 0; }
684 #define ERRNO_TABLE_SIZE 1200
686 /* target_to_host_errno_table[] is initialized from
687 * host_to_target_errno_table[] in syscall_init(). */
688 static uint16_t target_to_host_errno_table
[ERRNO_TABLE_SIZE
] = {
692 * This list is the union of errno values overridden in asm-<arch>/errno.h
693 * minus the errnos that are not actually generic to all archs.
695 static uint16_t host_to_target_errno_table
[ERRNO_TABLE_SIZE
] = {
696 [EAGAIN
] = TARGET_EAGAIN
,
697 [EIDRM
] = TARGET_EIDRM
,
698 [ECHRNG
] = TARGET_ECHRNG
,
699 [EL2NSYNC
] = TARGET_EL2NSYNC
,
700 [EL3HLT
] = TARGET_EL3HLT
,
701 [EL3RST
] = TARGET_EL3RST
,
702 [ELNRNG
] = TARGET_ELNRNG
,
703 [EUNATCH
] = TARGET_EUNATCH
,
704 [ENOCSI
] = TARGET_ENOCSI
,
705 [EL2HLT
] = TARGET_EL2HLT
,
706 [EDEADLK
] = TARGET_EDEADLK
,
707 [ENOLCK
] = TARGET_ENOLCK
,
708 [EBADE
] = TARGET_EBADE
,
709 [EBADR
] = TARGET_EBADR
,
710 [EXFULL
] = TARGET_EXFULL
,
711 [ENOANO
] = TARGET_ENOANO
,
712 [EBADRQC
] = TARGET_EBADRQC
,
713 [EBADSLT
] = TARGET_EBADSLT
,
714 [EBFONT
] = TARGET_EBFONT
,
715 [ENOSTR
] = TARGET_ENOSTR
,
716 [ENODATA
] = TARGET_ENODATA
,
717 [ETIME
] = TARGET_ETIME
,
718 [ENOSR
] = TARGET_ENOSR
,
719 [ENONET
] = TARGET_ENONET
,
720 [ENOPKG
] = TARGET_ENOPKG
,
721 [EREMOTE
] = TARGET_EREMOTE
,
722 [ENOLINK
] = TARGET_ENOLINK
,
723 [EADV
] = TARGET_EADV
,
724 [ESRMNT
] = TARGET_ESRMNT
,
725 [ECOMM
] = TARGET_ECOMM
,
726 [EPROTO
] = TARGET_EPROTO
,
727 [EDOTDOT
] = TARGET_EDOTDOT
,
728 [EMULTIHOP
] = TARGET_EMULTIHOP
,
729 [EBADMSG
] = TARGET_EBADMSG
,
730 [ENAMETOOLONG
] = TARGET_ENAMETOOLONG
,
731 [EOVERFLOW
] = TARGET_EOVERFLOW
,
732 [ENOTUNIQ
] = TARGET_ENOTUNIQ
,
733 [EBADFD
] = TARGET_EBADFD
,
734 [EREMCHG
] = TARGET_EREMCHG
,
735 [ELIBACC
] = TARGET_ELIBACC
,
736 [ELIBBAD
] = TARGET_ELIBBAD
,
737 [ELIBSCN
] = TARGET_ELIBSCN
,
738 [ELIBMAX
] = TARGET_ELIBMAX
,
739 [ELIBEXEC
] = TARGET_ELIBEXEC
,
740 [EILSEQ
] = TARGET_EILSEQ
,
741 [ENOSYS
] = TARGET_ENOSYS
,
742 [ELOOP
] = TARGET_ELOOP
,
743 [ERESTART
] = TARGET_ERESTART
,
744 [ESTRPIPE
] = TARGET_ESTRPIPE
,
745 [ENOTEMPTY
] = TARGET_ENOTEMPTY
,
746 [EUSERS
] = TARGET_EUSERS
,
747 [ENOTSOCK
] = TARGET_ENOTSOCK
,
748 [EDESTADDRREQ
] = TARGET_EDESTADDRREQ
,
749 [EMSGSIZE
] = TARGET_EMSGSIZE
,
750 [EPROTOTYPE
] = TARGET_EPROTOTYPE
,
751 [ENOPROTOOPT
] = TARGET_ENOPROTOOPT
,
752 [EPROTONOSUPPORT
] = TARGET_EPROTONOSUPPORT
,
753 [ESOCKTNOSUPPORT
] = TARGET_ESOCKTNOSUPPORT
,
754 [EOPNOTSUPP
] = TARGET_EOPNOTSUPP
,
755 [EPFNOSUPPORT
] = TARGET_EPFNOSUPPORT
,
756 [EAFNOSUPPORT
] = TARGET_EAFNOSUPPORT
,
757 [EADDRINUSE
] = TARGET_EADDRINUSE
,
758 [EADDRNOTAVAIL
] = TARGET_EADDRNOTAVAIL
,
759 [ENETDOWN
] = TARGET_ENETDOWN
,
760 [ENETUNREACH
] = TARGET_ENETUNREACH
,
761 [ENETRESET
] = TARGET_ENETRESET
,
762 [ECONNABORTED
] = TARGET_ECONNABORTED
,
763 [ECONNRESET
] = TARGET_ECONNRESET
,
764 [ENOBUFS
] = TARGET_ENOBUFS
,
765 [EISCONN
] = TARGET_EISCONN
,
766 [ENOTCONN
] = TARGET_ENOTCONN
,
767 [EUCLEAN
] = TARGET_EUCLEAN
,
768 [ENOTNAM
] = TARGET_ENOTNAM
,
769 [ENAVAIL
] = TARGET_ENAVAIL
,
770 [EISNAM
] = TARGET_EISNAM
,
771 [EREMOTEIO
] = TARGET_EREMOTEIO
,
772 [EDQUOT
] = TARGET_EDQUOT
,
773 [ESHUTDOWN
] = TARGET_ESHUTDOWN
,
774 [ETOOMANYREFS
] = TARGET_ETOOMANYREFS
,
775 [ETIMEDOUT
] = TARGET_ETIMEDOUT
,
776 [ECONNREFUSED
] = TARGET_ECONNREFUSED
,
777 [EHOSTDOWN
] = TARGET_EHOSTDOWN
,
778 [EHOSTUNREACH
] = TARGET_EHOSTUNREACH
,
779 [EALREADY
] = TARGET_EALREADY
,
780 [EINPROGRESS
] = TARGET_EINPROGRESS
,
781 [ESTALE
] = TARGET_ESTALE
,
782 [ECANCELED
] = TARGET_ECANCELED
,
783 [ENOMEDIUM
] = TARGET_ENOMEDIUM
,
784 [EMEDIUMTYPE
] = TARGET_EMEDIUMTYPE
,
786 [ENOKEY
] = TARGET_ENOKEY
,
789 [EKEYEXPIRED
] = TARGET_EKEYEXPIRED
,
792 [EKEYREVOKED
] = TARGET_EKEYREVOKED
,
795 [EKEYREJECTED
] = TARGET_EKEYREJECTED
,
798 [EOWNERDEAD
] = TARGET_EOWNERDEAD
,
800 #ifdef ENOTRECOVERABLE
801 [ENOTRECOVERABLE
] = TARGET_ENOTRECOVERABLE
,
804 [ENOMSG
] = TARGET_ENOMSG
,
807 [ERFKILL
] = TARGET_ERFKILL
,
810 [EHWPOISON
] = TARGET_EHWPOISON
,
814 static inline int host_to_target_errno(int err
)
816 if (err
>= 0 && err
< ERRNO_TABLE_SIZE
&&
817 host_to_target_errno_table
[err
]) {
818 return host_to_target_errno_table
[err
];
823 static inline int target_to_host_errno(int err
)
825 if (err
>= 0 && err
< ERRNO_TABLE_SIZE
&&
826 target_to_host_errno_table
[err
]) {
827 return target_to_host_errno_table
[err
];
832 static inline abi_long
get_errno(abi_long ret
)
835 return -host_to_target_errno(errno
);
840 static inline int is_error(abi_long ret
)
842 return (abi_ulong
)ret
>= (abi_ulong
)(-4096);
845 const char *target_strerror(int err
)
847 if (err
== TARGET_ERESTARTSYS
) {
848 return "To be restarted";
850 if (err
== TARGET_QEMU_ESIGRETURN
) {
851 return "Successful exit from sigreturn";
854 if ((err
>= ERRNO_TABLE_SIZE
) || (err
< 0)) {
857 return strerror(target_to_host_errno(err
));
860 #define safe_syscall0(type, name) \
861 static type safe_##name(void) \
863 return safe_syscall(__NR_##name); \
866 #define safe_syscall1(type, name, type1, arg1) \
867 static type safe_##name(type1 arg1) \
869 return safe_syscall(__NR_##name, arg1); \
872 #define safe_syscall2(type, name, type1, arg1, type2, arg2) \
873 static type safe_##name(type1 arg1, type2 arg2) \
875 return safe_syscall(__NR_##name, arg1, arg2); \
878 #define safe_syscall3(type, name, type1, arg1, type2, arg2, type3, arg3) \
879 static type safe_##name(type1 arg1, type2 arg2, type3 arg3) \
881 return safe_syscall(__NR_##name, arg1, arg2, arg3); \
884 #define safe_syscall4(type, name, type1, arg1, type2, arg2, type3, arg3, \
886 static type safe_##name(type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
888 return safe_syscall(__NR_##name, arg1, arg2, arg3, arg4); \
891 #define safe_syscall5(type, name, type1, arg1, type2, arg2, type3, arg3, \
892 type4, arg4, type5, arg5) \
893 static type safe_##name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \
896 return safe_syscall(__NR_##name, arg1, arg2, arg3, arg4, arg5); \
899 #define safe_syscall6(type, name, type1, arg1, type2, arg2, type3, arg3, \
900 type4, arg4, type5, arg5, type6, arg6) \
901 static type safe_##name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \
902 type5 arg5, type6 arg6) \
904 return safe_syscall(__NR_##name, arg1, arg2, arg3, arg4, arg5, arg6); \
907 safe_syscall3(ssize_t
, read
, int, fd
, void *, buff
, size_t, count
)
908 safe_syscall3(ssize_t
, write
, int, fd
, const void *, buff
, size_t, count
)
909 safe_syscall4(int, openat
, int, dirfd
, const char *, pathname
, \
910 int, flags
, mode_t
, mode
)
911 safe_syscall4(pid_t
, wait4
, pid_t
, pid
, int *, status
, int, options
, \
912 struct rusage
*, rusage
)
913 safe_syscall5(int, waitid
, idtype_t
, idtype
, id_t
, id
, siginfo_t
*, infop
, \
914 int, options
, struct rusage
*, rusage
)
915 safe_syscall3(int, execve
, const char *, filename
, char **, argv
, char **, envp
)
916 safe_syscall6(int, pselect6
, int, nfds
, fd_set
*, readfds
, fd_set
*, writefds
, \
917 fd_set
*, exceptfds
, struct timespec
*, timeout
, void *, sig
)
918 safe_syscall5(int, ppoll
, struct pollfd
*, ufds
, unsigned int, nfds
,
919 struct timespec
*, tsp
, const sigset_t
*, sigmask
,
921 safe_syscall6(int, epoll_pwait
, int, epfd
, struct epoll_event
*, events
,
922 int, maxevents
, int, timeout
, const sigset_t
*, sigmask
,
924 safe_syscall6(int,futex
,int *,uaddr
,int,op
,int,val
, \
925 const struct timespec
*,timeout
,int *,uaddr2
,int,val3
)
926 safe_syscall2(int, rt_sigsuspend
, sigset_t
*, newset
, size_t, sigsetsize
)
927 safe_syscall2(int, kill
, pid_t
, pid
, int, sig
)
928 safe_syscall2(int, tkill
, int, tid
, int, sig
)
929 safe_syscall3(int, tgkill
, int, tgid
, int, pid
, int, sig
)
930 safe_syscall3(ssize_t
, readv
, int, fd
, const struct iovec
*, iov
, int, iovcnt
)
931 safe_syscall3(ssize_t
, writev
, int, fd
, const struct iovec
*, iov
, int, iovcnt
)
932 safe_syscall5(ssize_t
, preadv
, int, fd
, const struct iovec
*, iov
, int, iovcnt
,
933 unsigned long, pos_l
, unsigned long, pos_h
)
934 safe_syscall5(ssize_t
, pwritev
, int, fd
, const struct iovec
*, iov
, int, iovcnt
,
935 unsigned long, pos_l
, unsigned long, pos_h
)
936 safe_syscall3(int, connect
, int, fd
, const struct sockaddr
*, addr
,
938 safe_syscall6(ssize_t
, sendto
, int, fd
, const void *, buf
, size_t, len
,
939 int, flags
, const struct sockaddr
*, addr
, socklen_t
, addrlen
)
940 safe_syscall6(ssize_t
, recvfrom
, int, fd
, void *, buf
, size_t, len
,
941 int, flags
, struct sockaddr
*, addr
, socklen_t
*, addrlen
)
942 safe_syscall3(ssize_t
, sendmsg
, int, fd
, const struct msghdr
*, msg
, int, flags
)
943 safe_syscall3(ssize_t
, recvmsg
, int, fd
, struct msghdr
*, msg
, int, flags
)
944 safe_syscall2(int, flock
, int, fd
, int, operation
)
945 safe_syscall4(int, rt_sigtimedwait
, const sigset_t
*, these
, siginfo_t
*, uinfo
,
946 const struct timespec
*, uts
, size_t, sigsetsize
)
947 safe_syscall4(int, accept4
, int, fd
, struct sockaddr
*, addr
, socklen_t
*, len
,
949 safe_syscall2(int, nanosleep
, const struct timespec
*, req
,
950 struct timespec
*, rem
)
951 #ifdef TARGET_NR_clock_nanosleep
952 safe_syscall4(int, clock_nanosleep
, const clockid_t
, clock
, int, flags
,
953 const struct timespec
*, req
, struct timespec
*, rem
)
956 safe_syscall4(int, msgsnd
, int, msgid
, const void *, msgp
, size_t, sz
,
958 safe_syscall5(int, msgrcv
, int, msgid
, void *, msgp
, size_t, sz
,
959 long, msgtype
, int, flags
)
960 safe_syscall4(int, semtimedop
, int, semid
, struct sembuf
*, tsops
,
961 unsigned, nsops
, const struct timespec
*, timeout
)
963 /* This host kernel architecture uses a single ipc syscall; fake up
964 * wrappers for the sub-operations to hide this implementation detail.
965 * Annoyingly we can't include linux/ipc.h to get the constant definitions
966 * for the call parameter because some structs in there conflict with the
967 * sys/ipc.h ones. So we just define them here, and rely on them being
968 * the same for all host architectures.
970 #define Q_SEMTIMEDOP 4
973 #define Q_IPCCALL(VERSION, OP) ((VERSION) << 16 | (OP))
975 safe_syscall6(int, ipc
, int, call
, long, first
, long, second
, long, third
,
976 void *, ptr
, long, fifth
)
977 static int safe_msgsnd(int msgid
, const void *msgp
, size_t sz
, int flags
)
979 return safe_ipc(Q_IPCCALL(0, Q_MSGSND
), msgid
, sz
, flags
, (void *)msgp
, 0);
981 static int safe_msgrcv(int msgid
, void *msgp
, size_t sz
, long type
, int flags
)
983 return safe_ipc(Q_IPCCALL(1, Q_MSGRCV
), msgid
, sz
, flags
, msgp
, type
);
985 static int safe_semtimedop(int semid
, struct sembuf
*tsops
, unsigned nsops
,
986 const struct timespec
*timeout
)
988 return safe_ipc(Q_IPCCALL(0, Q_SEMTIMEDOP
), semid
, nsops
, 0, tsops
,
992 #if defined(TARGET_NR_mq_open) && defined(__NR_mq_open)
993 safe_syscall5(int, mq_timedsend
, int, mqdes
, const char *, msg_ptr
,
994 size_t, len
, unsigned, prio
, const struct timespec
*, timeout
)
995 safe_syscall5(int, mq_timedreceive
, int, mqdes
, char *, msg_ptr
,
996 size_t, len
, unsigned *, prio
, const struct timespec
*, timeout
)
998 /* We do ioctl like this rather than via safe_syscall3 to preserve the
999 * "third argument might be integer or pointer or not present" behaviour of
1000 * the libc function.
1002 #define safe_ioctl(...) safe_syscall(__NR_ioctl, __VA_ARGS__)
1003 /* Similarly for fcntl. Note that callers must always:
1004 * pass the F_GETLK64 etc constants rather than the unsuffixed F_GETLK
1005 * use the flock64 struct rather than unsuffixed flock
1006 * This will then work and use a 64-bit offset for both 32-bit and 64-bit hosts.
1009 #define safe_fcntl(...) safe_syscall(__NR_fcntl64, __VA_ARGS__)
1011 #define safe_fcntl(...) safe_syscall(__NR_fcntl, __VA_ARGS__)
1014 static inline int host_to_target_sock_type(int host_type
)
1018 switch (host_type
& 0xf /* SOCK_TYPE_MASK */) {
1020 target_type
= TARGET_SOCK_DGRAM
;
1023 target_type
= TARGET_SOCK_STREAM
;
1026 target_type
= host_type
& 0xf /* SOCK_TYPE_MASK */;
1030 #if defined(SOCK_CLOEXEC)
1031 if (host_type
& SOCK_CLOEXEC
) {
1032 target_type
|= TARGET_SOCK_CLOEXEC
;
1036 #if defined(SOCK_NONBLOCK)
1037 if (host_type
& SOCK_NONBLOCK
) {
1038 target_type
|= TARGET_SOCK_NONBLOCK
;
1045 static abi_ulong target_brk
;
1046 static abi_ulong target_original_brk
;
1047 static abi_ulong brk_page
;
1049 void target_set_brk(abi_ulong new_brk
)
1051 target_original_brk
= target_brk
= HOST_PAGE_ALIGN(new_brk
);
1052 brk_page
= HOST_PAGE_ALIGN(target_brk
);
1055 //#define DEBUGF_BRK(message, args...) do { fprintf(stderr, (message), ## args); } while (0)
1056 #define DEBUGF_BRK(message, args...)
1058 /* do_brk() must return target values and target errnos. */
1059 abi_long
do_brk(abi_ulong new_brk
)
1061 abi_long mapped_addr
;
1062 abi_ulong new_alloc_size
;
1064 DEBUGF_BRK("do_brk(" TARGET_ABI_FMT_lx
") -> ", new_brk
);
1067 DEBUGF_BRK(TARGET_ABI_FMT_lx
" (!new_brk)\n", target_brk
);
1070 if (new_brk
< target_original_brk
) {
1071 DEBUGF_BRK(TARGET_ABI_FMT_lx
" (new_brk < target_original_brk)\n",
1076 /* If the new brk is less than the highest page reserved to the
1077 * target heap allocation, set it and we're almost done... */
1078 if (new_brk
<= brk_page
) {
1079 /* Heap contents are initialized to zero, as for anonymous
1081 if (new_brk
> target_brk
) {
1082 memset(g2h(target_brk
), 0, new_brk
- target_brk
);
1084 target_brk
= new_brk
;
1085 DEBUGF_BRK(TARGET_ABI_FMT_lx
" (new_brk <= brk_page)\n", target_brk
);
1089 /* We need to allocate more memory after the brk... Note that
1090 * we don't use MAP_FIXED because that will map over the top of
1091 * any existing mapping (like the one with the host libc or qemu
1092 * itself); instead we treat "mapped but at wrong address" as
1093 * a failure and unmap again.
1095 new_alloc_size
= HOST_PAGE_ALIGN(new_brk
- brk_page
);
1096 mapped_addr
= get_errno(target_mmap(brk_page
, new_alloc_size
,
1097 PROT_READ
|PROT_WRITE
,
1098 MAP_ANON
|MAP_PRIVATE
, 0, 0));
1100 if (mapped_addr
== brk_page
) {
1101 /* Heap contents are initialized to zero, as for anonymous
1102 * mapped pages. Technically the new pages are already
1103 * initialized to zero since they *are* anonymous mapped
1104 * pages, however we have to take care with the contents that
1105 * come from the remaining part of the previous page: it may
1106 * contains garbage data due to a previous heap usage (grown
1107 * then shrunken). */
1108 memset(g2h(target_brk
), 0, brk_page
- target_brk
);
1110 target_brk
= new_brk
;
1111 brk_page
= HOST_PAGE_ALIGN(target_brk
);
1112 DEBUGF_BRK(TARGET_ABI_FMT_lx
" (mapped_addr == brk_page)\n",
1115 } else if (mapped_addr
!= -1) {
1116 /* Mapped but at wrong address, meaning there wasn't actually
1117 * enough space for this brk.
1119 target_munmap(mapped_addr
, new_alloc_size
);
1121 DEBUGF_BRK(TARGET_ABI_FMT_lx
" (mapped_addr != -1)\n", target_brk
);
1124 DEBUGF_BRK(TARGET_ABI_FMT_lx
" (otherwise)\n", target_brk
);
1127 #if defined(TARGET_ALPHA)
1128 /* We (partially) emulate OSF/1 on Alpha, which requires we
1129 return a proper errno, not an unchanged brk value. */
1130 return -TARGET_ENOMEM
;
1132 /* For everything else, return the previous break. */
1136 static inline abi_long
copy_from_user_fdset(fd_set
*fds
,
1137 abi_ulong target_fds_addr
,
1141 abi_ulong b
, *target_fds
;
1143 nw
= DIV_ROUND_UP(n
, TARGET_ABI_BITS
);
1144 if (!(target_fds
= lock_user(VERIFY_READ
,
1146 sizeof(abi_ulong
) * nw
,
1148 return -TARGET_EFAULT
;
1152 for (i
= 0; i
< nw
; i
++) {
1153 /* grab the abi_ulong */
1154 __get_user(b
, &target_fds
[i
]);
1155 for (j
= 0; j
< TARGET_ABI_BITS
; j
++) {
1156 /* check the bit inside the abi_ulong */
1163 unlock_user(target_fds
, target_fds_addr
, 0);
1168 static inline abi_ulong
copy_from_user_fdset_ptr(fd_set
*fds
, fd_set
**fds_ptr
,
1169 abi_ulong target_fds_addr
,
1172 if (target_fds_addr
) {
1173 if (copy_from_user_fdset(fds
, target_fds_addr
, n
))
1174 return -TARGET_EFAULT
;
1182 static inline abi_long
copy_to_user_fdset(abi_ulong target_fds_addr
,
1188 abi_ulong
*target_fds
;
1190 nw
= DIV_ROUND_UP(n
, TARGET_ABI_BITS
);
1191 if (!(target_fds
= lock_user(VERIFY_WRITE
,
1193 sizeof(abi_ulong
) * nw
,
1195 return -TARGET_EFAULT
;
1198 for (i
= 0; i
< nw
; i
++) {
1200 for (j
= 0; j
< TARGET_ABI_BITS
; j
++) {
1201 v
|= ((abi_ulong
)(FD_ISSET(k
, fds
) != 0) << j
);
1204 __put_user(v
, &target_fds
[i
]);
1207 unlock_user(target_fds
, target_fds_addr
, sizeof(abi_ulong
) * nw
);
1212 #if defined(__alpha__)
1213 #define HOST_HZ 1024
1218 static inline abi_long
host_to_target_clock_t(long ticks
)
1220 #if HOST_HZ == TARGET_HZ
1223 return ((int64_t)ticks
* TARGET_HZ
) / HOST_HZ
;
1227 static inline abi_long
host_to_target_rusage(abi_ulong target_addr
,
1228 const struct rusage
*rusage
)
1230 struct target_rusage
*target_rusage
;
1232 if (!lock_user_struct(VERIFY_WRITE
, target_rusage
, target_addr
, 0))
1233 return -TARGET_EFAULT
;
1234 target_rusage
->ru_utime
.tv_sec
= tswapal(rusage
->ru_utime
.tv_sec
);
1235 target_rusage
->ru_utime
.tv_usec
= tswapal(rusage
->ru_utime
.tv_usec
);
1236 target_rusage
->ru_stime
.tv_sec
= tswapal(rusage
->ru_stime
.tv_sec
);
1237 target_rusage
->ru_stime
.tv_usec
= tswapal(rusage
->ru_stime
.tv_usec
);
1238 target_rusage
->ru_maxrss
= tswapal(rusage
->ru_maxrss
);
1239 target_rusage
->ru_ixrss
= tswapal(rusage
->ru_ixrss
);
1240 target_rusage
->ru_idrss
= tswapal(rusage
->ru_idrss
);
1241 target_rusage
->ru_isrss
= tswapal(rusage
->ru_isrss
);
1242 target_rusage
->ru_minflt
= tswapal(rusage
->ru_minflt
);
1243 target_rusage
->ru_majflt
= tswapal(rusage
->ru_majflt
);
1244 target_rusage
->ru_nswap
= tswapal(rusage
->ru_nswap
);
1245 target_rusage
->ru_inblock
= tswapal(rusage
->ru_inblock
);
1246 target_rusage
->ru_oublock
= tswapal(rusage
->ru_oublock
);
1247 target_rusage
->ru_msgsnd
= tswapal(rusage
->ru_msgsnd
);
1248 target_rusage
->ru_msgrcv
= tswapal(rusage
->ru_msgrcv
);
1249 target_rusage
->ru_nsignals
= tswapal(rusage
->ru_nsignals
);
1250 target_rusage
->ru_nvcsw
= tswapal(rusage
->ru_nvcsw
);
1251 target_rusage
->ru_nivcsw
= tswapal(rusage
->ru_nivcsw
);
1252 unlock_user_struct(target_rusage
, target_addr
, 1);
1257 static inline rlim_t
target_to_host_rlim(abi_ulong target_rlim
)
1259 abi_ulong target_rlim_swap
;
1262 target_rlim_swap
= tswapal(target_rlim
);
1263 if (target_rlim_swap
== TARGET_RLIM_INFINITY
)
1264 return RLIM_INFINITY
;
1266 result
= target_rlim_swap
;
1267 if (target_rlim_swap
!= (rlim_t
)result
)
1268 return RLIM_INFINITY
;
1273 static inline abi_ulong
host_to_target_rlim(rlim_t rlim
)
1275 abi_ulong target_rlim_swap
;
1278 if (rlim
== RLIM_INFINITY
|| rlim
!= (abi_long
)rlim
)
1279 target_rlim_swap
= TARGET_RLIM_INFINITY
;
1281 target_rlim_swap
= rlim
;
1282 result
= tswapal(target_rlim_swap
);
1287 static inline int target_to_host_resource(int code
)
1290 case TARGET_RLIMIT_AS
:
1292 case TARGET_RLIMIT_CORE
:
1294 case TARGET_RLIMIT_CPU
:
1296 case TARGET_RLIMIT_DATA
:
1298 case TARGET_RLIMIT_FSIZE
:
1299 return RLIMIT_FSIZE
;
1300 case TARGET_RLIMIT_LOCKS
:
1301 return RLIMIT_LOCKS
;
1302 case TARGET_RLIMIT_MEMLOCK
:
1303 return RLIMIT_MEMLOCK
;
1304 case TARGET_RLIMIT_MSGQUEUE
:
1305 return RLIMIT_MSGQUEUE
;
1306 case TARGET_RLIMIT_NICE
:
1308 case TARGET_RLIMIT_NOFILE
:
1309 return RLIMIT_NOFILE
;
1310 case TARGET_RLIMIT_NPROC
:
1311 return RLIMIT_NPROC
;
1312 case TARGET_RLIMIT_RSS
:
1314 case TARGET_RLIMIT_RTPRIO
:
1315 return RLIMIT_RTPRIO
;
1316 case TARGET_RLIMIT_SIGPENDING
:
1317 return RLIMIT_SIGPENDING
;
1318 case TARGET_RLIMIT_STACK
:
1319 return RLIMIT_STACK
;
1325 static inline abi_long
copy_from_user_timeval(struct timeval
*tv
,
1326 abi_ulong target_tv_addr
)
1328 struct target_timeval
*target_tv
;
1330 if (!lock_user_struct(VERIFY_READ
, target_tv
, target_tv_addr
, 1))
1331 return -TARGET_EFAULT
;
1333 __get_user(tv
->tv_sec
, &target_tv
->tv_sec
);
1334 __get_user(tv
->tv_usec
, &target_tv
->tv_usec
);
1336 unlock_user_struct(target_tv
, target_tv_addr
, 0);
1341 static inline abi_long
copy_to_user_timeval(abi_ulong target_tv_addr
,
1342 const struct timeval
*tv
)
1344 struct target_timeval
*target_tv
;
1346 if (!lock_user_struct(VERIFY_WRITE
, target_tv
, target_tv_addr
, 0))
1347 return -TARGET_EFAULT
;
1349 __put_user(tv
->tv_sec
, &target_tv
->tv_sec
);
1350 __put_user(tv
->tv_usec
, &target_tv
->tv_usec
);
1352 unlock_user_struct(target_tv
, target_tv_addr
, 1);
1357 static inline abi_long
copy_from_user_timezone(struct timezone
*tz
,
1358 abi_ulong target_tz_addr
)
1360 struct target_timezone
*target_tz
;
1362 if (!lock_user_struct(VERIFY_READ
, target_tz
, target_tz_addr
, 1)) {
1363 return -TARGET_EFAULT
;
1366 __get_user(tz
->tz_minuteswest
, &target_tz
->tz_minuteswest
);
1367 __get_user(tz
->tz_dsttime
, &target_tz
->tz_dsttime
);
1369 unlock_user_struct(target_tz
, target_tz_addr
, 0);
1374 #if defined(TARGET_NR_mq_open) && defined(__NR_mq_open)
1377 static inline abi_long
copy_from_user_mq_attr(struct mq_attr
*attr
,
1378 abi_ulong target_mq_attr_addr
)
1380 struct target_mq_attr
*target_mq_attr
;
1382 if (!lock_user_struct(VERIFY_READ
, target_mq_attr
,
1383 target_mq_attr_addr
, 1))
1384 return -TARGET_EFAULT
;
1386 __get_user(attr
->mq_flags
, &target_mq_attr
->mq_flags
);
1387 __get_user(attr
->mq_maxmsg
, &target_mq_attr
->mq_maxmsg
);
1388 __get_user(attr
->mq_msgsize
, &target_mq_attr
->mq_msgsize
);
1389 __get_user(attr
->mq_curmsgs
, &target_mq_attr
->mq_curmsgs
);
1391 unlock_user_struct(target_mq_attr
, target_mq_attr_addr
, 0);
1396 static inline abi_long
copy_to_user_mq_attr(abi_ulong target_mq_attr_addr
,
1397 const struct mq_attr
*attr
)
1399 struct target_mq_attr
*target_mq_attr
;
1401 if (!lock_user_struct(VERIFY_WRITE
, target_mq_attr
,
1402 target_mq_attr_addr
, 0))
1403 return -TARGET_EFAULT
;
1405 __put_user(attr
->mq_flags
, &target_mq_attr
->mq_flags
);
1406 __put_user(attr
->mq_maxmsg
, &target_mq_attr
->mq_maxmsg
);
1407 __put_user(attr
->mq_msgsize
, &target_mq_attr
->mq_msgsize
);
1408 __put_user(attr
->mq_curmsgs
, &target_mq_attr
->mq_curmsgs
);
1410 unlock_user_struct(target_mq_attr
, target_mq_attr_addr
, 1);
1416 #if defined(TARGET_NR_select) || defined(TARGET_NR__newselect)
1417 /* do_select() must return target values and target errnos. */
1418 static abi_long
do_select(int n
,
1419 abi_ulong rfd_addr
, abi_ulong wfd_addr
,
1420 abi_ulong efd_addr
, abi_ulong target_tv_addr
)
1422 fd_set rfds
, wfds
, efds
;
1423 fd_set
*rfds_ptr
, *wfds_ptr
, *efds_ptr
;
1425 struct timespec ts
, *ts_ptr
;
1428 ret
= copy_from_user_fdset_ptr(&rfds
, &rfds_ptr
, rfd_addr
, n
);
1432 ret
= copy_from_user_fdset_ptr(&wfds
, &wfds_ptr
, wfd_addr
, n
);
1436 ret
= copy_from_user_fdset_ptr(&efds
, &efds_ptr
, efd_addr
, n
);
1441 if (target_tv_addr
) {
1442 if (copy_from_user_timeval(&tv
, target_tv_addr
))
1443 return -TARGET_EFAULT
;
1444 ts
.tv_sec
= tv
.tv_sec
;
1445 ts
.tv_nsec
= tv
.tv_usec
* 1000;
1451 ret
= get_errno(safe_pselect6(n
, rfds_ptr
, wfds_ptr
, efds_ptr
,
1454 if (!is_error(ret
)) {
1455 if (rfd_addr
&& copy_to_user_fdset(rfd_addr
, &rfds
, n
))
1456 return -TARGET_EFAULT
;
1457 if (wfd_addr
&& copy_to_user_fdset(wfd_addr
, &wfds
, n
))
1458 return -TARGET_EFAULT
;
1459 if (efd_addr
&& copy_to_user_fdset(efd_addr
, &efds
, n
))
1460 return -TARGET_EFAULT
;
1462 if (target_tv_addr
) {
1463 tv
.tv_sec
= ts
.tv_sec
;
1464 tv
.tv_usec
= ts
.tv_nsec
/ 1000;
1465 if (copy_to_user_timeval(target_tv_addr
, &tv
)) {
1466 return -TARGET_EFAULT
;
1474 #if defined(TARGET_WANT_OLD_SYS_SELECT)
1475 static abi_long
do_old_select(abi_ulong arg1
)
1477 struct target_sel_arg_struct
*sel
;
1478 abi_ulong inp
, outp
, exp
, tvp
;
1481 if (!lock_user_struct(VERIFY_READ
, sel
, arg1
, 1)) {
1482 return -TARGET_EFAULT
;
1485 nsel
= tswapal(sel
->n
);
1486 inp
= tswapal(sel
->inp
);
1487 outp
= tswapal(sel
->outp
);
1488 exp
= tswapal(sel
->exp
);
1489 tvp
= tswapal(sel
->tvp
);
1491 unlock_user_struct(sel
, arg1
, 0);
1493 return do_select(nsel
, inp
, outp
, exp
, tvp
);
1498 static abi_long
do_pipe2(int host_pipe
[], int flags
)
1501 return pipe2(host_pipe
, flags
);
1507 static abi_long
do_pipe(void *cpu_env
, abi_ulong pipedes
,
1508 int flags
, int is_pipe2
)
1512 ret
= flags
? do_pipe2(host_pipe
, flags
) : pipe(host_pipe
);
1515 return get_errno(ret
);
1517 /* Several targets have special calling conventions for the original
1518 pipe syscall, but didn't replicate this into the pipe2 syscall. */
1520 #if defined(TARGET_ALPHA)
1521 ((CPUAlphaState
*)cpu_env
)->ir
[IR_A4
] = host_pipe
[1];
1522 return host_pipe
[0];
1523 #elif defined(TARGET_MIPS)
1524 ((CPUMIPSState
*)cpu_env
)->active_tc
.gpr
[3] = host_pipe
[1];
1525 return host_pipe
[0];
1526 #elif defined(TARGET_SH4)
1527 ((CPUSH4State
*)cpu_env
)->gregs
[1] = host_pipe
[1];
1528 return host_pipe
[0];
1529 #elif defined(TARGET_SPARC)
1530 ((CPUSPARCState
*)cpu_env
)->regwptr
[1] = host_pipe
[1];
1531 return host_pipe
[0];
1535 if (put_user_s32(host_pipe
[0], pipedes
)
1536 || put_user_s32(host_pipe
[1], pipedes
+ sizeof(host_pipe
[0])))
1537 return -TARGET_EFAULT
;
1538 return get_errno(ret
);
1541 static inline abi_long
target_to_host_ip_mreq(struct ip_mreqn
*mreqn
,
1542 abi_ulong target_addr
,
1545 struct target_ip_mreqn
*target_smreqn
;
1547 target_smreqn
= lock_user(VERIFY_READ
, target_addr
, len
, 1);
1549 return -TARGET_EFAULT
;
1550 mreqn
->imr_multiaddr
.s_addr
= target_smreqn
->imr_multiaddr
.s_addr
;
1551 mreqn
->imr_address
.s_addr
= target_smreqn
->imr_address
.s_addr
;
1552 if (len
== sizeof(struct target_ip_mreqn
))
1553 mreqn
->imr_ifindex
= tswapal(target_smreqn
->imr_ifindex
);
1554 unlock_user(target_smreqn
, target_addr
, 0);
1559 static inline abi_long
target_to_host_sockaddr(int fd
, struct sockaddr
*addr
,
1560 abi_ulong target_addr
,
1563 const socklen_t unix_maxlen
= sizeof (struct sockaddr_un
);
1564 sa_family_t sa_family
;
1565 struct target_sockaddr
*target_saddr
;
1567 if (fd_trans_target_to_host_addr(fd
)) {
1568 return fd_trans_target_to_host_addr(fd
)(addr
, target_addr
, len
);
1571 target_saddr
= lock_user(VERIFY_READ
, target_addr
, len
, 1);
1573 return -TARGET_EFAULT
;
1575 sa_family
= tswap16(target_saddr
->sa_family
);
1577 /* Oops. The caller might send a incomplete sun_path; sun_path
1578 * must be terminated by \0 (see the manual page), but
1579 * unfortunately it is quite common to specify sockaddr_un
1580 * length as "strlen(x->sun_path)" while it should be
1581 * "strlen(...) + 1". We'll fix that here if needed.
1582 * Linux kernel has a similar feature.
1585 if (sa_family
== AF_UNIX
) {
1586 if (len
< unix_maxlen
&& len
> 0) {
1587 char *cp
= (char*)target_saddr
;
1589 if ( cp
[len
-1] && !cp
[len
] )
1592 if (len
> unix_maxlen
)
1596 memcpy(addr
, target_saddr
, len
);
1597 addr
->sa_family
= sa_family
;
1598 if (sa_family
== AF_NETLINK
) {
1599 struct sockaddr_nl
*nladdr
;
1601 nladdr
= (struct sockaddr_nl
*)addr
;
1602 nladdr
->nl_pid
= tswap32(nladdr
->nl_pid
);
1603 nladdr
->nl_groups
= tswap32(nladdr
->nl_groups
);
1604 } else if (sa_family
== AF_PACKET
) {
1605 struct target_sockaddr_ll
*lladdr
;
1607 lladdr
= (struct target_sockaddr_ll
*)addr
;
1608 lladdr
->sll_ifindex
= tswap32(lladdr
->sll_ifindex
);
1609 lladdr
->sll_hatype
= tswap16(lladdr
->sll_hatype
);
1611 unlock_user(target_saddr
, target_addr
, 0);
1616 static inline abi_long
host_to_target_sockaddr(abi_ulong target_addr
,
1617 struct sockaddr
*addr
,
1620 struct target_sockaddr
*target_saddr
;
1626 target_saddr
= lock_user(VERIFY_WRITE
, target_addr
, len
, 0);
1628 return -TARGET_EFAULT
;
1629 memcpy(target_saddr
, addr
, len
);
1630 if (len
>= offsetof(struct target_sockaddr
, sa_family
) +
1631 sizeof(target_saddr
->sa_family
)) {
1632 target_saddr
->sa_family
= tswap16(addr
->sa_family
);
1634 if (addr
->sa_family
== AF_NETLINK
&& len
>= sizeof(struct sockaddr_nl
)) {
1635 struct sockaddr_nl
*target_nl
= (struct sockaddr_nl
*)target_saddr
;
1636 target_nl
->nl_pid
= tswap32(target_nl
->nl_pid
);
1637 target_nl
->nl_groups
= tswap32(target_nl
->nl_groups
);
1638 } else if (addr
->sa_family
== AF_PACKET
) {
1639 struct sockaddr_ll
*target_ll
= (struct sockaddr_ll
*)target_saddr
;
1640 target_ll
->sll_ifindex
= tswap32(target_ll
->sll_ifindex
);
1641 target_ll
->sll_hatype
= tswap16(target_ll
->sll_hatype
);
1642 } else if (addr
->sa_family
== AF_INET6
&&
1643 len
>= sizeof(struct target_sockaddr_in6
)) {
1644 struct target_sockaddr_in6
*target_in6
=
1645 (struct target_sockaddr_in6
*)target_saddr
;
1646 target_in6
->sin6_scope_id
= tswap16(target_in6
->sin6_scope_id
);
1648 unlock_user(target_saddr
, target_addr
, len
);
1653 static inline abi_long
target_to_host_cmsg(struct msghdr
*msgh
,
1654 struct target_msghdr
*target_msgh
)
1656 struct cmsghdr
*cmsg
= CMSG_FIRSTHDR(msgh
);
1657 abi_long msg_controllen
;
1658 abi_ulong target_cmsg_addr
;
1659 struct target_cmsghdr
*target_cmsg
, *target_cmsg_start
;
1660 socklen_t space
= 0;
1662 msg_controllen
= tswapal(target_msgh
->msg_controllen
);
1663 if (msg_controllen
< sizeof (struct target_cmsghdr
))
1665 target_cmsg_addr
= tswapal(target_msgh
->msg_control
);
1666 target_cmsg
= lock_user(VERIFY_READ
, target_cmsg_addr
, msg_controllen
, 1);
1667 target_cmsg_start
= target_cmsg
;
1669 return -TARGET_EFAULT
;
1671 while (cmsg
&& target_cmsg
) {
1672 void *data
= CMSG_DATA(cmsg
);
1673 void *target_data
= TARGET_CMSG_DATA(target_cmsg
);
1675 int len
= tswapal(target_cmsg
->cmsg_len
)
1676 - TARGET_CMSG_ALIGN(sizeof (struct target_cmsghdr
));
1678 space
+= CMSG_SPACE(len
);
1679 if (space
> msgh
->msg_controllen
) {
1680 space
-= CMSG_SPACE(len
);
1681 /* This is a QEMU bug, since we allocated the payload
1682 * area ourselves (unlike overflow in host-to-target
1683 * conversion, which is just the guest giving us a buffer
1684 * that's too small). It can't happen for the payload types
1685 * we currently support; if it becomes an issue in future
1686 * we would need to improve our allocation strategy to
1687 * something more intelligent than "twice the size of the
1688 * target buffer we're reading from".
1690 gemu_log("Host cmsg overflow\n");
1694 if (tswap32(target_cmsg
->cmsg_level
) == TARGET_SOL_SOCKET
) {
1695 cmsg
->cmsg_level
= SOL_SOCKET
;
1697 cmsg
->cmsg_level
= tswap32(target_cmsg
->cmsg_level
);
1699 cmsg
->cmsg_type
= tswap32(target_cmsg
->cmsg_type
);
1700 cmsg
->cmsg_len
= CMSG_LEN(len
);
1702 if (cmsg
->cmsg_level
== SOL_SOCKET
&& cmsg
->cmsg_type
== SCM_RIGHTS
) {
1703 int *fd
= (int *)data
;
1704 int *target_fd
= (int *)target_data
;
1705 int i
, numfds
= len
/ sizeof(int);
1707 for (i
= 0; i
< numfds
; i
++) {
1708 __get_user(fd
[i
], target_fd
+ i
);
1710 } else if (cmsg
->cmsg_level
== SOL_SOCKET
1711 && cmsg
->cmsg_type
== SCM_CREDENTIALS
) {
1712 struct ucred
*cred
= (struct ucred
*)data
;
1713 struct target_ucred
*target_cred
=
1714 (struct target_ucred
*)target_data
;
1716 __get_user(cred
->pid
, &target_cred
->pid
);
1717 __get_user(cred
->uid
, &target_cred
->uid
);
1718 __get_user(cred
->gid
, &target_cred
->gid
);
1720 gemu_log("Unsupported ancillary data: %d/%d\n",
1721 cmsg
->cmsg_level
, cmsg
->cmsg_type
);
1722 memcpy(data
, target_data
, len
);
1725 cmsg
= CMSG_NXTHDR(msgh
, cmsg
);
1726 target_cmsg
= TARGET_CMSG_NXTHDR(target_msgh
, target_cmsg
,
1729 unlock_user(target_cmsg
, target_cmsg_addr
, 0);
1731 msgh
->msg_controllen
= space
;
1735 static inline abi_long
host_to_target_cmsg(struct target_msghdr
*target_msgh
,
1736 struct msghdr
*msgh
)
1738 struct cmsghdr
*cmsg
= CMSG_FIRSTHDR(msgh
);
1739 abi_long msg_controllen
;
1740 abi_ulong target_cmsg_addr
;
1741 struct target_cmsghdr
*target_cmsg
, *target_cmsg_start
;
1742 socklen_t space
= 0;
1744 msg_controllen
= tswapal(target_msgh
->msg_controllen
);
1745 if (msg_controllen
< sizeof (struct target_cmsghdr
))
1747 target_cmsg_addr
= tswapal(target_msgh
->msg_control
);
1748 target_cmsg
= lock_user(VERIFY_WRITE
, target_cmsg_addr
, msg_controllen
, 0);
1749 target_cmsg_start
= target_cmsg
;
1751 return -TARGET_EFAULT
;
1753 while (cmsg
&& target_cmsg
) {
1754 void *data
= CMSG_DATA(cmsg
);
1755 void *target_data
= TARGET_CMSG_DATA(target_cmsg
);
1757 int len
= cmsg
->cmsg_len
- CMSG_ALIGN(sizeof (struct cmsghdr
));
1758 int tgt_len
, tgt_space
;
1760 /* We never copy a half-header but may copy half-data;
1761 * this is Linux's behaviour in put_cmsg(). Note that
1762 * truncation here is a guest problem (which we report
1763 * to the guest via the CTRUNC bit), unlike truncation
1764 * in target_to_host_cmsg, which is a QEMU bug.
1766 if (msg_controllen
< sizeof(struct cmsghdr
)) {
1767 target_msgh
->msg_flags
|= tswap32(MSG_CTRUNC
);
1771 if (cmsg
->cmsg_level
== SOL_SOCKET
) {
1772 target_cmsg
->cmsg_level
= tswap32(TARGET_SOL_SOCKET
);
1774 target_cmsg
->cmsg_level
= tswap32(cmsg
->cmsg_level
);
1776 target_cmsg
->cmsg_type
= tswap32(cmsg
->cmsg_type
);
1778 tgt_len
= TARGET_CMSG_LEN(len
);
1780 /* Payload types which need a different size of payload on
1781 * the target must adjust tgt_len here.
1783 switch (cmsg
->cmsg_level
) {
1785 switch (cmsg
->cmsg_type
) {
1787 tgt_len
= sizeof(struct target_timeval
);
1796 if (msg_controllen
< tgt_len
) {
1797 target_msgh
->msg_flags
|= tswap32(MSG_CTRUNC
);
1798 tgt_len
= msg_controllen
;
1801 /* We must now copy-and-convert len bytes of payload
1802 * into tgt_len bytes of destination space. Bear in mind
1803 * that in both source and destination we may be dealing
1804 * with a truncated value!
1806 switch (cmsg
->cmsg_level
) {
1808 switch (cmsg
->cmsg_type
) {
1811 int *fd
= (int *)data
;
1812 int *target_fd
= (int *)target_data
;
1813 int i
, numfds
= tgt_len
/ sizeof(int);
1815 for (i
= 0; i
< numfds
; i
++) {
1816 __put_user(fd
[i
], target_fd
+ i
);
1822 struct timeval
*tv
= (struct timeval
*)data
;
1823 struct target_timeval
*target_tv
=
1824 (struct target_timeval
*)target_data
;
1826 if (len
!= sizeof(struct timeval
) ||
1827 tgt_len
!= sizeof(struct target_timeval
)) {
1831 /* copy struct timeval to target */
1832 __put_user(tv
->tv_sec
, &target_tv
->tv_sec
);
1833 __put_user(tv
->tv_usec
, &target_tv
->tv_usec
);
1836 case SCM_CREDENTIALS
:
1838 struct ucred
*cred
= (struct ucred
*)data
;
1839 struct target_ucred
*target_cred
=
1840 (struct target_ucred
*)target_data
;
1842 __put_user(cred
->pid
, &target_cred
->pid
);
1843 __put_user(cred
->uid
, &target_cred
->uid
);
1844 __put_user(cred
->gid
, &target_cred
->gid
);
1853 switch (cmsg
->cmsg_type
) {
1856 uint32_t *v
= (uint32_t *)data
;
1857 uint32_t *t_int
= (uint32_t *)target_data
;
1859 __put_user(*v
, t_int
);
1865 struct sock_extended_err ee
;
1866 struct sockaddr_in offender
;
1868 struct errhdr_t
*errh
= (struct errhdr_t
*)data
;
1869 struct errhdr_t
*target_errh
=
1870 (struct errhdr_t
*)target_data
;
1872 __put_user(errh
->ee
.ee_errno
, &target_errh
->ee
.ee_errno
);
1873 __put_user(errh
->ee
.ee_origin
, &target_errh
->ee
.ee_origin
);
1874 __put_user(errh
->ee
.ee_type
, &target_errh
->ee
.ee_type
);
1875 __put_user(errh
->ee
.ee_code
, &target_errh
->ee
.ee_code
);
1876 __put_user(errh
->ee
.ee_pad
, &target_errh
->ee
.ee_pad
);
1877 __put_user(errh
->ee
.ee_info
, &target_errh
->ee
.ee_info
);
1878 __put_user(errh
->ee
.ee_data
, &target_errh
->ee
.ee_data
);
1879 host_to_target_sockaddr((unsigned long) &target_errh
->offender
,
1880 (void *) &errh
->offender
, sizeof(errh
->offender
));
1889 switch (cmsg
->cmsg_type
) {
1892 uint32_t *v
= (uint32_t *)data
;
1893 uint32_t *t_int
= (uint32_t *)target_data
;
1895 __put_user(*v
, t_int
);
1901 struct sock_extended_err ee
;
1902 struct sockaddr_in6 offender
;
1904 struct errhdr6_t
*errh
= (struct errhdr6_t
*)data
;
1905 struct errhdr6_t
*target_errh
=
1906 (struct errhdr6_t
*)target_data
;
1908 __put_user(errh
->ee
.ee_errno
, &target_errh
->ee
.ee_errno
);
1909 __put_user(errh
->ee
.ee_origin
, &target_errh
->ee
.ee_origin
);
1910 __put_user(errh
->ee
.ee_type
, &target_errh
->ee
.ee_type
);
1911 __put_user(errh
->ee
.ee_code
, &target_errh
->ee
.ee_code
);
1912 __put_user(errh
->ee
.ee_pad
, &target_errh
->ee
.ee_pad
);
1913 __put_user(errh
->ee
.ee_info
, &target_errh
->ee
.ee_info
);
1914 __put_user(errh
->ee
.ee_data
, &target_errh
->ee
.ee_data
);
1915 host_to_target_sockaddr((unsigned long) &target_errh
->offender
,
1916 (void *) &errh
->offender
, sizeof(errh
->offender
));
1926 gemu_log("Unsupported ancillary data: %d/%d\n",
1927 cmsg
->cmsg_level
, cmsg
->cmsg_type
);
1928 memcpy(target_data
, data
, MIN(len
, tgt_len
));
1929 if (tgt_len
> len
) {
1930 memset(target_data
+ len
, 0, tgt_len
- len
);
1934 target_cmsg
->cmsg_len
= tswapal(tgt_len
);
1935 tgt_space
= TARGET_CMSG_SPACE(len
);
1936 if (msg_controllen
< tgt_space
) {
1937 tgt_space
= msg_controllen
;
1939 msg_controllen
-= tgt_space
;
1941 cmsg
= CMSG_NXTHDR(msgh
, cmsg
);
1942 target_cmsg
= TARGET_CMSG_NXTHDR(target_msgh
, target_cmsg
,
1945 unlock_user(target_cmsg
, target_cmsg_addr
, space
);
1947 target_msgh
->msg_controllen
= tswapal(space
);
1951 static void tswap_nlmsghdr(struct nlmsghdr
*nlh
)
1953 nlh
->nlmsg_len
= tswap32(nlh
->nlmsg_len
);
1954 nlh
->nlmsg_type
= tswap16(nlh
->nlmsg_type
);
1955 nlh
->nlmsg_flags
= tswap16(nlh
->nlmsg_flags
);
1956 nlh
->nlmsg_seq
= tswap32(nlh
->nlmsg_seq
);
1957 nlh
->nlmsg_pid
= tswap32(nlh
->nlmsg_pid
);
1960 static abi_long
host_to_target_for_each_nlmsg(struct nlmsghdr
*nlh
,
1962 abi_long (*host_to_target_nlmsg
)
1963 (struct nlmsghdr
*))
1968 while (len
> sizeof(struct nlmsghdr
)) {
1970 nlmsg_len
= nlh
->nlmsg_len
;
1971 if (nlmsg_len
< sizeof(struct nlmsghdr
) ||
1976 switch (nlh
->nlmsg_type
) {
1978 tswap_nlmsghdr(nlh
);
1984 struct nlmsgerr
*e
= NLMSG_DATA(nlh
);
1985 e
->error
= tswap32(e
->error
);
1986 tswap_nlmsghdr(&e
->msg
);
1987 tswap_nlmsghdr(nlh
);
1991 ret
= host_to_target_nlmsg(nlh
);
1993 tswap_nlmsghdr(nlh
);
1998 tswap_nlmsghdr(nlh
);
1999 len
-= NLMSG_ALIGN(nlmsg_len
);
2000 nlh
= (struct nlmsghdr
*)(((char*)nlh
) + NLMSG_ALIGN(nlmsg_len
));
2005 static abi_long
target_to_host_for_each_nlmsg(struct nlmsghdr
*nlh
,
2007 abi_long (*target_to_host_nlmsg
)
2008 (struct nlmsghdr
*))
2012 while (len
> sizeof(struct nlmsghdr
)) {
2013 if (tswap32(nlh
->nlmsg_len
) < sizeof(struct nlmsghdr
) ||
2014 tswap32(nlh
->nlmsg_len
) > len
) {
2017 tswap_nlmsghdr(nlh
);
2018 switch (nlh
->nlmsg_type
) {
2025 struct nlmsgerr
*e
= NLMSG_DATA(nlh
);
2026 e
->error
= tswap32(e
->error
);
2027 tswap_nlmsghdr(&e
->msg
);
2031 ret
= target_to_host_nlmsg(nlh
);
2036 len
-= NLMSG_ALIGN(nlh
->nlmsg_len
);
2037 nlh
= (struct nlmsghdr
*)(((char *)nlh
) + NLMSG_ALIGN(nlh
->nlmsg_len
));
2042 #ifdef CONFIG_RTNETLINK
2043 static abi_long
host_to_target_for_each_nlattr(struct nlattr
*nlattr
,
2044 size_t len
, void *context
,
2045 abi_long (*host_to_target_nlattr
)
2049 unsigned short nla_len
;
2052 while (len
> sizeof(struct nlattr
)) {
2053 nla_len
= nlattr
->nla_len
;
2054 if (nla_len
< sizeof(struct nlattr
) ||
2058 ret
= host_to_target_nlattr(nlattr
, context
);
2059 nlattr
->nla_len
= tswap16(nlattr
->nla_len
);
2060 nlattr
->nla_type
= tswap16(nlattr
->nla_type
);
2064 len
-= NLA_ALIGN(nla_len
);
2065 nlattr
= (struct nlattr
*)(((char *)nlattr
) + NLA_ALIGN(nla_len
));
2070 static abi_long
host_to_target_for_each_rtattr(struct rtattr
*rtattr
,
2072 abi_long (*host_to_target_rtattr
)
2075 unsigned short rta_len
;
2078 while (len
> sizeof(struct rtattr
)) {
2079 rta_len
= rtattr
->rta_len
;
2080 if (rta_len
< sizeof(struct rtattr
) ||
2084 ret
= host_to_target_rtattr(rtattr
);
2085 rtattr
->rta_len
= tswap16(rtattr
->rta_len
);
2086 rtattr
->rta_type
= tswap16(rtattr
->rta_type
);
2090 len
-= RTA_ALIGN(rta_len
);
2091 rtattr
= (struct rtattr
*)(((char *)rtattr
) + RTA_ALIGN(rta_len
));
2096 #define NLA_DATA(nla) ((void *)((char *)(nla)) + NLA_HDRLEN)
2098 static abi_long
host_to_target_data_bridge_nlattr(struct nlattr
*nlattr
,
2105 switch (nlattr
->nla_type
) {
2107 case QEMU_IFLA_BR_FDB_FLUSH
:
2110 case QEMU_IFLA_BR_GROUP_ADDR
:
2113 case QEMU_IFLA_BR_VLAN_FILTERING
:
2114 case QEMU_IFLA_BR_TOPOLOGY_CHANGE
:
2115 case QEMU_IFLA_BR_TOPOLOGY_CHANGE_DETECTED
:
2116 case QEMU_IFLA_BR_MCAST_ROUTER
:
2117 case QEMU_IFLA_BR_MCAST_SNOOPING
:
2118 case QEMU_IFLA_BR_MCAST_QUERY_USE_IFADDR
:
2119 case QEMU_IFLA_BR_MCAST_QUERIER
:
2120 case QEMU_IFLA_BR_NF_CALL_IPTABLES
:
2121 case QEMU_IFLA_BR_NF_CALL_IP6TABLES
:
2122 case QEMU_IFLA_BR_NF_CALL_ARPTABLES
:
2125 case QEMU_IFLA_BR_PRIORITY
:
2126 case QEMU_IFLA_BR_VLAN_PROTOCOL
:
2127 case QEMU_IFLA_BR_GROUP_FWD_MASK
:
2128 case QEMU_IFLA_BR_ROOT_PORT
:
2129 case QEMU_IFLA_BR_VLAN_DEFAULT_PVID
:
2130 u16
= NLA_DATA(nlattr
);
2131 *u16
= tswap16(*u16
);
2134 case QEMU_IFLA_BR_FORWARD_DELAY
:
2135 case QEMU_IFLA_BR_HELLO_TIME
:
2136 case QEMU_IFLA_BR_MAX_AGE
:
2137 case QEMU_IFLA_BR_AGEING_TIME
:
2138 case QEMU_IFLA_BR_STP_STATE
:
2139 case QEMU_IFLA_BR_ROOT_PATH_COST
:
2140 case QEMU_IFLA_BR_MCAST_HASH_ELASTICITY
:
2141 case QEMU_IFLA_BR_MCAST_HASH_MAX
:
2142 case QEMU_IFLA_BR_MCAST_LAST_MEMBER_CNT
:
2143 case QEMU_IFLA_BR_MCAST_STARTUP_QUERY_CNT
:
2144 u32
= NLA_DATA(nlattr
);
2145 *u32
= tswap32(*u32
);
2148 case QEMU_IFLA_BR_HELLO_TIMER
:
2149 case QEMU_IFLA_BR_TCN_TIMER
:
2150 case QEMU_IFLA_BR_GC_TIMER
:
2151 case QEMU_IFLA_BR_TOPOLOGY_CHANGE_TIMER
:
2152 case QEMU_IFLA_BR_MCAST_LAST_MEMBER_INTVL
:
2153 case QEMU_IFLA_BR_MCAST_MEMBERSHIP_INTVL
:
2154 case QEMU_IFLA_BR_MCAST_QUERIER_INTVL
:
2155 case QEMU_IFLA_BR_MCAST_QUERY_INTVL
:
2156 case QEMU_IFLA_BR_MCAST_QUERY_RESPONSE_INTVL
:
2157 case QEMU_IFLA_BR_MCAST_STARTUP_QUERY_INTVL
:
2158 u64
= NLA_DATA(nlattr
);
2159 *u64
= tswap64(*u64
);
2161 /* ifla_bridge_id: uin8_t[] */
2162 case QEMU_IFLA_BR_ROOT_ID
:
2163 case QEMU_IFLA_BR_BRIDGE_ID
:
2166 gemu_log("Unknown QEMU_IFLA_BR type %d\n", nlattr
->nla_type
);
2172 static abi_long
host_to_target_slave_data_bridge_nlattr(struct nlattr
*nlattr
,
2179 switch (nlattr
->nla_type
) {
2181 case QEMU_IFLA_BRPORT_STATE
:
2182 case QEMU_IFLA_BRPORT_MODE
:
2183 case QEMU_IFLA_BRPORT_GUARD
:
2184 case QEMU_IFLA_BRPORT_PROTECT
:
2185 case QEMU_IFLA_BRPORT_FAST_LEAVE
:
2186 case QEMU_IFLA_BRPORT_LEARNING
:
2187 case QEMU_IFLA_BRPORT_UNICAST_FLOOD
:
2188 case QEMU_IFLA_BRPORT_PROXYARP
:
2189 case QEMU_IFLA_BRPORT_LEARNING_SYNC
:
2190 case QEMU_IFLA_BRPORT_PROXYARP_WIFI
:
2191 case QEMU_IFLA_BRPORT_TOPOLOGY_CHANGE_ACK
:
2192 case QEMU_IFLA_BRPORT_CONFIG_PENDING
:
2193 case QEMU_IFLA_BRPORT_MULTICAST_ROUTER
:
2196 case QEMU_IFLA_BRPORT_PRIORITY
:
2197 case QEMU_IFLA_BRPORT_DESIGNATED_PORT
:
2198 case QEMU_IFLA_BRPORT_DESIGNATED_COST
:
2199 case QEMU_IFLA_BRPORT_ID
:
2200 case QEMU_IFLA_BRPORT_NO
:
2201 u16
= NLA_DATA(nlattr
);
2202 *u16
= tswap16(*u16
);
2205 case QEMU_IFLA_BRPORT_COST
:
2206 u32
= NLA_DATA(nlattr
);
2207 *u32
= tswap32(*u32
);
2210 case QEMU_IFLA_BRPORT_MESSAGE_AGE_TIMER
:
2211 case QEMU_IFLA_BRPORT_FORWARD_DELAY_TIMER
:
2212 case QEMU_IFLA_BRPORT_HOLD_TIMER
:
2213 u64
= NLA_DATA(nlattr
);
2214 *u64
= tswap64(*u64
);
2216 /* ifla_bridge_id: uint8_t[] */
2217 case QEMU_IFLA_BRPORT_ROOT_ID
:
2218 case QEMU_IFLA_BRPORT_BRIDGE_ID
:
2221 gemu_log("Unknown QEMU_IFLA_BRPORT type %d\n", nlattr
->nla_type
);
2227 struct linkinfo_context
{
2234 static abi_long
host_to_target_data_linkinfo_nlattr(struct nlattr
*nlattr
,
2237 struct linkinfo_context
*li_context
= context
;
2239 switch (nlattr
->nla_type
) {
2241 case QEMU_IFLA_INFO_KIND
:
2242 li_context
->name
= NLA_DATA(nlattr
);
2243 li_context
->len
= nlattr
->nla_len
- NLA_HDRLEN
;
2245 case QEMU_IFLA_INFO_SLAVE_KIND
:
2246 li_context
->slave_name
= NLA_DATA(nlattr
);
2247 li_context
->slave_len
= nlattr
->nla_len
- NLA_HDRLEN
;
2250 case QEMU_IFLA_INFO_XSTATS
:
2251 /* FIXME: only used by CAN */
2254 case QEMU_IFLA_INFO_DATA
:
2255 if (strncmp(li_context
->name
, "bridge",
2256 li_context
->len
) == 0) {
2257 return host_to_target_for_each_nlattr(NLA_DATA(nlattr
),
2260 host_to_target_data_bridge_nlattr
);
2262 gemu_log("Unknown QEMU_IFLA_INFO_KIND %s\n", li_context
->name
);
2265 case QEMU_IFLA_INFO_SLAVE_DATA
:
2266 if (strncmp(li_context
->slave_name
, "bridge",
2267 li_context
->slave_len
) == 0) {
2268 return host_to_target_for_each_nlattr(NLA_DATA(nlattr
),
2271 host_to_target_slave_data_bridge_nlattr
);
2273 gemu_log("Unknown QEMU_IFLA_INFO_SLAVE_KIND %s\n",
2274 li_context
->slave_name
);
2278 gemu_log("Unknown host QEMU_IFLA_INFO type: %d\n", nlattr
->nla_type
);
2285 static abi_long
host_to_target_data_inet_nlattr(struct nlattr
*nlattr
,
2291 switch (nlattr
->nla_type
) {
2292 case QEMU_IFLA_INET_CONF
:
2293 u32
= NLA_DATA(nlattr
);
2294 for (i
= 0; i
< (nlattr
->nla_len
- NLA_HDRLEN
) / sizeof(*u32
);
2296 u32
[i
] = tswap32(u32
[i
]);
2300 gemu_log("Unknown host AF_INET type: %d\n", nlattr
->nla_type
);
2305 static abi_long
host_to_target_data_inet6_nlattr(struct nlattr
*nlattr
,
2310 struct ifla_cacheinfo
*ci
;
2313 switch (nlattr
->nla_type
) {
2315 case QEMU_IFLA_INET6_TOKEN
:
2318 case QEMU_IFLA_INET6_ADDR_GEN_MODE
:
2321 case QEMU_IFLA_INET6_FLAGS
:
2322 u32
= NLA_DATA(nlattr
);
2323 *u32
= tswap32(*u32
);
2326 case QEMU_IFLA_INET6_CONF
:
2327 u32
= NLA_DATA(nlattr
);
2328 for (i
= 0; i
< (nlattr
->nla_len
- NLA_HDRLEN
) / sizeof(*u32
);
2330 u32
[i
] = tswap32(u32
[i
]);
2333 /* ifla_cacheinfo */
2334 case QEMU_IFLA_INET6_CACHEINFO
:
2335 ci
= NLA_DATA(nlattr
);
2336 ci
->max_reasm_len
= tswap32(ci
->max_reasm_len
);
2337 ci
->tstamp
= tswap32(ci
->tstamp
);
2338 ci
->reachable_time
= tswap32(ci
->reachable_time
);
2339 ci
->retrans_time
= tswap32(ci
->retrans_time
);
2342 case QEMU_IFLA_INET6_STATS
:
2343 case QEMU_IFLA_INET6_ICMP6STATS
:
2344 u64
= NLA_DATA(nlattr
);
2345 for (i
= 0; i
< (nlattr
->nla_len
- NLA_HDRLEN
) / sizeof(*u64
);
2347 u64
[i
] = tswap64(u64
[i
]);
2351 gemu_log("Unknown host AF_INET6 type: %d\n", nlattr
->nla_type
);
2356 static abi_long
host_to_target_data_spec_nlattr(struct nlattr
*nlattr
,
2359 switch (nlattr
->nla_type
) {
2361 return host_to_target_for_each_nlattr(NLA_DATA(nlattr
), nlattr
->nla_len
,
2363 host_to_target_data_inet_nlattr
);
2365 return host_to_target_for_each_nlattr(NLA_DATA(nlattr
), nlattr
->nla_len
,
2367 host_to_target_data_inet6_nlattr
);
2369 gemu_log("Unknown host AF_SPEC type: %d\n", nlattr
->nla_type
);
2375 static abi_long
host_to_target_data_link_rtattr(struct rtattr
*rtattr
)
2378 struct rtnl_link_stats
*st
;
2379 struct rtnl_link_stats64
*st64
;
2380 struct rtnl_link_ifmap
*map
;
2381 struct linkinfo_context li_context
;
2383 switch (rtattr
->rta_type
) {
2385 case QEMU_IFLA_ADDRESS
:
2386 case QEMU_IFLA_BROADCAST
:
2388 case QEMU_IFLA_IFNAME
:
2389 case QEMU_IFLA_QDISC
:
2392 case QEMU_IFLA_OPERSTATE
:
2393 case QEMU_IFLA_LINKMODE
:
2394 case QEMU_IFLA_CARRIER
:
2395 case QEMU_IFLA_PROTO_DOWN
:
2399 case QEMU_IFLA_LINK
:
2400 case QEMU_IFLA_WEIGHT
:
2401 case QEMU_IFLA_TXQLEN
:
2402 case QEMU_IFLA_CARRIER_CHANGES
:
2403 case QEMU_IFLA_NUM_RX_QUEUES
:
2404 case QEMU_IFLA_NUM_TX_QUEUES
:
2405 case QEMU_IFLA_PROMISCUITY
:
2406 case QEMU_IFLA_EXT_MASK
:
2407 case QEMU_IFLA_LINK_NETNSID
:
2408 case QEMU_IFLA_GROUP
:
2409 case QEMU_IFLA_MASTER
:
2410 case QEMU_IFLA_NUM_VF
:
2411 case QEMU_IFLA_GSO_MAX_SEGS
:
2412 case QEMU_IFLA_GSO_MAX_SIZE
:
2413 u32
= RTA_DATA(rtattr
);
2414 *u32
= tswap32(*u32
);
2416 /* struct rtnl_link_stats */
2417 case QEMU_IFLA_STATS
:
2418 st
= RTA_DATA(rtattr
);
2419 st
->rx_packets
= tswap32(st
->rx_packets
);
2420 st
->tx_packets
= tswap32(st
->tx_packets
);
2421 st
->rx_bytes
= tswap32(st
->rx_bytes
);
2422 st
->tx_bytes
= tswap32(st
->tx_bytes
);
2423 st
->rx_errors
= tswap32(st
->rx_errors
);
2424 st
->tx_errors
= tswap32(st
->tx_errors
);
2425 st
->rx_dropped
= tswap32(st
->rx_dropped
);
2426 st
->tx_dropped
= tswap32(st
->tx_dropped
);
2427 st
->multicast
= tswap32(st
->multicast
);
2428 st
->collisions
= tswap32(st
->collisions
);
2430 /* detailed rx_errors: */
2431 st
->rx_length_errors
= tswap32(st
->rx_length_errors
);
2432 st
->rx_over_errors
= tswap32(st
->rx_over_errors
);
2433 st
->rx_crc_errors
= tswap32(st
->rx_crc_errors
);
2434 st
->rx_frame_errors
= tswap32(st
->rx_frame_errors
);
2435 st
->rx_fifo_errors
= tswap32(st
->rx_fifo_errors
);
2436 st
->rx_missed_errors
= tswap32(st
->rx_missed_errors
);
2438 /* detailed tx_errors */
2439 st
->tx_aborted_errors
= tswap32(st
->tx_aborted_errors
);
2440 st
->tx_carrier_errors
= tswap32(st
->tx_carrier_errors
);
2441 st
->tx_fifo_errors
= tswap32(st
->tx_fifo_errors
);
2442 st
->tx_heartbeat_errors
= tswap32(st
->tx_heartbeat_errors
);
2443 st
->tx_window_errors
= tswap32(st
->tx_window_errors
);
2446 st
->rx_compressed
= tswap32(st
->rx_compressed
);
2447 st
->tx_compressed
= tswap32(st
->tx_compressed
);
2449 /* struct rtnl_link_stats64 */
2450 case QEMU_IFLA_STATS64
:
2451 st64
= RTA_DATA(rtattr
);
2452 st64
->rx_packets
= tswap64(st64
->rx_packets
);
2453 st64
->tx_packets
= tswap64(st64
->tx_packets
);
2454 st64
->rx_bytes
= tswap64(st64
->rx_bytes
);
2455 st64
->tx_bytes
= tswap64(st64
->tx_bytes
);
2456 st64
->rx_errors
= tswap64(st64
->rx_errors
);
2457 st64
->tx_errors
= tswap64(st64
->tx_errors
);
2458 st64
->rx_dropped
= tswap64(st64
->rx_dropped
);
2459 st64
->tx_dropped
= tswap64(st64
->tx_dropped
);
2460 st64
->multicast
= tswap64(st64
->multicast
);
2461 st64
->collisions
= tswap64(st64
->collisions
);
2463 /* detailed rx_errors: */
2464 st64
->rx_length_errors
= tswap64(st64
->rx_length_errors
);
2465 st64
->rx_over_errors
= tswap64(st64
->rx_over_errors
);
2466 st64
->rx_crc_errors
= tswap64(st64
->rx_crc_errors
);
2467 st64
->rx_frame_errors
= tswap64(st64
->rx_frame_errors
);
2468 st64
->rx_fifo_errors
= tswap64(st64
->rx_fifo_errors
);
2469 st64
->rx_missed_errors
= tswap64(st64
->rx_missed_errors
);
2471 /* detailed tx_errors */
2472 st64
->tx_aborted_errors
= tswap64(st64
->tx_aborted_errors
);
2473 st64
->tx_carrier_errors
= tswap64(st64
->tx_carrier_errors
);
2474 st64
->tx_fifo_errors
= tswap64(st64
->tx_fifo_errors
);
2475 st64
->tx_heartbeat_errors
= tswap64(st64
->tx_heartbeat_errors
);
2476 st64
->tx_window_errors
= tswap64(st64
->tx_window_errors
);
2479 st64
->rx_compressed
= tswap64(st64
->rx_compressed
);
2480 st64
->tx_compressed
= tswap64(st64
->tx_compressed
);
2482 /* struct rtnl_link_ifmap */
2484 map
= RTA_DATA(rtattr
);
2485 map
->mem_start
= tswap64(map
->mem_start
);
2486 map
->mem_end
= tswap64(map
->mem_end
);
2487 map
->base_addr
= tswap64(map
->base_addr
);
2488 map
->irq
= tswap16(map
->irq
);
2491 case QEMU_IFLA_LINKINFO
:
2492 memset(&li_context
, 0, sizeof(li_context
));
2493 return host_to_target_for_each_nlattr(RTA_DATA(rtattr
), rtattr
->rta_len
,
2495 host_to_target_data_linkinfo_nlattr
);
2496 case QEMU_IFLA_AF_SPEC
:
2497 return host_to_target_for_each_nlattr(RTA_DATA(rtattr
), rtattr
->rta_len
,
2499 host_to_target_data_spec_nlattr
);
2501 gemu_log("Unknown host QEMU_IFLA type: %d\n", rtattr
->rta_type
);
2507 static abi_long
host_to_target_data_addr_rtattr(struct rtattr
*rtattr
)
2510 struct ifa_cacheinfo
*ci
;
2512 switch (rtattr
->rta_type
) {
2513 /* binary: depends on family type */
2523 u32
= RTA_DATA(rtattr
);
2524 *u32
= tswap32(*u32
);
2526 /* struct ifa_cacheinfo */
2528 ci
= RTA_DATA(rtattr
);
2529 ci
->ifa_prefered
= tswap32(ci
->ifa_prefered
);
2530 ci
->ifa_valid
= tswap32(ci
->ifa_valid
);
2531 ci
->cstamp
= tswap32(ci
->cstamp
);
2532 ci
->tstamp
= tswap32(ci
->tstamp
);
2535 gemu_log("Unknown host IFA type: %d\n", rtattr
->rta_type
);
2541 static abi_long
host_to_target_data_route_rtattr(struct rtattr
*rtattr
)
2544 switch (rtattr
->rta_type
) {
2545 /* binary: depends on family type */
2554 u32
= RTA_DATA(rtattr
);
2555 *u32
= tswap32(*u32
);
2558 gemu_log("Unknown host RTA type: %d\n", rtattr
->rta_type
);
2564 static abi_long
host_to_target_link_rtattr(struct rtattr
*rtattr
,
2565 uint32_t rtattr_len
)
2567 return host_to_target_for_each_rtattr(rtattr
, rtattr_len
,
2568 host_to_target_data_link_rtattr
);
2571 static abi_long
host_to_target_addr_rtattr(struct rtattr
*rtattr
,
2572 uint32_t rtattr_len
)
2574 return host_to_target_for_each_rtattr(rtattr
, rtattr_len
,
2575 host_to_target_data_addr_rtattr
);
2578 static abi_long
host_to_target_route_rtattr(struct rtattr
*rtattr
,
2579 uint32_t rtattr_len
)
2581 return host_to_target_for_each_rtattr(rtattr
, rtattr_len
,
2582 host_to_target_data_route_rtattr
);
2585 static abi_long
host_to_target_data_route(struct nlmsghdr
*nlh
)
2588 struct ifinfomsg
*ifi
;
2589 struct ifaddrmsg
*ifa
;
2592 nlmsg_len
= nlh
->nlmsg_len
;
2593 switch (nlh
->nlmsg_type
) {
2597 if (nlh
->nlmsg_len
>= NLMSG_LENGTH(sizeof(*ifi
))) {
2598 ifi
= NLMSG_DATA(nlh
);
2599 ifi
->ifi_type
= tswap16(ifi
->ifi_type
);
2600 ifi
->ifi_index
= tswap32(ifi
->ifi_index
);
2601 ifi
->ifi_flags
= tswap32(ifi
->ifi_flags
);
2602 ifi
->ifi_change
= tswap32(ifi
->ifi_change
);
2603 host_to_target_link_rtattr(IFLA_RTA(ifi
),
2604 nlmsg_len
- NLMSG_LENGTH(sizeof(*ifi
)));
2610 if (nlh
->nlmsg_len
>= NLMSG_LENGTH(sizeof(*ifa
))) {
2611 ifa
= NLMSG_DATA(nlh
);
2612 ifa
->ifa_index
= tswap32(ifa
->ifa_index
);
2613 host_to_target_addr_rtattr(IFA_RTA(ifa
),
2614 nlmsg_len
- NLMSG_LENGTH(sizeof(*ifa
)));
2620 if (nlh
->nlmsg_len
>= NLMSG_LENGTH(sizeof(*rtm
))) {
2621 rtm
= NLMSG_DATA(nlh
);
2622 rtm
->rtm_flags
= tswap32(rtm
->rtm_flags
);
2623 host_to_target_route_rtattr(RTM_RTA(rtm
),
2624 nlmsg_len
- NLMSG_LENGTH(sizeof(*rtm
)));
2628 return -TARGET_EINVAL
;
2633 static inline abi_long
host_to_target_nlmsg_route(struct nlmsghdr
*nlh
,
2636 return host_to_target_for_each_nlmsg(nlh
, len
, host_to_target_data_route
);
2639 static abi_long
target_to_host_for_each_rtattr(struct rtattr
*rtattr
,
2641 abi_long (*target_to_host_rtattr
)
2646 while (len
>= sizeof(struct rtattr
)) {
2647 if (tswap16(rtattr
->rta_len
) < sizeof(struct rtattr
) ||
2648 tswap16(rtattr
->rta_len
) > len
) {
2651 rtattr
->rta_len
= tswap16(rtattr
->rta_len
);
2652 rtattr
->rta_type
= tswap16(rtattr
->rta_type
);
2653 ret
= target_to_host_rtattr(rtattr
);
2657 len
-= RTA_ALIGN(rtattr
->rta_len
);
2658 rtattr
= (struct rtattr
*)(((char *)rtattr
) +
2659 RTA_ALIGN(rtattr
->rta_len
));
2664 static abi_long
target_to_host_data_link_rtattr(struct rtattr
*rtattr
)
2666 switch (rtattr
->rta_type
) {
2668 gemu_log("Unknown target QEMU_IFLA type: %d\n", rtattr
->rta_type
);
2674 static abi_long
target_to_host_data_addr_rtattr(struct rtattr
*rtattr
)
2676 switch (rtattr
->rta_type
) {
2677 /* binary: depends on family type */
2682 gemu_log("Unknown target IFA type: %d\n", rtattr
->rta_type
);
2688 static abi_long
target_to_host_data_route_rtattr(struct rtattr
*rtattr
)
2691 switch (rtattr
->rta_type
) {
2692 /* binary: depends on family type */
2700 u32
= RTA_DATA(rtattr
);
2701 *u32
= tswap32(*u32
);
2704 gemu_log("Unknown target RTA type: %d\n", rtattr
->rta_type
);
2710 static void target_to_host_link_rtattr(struct rtattr
*rtattr
,
2711 uint32_t rtattr_len
)
2713 target_to_host_for_each_rtattr(rtattr
, rtattr_len
,
2714 target_to_host_data_link_rtattr
);
2717 static void target_to_host_addr_rtattr(struct rtattr
*rtattr
,
2718 uint32_t rtattr_len
)
2720 target_to_host_for_each_rtattr(rtattr
, rtattr_len
,
2721 target_to_host_data_addr_rtattr
);
2724 static void target_to_host_route_rtattr(struct rtattr
*rtattr
,
2725 uint32_t rtattr_len
)
2727 target_to_host_for_each_rtattr(rtattr
, rtattr_len
,
2728 target_to_host_data_route_rtattr
);
2731 static abi_long
target_to_host_data_route(struct nlmsghdr
*nlh
)
2733 struct ifinfomsg
*ifi
;
2734 struct ifaddrmsg
*ifa
;
2737 switch (nlh
->nlmsg_type
) {
2742 if (nlh
->nlmsg_len
>= NLMSG_LENGTH(sizeof(*ifi
))) {
2743 ifi
= NLMSG_DATA(nlh
);
2744 ifi
->ifi_type
= tswap16(ifi
->ifi_type
);
2745 ifi
->ifi_index
= tswap32(ifi
->ifi_index
);
2746 ifi
->ifi_flags
= tswap32(ifi
->ifi_flags
);
2747 ifi
->ifi_change
= tswap32(ifi
->ifi_change
);
2748 target_to_host_link_rtattr(IFLA_RTA(ifi
), nlh
->nlmsg_len
-
2749 NLMSG_LENGTH(sizeof(*ifi
)));
2755 if (nlh
->nlmsg_len
>= NLMSG_LENGTH(sizeof(*ifa
))) {
2756 ifa
= NLMSG_DATA(nlh
);
2757 ifa
->ifa_index
= tswap32(ifa
->ifa_index
);
2758 target_to_host_addr_rtattr(IFA_RTA(ifa
), nlh
->nlmsg_len
-
2759 NLMSG_LENGTH(sizeof(*ifa
)));
2766 if (nlh
->nlmsg_len
>= NLMSG_LENGTH(sizeof(*rtm
))) {
2767 rtm
= NLMSG_DATA(nlh
);
2768 rtm
->rtm_flags
= tswap32(rtm
->rtm_flags
);
2769 target_to_host_route_rtattr(RTM_RTA(rtm
), nlh
->nlmsg_len
-
2770 NLMSG_LENGTH(sizeof(*rtm
)));
2774 return -TARGET_EOPNOTSUPP
;
2779 static abi_long
target_to_host_nlmsg_route(struct nlmsghdr
*nlh
, size_t len
)
2781 return target_to_host_for_each_nlmsg(nlh
, len
, target_to_host_data_route
);
2783 #endif /* CONFIG_RTNETLINK */
2785 static abi_long
host_to_target_data_audit(struct nlmsghdr
*nlh
)
2787 switch (nlh
->nlmsg_type
) {
2789 gemu_log("Unknown host audit message type %d\n",
2791 return -TARGET_EINVAL
;
2796 static inline abi_long
host_to_target_nlmsg_audit(struct nlmsghdr
*nlh
,
2799 return host_to_target_for_each_nlmsg(nlh
, len
, host_to_target_data_audit
);
2802 static abi_long
target_to_host_data_audit(struct nlmsghdr
*nlh
)
2804 switch (nlh
->nlmsg_type
) {
2806 case AUDIT_FIRST_USER_MSG
... AUDIT_LAST_USER_MSG
:
2807 case AUDIT_FIRST_USER_MSG2
... AUDIT_LAST_USER_MSG2
:
2810 gemu_log("Unknown target audit message type %d\n",
2812 return -TARGET_EINVAL
;
2818 static abi_long
target_to_host_nlmsg_audit(struct nlmsghdr
*nlh
, size_t len
)
2820 return target_to_host_for_each_nlmsg(nlh
, len
, target_to_host_data_audit
);
2823 /* do_setsockopt() Must return target values and target errnos. */
2824 static abi_long
do_setsockopt(int sockfd
, int level
, int optname
,
2825 abi_ulong optval_addr
, socklen_t optlen
)
2829 struct ip_mreqn
*ip_mreq
;
2830 struct ip_mreq_source
*ip_mreq_source
;
2834 /* TCP options all take an 'int' value. */
2835 if (optlen
< sizeof(uint32_t))
2836 return -TARGET_EINVAL
;
2838 if (get_user_u32(val
, optval_addr
))
2839 return -TARGET_EFAULT
;
2840 ret
= get_errno(setsockopt(sockfd
, level
, optname
, &val
, sizeof(val
)));
2847 case IP_ROUTER_ALERT
:
2851 case IP_MTU_DISCOVER
:
2858 case IP_MULTICAST_TTL
:
2859 case IP_MULTICAST_LOOP
:
2861 if (optlen
>= sizeof(uint32_t)) {
2862 if (get_user_u32(val
, optval_addr
))
2863 return -TARGET_EFAULT
;
2864 } else if (optlen
>= 1) {
2865 if (get_user_u8(val
, optval_addr
))
2866 return -TARGET_EFAULT
;
2868 ret
= get_errno(setsockopt(sockfd
, level
, optname
, &val
, sizeof(val
)));
2870 case IP_ADD_MEMBERSHIP
:
2871 case IP_DROP_MEMBERSHIP
:
2872 if (optlen
< sizeof (struct target_ip_mreq
) ||
2873 optlen
> sizeof (struct target_ip_mreqn
))
2874 return -TARGET_EINVAL
;
2876 ip_mreq
= (struct ip_mreqn
*) alloca(optlen
);
2877 target_to_host_ip_mreq(ip_mreq
, optval_addr
, optlen
);
2878 ret
= get_errno(setsockopt(sockfd
, level
, optname
, ip_mreq
, optlen
));
2881 case IP_BLOCK_SOURCE
:
2882 case IP_UNBLOCK_SOURCE
:
2883 case IP_ADD_SOURCE_MEMBERSHIP
:
2884 case IP_DROP_SOURCE_MEMBERSHIP
:
2885 if (optlen
!= sizeof (struct target_ip_mreq_source
))
2886 return -TARGET_EINVAL
;
2888 ip_mreq_source
= lock_user(VERIFY_READ
, optval_addr
, optlen
, 1);
2889 ret
= get_errno(setsockopt(sockfd
, level
, optname
, ip_mreq_source
, optlen
));
2890 unlock_user (ip_mreq_source
, optval_addr
, 0);
2899 case IPV6_MTU_DISCOVER
:
2902 case IPV6_RECVPKTINFO
:
2903 case IPV6_UNICAST_HOPS
:
2905 case IPV6_RECVHOPLIMIT
:
2906 case IPV6_2292HOPLIMIT
:
2909 if (optlen
< sizeof(uint32_t)) {
2910 return -TARGET_EINVAL
;
2912 if (get_user_u32(val
, optval_addr
)) {
2913 return -TARGET_EFAULT
;
2915 ret
= get_errno(setsockopt(sockfd
, level
, optname
,
2916 &val
, sizeof(val
)));
2920 struct in6_pktinfo pki
;
2922 if (optlen
< sizeof(pki
)) {
2923 return -TARGET_EINVAL
;
2926 if (copy_from_user(&pki
, optval_addr
, sizeof(pki
))) {
2927 return -TARGET_EFAULT
;
2930 pki
.ipi6_ifindex
= tswap32(pki
.ipi6_ifindex
);
2932 ret
= get_errno(setsockopt(sockfd
, level
, optname
,
2933 &pki
, sizeof(pki
)));
2944 struct icmp6_filter icmp6f
;
2946 if (optlen
> sizeof(icmp6f
)) {
2947 optlen
= sizeof(icmp6f
);
2950 if (copy_from_user(&icmp6f
, optval_addr
, optlen
)) {
2951 return -TARGET_EFAULT
;
2954 for (val
= 0; val
< 8; val
++) {
2955 icmp6f
.data
[val
] = tswap32(icmp6f
.data
[val
]);
2958 ret
= get_errno(setsockopt(sockfd
, level
, optname
,
2970 /* those take an u32 value */
2971 if (optlen
< sizeof(uint32_t)) {
2972 return -TARGET_EINVAL
;
2975 if (get_user_u32(val
, optval_addr
)) {
2976 return -TARGET_EFAULT
;
2978 ret
= get_errno(setsockopt(sockfd
, level
, optname
,
2979 &val
, sizeof(val
)));
2986 case TARGET_SOL_SOCKET
:
2988 case TARGET_SO_RCVTIMEO
:
2992 optname
= SO_RCVTIMEO
;
2995 if (optlen
!= sizeof(struct target_timeval
)) {
2996 return -TARGET_EINVAL
;
2999 if (copy_from_user_timeval(&tv
, optval_addr
)) {
3000 return -TARGET_EFAULT
;
3003 ret
= get_errno(setsockopt(sockfd
, SOL_SOCKET
, optname
,
3007 case TARGET_SO_SNDTIMEO
:
3008 optname
= SO_SNDTIMEO
;
3010 case TARGET_SO_ATTACH_FILTER
:
3012 struct target_sock_fprog
*tfprog
;
3013 struct target_sock_filter
*tfilter
;
3014 struct sock_fprog fprog
;
3015 struct sock_filter
*filter
;
3018 if (optlen
!= sizeof(*tfprog
)) {
3019 return -TARGET_EINVAL
;
3021 if (!lock_user_struct(VERIFY_READ
, tfprog
, optval_addr
, 0)) {
3022 return -TARGET_EFAULT
;
3024 if (!lock_user_struct(VERIFY_READ
, tfilter
,
3025 tswapal(tfprog
->filter
), 0)) {
3026 unlock_user_struct(tfprog
, optval_addr
, 1);
3027 return -TARGET_EFAULT
;
3030 fprog
.len
= tswap16(tfprog
->len
);
3031 filter
= g_try_new(struct sock_filter
, fprog
.len
);
3032 if (filter
== NULL
) {
3033 unlock_user_struct(tfilter
, tfprog
->filter
, 1);
3034 unlock_user_struct(tfprog
, optval_addr
, 1);
3035 return -TARGET_ENOMEM
;
3037 for (i
= 0; i
< fprog
.len
; i
++) {
3038 filter
[i
].code
= tswap16(tfilter
[i
].code
);
3039 filter
[i
].jt
= tfilter
[i
].jt
;
3040 filter
[i
].jf
= tfilter
[i
].jf
;
3041 filter
[i
].k
= tswap32(tfilter
[i
].k
);
3043 fprog
.filter
= filter
;
3045 ret
= get_errno(setsockopt(sockfd
, SOL_SOCKET
,
3046 SO_ATTACH_FILTER
, &fprog
, sizeof(fprog
)));
3049 unlock_user_struct(tfilter
, tfprog
->filter
, 1);
3050 unlock_user_struct(tfprog
, optval_addr
, 1);
3053 case TARGET_SO_BINDTODEVICE
:
3055 char *dev_ifname
, *addr_ifname
;
3057 if (optlen
> IFNAMSIZ
- 1) {
3058 optlen
= IFNAMSIZ
- 1;
3060 dev_ifname
= lock_user(VERIFY_READ
, optval_addr
, optlen
, 1);
3062 return -TARGET_EFAULT
;
3064 optname
= SO_BINDTODEVICE
;
3065 addr_ifname
= alloca(IFNAMSIZ
);
3066 memcpy(addr_ifname
, dev_ifname
, optlen
);
3067 addr_ifname
[optlen
] = 0;
3068 ret
= get_errno(setsockopt(sockfd
, SOL_SOCKET
, optname
,
3069 addr_ifname
, optlen
));
3070 unlock_user (dev_ifname
, optval_addr
, 0);
3073 /* Options with 'int' argument. */
3074 case TARGET_SO_DEBUG
:
3077 case TARGET_SO_REUSEADDR
:
3078 optname
= SO_REUSEADDR
;
3080 case TARGET_SO_TYPE
:
3083 case TARGET_SO_ERROR
:
3086 case TARGET_SO_DONTROUTE
:
3087 optname
= SO_DONTROUTE
;
3089 case TARGET_SO_BROADCAST
:
3090 optname
= SO_BROADCAST
;
3092 case TARGET_SO_SNDBUF
:
3093 optname
= SO_SNDBUF
;
3095 case TARGET_SO_SNDBUFFORCE
:
3096 optname
= SO_SNDBUFFORCE
;
3098 case TARGET_SO_RCVBUF
:
3099 optname
= SO_RCVBUF
;
3101 case TARGET_SO_RCVBUFFORCE
:
3102 optname
= SO_RCVBUFFORCE
;
3104 case TARGET_SO_KEEPALIVE
:
3105 optname
= SO_KEEPALIVE
;
3107 case TARGET_SO_OOBINLINE
:
3108 optname
= SO_OOBINLINE
;
3110 case TARGET_SO_NO_CHECK
:
3111 optname
= SO_NO_CHECK
;
3113 case TARGET_SO_PRIORITY
:
3114 optname
= SO_PRIORITY
;
3117 case TARGET_SO_BSDCOMPAT
:
3118 optname
= SO_BSDCOMPAT
;
3121 case TARGET_SO_PASSCRED
:
3122 optname
= SO_PASSCRED
;
3124 case TARGET_SO_PASSSEC
:
3125 optname
= SO_PASSSEC
;
3127 case TARGET_SO_TIMESTAMP
:
3128 optname
= SO_TIMESTAMP
;
3130 case TARGET_SO_RCVLOWAT
:
3131 optname
= SO_RCVLOWAT
;
3137 if (optlen
< sizeof(uint32_t))
3138 return -TARGET_EINVAL
;
3140 if (get_user_u32(val
, optval_addr
))
3141 return -TARGET_EFAULT
;
3142 ret
= get_errno(setsockopt(sockfd
, SOL_SOCKET
, optname
, &val
, sizeof(val
)));
3146 gemu_log("Unsupported setsockopt level=%d optname=%d\n", level
, optname
);
3147 ret
= -TARGET_ENOPROTOOPT
;
3152 /* do_getsockopt() Must return target values and target errnos. */
3153 static abi_long
do_getsockopt(int sockfd
, int level
, int optname
,
3154 abi_ulong optval_addr
, abi_ulong optlen
)
3161 case TARGET_SOL_SOCKET
:
3164 /* These don't just return a single integer */
3165 case TARGET_SO_LINGER
:
3166 case TARGET_SO_RCVTIMEO
:
3167 case TARGET_SO_SNDTIMEO
:
3168 case TARGET_SO_PEERNAME
:
3170 case TARGET_SO_PEERCRED
: {
3173 struct target_ucred
*tcr
;
3175 if (get_user_u32(len
, optlen
)) {
3176 return -TARGET_EFAULT
;
3179 return -TARGET_EINVAL
;
3183 ret
= get_errno(getsockopt(sockfd
, level
, SO_PEERCRED
,
3191 if (!lock_user_struct(VERIFY_WRITE
, tcr
, optval_addr
, 0)) {
3192 return -TARGET_EFAULT
;
3194 __put_user(cr
.pid
, &tcr
->pid
);
3195 __put_user(cr
.uid
, &tcr
->uid
);
3196 __put_user(cr
.gid
, &tcr
->gid
);
3197 unlock_user_struct(tcr
, optval_addr
, 1);
3198 if (put_user_u32(len
, optlen
)) {
3199 return -TARGET_EFAULT
;
3203 /* Options with 'int' argument. */
3204 case TARGET_SO_DEBUG
:
3207 case TARGET_SO_REUSEADDR
:
3208 optname
= SO_REUSEADDR
;
3210 case TARGET_SO_TYPE
:
3213 case TARGET_SO_ERROR
:
3216 case TARGET_SO_DONTROUTE
:
3217 optname
= SO_DONTROUTE
;
3219 case TARGET_SO_BROADCAST
:
3220 optname
= SO_BROADCAST
;
3222 case TARGET_SO_SNDBUF
:
3223 optname
= SO_SNDBUF
;
3225 case TARGET_SO_RCVBUF
:
3226 optname
= SO_RCVBUF
;
3228 case TARGET_SO_KEEPALIVE
:
3229 optname
= SO_KEEPALIVE
;
3231 case TARGET_SO_OOBINLINE
:
3232 optname
= SO_OOBINLINE
;
3234 case TARGET_SO_NO_CHECK
:
3235 optname
= SO_NO_CHECK
;
3237 case TARGET_SO_PRIORITY
:
3238 optname
= SO_PRIORITY
;
3241 case TARGET_SO_BSDCOMPAT
:
3242 optname
= SO_BSDCOMPAT
;
3245 case TARGET_SO_PASSCRED
:
3246 optname
= SO_PASSCRED
;
3248 case TARGET_SO_TIMESTAMP
:
3249 optname
= SO_TIMESTAMP
;
3251 case TARGET_SO_RCVLOWAT
:
3252 optname
= SO_RCVLOWAT
;
3254 case TARGET_SO_ACCEPTCONN
:
3255 optname
= SO_ACCEPTCONN
;
3262 /* TCP options all take an 'int' value. */
3264 if (get_user_u32(len
, optlen
))
3265 return -TARGET_EFAULT
;
3267 return -TARGET_EINVAL
;
3269 ret
= get_errno(getsockopt(sockfd
, level
, optname
, &val
, &lv
));
3272 if (optname
== SO_TYPE
) {
3273 val
= host_to_target_sock_type(val
);
3278 if (put_user_u32(val
, optval_addr
))
3279 return -TARGET_EFAULT
;
3281 if (put_user_u8(val
, optval_addr
))
3282 return -TARGET_EFAULT
;
3284 if (put_user_u32(len
, optlen
))
3285 return -TARGET_EFAULT
;
3292 case IP_ROUTER_ALERT
:
3296 case IP_MTU_DISCOVER
:
3302 case IP_MULTICAST_TTL
:
3303 case IP_MULTICAST_LOOP
:
3304 if (get_user_u32(len
, optlen
))
3305 return -TARGET_EFAULT
;
3307 return -TARGET_EINVAL
;
3309 ret
= get_errno(getsockopt(sockfd
, level
, optname
, &val
, &lv
));
3312 if (len
< sizeof(int) && len
> 0 && val
>= 0 && val
< 255) {
3314 if (put_user_u32(len
, optlen
)
3315 || put_user_u8(val
, optval_addr
))
3316 return -TARGET_EFAULT
;
3318 if (len
> sizeof(int))
3320 if (put_user_u32(len
, optlen
)
3321 || put_user_u32(val
, optval_addr
))
3322 return -TARGET_EFAULT
;
3326 ret
= -TARGET_ENOPROTOOPT
;
3332 gemu_log("getsockopt level=%d optname=%d not yet supported\n",
3334 ret
= -TARGET_EOPNOTSUPP
;
3340 static struct iovec
*lock_iovec(int type
, abi_ulong target_addr
,
3341 abi_ulong count
, int copy
)
3343 struct target_iovec
*target_vec
;
3345 abi_ulong total_len
, max_len
;
3348 bool bad_address
= false;
3354 if (count
> IOV_MAX
) {
3359 vec
= g_try_new0(struct iovec
, count
);
3365 target_vec
= lock_user(VERIFY_READ
, target_addr
,
3366 count
* sizeof(struct target_iovec
), 1);
3367 if (target_vec
== NULL
) {
3372 /* ??? If host page size > target page size, this will result in a
3373 value larger than what we can actually support. */
3374 max_len
= 0x7fffffff & TARGET_PAGE_MASK
;
3377 for (i
= 0; i
< count
; i
++) {
3378 abi_ulong base
= tswapal(target_vec
[i
].iov_base
);
3379 abi_long len
= tswapal(target_vec
[i
].iov_len
);
3384 } else if (len
== 0) {
3385 /* Zero length pointer is ignored. */
3386 vec
[i
].iov_base
= 0;
3388 vec
[i
].iov_base
= lock_user(type
, base
, len
, copy
);
3389 /* If the first buffer pointer is bad, this is a fault. But
3390 * subsequent bad buffers will result in a partial write; this
3391 * is realized by filling the vector with null pointers and
3393 if (!vec
[i
].iov_base
) {
3404 if (len
> max_len
- total_len
) {
3405 len
= max_len
- total_len
;
3408 vec
[i
].iov_len
= len
;
3412 unlock_user(target_vec
, target_addr
, 0);
3417 if (tswapal(target_vec
[i
].iov_len
) > 0) {
3418 unlock_user(vec
[i
].iov_base
, tswapal(target_vec
[i
].iov_base
), 0);
3421 unlock_user(target_vec
, target_addr
, 0);
3428 static void unlock_iovec(struct iovec
*vec
, abi_ulong target_addr
,
3429 abi_ulong count
, int copy
)
3431 struct target_iovec
*target_vec
;
3434 target_vec
= lock_user(VERIFY_READ
, target_addr
,
3435 count
* sizeof(struct target_iovec
), 1);
3437 for (i
= 0; i
< count
; i
++) {
3438 abi_ulong base
= tswapal(target_vec
[i
].iov_base
);
3439 abi_long len
= tswapal(target_vec
[i
].iov_len
);
3443 unlock_user(vec
[i
].iov_base
, base
, copy
? vec
[i
].iov_len
: 0);
3445 unlock_user(target_vec
, target_addr
, 0);
3451 static inline int target_to_host_sock_type(int *type
)
3454 int target_type
= *type
;
3456 switch (target_type
& TARGET_SOCK_TYPE_MASK
) {
3457 case TARGET_SOCK_DGRAM
:
3458 host_type
= SOCK_DGRAM
;
3460 case TARGET_SOCK_STREAM
:
3461 host_type
= SOCK_STREAM
;
3464 host_type
= target_type
& TARGET_SOCK_TYPE_MASK
;
3467 if (target_type
& TARGET_SOCK_CLOEXEC
) {
3468 #if defined(SOCK_CLOEXEC)
3469 host_type
|= SOCK_CLOEXEC
;
3471 return -TARGET_EINVAL
;
3474 if (target_type
& TARGET_SOCK_NONBLOCK
) {
3475 #if defined(SOCK_NONBLOCK)
3476 host_type
|= SOCK_NONBLOCK
;
3477 #elif !defined(O_NONBLOCK)
3478 return -TARGET_EINVAL
;
3485 /* Try to emulate socket type flags after socket creation. */
3486 static int sock_flags_fixup(int fd
, int target_type
)
3488 #if !defined(SOCK_NONBLOCK) && defined(O_NONBLOCK)
3489 if (target_type
& TARGET_SOCK_NONBLOCK
) {
3490 int flags
= fcntl(fd
, F_GETFL
);
3491 if (fcntl(fd
, F_SETFL
, O_NONBLOCK
| flags
) == -1) {
3493 return -TARGET_EINVAL
;
3500 static abi_long
packet_target_to_host_sockaddr(void *host_addr
,
3501 abi_ulong target_addr
,
3504 struct sockaddr
*addr
= host_addr
;
3505 struct target_sockaddr
*target_saddr
;
3507 target_saddr
= lock_user(VERIFY_READ
, target_addr
, len
, 1);
3508 if (!target_saddr
) {
3509 return -TARGET_EFAULT
;
3512 memcpy(addr
, target_saddr
, len
);
3513 addr
->sa_family
= tswap16(target_saddr
->sa_family
);
3514 /* spkt_protocol is big-endian */
3516 unlock_user(target_saddr
, target_addr
, 0);
3520 static TargetFdTrans target_packet_trans
= {
3521 .target_to_host_addr
= packet_target_to_host_sockaddr
,
3524 #ifdef CONFIG_RTNETLINK
3525 static abi_long
netlink_route_target_to_host(void *buf
, size_t len
)
3529 ret
= target_to_host_nlmsg_route(buf
, len
);
3537 static abi_long
netlink_route_host_to_target(void *buf
, size_t len
)
3541 ret
= host_to_target_nlmsg_route(buf
, len
);
3549 static TargetFdTrans target_netlink_route_trans
= {
3550 .target_to_host_data
= netlink_route_target_to_host
,
3551 .host_to_target_data
= netlink_route_host_to_target
,
3553 #endif /* CONFIG_RTNETLINK */
3555 static abi_long
netlink_audit_target_to_host(void *buf
, size_t len
)
3559 ret
= target_to_host_nlmsg_audit(buf
, len
);
3567 static abi_long
netlink_audit_host_to_target(void *buf
, size_t len
)
3571 ret
= host_to_target_nlmsg_audit(buf
, len
);
3579 static TargetFdTrans target_netlink_audit_trans
= {
3580 .target_to_host_data
= netlink_audit_target_to_host
,
3581 .host_to_target_data
= netlink_audit_host_to_target
,
3584 /* do_socket() Must return target values and target errnos. */
3585 static abi_long
do_socket(int domain
, int type
, int protocol
)
3587 int target_type
= type
;
3590 ret
= target_to_host_sock_type(&type
);
3595 if (domain
== PF_NETLINK
&& !(
3596 #ifdef CONFIG_RTNETLINK
3597 protocol
== NETLINK_ROUTE
||
3599 protocol
== NETLINK_KOBJECT_UEVENT
||
3600 protocol
== NETLINK_AUDIT
)) {
3601 return -EPFNOSUPPORT
;
3604 if (domain
== AF_PACKET
||
3605 (domain
== AF_INET
&& type
== SOCK_PACKET
)) {
3606 protocol
= tswap16(protocol
);
3609 ret
= get_errno(socket(domain
, type
, protocol
));
3611 ret
= sock_flags_fixup(ret
, target_type
);
3612 if (type
== SOCK_PACKET
) {
3613 /* Manage an obsolete case :
3614 * if socket type is SOCK_PACKET, bind by name
3616 fd_trans_register(ret
, &target_packet_trans
);
3617 } else if (domain
== PF_NETLINK
) {
3619 #ifdef CONFIG_RTNETLINK
3621 fd_trans_register(ret
, &target_netlink_route_trans
);
3624 case NETLINK_KOBJECT_UEVENT
:
3625 /* nothing to do: messages are strings */
3628 fd_trans_register(ret
, &target_netlink_audit_trans
);
3631 g_assert_not_reached();
3638 /* do_bind() Must return target values and target errnos. */
3639 static abi_long
do_bind(int sockfd
, abi_ulong target_addr
,
3645 if ((int)addrlen
< 0) {
3646 return -TARGET_EINVAL
;
3649 addr
= alloca(addrlen
+1);
3651 ret
= target_to_host_sockaddr(sockfd
, addr
, target_addr
, addrlen
);
3655 return get_errno(bind(sockfd
, addr
, addrlen
));
3658 /* do_connect() Must return target values and target errnos. */
3659 static abi_long
do_connect(int sockfd
, abi_ulong target_addr
,
3665 if ((int)addrlen
< 0) {
3666 return -TARGET_EINVAL
;
3669 addr
= alloca(addrlen
+1);
3671 ret
= target_to_host_sockaddr(sockfd
, addr
, target_addr
, addrlen
);
3675 return get_errno(safe_connect(sockfd
, addr
, addrlen
));
3678 /* do_sendrecvmsg_locked() Must return target values and target errnos. */
3679 static abi_long
do_sendrecvmsg_locked(int fd
, struct target_msghdr
*msgp
,
3680 int flags
, int send
)
3686 abi_ulong target_vec
;
3688 if (msgp
->msg_name
) {
3689 msg
.msg_namelen
= tswap32(msgp
->msg_namelen
);
3690 msg
.msg_name
= alloca(msg
.msg_namelen
+1);
3691 ret
= target_to_host_sockaddr(fd
, msg
.msg_name
,
3692 tswapal(msgp
->msg_name
),
3694 if (ret
== -TARGET_EFAULT
) {
3695 /* For connected sockets msg_name and msg_namelen must
3696 * be ignored, so returning EFAULT immediately is wrong.
3697 * Instead, pass a bad msg_name to the host kernel, and
3698 * let it decide whether to return EFAULT or not.
3700 msg
.msg_name
= (void *)-1;
3705 msg
.msg_name
= NULL
;
3706 msg
.msg_namelen
= 0;
3708 msg
.msg_controllen
= 2 * tswapal(msgp
->msg_controllen
);
3709 msg
.msg_control
= alloca(msg
.msg_controllen
);
3710 msg
.msg_flags
= tswap32(msgp
->msg_flags
);
3712 count
= tswapal(msgp
->msg_iovlen
);
3713 target_vec
= tswapal(msgp
->msg_iov
);
3715 if (count
> IOV_MAX
) {
3716 /* sendrcvmsg returns a different errno for this condition than
3717 * readv/writev, so we must catch it here before lock_iovec() does.
3719 ret
= -TARGET_EMSGSIZE
;
3723 vec
= lock_iovec(send
? VERIFY_READ
: VERIFY_WRITE
,
3724 target_vec
, count
, send
);
3726 ret
= -host_to_target_errno(errno
);
3729 msg
.msg_iovlen
= count
;
3733 if (fd_trans_target_to_host_data(fd
)) {
3736 host_msg
= g_malloc(msg
.msg_iov
->iov_len
);
3737 memcpy(host_msg
, msg
.msg_iov
->iov_base
, msg
.msg_iov
->iov_len
);
3738 ret
= fd_trans_target_to_host_data(fd
)(host_msg
,
3739 msg
.msg_iov
->iov_len
);
3741 msg
.msg_iov
->iov_base
= host_msg
;
3742 ret
= get_errno(safe_sendmsg(fd
, &msg
, flags
));
3746 ret
= target_to_host_cmsg(&msg
, msgp
);
3748 ret
= get_errno(safe_sendmsg(fd
, &msg
, flags
));
3752 ret
= get_errno(safe_recvmsg(fd
, &msg
, flags
));
3753 if (!is_error(ret
)) {
3755 if (fd_trans_host_to_target_data(fd
)) {
3756 ret
= fd_trans_host_to_target_data(fd
)(msg
.msg_iov
->iov_base
,
3759 ret
= host_to_target_cmsg(msgp
, &msg
);
3761 if (!is_error(ret
)) {
3762 msgp
->msg_namelen
= tswap32(msg
.msg_namelen
);
3763 if (msg
.msg_name
!= NULL
&& msg
.msg_name
!= (void *)-1) {
3764 ret
= host_to_target_sockaddr(tswapal(msgp
->msg_name
),
3765 msg
.msg_name
, msg
.msg_namelen
);
3777 unlock_iovec(vec
, target_vec
, count
, !send
);
3782 static abi_long
do_sendrecvmsg(int fd
, abi_ulong target_msg
,
3783 int flags
, int send
)
3786 struct target_msghdr
*msgp
;
3788 if (!lock_user_struct(send
? VERIFY_READ
: VERIFY_WRITE
,
3792 return -TARGET_EFAULT
;
3794 ret
= do_sendrecvmsg_locked(fd
, msgp
, flags
, send
);
3795 unlock_user_struct(msgp
, target_msg
, send
? 0 : 1);
3799 /* We don't rely on the C library to have sendmmsg/recvmmsg support,
3800 * so it might not have this *mmsg-specific flag either.
3802 #ifndef MSG_WAITFORONE
3803 #define MSG_WAITFORONE 0x10000
3806 static abi_long
do_sendrecvmmsg(int fd
, abi_ulong target_msgvec
,
3807 unsigned int vlen
, unsigned int flags
,
3810 struct target_mmsghdr
*mmsgp
;
3814 if (vlen
> UIO_MAXIOV
) {
3818 mmsgp
= lock_user(VERIFY_WRITE
, target_msgvec
, sizeof(*mmsgp
) * vlen
, 1);
3820 return -TARGET_EFAULT
;
3823 for (i
= 0; i
< vlen
; i
++) {
3824 ret
= do_sendrecvmsg_locked(fd
, &mmsgp
[i
].msg_hdr
, flags
, send
);
3825 if (is_error(ret
)) {
3828 mmsgp
[i
].msg_len
= tswap32(ret
);
3829 /* MSG_WAITFORONE turns on MSG_DONTWAIT after one packet */
3830 if (flags
& MSG_WAITFORONE
) {
3831 flags
|= MSG_DONTWAIT
;
3835 unlock_user(mmsgp
, target_msgvec
, sizeof(*mmsgp
) * i
);
3837 /* Return number of datagrams sent if we sent any at all;
3838 * otherwise return the error.
3846 /* do_accept4() Must return target values and target errnos. */
3847 static abi_long
do_accept4(int fd
, abi_ulong target_addr
,
3848 abi_ulong target_addrlen_addr
, int flags
)
3855 host_flags
= target_to_host_bitmask(flags
, fcntl_flags_tbl
);
3857 if (target_addr
== 0) {
3858 return get_errno(safe_accept4(fd
, NULL
, NULL
, host_flags
));
3861 /* linux returns EINVAL if addrlen pointer is invalid */
3862 if (get_user_u32(addrlen
, target_addrlen_addr
))
3863 return -TARGET_EINVAL
;
3865 if ((int)addrlen
< 0) {
3866 return -TARGET_EINVAL
;
3869 if (!access_ok(VERIFY_WRITE
, target_addr
, addrlen
))
3870 return -TARGET_EINVAL
;
3872 addr
= alloca(addrlen
);
3874 ret
= get_errno(safe_accept4(fd
, addr
, &addrlen
, host_flags
));
3875 if (!is_error(ret
)) {
3876 host_to_target_sockaddr(target_addr
, addr
, addrlen
);
3877 if (put_user_u32(addrlen
, target_addrlen_addr
))
3878 ret
= -TARGET_EFAULT
;
3883 /* do_getpeername() Must return target values and target errnos. */
3884 static abi_long
do_getpeername(int fd
, abi_ulong target_addr
,
3885 abi_ulong target_addrlen_addr
)
3891 if (get_user_u32(addrlen
, target_addrlen_addr
))
3892 return -TARGET_EFAULT
;
3894 if ((int)addrlen
< 0) {
3895 return -TARGET_EINVAL
;
3898 if (!access_ok(VERIFY_WRITE
, target_addr
, addrlen
))
3899 return -TARGET_EFAULT
;
3901 addr
= alloca(addrlen
);
3903 ret
= get_errno(getpeername(fd
, addr
, &addrlen
));
3904 if (!is_error(ret
)) {
3905 host_to_target_sockaddr(target_addr
, addr
, addrlen
);
3906 if (put_user_u32(addrlen
, target_addrlen_addr
))
3907 ret
= -TARGET_EFAULT
;
3912 /* do_getsockname() Must return target values and target errnos. */
3913 static abi_long
do_getsockname(int fd
, abi_ulong target_addr
,
3914 abi_ulong target_addrlen_addr
)
3920 if (get_user_u32(addrlen
, target_addrlen_addr
))
3921 return -TARGET_EFAULT
;
3923 if ((int)addrlen
< 0) {
3924 return -TARGET_EINVAL
;
3927 if (!access_ok(VERIFY_WRITE
, target_addr
, addrlen
))
3928 return -TARGET_EFAULT
;
3930 addr
= alloca(addrlen
);
3932 ret
= get_errno(getsockname(fd
, addr
, &addrlen
));
3933 if (!is_error(ret
)) {
3934 host_to_target_sockaddr(target_addr
, addr
, addrlen
);
3935 if (put_user_u32(addrlen
, target_addrlen_addr
))
3936 ret
= -TARGET_EFAULT
;
3941 /* do_socketpair() Must return target values and target errnos. */
3942 static abi_long
do_socketpair(int domain
, int type
, int protocol
,
3943 abi_ulong target_tab_addr
)
3948 target_to_host_sock_type(&type
);
3950 ret
= get_errno(socketpair(domain
, type
, protocol
, tab
));
3951 if (!is_error(ret
)) {
3952 if (put_user_s32(tab
[0], target_tab_addr
)
3953 || put_user_s32(tab
[1], target_tab_addr
+ sizeof(tab
[0])))
3954 ret
= -TARGET_EFAULT
;
3959 /* do_sendto() Must return target values and target errnos. */
3960 static abi_long
do_sendto(int fd
, abi_ulong msg
, size_t len
, int flags
,
3961 abi_ulong target_addr
, socklen_t addrlen
)
3965 void *copy_msg
= NULL
;
3968 if ((int)addrlen
< 0) {
3969 return -TARGET_EINVAL
;
3972 host_msg
= lock_user(VERIFY_READ
, msg
, len
, 1);
3974 return -TARGET_EFAULT
;
3975 if (fd_trans_target_to_host_data(fd
)) {
3976 copy_msg
= host_msg
;
3977 host_msg
= g_malloc(len
);
3978 memcpy(host_msg
, copy_msg
, len
);
3979 ret
= fd_trans_target_to_host_data(fd
)(host_msg
, len
);
3985 addr
= alloca(addrlen
+1);
3986 ret
= target_to_host_sockaddr(fd
, addr
, target_addr
, addrlen
);
3990 ret
= get_errno(safe_sendto(fd
, host_msg
, len
, flags
, addr
, addrlen
));
3992 ret
= get_errno(safe_sendto(fd
, host_msg
, len
, flags
, NULL
, 0));
3997 host_msg
= copy_msg
;
3999 unlock_user(host_msg
, msg
, 0);
4003 /* do_recvfrom() Must return target values and target errnos. */
4004 static abi_long
do_recvfrom(int fd
, abi_ulong msg
, size_t len
, int flags
,
4005 abi_ulong target_addr
,
4006 abi_ulong target_addrlen
)
4013 host_msg
= lock_user(VERIFY_WRITE
, msg
, len
, 0);
4015 return -TARGET_EFAULT
;
4017 if (get_user_u32(addrlen
, target_addrlen
)) {
4018 ret
= -TARGET_EFAULT
;
4021 if ((int)addrlen
< 0) {
4022 ret
= -TARGET_EINVAL
;
4025 addr
= alloca(addrlen
);
4026 ret
= get_errno(safe_recvfrom(fd
, host_msg
, len
, flags
,
4029 addr
= NULL
; /* To keep compiler quiet. */
4030 ret
= get_errno(safe_recvfrom(fd
, host_msg
, len
, flags
, NULL
, 0));
4032 if (!is_error(ret
)) {
4033 if (fd_trans_host_to_target_data(fd
)) {
4034 ret
= fd_trans_host_to_target_data(fd
)(host_msg
, ret
);
4037 host_to_target_sockaddr(target_addr
, addr
, addrlen
);
4038 if (put_user_u32(addrlen
, target_addrlen
)) {
4039 ret
= -TARGET_EFAULT
;
4043 unlock_user(host_msg
, msg
, len
);
4046 unlock_user(host_msg
, msg
, 0);
4051 #ifdef TARGET_NR_socketcall
4052 /* do_socketcall() must return target values and target errnos. */
4053 static abi_long
do_socketcall(int num
, abi_ulong vptr
)
4055 static const unsigned nargs
[] = { /* number of arguments per operation */
4056 [TARGET_SYS_SOCKET
] = 3, /* domain, type, protocol */
4057 [TARGET_SYS_BIND
] = 3, /* fd, addr, addrlen */
4058 [TARGET_SYS_CONNECT
] = 3, /* fd, addr, addrlen */
4059 [TARGET_SYS_LISTEN
] = 2, /* fd, backlog */
4060 [TARGET_SYS_ACCEPT
] = 3, /* fd, addr, addrlen */
4061 [TARGET_SYS_GETSOCKNAME
] = 3, /* fd, addr, addrlen */
4062 [TARGET_SYS_GETPEERNAME
] = 3, /* fd, addr, addrlen */
4063 [TARGET_SYS_SOCKETPAIR
] = 4, /* domain, type, protocol, tab */
4064 [TARGET_SYS_SEND
] = 4, /* fd, msg, len, flags */
4065 [TARGET_SYS_RECV
] = 4, /* fd, msg, len, flags */
4066 [TARGET_SYS_SENDTO
] = 6, /* fd, msg, len, flags, addr, addrlen */
4067 [TARGET_SYS_RECVFROM
] = 6, /* fd, msg, len, flags, addr, addrlen */
4068 [TARGET_SYS_SHUTDOWN
] = 2, /* fd, how */
4069 [TARGET_SYS_SETSOCKOPT
] = 5, /* fd, level, optname, optval, optlen */
4070 [TARGET_SYS_GETSOCKOPT
] = 5, /* fd, level, optname, optval, optlen */
4071 [TARGET_SYS_SENDMSG
] = 3, /* fd, msg, flags */
4072 [TARGET_SYS_RECVMSG
] = 3, /* fd, msg, flags */
4073 [TARGET_SYS_ACCEPT4
] = 4, /* fd, addr, addrlen, flags */
4074 [TARGET_SYS_RECVMMSG
] = 4, /* fd, msgvec, vlen, flags */
4075 [TARGET_SYS_SENDMMSG
] = 4, /* fd, msgvec, vlen, flags */
4077 abi_long a
[6]; /* max 6 args */
4080 /* check the range of the first argument num */
4081 /* (TARGET_SYS_SENDMMSG is the highest among TARGET_SYS_xxx) */
4082 if (num
< 1 || num
> TARGET_SYS_SENDMMSG
) {
4083 return -TARGET_EINVAL
;
4085 /* ensure we have space for args */
4086 if (nargs
[num
] > ARRAY_SIZE(a
)) {
4087 return -TARGET_EINVAL
;
4089 /* collect the arguments in a[] according to nargs[] */
4090 for (i
= 0; i
< nargs
[num
]; ++i
) {
4091 if (get_user_ual(a
[i
], vptr
+ i
* sizeof(abi_long
)) != 0) {
4092 return -TARGET_EFAULT
;
4095 /* now when we have the args, invoke the appropriate underlying function */
4097 case TARGET_SYS_SOCKET
: /* domain, type, protocol */
4098 return do_socket(a
[0], a
[1], a
[2]);
4099 case TARGET_SYS_BIND
: /* sockfd, addr, addrlen */
4100 return do_bind(a
[0], a
[1], a
[2]);
4101 case TARGET_SYS_CONNECT
: /* sockfd, addr, addrlen */
4102 return do_connect(a
[0], a
[1], a
[2]);
4103 case TARGET_SYS_LISTEN
: /* sockfd, backlog */
4104 return get_errno(listen(a
[0], a
[1]));
4105 case TARGET_SYS_ACCEPT
: /* sockfd, addr, addrlen */
4106 return do_accept4(a
[0], a
[1], a
[2], 0);
4107 case TARGET_SYS_GETSOCKNAME
: /* sockfd, addr, addrlen */
4108 return do_getsockname(a
[0], a
[1], a
[2]);
4109 case TARGET_SYS_GETPEERNAME
: /* sockfd, addr, addrlen */
4110 return do_getpeername(a
[0], a
[1], a
[2]);
4111 case TARGET_SYS_SOCKETPAIR
: /* domain, type, protocol, tab */
4112 return do_socketpair(a
[0], a
[1], a
[2], a
[3]);
4113 case TARGET_SYS_SEND
: /* sockfd, msg, len, flags */
4114 return do_sendto(a
[0], a
[1], a
[2], a
[3], 0, 0);
4115 case TARGET_SYS_RECV
: /* sockfd, msg, len, flags */
4116 return do_recvfrom(a
[0], a
[1], a
[2], a
[3], 0, 0);
4117 case TARGET_SYS_SENDTO
: /* sockfd, msg, len, flags, addr, addrlen */
4118 return do_sendto(a
[0], a
[1], a
[2], a
[3], a
[4], a
[5]);
4119 case TARGET_SYS_RECVFROM
: /* sockfd, msg, len, flags, addr, addrlen */
4120 return do_recvfrom(a
[0], a
[1], a
[2], a
[3], a
[4], a
[5]);
4121 case TARGET_SYS_SHUTDOWN
: /* sockfd, how */
4122 return get_errno(shutdown(a
[0], a
[1]));
4123 case TARGET_SYS_SETSOCKOPT
: /* sockfd, level, optname, optval, optlen */
4124 return do_setsockopt(a
[0], a
[1], a
[2], a
[3], a
[4]);
4125 case TARGET_SYS_GETSOCKOPT
: /* sockfd, level, optname, optval, optlen */
4126 return do_getsockopt(a
[0], a
[1], a
[2], a
[3], a
[4]);
4127 case TARGET_SYS_SENDMSG
: /* sockfd, msg, flags */
4128 return do_sendrecvmsg(a
[0], a
[1], a
[2], 1);
4129 case TARGET_SYS_RECVMSG
: /* sockfd, msg, flags */
4130 return do_sendrecvmsg(a
[0], a
[1], a
[2], 0);
4131 case TARGET_SYS_ACCEPT4
: /* sockfd, addr, addrlen, flags */
4132 return do_accept4(a
[0], a
[1], a
[2], a
[3]);
4133 case TARGET_SYS_RECVMMSG
: /* sockfd, msgvec, vlen, flags */
4134 return do_sendrecvmmsg(a
[0], a
[1], a
[2], a
[3], 0);
4135 case TARGET_SYS_SENDMMSG
: /* sockfd, msgvec, vlen, flags */
4136 return do_sendrecvmmsg(a
[0], a
[1], a
[2], a
[3], 1);
4138 gemu_log("Unsupported socketcall: %d\n", num
);
4139 return -TARGET_EINVAL
;
4144 #define N_SHM_REGIONS 32
4146 static struct shm_region
{
4150 } shm_regions
[N_SHM_REGIONS
];
4152 #ifndef TARGET_SEMID64_DS
4153 /* asm-generic version of this struct */
4154 struct target_semid64_ds
4156 struct target_ipc_perm sem_perm
;
4157 abi_ulong sem_otime
;
4158 #if TARGET_ABI_BITS == 32
4159 abi_ulong __unused1
;
4161 abi_ulong sem_ctime
;
4162 #if TARGET_ABI_BITS == 32
4163 abi_ulong __unused2
;
4165 abi_ulong sem_nsems
;
4166 abi_ulong __unused3
;
4167 abi_ulong __unused4
;
4171 static inline abi_long
target_to_host_ipc_perm(struct ipc_perm
*host_ip
,
4172 abi_ulong target_addr
)
4174 struct target_ipc_perm
*target_ip
;
4175 struct target_semid64_ds
*target_sd
;
4177 if (!lock_user_struct(VERIFY_READ
, target_sd
, target_addr
, 1))
4178 return -TARGET_EFAULT
;
4179 target_ip
= &(target_sd
->sem_perm
);
4180 host_ip
->__key
= tswap32(target_ip
->__key
);
4181 host_ip
->uid
= tswap32(target_ip
->uid
);
4182 host_ip
->gid
= tswap32(target_ip
->gid
);
4183 host_ip
->cuid
= tswap32(target_ip
->cuid
);
4184 host_ip
->cgid
= tswap32(target_ip
->cgid
);
4185 #if defined(TARGET_ALPHA) || defined(TARGET_MIPS) || defined(TARGET_PPC)
4186 host_ip
->mode
= tswap32(target_ip
->mode
);
4188 host_ip
->mode
= tswap16(target_ip
->mode
);
4190 #if defined(TARGET_PPC)
4191 host_ip
->__seq
= tswap32(target_ip
->__seq
);
4193 host_ip
->__seq
= tswap16(target_ip
->__seq
);
4195 unlock_user_struct(target_sd
, target_addr
, 0);
4199 static inline abi_long
host_to_target_ipc_perm(abi_ulong target_addr
,
4200 struct ipc_perm
*host_ip
)
4202 struct target_ipc_perm
*target_ip
;
4203 struct target_semid64_ds
*target_sd
;
4205 if (!lock_user_struct(VERIFY_WRITE
, target_sd
, target_addr
, 0))
4206 return -TARGET_EFAULT
;
4207 target_ip
= &(target_sd
->sem_perm
);
4208 target_ip
->__key
= tswap32(host_ip
->__key
);
4209 target_ip
->uid
= tswap32(host_ip
->uid
);
4210 target_ip
->gid
= tswap32(host_ip
->gid
);
4211 target_ip
->cuid
= tswap32(host_ip
->cuid
);
4212 target_ip
->cgid
= tswap32(host_ip
->cgid
);
4213 #if defined(TARGET_ALPHA) || defined(TARGET_MIPS) || defined(TARGET_PPC)
4214 target_ip
->mode
= tswap32(host_ip
->mode
);
4216 target_ip
->mode
= tswap16(host_ip
->mode
);
4218 #if defined(TARGET_PPC)
4219 target_ip
->__seq
= tswap32(host_ip
->__seq
);
4221 target_ip
->__seq
= tswap16(host_ip
->__seq
);
4223 unlock_user_struct(target_sd
, target_addr
, 1);
4227 static inline abi_long
target_to_host_semid_ds(struct semid_ds
*host_sd
,
4228 abi_ulong target_addr
)
4230 struct target_semid64_ds
*target_sd
;
4232 if (!lock_user_struct(VERIFY_READ
, target_sd
, target_addr
, 1))
4233 return -TARGET_EFAULT
;
4234 if (target_to_host_ipc_perm(&(host_sd
->sem_perm
),target_addr
))
4235 return -TARGET_EFAULT
;
4236 host_sd
->sem_nsems
= tswapal(target_sd
->sem_nsems
);
4237 host_sd
->sem_otime
= tswapal(target_sd
->sem_otime
);
4238 host_sd
->sem_ctime
= tswapal(target_sd
->sem_ctime
);
4239 unlock_user_struct(target_sd
, target_addr
, 0);
4243 static inline abi_long
host_to_target_semid_ds(abi_ulong target_addr
,
4244 struct semid_ds
*host_sd
)
4246 struct target_semid64_ds
*target_sd
;
4248 if (!lock_user_struct(VERIFY_WRITE
, target_sd
, target_addr
, 0))
4249 return -TARGET_EFAULT
;
4250 if (host_to_target_ipc_perm(target_addr
,&(host_sd
->sem_perm
)))
4251 return -TARGET_EFAULT
;
4252 target_sd
->sem_nsems
= tswapal(host_sd
->sem_nsems
);
4253 target_sd
->sem_otime
= tswapal(host_sd
->sem_otime
);
4254 target_sd
->sem_ctime
= tswapal(host_sd
->sem_ctime
);
4255 unlock_user_struct(target_sd
, target_addr
, 1);
4259 struct target_seminfo
{
4272 static inline abi_long
host_to_target_seminfo(abi_ulong target_addr
,
4273 struct seminfo
*host_seminfo
)
4275 struct target_seminfo
*target_seminfo
;
4276 if (!lock_user_struct(VERIFY_WRITE
, target_seminfo
, target_addr
, 0))
4277 return -TARGET_EFAULT
;
4278 __put_user(host_seminfo
->semmap
, &target_seminfo
->semmap
);
4279 __put_user(host_seminfo
->semmni
, &target_seminfo
->semmni
);
4280 __put_user(host_seminfo
->semmns
, &target_seminfo
->semmns
);
4281 __put_user(host_seminfo
->semmnu
, &target_seminfo
->semmnu
);
4282 __put_user(host_seminfo
->semmsl
, &target_seminfo
->semmsl
);
4283 __put_user(host_seminfo
->semopm
, &target_seminfo
->semopm
);
4284 __put_user(host_seminfo
->semume
, &target_seminfo
->semume
);
4285 __put_user(host_seminfo
->semusz
, &target_seminfo
->semusz
);
4286 __put_user(host_seminfo
->semvmx
, &target_seminfo
->semvmx
);
4287 __put_user(host_seminfo
->semaem
, &target_seminfo
->semaem
);
4288 unlock_user_struct(target_seminfo
, target_addr
, 1);
4294 struct semid_ds
*buf
;
4295 unsigned short *array
;
4296 struct seminfo
*__buf
;
4299 union target_semun
{
4306 static inline abi_long
target_to_host_semarray(int semid
, unsigned short **host_array
,
4307 abi_ulong target_addr
)
4310 unsigned short *array
;
4312 struct semid_ds semid_ds
;
4315 semun
.buf
= &semid_ds
;
4317 ret
= semctl(semid
, 0, IPC_STAT
, semun
);
4319 return get_errno(ret
);
4321 nsems
= semid_ds
.sem_nsems
;
4323 *host_array
= g_try_new(unsigned short, nsems
);
4325 return -TARGET_ENOMEM
;
4327 array
= lock_user(VERIFY_READ
, target_addr
,
4328 nsems
*sizeof(unsigned short), 1);
4330 g_free(*host_array
);
4331 return -TARGET_EFAULT
;
4334 for(i
=0; i
<nsems
; i
++) {
4335 __get_user((*host_array
)[i
], &array
[i
]);
4337 unlock_user(array
, target_addr
, 0);
4342 static inline abi_long
host_to_target_semarray(int semid
, abi_ulong target_addr
,
4343 unsigned short **host_array
)
4346 unsigned short *array
;
4348 struct semid_ds semid_ds
;
4351 semun
.buf
= &semid_ds
;
4353 ret
= semctl(semid
, 0, IPC_STAT
, semun
);
4355 return get_errno(ret
);
4357 nsems
= semid_ds
.sem_nsems
;
4359 array
= lock_user(VERIFY_WRITE
, target_addr
,
4360 nsems
*sizeof(unsigned short), 0);
4362 return -TARGET_EFAULT
;
4364 for(i
=0; i
<nsems
; i
++) {
4365 __put_user((*host_array
)[i
], &array
[i
]);
4367 g_free(*host_array
);
4368 unlock_user(array
, target_addr
, 1);
4373 static inline abi_long
do_semctl(int semid
, int semnum
, int cmd
,
4374 abi_ulong target_arg
)
4376 union target_semun target_su
= { .buf
= target_arg
};
4378 struct semid_ds dsarg
;
4379 unsigned short *array
= NULL
;
4380 struct seminfo seminfo
;
4381 abi_long ret
= -TARGET_EINVAL
;
4388 /* In 64 bit cross-endian situations, we will erroneously pick up
4389 * the wrong half of the union for the "val" element. To rectify
4390 * this, the entire 8-byte structure is byteswapped, followed by
4391 * a swap of the 4 byte val field. In other cases, the data is
4392 * already in proper host byte order. */
4393 if (sizeof(target_su
.val
) != (sizeof(target_su
.buf
))) {
4394 target_su
.buf
= tswapal(target_su
.buf
);
4395 arg
.val
= tswap32(target_su
.val
);
4397 arg
.val
= target_su
.val
;
4399 ret
= get_errno(semctl(semid
, semnum
, cmd
, arg
));
4403 err
= target_to_host_semarray(semid
, &array
, target_su
.array
);
4407 ret
= get_errno(semctl(semid
, semnum
, cmd
, arg
));
4408 err
= host_to_target_semarray(semid
, target_su
.array
, &array
);
4415 err
= target_to_host_semid_ds(&dsarg
, target_su
.buf
);
4419 ret
= get_errno(semctl(semid
, semnum
, cmd
, arg
));
4420 err
= host_to_target_semid_ds(target_su
.buf
, &dsarg
);
4426 arg
.__buf
= &seminfo
;
4427 ret
= get_errno(semctl(semid
, semnum
, cmd
, arg
));
4428 err
= host_to_target_seminfo(target_su
.__buf
, &seminfo
);
4436 ret
= get_errno(semctl(semid
, semnum
, cmd
, NULL
));
4443 struct target_sembuf
{
4444 unsigned short sem_num
;
4449 static inline abi_long
target_to_host_sembuf(struct sembuf
*host_sembuf
,
4450 abi_ulong target_addr
,
4453 struct target_sembuf
*target_sembuf
;
4456 target_sembuf
= lock_user(VERIFY_READ
, target_addr
,
4457 nsops
*sizeof(struct target_sembuf
), 1);
4459 return -TARGET_EFAULT
;
4461 for(i
=0; i
<nsops
; i
++) {
4462 __get_user(host_sembuf
[i
].sem_num
, &target_sembuf
[i
].sem_num
);
4463 __get_user(host_sembuf
[i
].sem_op
, &target_sembuf
[i
].sem_op
);
4464 __get_user(host_sembuf
[i
].sem_flg
, &target_sembuf
[i
].sem_flg
);
4467 unlock_user(target_sembuf
, target_addr
, 0);
4472 static inline abi_long
do_semop(int semid
, abi_long ptr
, unsigned nsops
)
4474 struct sembuf sops
[nsops
];
4476 if (target_to_host_sembuf(sops
, ptr
, nsops
))
4477 return -TARGET_EFAULT
;
4479 return get_errno(safe_semtimedop(semid
, sops
, nsops
, NULL
));
4482 struct target_msqid_ds
4484 struct target_ipc_perm msg_perm
;
4485 abi_ulong msg_stime
;
4486 #if TARGET_ABI_BITS == 32
4487 abi_ulong __unused1
;
4489 abi_ulong msg_rtime
;
4490 #if TARGET_ABI_BITS == 32
4491 abi_ulong __unused2
;
4493 abi_ulong msg_ctime
;
4494 #if TARGET_ABI_BITS == 32
4495 abi_ulong __unused3
;
4497 abi_ulong __msg_cbytes
;
4499 abi_ulong msg_qbytes
;
4500 abi_ulong msg_lspid
;
4501 abi_ulong msg_lrpid
;
4502 abi_ulong __unused4
;
4503 abi_ulong __unused5
;
4506 static inline abi_long
target_to_host_msqid_ds(struct msqid_ds
*host_md
,
4507 abi_ulong target_addr
)
4509 struct target_msqid_ds
*target_md
;
4511 if (!lock_user_struct(VERIFY_READ
, target_md
, target_addr
, 1))
4512 return -TARGET_EFAULT
;
4513 if (target_to_host_ipc_perm(&(host_md
->msg_perm
),target_addr
))
4514 return -TARGET_EFAULT
;
4515 host_md
->msg_stime
= tswapal(target_md
->msg_stime
);
4516 host_md
->msg_rtime
= tswapal(target_md
->msg_rtime
);
4517 host_md
->msg_ctime
= tswapal(target_md
->msg_ctime
);
4518 host_md
->__msg_cbytes
= tswapal(target_md
->__msg_cbytes
);
4519 host_md
->msg_qnum
= tswapal(target_md
->msg_qnum
);
4520 host_md
->msg_qbytes
= tswapal(target_md
->msg_qbytes
);
4521 host_md
->msg_lspid
= tswapal(target_md
->msg_lspid
);
4522 host_md
->msg_lrpid
= tswapal(target_md
->msg_lrpid
);
4523 unlock_user_struct(target_md
, target_addr
, 0);
4527 static inline abi_long
host_to_target_msqid_ds(abi_ulong target_addr
,
4528 struct msqid_ds
*host_md
)
4530 struct target_msqid_ds
*target_md
;
4532 if (!lock_user_struct(VERIFY_WRITE
, target_md
, target_addr
, 0))
4533 return -TARGET_EFAULT
;
4534 if (host_to_target_ipc_perm(target_addr
,&(host_md
->msg_perm
)))
4535 return -TARGET_EFAULT
;
4536 target_md
->msg_stime
= tswapal(host_md
->msg_stime
);
4537 target_md
->msg_rtime
= tswapal(host_md
->msg_rtime
);
4538 target_md
->msg_ctime
= tswapal(host_md
->msg_ctime
);
4539 target_md
->__msg_cbytes
= tswapal(host_md
->__msg_cbytes
);
4540 target_md
->msg_qnum
= tswapal(host_md
->msg_qnum
);
4541 target_md
->msg_qbytes
= tswapal(host_md
->msg_qbytes
);
4542 target_md
->msg_lspid
= tswapal(host_md
->msg_lspid
);
4543 target_md
->msg_lrpid
= tswapal(host_md
->msg_lrpid
);
4544 unlock_user_struct(target_md
, target_addr
, 1);
4548 struct target_msginfo
{
4556 unsigned short int msgseg
;
4559 static inline abi_long
host_to_target_msginfo(abi_ulong target_addr
,
4560 struct msginfo
*host_msginfo
)
4562 struct target_msginfo
*target_msginfo
;
4563 if (!lock_user_struct(VERIFY_WRITE
, target_msginfo
, target_addr
, 0))
4564 return -TARGET_EFAULT
;
4565 __put_user(host_msginfo
->msgpool
, &target_msginfo
->msgpool
);
4566 __put_user(host_msginfo
->msgmap
, &target_msginfo
->msgmap
);
4567 __put_user(host_msginfo
->msgmax
, &target_msginfo
->msgmax
);
4568 __put_user(host_msginfo
->msgmnb
, &target_msginfo
->msgmnb
);
4569 __put_user(host_msginfo
->msgmni
, &target_msginfo
->msgmni
);
4570 __put_user(host_msginfo
->msgssz
, &target_msginfo
->msgssz
);
4571 __put_user(host_msginfo
->msgtql
, &target_msginfo
->msgtql
);
4572 __put_user(host_msginfo
->msgseg
, &target_msginfo
->msgseg
);
4573 unlock_user_struct(target_msginfo
, target_addr
, 1);
4577 static inline abi_long
do_msgctl(int msgid
, int cmd
, abi_long ptr
)
4579 struct msqid_ds dsarg
;
4580 struct msginfo msginfo
;
4581 abi_long ret
= -TARGET_EINVAL
;
4589 if (target_to_host_msqid_ds(&dsarg
,ptr
))
4590 return -TARGET_EFAULT
;
4591 ret
= get_errno(msgctl(msgid
, cmd
, &dsarg
));
4592 if (host_to_target_msqid_ds(ptr
,&dsarg
))
4593 return -TARGET_EFAULT
;
4596 ret
= get_errno(msgctl(msgid
, cmd
, NULL
));
4600 ret
= get_errno(msgctl(msgid
, cmd
, (struct msqid_ds
*)&msginfo
));
4601 if (host_to_target_msginfo(ptr
, &msginfo
))
4602 return -TARGET_EFAULT
;
4609 struct target_msgbuf
{
4614 static inline abi_long
do_msgsnd(int msqid
, abi_long msgp
,
4615 ssize_t msgsz
, int msgflg
)
4617 struct target_msgbuf
*target_mb
;
4618 struct msgbuf
*host_mb
;
4622 return -TARGET_EINVAL
;
4625 if (!lock_user_struct(VERIFY_READ
, target_mb
, msgp
, 0))
4626 return -TARGET_EFAULT
;
4627 host_mb
= g_try_malloc(msgsz
+ sizeof(long));
4629 unlock_user_struct(target_mb
, msgp
, 0);
4630 return -TARGET_ENOMEM
;
4632 host_mb
->mtype
= (abi_long
) tswapal(target_mb
->mtype
);
4633 memcpy(host_mb
->mtext
, target_mb
->mtext
, msgsz
);
4634 ret
= get_errno(safe_msgsnd(msqid
, host_mb
, msgsz
, msgflg
));
4636 unlock_user_struct(target_mb
, msgp
, 0);
4641 static inline abi_long
do_msgrcv(int msqid
, abi_long msgp
,
4642 ssize_t msgsz
, abi_long msgtyp
,
4645 struct target_msgbuf
*target_mb
;
4647 struct msgbuf
*host_mb
;
4651 return -TARGET_EINVAL
;
4654 if (!lock_user_struct(VERIFY_WRITE
, target_mb
, msgp
, 0))
4655 return -TARGET_EFAULT
;
4657 host_mb
= g_try_malloc(msgsz
+ sizeof(long));
4659 ret
= -TARGET_ENOMEM
;
4662 ret
= get_errno(safe_msgrcv(msqid
, host_mb
, msgsz
, msgtyp
, msgflg
));
4665 abi_ulong target_mtext_addr
= msgp
+ sizeof(abi_ulong
);
4666 target_mtext
= lock_user(VERIFY_WRITE
, target_mtext_addr
, ret
, 0);
4667 if (!target_mtext
) {
4668 ret
= -TARGET_EFAULT
;
4671 memcpy(target_mb
->mtext
, host_mb
->mtext
, ret
);
4672 unlock_user(target_mtext
, target_mtext_addr
, ret
);
4675 target_mb
->mtype
= tswapal(host_mb
->mtype
);
4679 unlock_user_struct(target_mb
, msgp
, 1);
4684 static inline abi_long
target_to_host_shmid_ds(struct shmid_ds
*host_sd
,
4685 abi_ulong target_addr
)
4687 struct target_shmid_ds
*target_sd
;
4689 if (!lock_user_struct(VERIFY_READ
, target_sd
, target_addr
, 1))
4690 return -TARGET_EFAULT
;
4691 if (target_to_host_ipc_perm(&(host_sd
->shm_perm
), target_addr
))
4692 return -TARGET_EFAULT
;
4693 __get_user(host_sd
->shm_segsz
, &target_sd
->shm_segsz
);
4694 __get_user(host_sd
->shm_atime
, &target_sd
->shm_atime
);
4695 __get_user(host_sd
->shm_dtime
, &target_sd
->shm_dtime
);
4696 __get_user(host_sd
->shm_ctime
, &target_sd
->shm_ctime
);
4697 __get_user(host_sd
->shm_cpid
, &target_sd
->shm_cpid
);
4698 __get_user(host_sd
->shm_lpid
, &target_sd
->shm_lpid
);
4699 __get_user(host_sd
->shm_nattch
, &target_sd
->shm_nattch
);
4700 unlock_user_struct(target_sd
, target_addr
, 0);
4704 static inline abi_long
host_to_target_shmid_ds(abi_ulong target_addr
,
4705 struct shmid_ds
*host_sd
)
4707 struct target_shmid_ds
*target_sd
;
4709 if (!lock_user_struct(VERIFY_WRITE
, target_sd
, target_addr
, 0))
4710 return -TARGET_EFAULT
;
4711 if (host_to_target_ipc_perm(target_addr
, &(host_sd
->shm_perm
)))
4712 return -TARGET_EFAULT
;
4713 __put_user(host_sd
->shm_segsz
, &target_sd
->shm_segsz
);
4714 __put_user(host_sd
->shm_atime
, &target_sd
->shm_atime
);
4715 __put_user(host_sd
->shm_dtime
, &target_sd
->shm_dtime
);
4716 __put_user(host_sd
->shm_ctime
, &target_sd
->shm_ctime
);
4717 __put_user(host_sd
->shm_cpid
, &target_sd
->shm_cpid
);
4718 __put_user(host_sd
->shm_lpid
, &target_sd
->shm_lpid
);
4719 __put_user(host_sd
->shm_nattch
, &target_sd
->shm_nattch
);
4720 unlock_user_struct(target_sd
, target_addr
, 1);
4724 struct target_shminfo
{
4732 static inline abi_long
host_to_target_shminfo(abi_ulong target_addr
,
4733 struct shminfo
*host_shminfo
)
4735 struct target_shminfo
*target_shminfo
;
4736 if (!lock_user_struct(VERIFY_WRITE
, target_shminfo
, target_addr
, 0))
4737 return -TARGET_EFAULT
;
4738 __put_user(host_shminfo
->shmmax
, &target_shminfo
->shmmax
);
4739 __put_user(host_shminfo
->shmmin
, &target_shminfo
->shmmin
);
4740 __put_user(host_shminfo
->shmmni
, &target_shminfo
->shmmni
);
4741 __put_user(host_shminfo
->shmseg
, &target_shminfo
->shmseg
);
4742 __put_user(host_shminfo
->shmall
, &target_shminfo
->shmall
);
4743 unlock_user_struct(target_shminfo
, target_addr
, 1);
4747 struct target_shm_info
{
4752 abi_ulong swap_attempts
;
4753 abi_ulong swap_successes
;
4756 static inline abi_long
host_to_target_shm_info(abi_ulong target_addr
,
4757 struct shm_info
*host_shm_info
)
4759 struct target_shm_info
*target_shm_info
;
4760 if (!lock_user_struct(VERIFY_WRITE
, target_shm_info
, target_addr
, 0))
4761 return -TARGET_EFAULT
;
4762 __put_user(host_shm_info
->used_ids
, &target_shm_info
->used_ids
);
4763 __put_user(host_shm_info
->shm_tot
, &target_shm_info
->shm_tot
);
4764 __put_user(host_shm_info
->shm_rss
, &target_shm_info
->shm_rss
);
4765 __put_user(host_shm_info
->shm_swp
, &target_shm_info
->shm_swp
);
4766 __put_user(host_shm_info
->swap_attempts
, &target_shm_info
->swap_attempts
);
4767 __put_user(host_shm_info
->swap_successes
, &target_shm_info
->swap_successes
);
4768 unlock_user_struct(target_shm_info
, target_addr
, 1);
4772 static inline abi_long
do_shmctl(int shmid
, int cmd
, abi_long buf
)
4774 struct shmid_ds dsarg
;
4775 struct shminfo shminfo
;
4776 struct shm_info shm_info
;
4777 abi_long ret
= -TARGET_EINVAL
;
4785 if (target_to_host_shmid_ds(&dsarg
, buf
))
4786 return -TARGET_EFAULT
;
4787 ret
= get_errno(shmctl(shmid
, cmd
, &dsarg
));
4788 if (host_to_target_shmid_ds(buf
, &dsarg
))
4789 return -TARGET_EFAULT
;
4792 ret
= get_errno(shmctl(shmid
, cmd
, (struct shmid_ds
*)&shminfo
));
4793 if (host_to_target_shminfo(buf
, &shminfo
))
4794 return -TARGET_EFAULT
;
4797 ret
= get_errno(shmctl(shmid
, cmd
, (struct shmid_ds
*)&shm_info
));
4798 if (host_to_target_shm_info(buf
, &shm_info
))
4799 return -TARGET_EFAULT
;
4804 ret
= get_errno(shmctl(shmid
, cmd
, NULL
));
4811 #ifndef TARGET_FORCE_SHMLBA
4812 /* For most architectures, SHMLBA is the same as the page size;
4813 * some architectures have larger values, in which case they should
4814 * define TARGET_FORCE_SHMLBA and provide a target_shmlba() function.
4815 * This corresponds to the kernel arch code defining __ARCH_FORCE_SHMLBA
4816 * and defining its own value for SHMLBA.
4818 * The kernel also permits SHMLBA to be set by the architecture to a
4819 * value larger than the page size without setting __ARCH_FORCE_SHMLBA;
4820 * this means that addresses are rounded to the large size if
4821 * SHM_RND is set but addresses not aligned to that size are not rejected
4822 * as long as they are at least page-aligned. Since the only architecture
4823 * which uses this is ia64 this code doesn't provide for that oddity.
4825 static inline abi_ulong
target_shmlba(CPUArchState
*cpu_env
)
4827 return TARGET_PAGE_SIZE
;
4831 static inline abi_ulong
do_shmat(CPUArchState
*cpu_env
,
4832 int shmid
, abi_ulong shmaddr
, int shmflg
)
4836 struct shmid_ds shm_info
;
4840 /* find out the length of the shared memory segment */
4841 ret
= get_errno(shmctl(shmid
, IPC_STAT
, &shm_info
));
4842 if (is_error(ret
)) {
4843 /* can't get length, bail out */
4847 shmlba
= target_shmlba(cpu_env
);
4849 if (shmaddr
& (shmlba
- 1)) {
4850 if (shmflg
& SHM_RND
) {
4851 shmaddr
&= ~(shmlba
- 1);
4853 return -TARGET_EINVAL
;
4860 host_raddr
= shmat(shmid
, (void *)g2h(shmaddr
), shmflg
);
4862 abi_ulong mmap_start
;
4864 mmap_start
= mmap_find_vma(0, shm_info
.shm_segsz
);
4866 if (mmap_start
== -1) {
4868 host_raddr
= (void *)-1;
4870 host_raddr
= shmat(shmid
, g2h(mmap_start
), shmflg
| SHM_REMAP
);
4873 if (host_raddr
== (void *)-1) {
4875 return get_errno((long)host_raddr
);
4877 raddr
=h2g((unsigned long)host_raddr
);
4879 page_set_flags(raddr
, raddr
+ shm_info
.shm_segsz
,
4880 PAGE_VALID
| PAGE_READ
|
4881 ((shmflg
& SHM_RDONLY
)? 0 : PAGE_WRITE
));
4883 for (i
= 0; i
< N_SHM_REGIONS
; i
++) {
4884 if (!shm_regions
[i
].in_use
) {
4885 shm_regions
[i
].in_use
= true;
4886 shm_regions
[i
].start
= raddr
;
4887 shm_regions
[i
].size
= shm_info
.shm_segsz
;
4897 static inline abi_long
do_shmdt(abi_ulong shmaddr
)
4901 for (i
= 0; i
< N_SHM_REGIONS
; ++i
) {
4902 if (shm_regions
[i
].in_use
&& shm_regions
[i
].start
== shmaddr
) {
4903 shm_regions
[i
].in_use
= false;
4904 page_set_flags(shmaddr
, shmaddr
+ shm_regions
[i
].size
, 0);
4909 return get_errno(shmdt(g2h(shmaddr
)));
4912 #ifdef TARGET_NR_ipc
4913 /* ??? This only works with linear mappings. */
4914 /* do_ipc() must return target values and target errnos. */
4915 static abi_long
do_ipc(CPUArchState
*cpu_env
,
4916 unsigned int call
, abi_long first
,
4917 abi_long second
, abi_long third
,
4918 abi_long ptr
, abi_long fifth
)
4923 version
= call
>> 16;
4928 ret
= do_semop(first
, ptr
, second
);
4932 ret
= get_errno(semget(first
, second
, third
));
4935 case IPCOP_semctl
: {
4936 /* The semun argument to semctl is passed by value, so dereference the
4939 get_user_ual(atptr
, ptr
);
4940 ret
= do_semctl(first
, second
, third
, atptr
);
4945 ret
= get_errno(msgget(first
, second
));
4949 ret
= do_msgsnd(first
, ptr
, second
, third
);
4953 ret
= do_msgctl(first
, second
, ptr
);
4960 struct target_ipc_kludge
{
4965 if (!lock_user_struct(VERIFY_READ
, tmp
, ptr
, 1)) {
4966 ret
= -TARGET_EFAULT
;
4970 ret
= do_msgrcv(first
, tswapal(tmp
->msgp
), second
, tswapal(tmp
->msgtyp
), third
);
4972 unlock_user_struct(tmp
, ptr
, 0);
4976 ret
= do_msgrcv(first
, ptr
, second
, fifth
, third
);
4985 raddr
= do_shmat(cpu_env
, first
, ptr
, second
);
4986 if (is_error(raddr
))
4987 return get_errno(raddr
);
4988 if (put_user_ual(raddr
, third
))
4989 return -TARGET_EFAULT
;
4993 ret
= -TARGET_EINVAL
;
4998 ret
= do_shmdt(ptr
);
5002 /* IPC_* flag values are the same on all linux platforms */
5003 ret
= get_errno(shmget(first
, second
, third
));
5006 /* IPC_* and SHM_* command values are the same on all linux platforms */
5008 ret
= do_shmctl(first
, second
, ptr
);
5011 gemu_log("Unsupported ipc call: %d (version %d)\n", call
, version
);
5012 ret
= -TARGET_ENOSYS
;
5019 /* kernel structure types definitions */
5021 #define STRUCT(name, ...) STRUCT_ ## name,
5022 #define STRUCT_SPECIAL(name) STRUCT_ ## name,
5024 #include "syscall_types.h"
5028 #undef STRUCT_SPECIAL
5030 #define STRUCT(name, ...) static const argtype struct_ ## name ## _def[] = { __VA_ARGS__, TYPE_NULL };
5031 #define STRUCT_SPECIAL(name)
5032 #include "syscall_types.h"
5034 #undef STRUCT_SPECIAL
5036 typedef struct IOCTLEntry IOCTLEntry
;
5038 typedef abi_long
do_ioctl_fn(const IOCTLEntry
*ie
, uint8_t *buf_temp
,
5039 int fd
, int cmd
, abi_long arg
);
5043 unsigned int host_cmd
;
5046 do_ioctl_fn
*do_ioctl
;
5047 const argtype arg_type
[5];
5050 #define IOC_R 0x0001
5051 #define IOC_W 0x0002
5052 #define IOC_RW (IOC_R | IOC_W)
5054 #define MAX_STRUCT_SIZE 4096
5056 #ifdef CONFIG_FIEMAP
5057 /* So fiemap access checks don't overflow on 32 bit systems.
5058 * This is very slightly smaller than the limit imposed by
5059 * the underlying kernel.
5061 #define FIEMAP_MAX_EXTENTS ((UINT_MAX - sizeof(struct fiemap)) \
5062 / sizeof(struct fiemap_extent))
5064 static abi_long
do_ioctl_fs_ioc_fiemap(const IOCTLEntry
*ie
, uint8_t *buf_temp
,
5065 int fd
, int cmd
, abi_long arg
)
5067 /* The parameter for this ioctl is a struct fiemap followed
5068 * by an array of struct fiemap_extent whose size is set
5069 * in fiemap->fm_extent_count. The array is filled in by the
5072 int target_size_in
, target_size_out
;
5074 const argtype
*arg_type
= ie
->arg_type
;
5075 const argtype extent_arg_type
[] = { MK_STRUCT(STRUCT_fiemap_extent
) };
5078 int i
, extent_size
= thunk_type_size(extent_arg_type
, 0);
5082 assert(arg_type
[0] == TYPE_PTR
);
5083 assert(ie
->access
== IOC_RW
);
5085 target_size_in
= thunk_type_size(arg_type
, 0);
5086 argptr
= lock_user(VERIFY_READ
, arg
, target_size_in
, 1);
5088 return -TARGET_EFAULT
;
5090 thunk_convert(buf_temp
, argptr
, arg_type
, THUNK_HOST
);
5091 unlock_user(argptr
, arg
, 0);
5092 fm
= (struct fiemap
*)buf_temp
;
5093 if (fm
->fm_extent_count
> FIEMAP_MAX_EXTENTS
) {
5094 return -TARGET_EINVAL
;
5097 outbufsz
= sizeof (*fm
) +
5098 (sizeof(struct fiemap_extent
) * fm
->fm_extent_count
);
5100 if (outbufsz
> MAX_STRUCT_SIZE
) {
5101 /* We can't fit all the extents into the fixed size buffer.
5102 * Allocate one that is large enough and use it instead.
5104 fm
= g_try_malloc(outbufsz
);
5106 return -TARGET_ENOMEM
;
5108 memcpy(fm
, buf_temp
, sizeof(struct fiemap
));
5111 ret
= get_errno(safe_ioctl(fd
, ie
->host_cmd
, fm
));
5112 if (!is_error(ret
)) {
5113 target_size_out
= target_size_in
;
5114 /* An extent_count of 0 means we were only counting the extents
5115 * so there are no structs to copy
5117 if (fm
->fm_extent_count
!= 0) {
5118 target_size_out
+= fm
->fm_mapped_extents
* extent_size
;
5120 argptr
= lock_user(VERIFY_WRITE
, arg
, target_size_out
, 0);
5122 ret
= -TARGET_EFAULT
;
5124 /* Convert the struct fiemap */
5125 thunk_convert(argptr
, fm
, arg_type
, THUNK_TARGET
);
5126 if (fm
->fm_extent_count
!= 0) {
5127 p
= argptr
+ target_size_in
;
5128 /* ...and then all the struct fiemap_extents */
5129 for (i
= 0; i
< fm
->fm_mapped_extents
; i
++) {
5130 thunk_convert(p
, &fm
->fm_extents
[i
], extent_arg_type
,
5135 unlock_user(argptr
, arg
, target_size_out
);
5145 static abi_long
do_ioctl_ifconf(const IOCTLEntry
*ie
, uint8_t *buf_temp
,
5146 int fd
, int cmd
, abi_long arg
)
5148 const argtype
*arg_type
= ie
->arg_type
;
5152 struct ifconf
*host_ifconf
;
5154 const argtype ifreq_arg_type
[] = { MK_STRUCT(STRUCT_sockaddr_ifreq
) };
5155 int target_ifreq_size
;
5160 abi_long target_ifc_buf
;
5164 assert(arg_type
[0] == TYPE_PTR
);
5165 assert(ie
->access
== IOC_RW
);
5168 target_size
= thunk_type_size(arg_type
, 0);
5170 argptr
= lock_user(VERIFY_READ
, arg
, target_size
, 1);
5172 return -TARGET_EFAULT
;
5173 thunk_convert(buf_temp
, argptr
, arg_type
, THUNK_HOST
);
5174 unlock_user(argptr
, arg
, 0);
5176 host_ifconf
= (struct ifconf
*)(unsigned long)buf_temp
;
5177 target_ifc_len
= host_ifconf
->ifc_len
;
5178 target_ifc_buf
= (abi_long
)(unsigned long)host_ifconf
->ifc_buf
;
5180 target_ifreq_size
= thunk_type_size(ifreq_arg_type
, 0);
5181 nb_ifreq
= target_ifc_len
/ target_ifreq_size
;
5182 host_ifc_len
= nb_ifreq
* sizeof(struct ifreq
);
5184 outbufsz
= sizeof(*host_ifconf
) + host_ifc_len
;
5185 if (outbufsz
> MAX_STRUCT_SIZE
) {
5186 /* We can't fit all the extents into the fixed size buffer.
5187 * Allocate one that is large enough and use it instead.
5189 host_ifconf
= malloc(outbufsz
);
5191 return -TARGET_ENOMEM
;
5193 memcpy(host_ifconf
, buf_temp
, sizeof(*host_ifconf
));
5196 host_ifc_buf
= (char*)host_ifconf
+ sizeof(*host_ifconf
);
5198 host_ifconf
->ifc_len
= host_ifc_len
;
5199 host_ifconf
->ifc_buf
= host_ifc_buf
;
5201 ret
= get_errno(safe_ioctl(fd
, ie
->host_cmd
, host_ifconf
));
5202 if (!is_error(ret
)) {
5203 /* convert host ifc_len to target ifc_len */
5205 nb_ifreq
= host_ifconf
->ifc_len
/ sizeof(struct ifreq
);
5206 target_ifc_len
= nb_ifreq
* target_ifreq_size
;
5207 host_ifconf
->ifc_len
= target_ifc_len
;
5209 /* restore target ifc_buf */
5211 host_ifconf
->ifc_buf
= (char *)(unsigned long)target_ifc_buf
;
5213 /* copy struct ifconf to target user */
5215 argptr
= lock_user(VERIFY_WRITE
, arg
, target_size
, 0);
5217 return -TARGET_EFAULT
;
5218 thunk_convert(argptr
, host_ifconf
, arg_type
, THUNK_TARGET
);
5219 unlock_user(argptr
, arg
, target_size
);
5221 /* copy ifreq[] to target user */
5223 argptr
= lock_user(VERIFY_WRITE
, target_ifc_buf
, target_ifc_len
, 0);
5224 for (i
= 0; i
< nb_ifreq
; i
++) {
5225 thunk_convert(argptr
+ i
* target_ifreq_size
,
5226 host_ifc_buf
+ i
* sizeof(struct ifreq
),
5227 ifreq_arg_type
, THUNK_TARGET
);
5229 unlock_user(argptr
, target_ifc_buf
, target_ifc_len
);
5239 static abi_long
do_ioctl_dm(const IOCTLEntry
*ie
, uint8_t *buf_temp
, int fd
,
5240 int cmd
, abi_long arg
)
5243 struct dm_ioctl
*host_dm
;
5244 abi_long guest_data
;
5245 uint32_t guest_data_size
;
5247 const argtype
*arg_type
= ie
->arg_type
;
5249 void *big_buf
= NULL
;
5253 target_size
= thunk_type_size(arg_type
, 0);
5254 argptr
= lock_user(VERIFY_READ
, arg
, target_size
, 1);
5256 ret
= -TARGET_EFAULT
;
5259 thunk_convert(buf_temp
, argptr
, arg_type
, THUNK_HOST
);
5260 unlock_user(argptr
, arg
, 0);
5262 /* buf_temp is too small, so fetch things into a bigger buffer */
5263 big_buf
= g_malloc0(((struct dm_ioctl
*)buf_temp
)->data_size
* 2);
5264 memcpy(big_buf
, buf_temp
, target_size
);
5268 guest_data
= arg
+ host_dm
->data_start
;
5269 if ((guest_data
- arg
) < 0) {
5270 ret
= -TARGET_EINVAL
;
5273 guest_data_size
= host_dm
->data_size
- host_dm
->data_start
;
5274 host_data
= (char*)host_dm
+ host_dm
->data_start
;
5276 argptr
= lock_user(VERIFY_READ
, guest_data
, guest_data_size
, 1);
5278 ret
= -TARGET_EFAULT
;
5282 switch (ie
->host_cmd
) {
5284 case DM_LIST_DEVICES
:
5287 case DM_DEV_SUSPEND
:
5290 case DM_TABLE_STATUS
:
5291 case DM_TABLE_CLEAR
:
5293 case DM_LIST_VERSIONS
:
5297 case DM_DEV_SET_GEOMETRY
:
5298 /* data contains only strings */
5299 memcpy(host_data
, argptr
, guest_data_size
);
5302 memcpy(host_data
, argptr
, guest_data_size
);
5303 *(uint64_t*)host_data
= tswap64(*(uint64_t*)argptr
);
5307 void *gspec
= argptr
;
5308 void *cur_data
= host_data
;
5309 const argtype arg_type
[] = { MK_STRUCT(STRUCT_dm_target_spec
) };
5310 int spec_size
= thunk_type_size(arg_type
, 0);
5313 for (i
= 0; i
< host_dm
->target_count
; i
++) {
5314 struct dm_target_spec
*spec
= cur_data
;
5318 thunk_convert(spec
, gspec
, arg_type
, THUNK_HOST
);
5319 slen
= strlen((char*)gspec
+ spec_size
) + 1;
5321 spec
->next
= sizeof(*spec
) + slen
;
5322 strcpy((char*)&spec
[1], gspec
+ spec_size
);
5324 cur_data
+= spec
->next
;
5329 ret
= -TARGET_EINVAL
;
5330 unlock_user(argptr
, guest_data
, 0);
5333 unlock_user(argptr
, guest_data
, 0);
5335 ret
= get_errno(safe_ioctl(fd
, ie
->host_cmd
, buf_temp
));
5336 if (!is_error(ret
)) {
5337 guest_data
= arg
+ host_dm
->data_start
;
5338 guest_data_size
= host_dm
->data_size
- host_dm
->data_start
;
5339 argptr
= lock_user(VERIFY_WRITE
, guest_data
, guest_data_size
, 0);
5340 switch (ie
->host_cmd
) {
5345 case DM_DEV_SUSPEND
:
5348 case DM_TABLE_CLEAR
:
5350 case DM_DEV_SET_GEOMETRY
:
5351 /* no return data */
5353 case DM_LIST_DEVICES
:
5355 struct dm_name_list
*nl
= (void*)host_dm
+ host_dm
->data_start
;
5356 uint32_t remaining_data
= guest_data_size
;
5357 void *cur_data
= argptr
;
5358 const argtype arg_type
[] = { MK_STRUCT(STRUCT_dm_name_list
) };
5359 int nl_size
= 12; /* can't use thunk_size due to alignment */
5362 uint32_t next
= nl
->next
;
5364 nl
->next
= nl_size
+ (strlen(nl
->name
) + 1);
5366 if (remaining_data
< nl
->next
) {
5367 host_dm
->flags
|= DM_BUFFER_FULL_FLAG
;
5370 thunk_convert(cur_data
, nl
, arg_type
, THUNK_TARGET
);
5371 strcpy(cur_data
+ nl_size
, nl
->name
);
5372 cur_data
+= nl
->next
;
5373 remaining_data
-= nl
->next
;
5377 nl
= (void*)nl
+ next
;
5382 case DM_TABLE_STATUS
:
5384 struct dm_target_spec
*spec
= (void*)host_dm
+ host_dm
->data_start
;
5385 void *cur_data
= argptr
;
5386 const argtype arg_type
[] = { MK_STRUCT(STRUCT_dm_target_spec
) };
5387 int spec_size
= thunk_type_size(arg_type
, 0);
5390 for (i
= 0; i
< host_dm
->target_count
; i
++) {
5391 uint32_t next
= spec
->next
;
5392 int slen
= strlen((char*)&spec
[1]) + 1;
5393 spec
->next
= (cur_data
- argptr
) + spec_size
+ slen
;
5394 if (guest_data_size
< spec
->next
) {
5395 host_dm
->flags
|= DM_BUFFER_FULL_FLAG
;
5398 thunk_convert(cur_data
, spec
, arg_type
, THUNK_TARGET
);
5399 strcpy(cur_data
+ spec_size
, (char*)&spec
[1]);
5400 cur_data
= argptr
+ spec
->next
;
5401 spec
= (void*)host_dm
+ host_dm
->data_start
+ next
;
5407 void *hdata
= (void*)host_dm
+ host_dm
->data_start
;
5408 int count
= *(uint32_t*)hdata
;
5409 uint64_t *hdev
= hdata
+ 8;
5410 uint64_t *gdev
= argptr
+ 8;
5413 *(uint32_t*)argptr
= tswap32(count
);
5414 for (i
= 0; i
< count
; i
++) {
5415 *gdev
= tswap64(*hdev
);
5421 case DM_LIST_VERSIONS
:
5423 struct dm_target_versions
*vers
= (void*)host_dm
+ host_dm
->data_start
;
5424 uint32_t remaining_data
= guest_data_size
;
5425 void *cur_data
= argptr
;
5426 const argtype arg_type
[] = { MK_STRUCT(STRUCT_dm_target_versions
) };
5427 int vers_size
= thunk_type_size(arg_type
, 0);
5430 uint32_t next
= vers
->next
;
5432 vers
->next
= vers_size
+ (strlen(vers
->name
) + 1);
5434 if (remaining_data
< vers
->next
) {
5435 host_dm
->flags
|= DM_BUFFER_FULL_FLAG
;
5438 thunk_convert(cur_data
, vers
, arg_type
, THUNK_TARGET
);
5439 strcpy(cur_data
+ vers_size
, vers
->name
);
5440 cur_data
+= vers
->next
;
5441 remaining_data
-= vers
->next
;
5445 vers
= (void*)vers
+ next
;
5450 unlock_user(argptr
, guest_data
, 0);
5451 ret
= -TARGET_EINVAL
;
5454 unlock_user(argptr
, guest_data
, guest_data_size
);
5456 argptr
= lock_user(VERIFY_WRITE
, arg
, target_size
, 0);
5458 ret
= -TARGET_EFAULT
;
5461 thunk_convert(argptr
, buf_temp
, arg_type
, THUNK_TARGET
);
5462 unlock_user(argptr
, arg
, target_size
);
5469 static abi_long
do_ioctl_blkpg(const IOCTLEntry
*ie
, uint8_t *buf_temp
, int fd
,
5470 int cmd
, abi_long arg
)
5474 const argtype
*arg_type
= ie
->arg_type
;
5475 const argtype part_arg_type
[] = { MK_STRUCT(STRUCT_blkpg_partition
) };
5478 struct blkpg_ioctl_arg
*host_blkpg
= (void*)buf_temp
;
5479 struct blkpg_partition host_part
;
5481 /* Read and convert blkpg */
5483 target_size
= thunk_type_size(arg_type
, 0);
5484 argptr
= lock_user(VERIFY_READ
, arg
, target_size
, 1);
5486 ret
= -TARGET_EFAULT
;
5489 thunk_convert(buf_temp
, argptr
, arg_type
, THUNK_HOST
);
5490 unlock_user(argptr
, arg
, 0);
5492 switch (host_blkpg
->op
) {
5493 case BLKPG_ADD_PARTITION
:
5494 case BLKPG_DEL_PARTITION
:
5495 /* payload is struct blkpg_partition */
5498 /* Unknown opcode */
5499 ret
= -TARGET_EINVAL
;
5503 /* Read and convert blkpg->data */
5504 arg
= (abi_long
)(uintptr_t)host_blkpg
->data
;
5505 target_size
= thunk_type_size(part_arg_type
, 0);
5506 argptr
= lock_user(VERIFY_READ
, arg
, target_size
, 1);
5508 ret
= -TARGET_EFAULT
;
5511 thunk_convert(&host_part
, argptr
, part_arg_type
, THUNK_HOST
);
5512 unlock_user(argptr
, arg
, 0);
5514 /* Swizzle the data pointer to our local copy and call! */
5515 host_blkpg
->data
= &host_part
;
5516 ret
= get_errno(safe_ioctl(fd
, ie
->host_cmd
, host_blkpg
));
5522 static abi_long
do_ioctl_rt(const IOCTLEntry
*ie
, uint8_t *buf_temp
,
5523 int fd
, int cmd
, abi_long arg
)
5525 const argtype
*arg_type
= ie
->arg_type
;
5526 const StructEntry
*se
;
5527 const argtype
*field_types
;
5528 const int *dst_offsets
, *src_offsets
;
5531 abi_ulong
*target_rt_dev_ptr
;
5532 unsigned long *host_rt_dev_ptr
;
5536 assert(ie
->access
== IOC_W
);
5537 assert(*arg_type
== TYPE_PTR
);
5539 assert(*arg_type
== TYPE_STRUCT
);
5540 target_size
= thunk_type_size(arg_type
, 0);
5541 argptr
= lock_user(VERIFY_READ
, arg
, target_size
, 1);
5543 return -TARGET_EFAULT
;
5546 assert(*arg_type
== (int)STRUCT_rtentry
);
5547 se
= struct_entries
+ *arg_type
++;
5548 assert(se
->convert
[0] == NULL
);
5549 /* convert struct here to be able to catch rt_dev string */
5550 field_types
= se
->field_types
;
5551 dst_offsets
= se
->field_offsets
[THUNK_HOST
];
5552 src_offsets
= se
->field_offsets
[THUNK_TARGET
];
5553 for (i
= 0; i
< se
->nb_fields
; i
++) {
5554 if (dst_offsets
[i
] == offsetof(struct rtentry
, rt_dev
)) {
5555 assert(*field_types
== TYPE_PTRVOID
);
5556 target_rt_dev_ptr
= (abi_ulong
*)(argptr
+ src_offsets
[i
]);
5557 host_rt_dev_ptr
= (unsigned long *)(buf_temp
+ dst_offsets
[i
]);
5558 if (*target_rt_dev_ptr
!= 0) {
5559 *host_rt_dev_ptr
= (unsigned long)lock_user_string(
5560 tswapal(*target_rt_dev_ptr
));
5561 if (!*host_rt_dev_ptr
) {
5562 unlock_user(argptr
, arg
, 0);
5563 return -TARGET_EFAULT
;
5566 *host_rt_dev_ptr
= 0;
5571 field_types
= thunk_convert(buf_temp
+ dst_offsets
[i
],
5572 argptr
+ src_offsets
[i
],
5573 field_types
, THUNK_HOST
);
5575 unlock_user(argptr
, arg
, 0);
5577 ret
= get_errno(safe_ioctl(fd
, ie
->host_cmd
, buf_temp
));
5578 if (*host_rt_dev_ptr
!= 0) {
5579 unlock_user((void *)*host_rt_dev_ptr
,
5580 *target_rt_dev_ptr
, 0);
5585 static abi_long
do_ioctl_kdsigaccept(const IOCTLEntry
*ie
, uint8_t *buf_temp
,
5586 int fd
, int cmd
, abi_long arg
)
5588 int sig
= target_to_host_signal(arg
);
5589 return get_errno(safe_ioctl(fd
, ie
->host_cmd
, sig
));
5592 static IOCTLEntry ioctl_entries
[] = {
5593 #define IOCTL(cmd, access, ...) \
5594 { TARGET_ ## cmd, cmd, #cmd, access, 0, { __VA_ARGS__ } },
5595 #define IOCTL_SPECIAL(cmd, access, dofn, ...) \
5596 { TARGET_ ## cmd, cmd, #cmd, access, dofn, { __VA_ARGS__ } },
5597 #define IOCTL_IGNORE(cmd) \
5598 { TARGET_ ## cmd, 0, #cmd },
5603 /* ??? Implement proper locking for ioctls. */
5604 /* do_ioctl() Must return target values and target errnos. */
5605 static abi_long
do_ioctl(int fd
, int cmd
, abi_long arg
)
5607 const IOCTLEntry
*ie
;
5608 const argtype
*arg_type
;
5610 uint8_t buf_temp
[MAX_STRUCT_SIZE
];
5616 if (ie
->target_cmd
== 0) {
5617 gemu_log("Unsupported ioctl: cmd=0x%04lx\n", (long)cmd
);
5618 return -TARGET_ENOSYS
;
5620 if (ie
->target_cmd
== cmd
)
5624 arg_type
= ie
->arg_type
;
5626 gemu_log("ioctl: cmd=0x%04lx (%s)\n", (long)cmd
, ie
->name
);
5629 return ie
->do_ioctl(ie
, buf_temp
, fd
, cmd
, arg
);
5630 } else if (!ie
->host_cmd
) {
5631 /* Some architectures define BSD ioctls in their headers
5632 that are not implemented in Linux. */
5633 return -TARGET_ENOSYS
;
5636 switch(arg_type
[0]) {
5639 ret
= get_errno(safe_ioctl(fd
, ie
->host_cmd
));
5643 ret
= get_errno(safe_ioctl(fd
, ie
->host_cmd
, arg
));
5647 target_size
= thunk_type_size(arg_type
, 0);
5648 switch(ie
->access
) {
5650 ret
= get_errno(safe_ioctl(fd
, ie
->host_cmd
, buf_temp
));
5651 if (!is_error(ret
)) {
5652 argptr
= lock_user(VERIFY_WRITE
, arg
, target_size
, 0);
5654 return -TARGET_EFAULT
;
5655 thunk_convert(argptr
, buf_temp
, arg_type
, THUNK_TARGET
);
5656 unlock_user(argptr
, arg
, target_size
);
5660 argptr
= lock_user(VERIFY_READ
, arg
, target_size
, 1);
5662 return -TARGET_EFAULT
;
5663 thunk_convert(buf_temp
, argptr
, arg_type
, THUNK_HOST
);
5664 unlock_user(argptr
, arg
, 0);
5665 ret
= get_errno(safe_ioctl(fd
, ie
->host_cmd
, buf_temp
));
5669 argptr
= lock_user(VERIFY_READ
, arg
, target_size
, 1);
5671 return -TARGET_EFAULT
;
5672 thunk_convert(buf_temp
, argptr
, arg_type
, THUNK_HOST
);
5673 unlock_user(argptr
, arg
, 0);
5674 ret
= get_errno(safe_ioctl(fd
, ie
->host_cmd
, buf_temp
));
5675 if (!is_error(ret
)) {
5676 argptr
= lock_user(VERIFY_WRITE
, arg
, target_size
, 0);
5678 return -TARGET_EFAULT
;
5679 thunk_convert(argptr
, buf_temp
, arg_type
, THUNK_TARGET
);
5680 unlock_user(argptr
, arg
, target_size
);
5686 gemu_log("Unsupported ioctl type: cmd=0x%04lx type=%d\n",
5687 (long)cmd
, arg_type
[0]);
5688 ret
= -TARGET_ENOSYS
;
5694 static const bitmask_transtbl iflag_tbl
[] = {
5695 { TARGET_IGNBRK
, TARGET_IGNBRK
, IGNBRK
, IGNBRK
},
5696 { TARGET_BRKINT
, TARGET_BRKINT
, BRKINT
, BRKINT
},
5697 { TARGET_IGNPAR
, TARGET_IGNPAR
, IGNPAR
, IGNPAR
},
5698 { TARGET_PARMRK
, TARGET_PARMRK
, PARMRK
, PARMRK
},
5699 { TARGET_INPCK
, TARGET_INPCK
, INPCK
, INPCK
},
5700 { TARGET_ISTRIP
, TARGET_ISTRIP
, ISTRIP
, ISTRIP
},
5701 { TARGET_INLCR
, TARGET_INLCR
, INLCR
, INLCR
},
5702 { TARGET_IGNCR
, TARGET_IGNCR
, IGNCR
, IGNCR
},
5703 { TARGET_ICRNL
, TARGET_ICRNL
, ICRNL
, ICRNL
},
5704 { TARGET_IUCLC
, TARGET_IUCLC
, IUCLC
, IUCLC
},
5705 { TARGET_IXON
, TARGET_IXON
, IXON
, IXON
},
5706 { TARGET_IXANY
, TARGET_IXANY
, IXANY
, IXANY
},
5707 { TARGET_IXOFF
, TARGET_IXOFF
, IXOFF
, IXOFF
},
5708 { TARGET_IMAXBEL
, TARGET_IMAXBEL
, IMAXBEL
, IMAXBEL
},
5712 static const bitmask_transtbl oflag_tbl
[] = {
5713 { TARGET_OPOST
, TARGET_OPOST
, OPOST
, OPOST
},
5714 { TARGET_OLCUC
, TARGET_OLCUC
, OLCUC
, OLCUC
},
5715 { TARGET_ONLCR
, TARGET_ONLCR
, ONLCR
, ONLCR
},
5716 { TARGET_OCRNL
, TARGET_OCRNL
, OCRNL
, OCRNL
},
5717 { TARGET_ONOCR
, TARGET_ONOCR
, ONOCR
, ONOCR
},
5718 { TARGET_ONLRET
, TARGET_ONLRET
, ONLRET
, ONLRET
},
5719 { TARGET_OFILL
, TARGET_OFILL
, OFILL
, OFILL
},
5720 { TARGET_OFDEL
, TARGET_OFDEL
, OFDEL
, OFDEL
},
5721 { TARGET_NLDLY
, TARGET_NL0
, NLDLY
, NL0
},
5722 { TARGET_NLDLY
, TARGET_NL1
, NLDLY
, NL1
},
5723 { TARGET_CRDLY
, TARGET_CR0
, CRDLY
, CR0
},
5724 { TARGET_CRDLY
, TARGET_CR1
, CRDLY
, CR1
},
5725 { TARGET_CRDLY
, TARGET_CR2
, CRDLY
, CR2
},
5726 { TARGET_CRDLY
, TARGET_CR3
, CRDLY
, CR3
},
5727 { TARGET_TABDLY
, TARGET_TAB0
, TABDLY
, TAB0
},
5728 { TARGET_TABDLY
, TARGET_TAB1
, TABDLY
, TAB1
},
5729 { TARGET_TABDLY
, TARGET_TAB2
, TABDLY
, TAB2
},
5730 { TARGET_TABDLY
, TARGET_TAB3
, TABDLY
, TAB3
},
5731 { TARGET_BSDLY
, TARGET_BS0
, BSDLY
, BS0
},
5732 { TARGET_BSDLY
, TARGET_BS1
, BSDLY
, BS1
},
5733 { TARGET_VTDLY
, TARGET_VT0
, VTDLY
, VT0
},
5734 { TARGET_VTDLY
, TARGET_VT1
, VTDLY
, VT1
},
5735 { TARGET_FFDLY
, TARGET_FF0
, FFDLY
, FF0
},
5736 { TARGET_FFDLY
, TARGET_FF1
, FFDLY
, FF1
},
5740 static const bitmask_transtbl cflag_tbl
[] = {
5741 { TARGET_CBAUD
, TARGET_B0
, CBAUD
, B0
},
5742 { TARGET_CBAUD
, TARGET_B50
, CBAUD
, B50
},
5743 { TARGET_CBAUD
, TARGET_B75
, CBAUD
, B75
},
5744 { TARGET_CBAUD
, TARGET_B110
, CBAUD
, B110
},
5745 { TARGET_CBAUD
, TARGET_B134
, CBAUD
, B134
},
5746 { TARGET_CBAUD
, TARGET_B150
, CBAUD
, B150
},
5747 { TARGET_CBAUD
, TARGET_B200
, CBAUD
, B200
},
5748 { TARGET_CBAUD
, TARGET_B300
, CBAUD
, B300
},
5749 { TARGET_CBAUD
, TARGET_B600
, CBAUD
, B600
},
5750 { TARGET_CBAUD
, TARGET_B1200
, CBAUD
, B1200
},
5751 { TARGET_CBAUD
, TARGET_B1800
, CBAUD
, B1800
},
5752 { TARGET_CBAUD
, TARGET_B2400
, CBAUD
, B2400
},
5753 { TARGET_CBAUD
, TARGET_B4800
, CBAUD
, B4800
},
5754 { TARGET_CBAUD
, TARGET_B9600
, CBAUD
, B9600
},
5755 { TARGET_CBAUD
, TARGET_B19200
, CBAUD
, B19200
},
5756 { TARGET_CBAUD
, TARGET_B38400
, CBAUD
, B38400
},
5757 { TARGET_CBAUD
, TARGET_B57600
, CBAUD
, B57600
},
5758 { TARGET_CBAUD
, TARGET_B115200
, CBAUD
, B115200
},
5759 { TARGET_CBAUD
, TARGET_B230400
, CBAUD
, B230400
},
5760 { TARGET_CBAUD
, TARGET_B460800
, CBAUD
, B460800
},
5761 { TARGET_CSIZE
, TARGET_CS5
, CSIZE
, CS5
},
5762 { TARGET_CSIZE
, TARGET_CS6
, CSIZE
, CS6
},
5763 { TARGET_CSIZE
, TARGET_CS7
, CSIZE
, CS7
},
5764 { TARGET_CSIZE
, TARGET_CS8
, CSIZE
, CS8
},
5765 { TARGET_CSTOPB
, TARGET_CSTOPB
, CSTOPB
, CSTOPB
},
5766 { TARGET_CREAD
, TARGET_CREAD
, CREAD
, CREAD
},
5767 { TARGET_PARENB
, TARGET_PARENB
, PARENB
, PARENB
},
5768 { TARGET_PARODD
, TARGET_PARODD
, PARODD
, PARODD
},
5769 { TARGET_HUPCL
, TARGET_HUPCL
, HUPCL
, HUPCL
},
5770 { TARGET_CLOCAL
, TARGET_CLOCAL
, CLOCAL
, CLOCAL
},
5771 { TARGET_CRTSCTS
, TARGET_CRTSCTS
, CRTSCTS
, CRTSCTS
},
5775 static const bitmask_transtbl lflag_tbl
[] = {
5776 { TARGET_ISIG
, TARGET_ISIG
, ISIG
, ISIG
},
5777 { TARGET_ICANON
, TARGET_ICANON
, ICANON
, ICANON
},
5778 { TARGET_XCASE
, TARGET_XCASE
, XCASE
, XCASE
},
5779 { TARGET_ECHO
, TARGET_ECHO
, ECHO
, ECHO
},
5780 { TARGET_ECHOE
, TARGET_ECHOE
, ECHOE
, ECHOE
},
5781 { TARGET_ECHOK
, TARGET_ECHOK
, ECHOK
, ECHOK
},
5782 { TARGET_ECHONL
, TARGET_ECHONL
, ECHONL
, ECHONL
},
5783 { TARGET_NOFLSH
, TARGET_NOFLSH
, NOFLSH
, NOFLSH
},
5784 { TARGET_TOSTOP
, TARGET_TOSTOP
, TOSTOP
, TOSTOP
},
5785 { TARGET_ECHOCTL
, TARGET_ECHOCTL
, ECHOCTL
, ECHOCTL
},
5786 { TARGET_ECHOPRT
, TARGET_ECHOPRT
, ECHOPRT
, ECHOPRT
},
5787 { TARGET_ECHOKE
, TARGET_ECHOKE
, ECHOKE
, ECHOKE
},
5788 { TARGET_FLUSHO
, TARGET_FLUSHO
, FLUSHO
, FLUSHO
},
5789 { TARGET_PENDIN
, TARGET_PENDIN
, PENDIN
, PENDIN
},
5790 { TARGET_IEXTEN
, TARGET_IEXTEN
, IEXTEN
, IEXTEN
},
5794 static void target_to_host_termios (void *dst
, const void *src
)
5796 struct host_termios
*host
= dst
;
5797 const struct target_termios
*target
= src
;
5800 target_to_host_bitmask(tswap32(target
->c_iflag
), iflag_tbl
);
5802 target_to_host_bitmask(tswap32(target
->c_oflag
), oflag_tbl
);
5804 target_to_host_bitmask(tswap32(target
->c_cflag
), cflag_tbl
);
5806 target_to_host_bitmask(tswap32(target
->c_lflag
), lflag_tbl
);
5807 host
->c_line
= target
->c_line
;
5809 memset(host
->c_cc
, 0, sizeof(host
->c_cc
));
5810 host
->c_cc
[VINTR
] = target
->c_cc
[TARGET_VINTR
];
5811 host
->c_cc
[VQUIT
] = target
->c_cc
[TARGET_VQUIT
];
5812 host
->c_cc
[VERASE
] = target
->c_cc
[TARGET_VERASE
];
5813 host
->c_cc
[VKILL
] = target
->c_cc
[TARGET_VKILL
];
5814 host
->c_cc
[VEOF
] = target
->c_cc
[TARGET_VEOF
];
5815 host
->c_cc
[VTIME
] = target
->c_cc
[TARGET_VTIME
];
5816 host
->c_cc
[VMIN
] = target
->c_cc
[TARGET_VMIN
];
5817 host
->c_cc
[VSWTC
] = target
->c_cc
[TARGET_VSWTC
];
5818 host
->c_cc
[VSTART
] = target
->c_cc
[TARGET_VSTART
];
5819 host
->c_cc
[VSTOP
] = target
->c_cc
[TARGET_VSTOP
];
5820 host
->c_cc
[VSUSP
] = target
->c_cc
[TARGET_VSUSP
];
5821 host
->c_cc
[VEOL
] = target
->c_cc
[TARGET_VEOL
];
5822 host
->c_cc
[VREPRINT
] = target
->c_cc
[TARGET_VREPRINT
];
5823 host
->c_cc
[VDISCARD
] = target
->c_cc
[TARGET_VDISCARD
];
5824 host
->c_cc
[VWERASE
] = target
->c_cc
[TARGET_VWERASE
];
5825 host
->c_cc
[VLNEXT
] = target
->c_cc
[TARGET_VLNEXT
];
5826 host
->c_cc
[VEOL2
] = target
->c_cc
[TARGET_VEOL2
];
5829 static void host_to_target_termios (void *dst
, const void *src
)
5831 struct target_termios
*target
= dst
;
5832 const struct host_termios
*host
= src
;
5835 tswap32(host_to_target_bitmask(host
->c_iflag
, iflag_tbl
));
5837 tswap32(host_to_target_bitmask(host
->c_oflag
, oflag_tbl
));
5839 tswap32(host_to_target_bitmask(host
->c_cflag
, cflag_tbl
));
5841 tswap32(host_to_target_bitmask(host
->c_lflag
, lflag_tbl
));
5842 target
->c_line
= host
->c_line
;
5844 memset(target
->c_cc
, 0, sizeof(target
->c_cc
));
5845 target
->c_cc
[TARGET_VINTR
] = host
->c_cc
[VINTR
];
5846 target
->c_cc
[TARGET_VQUIT
] = host
->c_cc
[VQUIT
];
5847 target
->c_cc
[TARGET_VERASE
] = host
->c_cc
[VERASE
];
5848 target
->c_cc
[TARGET_VKILL
] = host
->c_cc
[VKILL
];
5849 target
->c_cc
[TARGET_VEOF
] = host
->c_cc
[VEOF
];
5850 target
->c_cc
[TARGET_VTIME
] = host
->c_cc
[VTIME
];
5851 target
->c_cc
[TARGET_VMIN
] = host
->c_cc
[VMIN
];
5852 target
->c_cc
[TARGET_VSWTC
] = host
->c_cc
[VSWTC
];
5853 target
->c_cc
[TARGET_VSTART
] = host
->c_cc
[VSTART
];
5854 target
->c_cc
[TARGET_VSTOP
] = host
->c_cc
[VSTOP
];
5855 target
->c_cc
[TARGET_VSUSP
] = host
->c_cc
[VSUSP
];
5856 target
->c_cc
[TARGET_VEOL
] = host
->c_cc
[VEOL
];
5857 target
->c_cc
[TARGET_VREPRINT
] = host
->c_cc
[VREPRINT
];
5858 target
->c_cc
[TARGET_VDISCARD
] = host
->c_cc
[VDISCARD
];
5859 target
->c_cc
[TARGET_VWERASE
] = host
->c_cc
[VWERASE
];
5860 target
->c_cc
[TARGET_VLNEXT
] = host
->c_cc
[VLNEXT
];
5861 target
->c_cc
[TARGET_VEOL2
] = host
->c_cc
[VEOL2
];
5864 static const StructEntry struct_termios_def
= {
5865 .convert
= { host_to_target_termios
, target_to_host_termios
},
5866 .size
= { sizeof(struct target_termios
), sizeof(struct host_termios
) },
5867 .align
= { __alignof__(struct target_termios
), __alignof__(struct host_termios
) },
5870 static bitmask_transtbl mmap_flags_tbl
[] = {
5871 { TARGET_MAP_SHARED
, TARGET_MAP_SHARED
, MAP_SHARED
, MAP_SHARED
},
5872 { TARGET_MAP_PRIVATE
, TARGET_MAP_PRIVATE
, MAP_PRIVATE
, MAP_PRIVATE
},
5873 { TARGET_MAP_FIXED
, TARGET_MAP_FIXED
, MAP_FIXED
, MAP_FIXED
},
5874 { TARGET_MAP_ANONYMOUS
, TARGET_MAP_ANONYMOUS
, MAP_ANONYMOUS
, MAP_ANONYMOUS
},
5875 { TARGET_MAP_GROWSDOWN
, TARGET_MAP_GROWSDOWN
, MAP_GROWSDOWN
, MAP_GROWSDOWN
},
5876 { TARGET_MAP_DENYWRITE
, TARGET_MAP_DENYWRITE
, MAP_DENYWRITE
, MAP_DENYWRITE
},
5877 { TARGET_MAP_EXECUTABLE
, TARGET_MAP_EXECUTABLE
, MAP_EXECUTABLE
, MAP_EXECUTABLE
},
5878 { TARGET_MAP_LOCKED
, TARGET_MAP_LOCKED
, MAP_LOCKED
, MAP_LOCKED
},
5879 { TARGET_MAP_NORESERVE
, TARGET_MAP_NORESERVE
, MAP_NORESERVE
,
5884 #if defined(TARGET_I386)
5886 /* NOTE: there is really one LDT for all the threads */
5887 static uint8_t *ldt_table
;
5889 static abi_long
read_ldt(abi_ulong ptr
, unsigned long bytecount
)
5896 size
= TARGET_LDT_ENTRIES
* TARGET_LDT_ENTRY_SIZE
;
5897 if (size
> bytecount
)
5899 p
= lock_user(VERIFY_WRITE
, ptr
, size
, 0);
5901 return -TARGET_EFAULT
;
5902 /* ??? Should this by byteswapped? */
5903 memcpy(p
, ldt_table
, size
);
5904 unlock_user(p
, ptr
, size
);
5908 /* XXX: add locking support */
5909 static abi_long
write_ldt(CPUX86State
*env
,
5910 abi_ulong ptr
, unsigned long bytecount
, int oldmode
)
5912 struct target_modify_ldt_ldt_s ldt_info
;
5913 struct target_modify_ldt_ldt_s
*target_ldt_info
;
5914 int seg_32bit
, contents
, read_exec_only
, limit_in_pages
;
5915 int seg_not_present
, useable
, lm
;
5916 uint32_t *lp
, entry_1
, entry_2
;
5918 if (bytecount
!= sizeof(ldt_info
))
5919 return -TARGET_EINVAL
;
5920 if (!lock_user_struct(VERIFY_READ
, target_ldt_info
, ptr
, 1))
5921 return -TARGET_EFAULT
;
5922 ldt_info
.entry_number
= tswap32(target_ldt_info
->entry_number
);
5923 ldt_info
.base_addr
= tswapal(target_ldt_info
->base_addr
);
5924 ldt_info
.limit
= tswap32(target_ldt_info
->limit
);
5925 ldt_info
.flags
= tswap32(target_ldt_info
->flags
);
5926 unlock_user_struct(target_ldt_info
, ptr
, 0);
5928 if (ldt_info
.entry_number
>= TARGET_LDT_ENTRIES
)
5929 return -TARGET_EINVAL
;
5930 seg_32bit
= ldt_info
.flags
& 1;
5931 contents
= (ldt_info
.flags
>> 1) & 3;
5932 read_exec_only
= (ldt_info
.flags
>> 3) & 1;
5933 limit_in_pages
= (ldt_info
.flags
>> 4) & 1;
5934 seg_not_present
= (ldt_info
.flags
>> 5) & 1;
5935 useable
= (ldt_info
.flags
>> 6) & 1;
5939 lm
= (ldt_info
.flags
>> 7) & 1;
5941 if (contents
== 3) {
5943 return -TARGET_EINVAL
;
5944 if (seg_not_present
== 0)
5945 return -TARGET_EINVAL
;
5947 /* allocate the LDT */
5949 env
->ldt
.base
= target_mmap(0,
5950 TARGET_LDT_ENTRIES
* TARGET_LDT_ENTRY_SIZE
,
5951 PROT_READ
|PROT_WRITE
,
5952 MAP_ANONYMOUS
|MAP_PRIVATE
, -1, 0);
5953 if (env
->ldt
.base
== -1)
5954 return -TARGET_ENOMEM
;
5955 memset(g2h(env
->ldt
.base
), 0,
5956 TARGET_LDT_ENTRIES
* TARGET_LDT_ENTRY_SIZE
);
5957 env
->ldt
.limit
= 0xffff;
5958 ldt_table
= g2h(env
->ldt
.base
);
5961 /* NOTE: same code as Linux kernel */
5962 /* Allow LDTs to be cleared by the user. */
5963 if (ldt_info
.base_addr
== 0 && ldt_info
.limit
== 0) {
5966 read_exec_only
== 1 &&
5968 limit_in_pages
== 0 &&
5969 seg_not_present
== 1 &&
5977 entry_1
= ((ldt_info
.base_addr
& 0x0000ffff) << 16) |
5978 (ldt_info
.limit
& 0x0ffff);
5979 entry_2
= (ldt_info
.base_addr
& 0xff000000) |
5980 ((ldt_info
.base_addr
& 0x00ff0000) >> 16) |
5981 (ldt_info
.limit
& 0xf0000) |
5982 ((read_exec_only
^ 1) << 9) |
5984 ((seg_not_present
^ 1) << 15) |
5986 (limit_in_pages
<< 23) |
5990 entry_2
|= (useable
<< 20);
5992 /* Install the new entry ... */
5994 lp
= (uint32_t *)(ldt_table
+ (ldt_info
.entry_number
<< 3));
5995 lp
[0] = tswap32(entry_1
);
5996 lp
[1] = tswap32(entry_2
);
6000 /* specific and weird i386 syscalls */
6001 static abi_long
do_modify_ldt(CPUX86State
*env
, int func
, abi_ulong ptr
,
6002 unsigned long bytecount
)
6008 ret
= read_ldt(ptr
, bytecount
);
6011 ret
= write_ldt(env
, ptr
, bytecount
, 1);
6014 ret
= write_ldt(env
, ptr
, bytecount
, 0);
6017 ret
= -TARGET_ENOSYS
;
6023 #if defined(TARGET_I386) && defined(TARGET_ABI32)
6024 abi_long
do_set_thread_area(CPUX86State
*env
, abi_ulong ptr
)
6026 uint64_t *gdt_table
= g2h(env
->gdt
.base
);
6027 struct target_modify_ldt_ldt_s ldt_info
;
6028 struct target_modify_ldt_ldt_s
*target_ldt_info
;
6029 int seg_32bit
, contents
, read_exec_only
, limit_in_pages
;
6030 int seg_not_present
, useable
, lm
;
6031 uint32_t *lp
, entry_1
, entry_2
;
6034 lock_user_struct(VERIFY_WRITE
, target_ldt_info
, ptr
, 1);
6035 if (!target_ldt_info
)
6036 return -TARGET_EFAULT
;
6037 ldt_info
.entry_number
= tswap32(target_ldt_info
->entry_number
);
6038 ldt_info
.base_addr
= tswapal(target_ldt_info
->base_addr
);
6039 ldt_info
.limit
= tswap32(target_ldt_info
->limit
);
6040 ldt_info
.flags
= tswap32(target_ldt_info
->flags
);
6041 if (ldt_info
.entry_number
== -1) {
6042 for (i
=TARGET_GDT_ENTRY_TLS_MIN
; i
<=TARGET_GDT_ENTRY_TLS_MAX
; i
++) {
6043 if (gdt_table
[i
] == 0) {
6044 ldt_info
.entry_number
= i
;
6045 target_ldt_info
->entry_number
= tswap32(i
);
6050 unlock_user_struct(target_ldt_info
, ptr
, 1);
6052 if (ldt_info
.entry_number
< TARGET_GDT_ENTRY_TLS_MIN
||
6053 ldt_info
.entry_number
> TARGET_GDT_ENTRY_TLS_MAX
)
6054 return -TARGET_EINVAL
;
6055 seg_32bit
= ldt_info
.flags
& 1;
6056 contents
= (ldt_info
.flags
>> 1) & 3;
6057 read_exec_only
= (ldt_info
.flags
>> 3) & 1;
6058 limit_in_pages
= (ldt_info
.flags
>> 4) & 1;
6059 seg_not_present
= (ldt_info
.flags
>> 5) & 1;
6060 useable
= (ldt_info
.flags
>> 6) & 1;
6064 lm
= (ldt_info
.flags
>> 7) & 1;
6067 if (contents
== 3) {
6068 if (seg_not_present
== 0)
6069 return -TARGET_EINVAL
;
6072 /* NOTE: same code as Linux kernel */
6073 /* Allow LDTs to be cleared by the user. */
6074 if (ldt_info
.base_addr
== 0 && ldt_info
.limit
== 0) {
6075 if ((contents
== 0 &&
6076 read_exec_only
== 1 &&
6078 limit_in_pages
== 0 &&
6079 seg_not_present
== 1 &&
6087 entry_1
= ((ldt_info
.base_addr
& 0x0000ffff) << 16) |
6088 (ldt_info
.limit
& 0x0ffff);
6089 entry_2
= (ldt_info
.base_addr
& 0xff000000) |
6090 ((ldt_info
.base_addr
& 0x00ff0000) >> 16) |
6091 (ldt_info
.limit
& 0xf0000) |
6092 ((read_exec_only
^ 1) << 9) |
6094 ((seg_not_present
^ 1) << 15) |
6096 (limit_in_pages
<< 23) |
6101 /* Install the new entry ... */
6103 lp
= (uint32_t *)(gdt_table
+ ldt_info
.entry_number
);
6104 lp
[0] = tswap32(entry_1
);
6105 lp
[1] = tswap32(entry_2
);
6109 static abi_long
do_get_thread_area(CPUX86State
*env
, abi_ulong ptr
)
6111 struct target_modify_ldt_ldt_s
*target_ldt_info
;
6112 uint64_t *gdt_table
= g2h(env
->gdt
.base
);
6113 uint32_t base_addr
, limit
, flags
;
6114 int seg_32bit
, contents
, read_exec_only
, limit_in_pages
, idx
;
6115 int seg_not_present
, useable
, lm
;
6116 uint32_t *lp
, entry_1
, entry_2
;
6118 lock_user_struct(VERIFY_WRITE
, target_ldt_info
, ptr
, 1);
6119 if (!target_ldt_info
)
6120 return -TARGET_EFAULT
;
6121 idx
= tswap32(target_ldt_info
->entry_number
);
6122 if (idx
< TARGET_GDT_ENTRY_TLS_MIN
||
6123 idx
> TARGET_GDT_ENTRY_TLS_MAX
) {
6124 unlock_user_struct(target_ldt_info
, ptr
, 1);
6125 return -TARGET_EINVAL
;
6127 lp
= (uint32_t *)(gdt_table
+ idx
);
6128 entry_1
= tswap32(lp
[0]);
6129 entry_2
= tswap32(lp
[1]);
6131 read_exec_only
= ((entry_2
>> 9) & 1) ^ 1;
6132 contents
= (entry_2
>> 10) & 3;
6133 seg_not_present
= ((entry_2
>> 15) & 1) ^ 1;
6134 seg_32bit
= (entry_2
>> 22) & 1;
6135 limit_in_pages
= (entry_2
>> 23) & 1;
6136 useable
= (entry_2
>> 20) & 1;
6140 lm
= (entry_2
>> 21) & 1;
6142 flags
= (seg_32bit
<< 0) | (contents
<< 1) |
6143 (read_exec_only
<< 3) | (limit_in_pages
<< 4) |
6144 (seg_not_present
<< 5) | (useable
<< 6) | (lm
<< 7);
6145 limit
= (entry_1
& 0xffff) | (entry_2
& 0xf0000);
6146 base_addr
= (entry_1
>> 16) |
6147 (entry_2
& 0xff000000) |
6148 ((entry_2
& 0xff) << 16);
6149 target_ldt_info
->base_addr
= tswapal(base_addr
);
6150 target_ldt_info
->limit
= tswap32(limit
);
6151 target_ldt_info
->flags
= tswap32(flags
);
6152 unlock_user_struct(target_ldt_info
, ptr
, 1);
6155 #endif /* TARGET_I386 && TARGET_ABI32 */
6157 #ifndef TARGET_ABI32
6158 abi_long
do_arch_prctl(CPUX86State
*env
, int code
, abi_ulong addr
)
6165 case TARGET_ARCH_SET_GS
:
6166 case TARGET_ARCH_SET_FS
:
6167 if (code
== TARGET_ARCH_SET_GS
)
6171 cpu_x86_load_seg(env
, idx
, 0);
6172 env
->segs
[idx
].base
= addr
;
6174 case TARGET_ARCH_GET_GS
:
6175 case TARGET_ARCH_GET_FS
:
6176 if (code
== TARGET_ARCH_GET_GS
)
6180 val
= env
->segs
[idx
].base
;
6181 if (put_user(val
, addr
, abi_ulong
))
6182 ret
= -TARGET_EFAULT
;
6185 ret
= -TARGET_EINVAL
;
6192 #endif /* defined(TARGET_I386) */
6194 #define NEW_STACK_SIZE 0x40000
6197 static pthread_mutex_t clone_lock
= PTHREAD_MUTEX_INITIALIZER
;
6200 pthread_mutex_t mutex
;
6201 pthread_cond_t cond
;
6204 abi_ulong child_tidptr
;
6205 abi_ulong parent_tidptr
;
6209 static void *clone_func(void *arg
)
6211 new_thread_info
*info
= arg
;
6216 rcu_register_thread();
6218 cpu
= ENV_GET_CPU(env
);
6220 ts
= (TaskState
*)cpu
->opaque
;
6221 info
->tid
= gettid();
6222 cpu
->host_tid
= info
->tid
;
6224 if (info
->child_tidptr
)
6225 put_user_u32(info
->tid
, info
->child_tidptr
);
6226 if (info
->parent_tidptr
)
6227 put_user_u32(info
->tid
, info
->parent_tidptr
);
6228 /* Enable signals. */
6229 sigprocmask(SIG_SETMASK
, &info
->sigmask
, NULL
);
6230 /* Signal to the parent that we're ready. */
6231 pthread_mutex_lock(&info
->mutex
);
6232 pthread_cond_broadcast(&info
->cond
);
6233 pthread_mutex_unlock(&info
->mutex
);
6234 /* Wait until the parent has finshed initializing the tls state. */
6235 pthread_mutex_lock(&clone_lock
);
6236 pthread_mutex_unlock(&clone_lock
);
6242 /* do_fork() Must return host values and target errnos (unlike most
6243 do_*() functions). */
6244 static int do_fork(CPUArchState
*env
, unsigned int flags
, abi_ulong newsp
,
6245 abi_ulong parent_tidptr
, target_ulong newtls
,
6246 abi_ulong child_tidptr
)
6248 CPUState
*cpu
= ENV_GET_CPU(env
);
6252 CPUArchState
*new_env
;
6255 flags
&= ~CLONE_IGNORED_FLAGS
;
6257 /* Emulate vfork() with fork() */
6258 if (flags
& CLONE_VFORK
)
6259 flags
&= ~(CLONE_VFORK
| CLONE_VM
);
6261 if (flags
& CLONE_VM
) {
6262 TaskState
*parent_ts
= (TaskState
*)cpu
->opaque
;
6263 new_thread_info info
;
6264 pthread_attr_t attr
;
6266 if (((flags
& CLONE_THREAD_FLAGS
) != CLONE_THREAD_FLAGS
) ||
6267 (flags
& CLONE_INVALID_THREAD_FLAGS
)) {
6268 return -TARGET_EINVAL
;
6271 ts
= g_new0(TaskState
, 1);
6272 init_task_state(ts
);
6273 /* we create a new CPU instance. */
6274 new_env
= cpu_copy(env
);
6275 /* Init regs that differ from the parent. */
6276 cpu_clone_regs(new_env
, newsp
);
6277 new_cpu
= ENV_GET_CPU(new_env
);
6278 new_cpu
->opaque
= ts
;
6279 ts
->bprm
= parent_ts
->bprm
;
6280 ts
->info
= parent_ts
->info
;
6281 ts
->signal_mask
= parent_ts
->signal_mask
;
6283 if (flags
& CLONE_CHILD_CLEARTID
) {
6284 ts
->child_tidptr
= child_tidptr
;
6287 if (flags
& CLONE_SETTLS
) {
6288 cpu_set_tls (new_env
, newtls
);
6291 /* Grab a mutex so that thread setup appears atomic. */
6292 pthread_mutex_lock(&clone_lock
);
6294 memset(&info
, 0, sizeof(info
));
6295 pthread_mutex_init(&info
.mutex
, NULL
);
6296 pthread_mutex_lock(&info
.mutex
);
6297 pthread_cond_init(&info
.cond
, NULL
);
6299 if (flags
& CLONE_CHILD_SETTID
) {
6300 info
.child_tidptr
= child_tidptr
;
6302 if (flags
& CLONE_PARENT_SETTID
) {
6303 info
.parent_tidptr
= parent_tidptr
;
6306 ret
= pthread_attr_init(&attr
);
6307 ret
= pthread_attr_setstacksize(&attr
, NEW_STACK_SIZE
);
6308 ret
= pthread_attr_setdetachstate(&attr
, PTHREAD_CREATE_DETACHED
);
6309 /* It is not safe to deliver signals until the child has finished
6310 initializing, so temporarily block all signals. */
6311 sigfillset(&sigmask
);
6312 sigprocmask(SIG_BLOCK
, &sigmask
, &info
.sigmask
);
6314 /* If this is our first additional thread, we need to ensure we
6315 * generate code for parallel execution and flush old translations.
6317 if (!parallel_cpus
) {
6318 parallel_cpus
= true;
6322 ret
= pthread_create(&info
.thread
, &attr
, clone_func
, &info
);
6323 /* TODO: Free new CPU state if thread creation failed. */
6325 sigprocmask(SIG_SETMASK
, &info
.sigmask
, NULL
);
6326 pthread_attr_destroy(&attr
);
6328 /* Wait for the child to initialize. */
6329 pthread_cond_wait(&info
.cond
, &info
.mutex
);
6334 pthread_mutex_unlock(&info
.mutex
);
6335 pthread_cond_destroy(&info
.cond
);
6336 pthread_mutex_destroy(&info
.mutex
);
6337 pthread_mutex_unlock(&clone_lock
);
6339 /* if no CLONE_VM, we consider it is a fork */
6340 if (flags
& CLONE_INVALID_FORK_FLAGS
) {
6341 return -TARGET_EINVAL
;
6344 /* We can't support custom termination signals */
6345 if ((flags
& CSIGNAL
) != TARGET_SIGCHLD
) {
6346 return -TARGET_EINVAL
;
6349 if (block_signals()) {
6350 return -TARGET_ERESTARTSYS
;
6356 /* Child Process. */
6358 cpu_clone_regs(env
, newsp
);
6360 /* There is a race condition here. The parent process could
6361 theoretically read the TID in the child process before the child
6362 tid is set. This would require using either ptrace
6363 (not implemented) or having *_tidptr to point at a shared memory
6364 mapping. We can't repeat the spinlock hack used above because
6365 the child process gets its own copy of the lock. */
6366 if (flags
& CLONE_CHILD_SETTID
)
6367 put_user_u32(gettid(), child_tidptr
);
6368 if (flags
& CLONE_PARENT_SETTID
)
6369 put_user_u32(gettid(), parent_tidptr
);
6370 ts
= (TaskState
*)cpu
->opaque
;
6371 if (flags
& CLONE_SETTLS
)
6372 cpu_set_tls (env
, newtls
);
6373 if (flags
& CLONE_CHILD_CLEARTID
)
6374 ts
->child_tidptr
= child_tidptr
;
6382 /* warning : doesn't handle linux specific flags... */
6383 static int target_to_host_fcntl_cmd(int cmd
)
6386 case TARGET_F_DUPFD
:
6387 case TARGET_F_GETFD
:
6388 case TARGET_F_SETFD
:
6389 case TARGET_F_GETFL
:
6390 case TARGET_F_SETFL
:
6392 case TARGET_F_GETLK
:
6394 case TARGET_F_SETLK
:
6396 case TARGET_F_SETLKW
:
6398 case TARGET_F_GETOWN
:
6400 case TARGET_F_SETOWN
:
6402 case TARGET_F_GETSIG
:
6404 case TARGET_F_SETSIG
:
6406 #if TARGET_ABI_BITS == 32
6407 case TARGET_F_GETLK64
:
6409 case TARGET_F_SETLK64
:
6411 case TARGET_F_SETLKW64
:
6414 case TARGET_F_SETLEASE
:
6416 case TARGET_F_GETLEASE
:
6418 #ifdef F_DUPFD_CLOEXEC
6419 case TARGET_F_DUPFD_CLOEXEC
:
6420 return F_DUPFD_CLOEXEC
;
6422 case TARGET_F_NOTIFY
:
6425 case TARGET_F_GETOWN_EX
:
6429 case TARGET_F_SETOWN_EX
:
6433 case TARGET_F_SETPIPE_SZ
:
6434 return F_SETPIPE_SZ
;
6435 case TARGET_F_GETPIPE_SZ
:
6436 return F_GETPIPE_SZ
;
6439 return -TARGET_EINVAL
;
6441 return -TARGET_EINVAL
;
6444 #define TRANSTBL_CONVERT(a) { -1, TARGET_##a, -1, a }
6445 static const bitmask_transtbl flock_tbl
[] = {
6446 TRANSTBL_CONVERT(F_RDLCK
),
6447 TRANSTBL_CONVERT(F_WRLCK
),
6448 TRANSTBL_CONVERT(F_UNLCK
),
6449 TRANSTBL_CONVERT(F_EXLCK
),
6450 TRANSTBL_CONVERT(F_SHLCK
),
6454 static inline abi_long
copy_from_user_flock(struct flock64
*fl
,
6455 abi_ulong target_flock_addr
)
6457 struct target_flock
*target_fl
;
6460 if (!lock_user_struct(VERIFY_READ
, target_fl
, target_flock_addr
, 1)) {
6461 return -TARGET_EFAULT
;
6464 __get_user(l_type
, &target_fl
->l_type
);
6465 fl
->l_type
= target_to_host_bitmask(l_type
, flock_tbl
);
6466 __get_user(fl
->l_whence
, &target_fl
->l_whence
);
6467 __get_user(fl
->l_start
, &target_fl
->l_start
);
6468 __get_user(fl
->l_len
, &target_fl
->l_len
);
6469 __get_user(fl
->l_pid
, &target_fl
->l_pid
);
6470 unlock_user_struct(target_fl
, target_flock_addr
, 0);
6474 static inline abi_long
copy_to_user_flock(abi_ulong target_flock_addr
,
6475 const struct flock64
*fl
)
6477 struct target_flock
*target_fl
;
6480 if (!lock_user_struct(VERIFY_WRITE
, target_fl
, target_flock_addr
, 0)) {
6481 return -TARGET_EFAULT
;
6484 l_type
= host_to_target_bitmask(fl
->l_type
, flock_tbl
);
6485 __put_user(l_type
, &target_fl
->l_type
);
6486 __put_user(fl
->l_whence
, &target_fl
->l_whence
);
6487 __put_user(fl
->l_start
, &target_fl
->l_start
);
6488 __put_user(fl
->l_len
, &target_fl
->l_len
);
6489 __put_user(fl
->l_pid
, &target_fl
->l_pid
);
6490 unlock_user_struct(target_fl
, target_flock_addr
, 1);
6494 typedef abi_long
from_flock64_fn(struct flock64
*fl
, abi_ulong target_addr
);
6495 typedef abi_long
to_flock64_fn(abi_ulong target_addr
, const struct flock64
*fl
);
6497 #if defined(TARGET_ARM) && TARGET_ABI_BITS == 32
6498 static inline abi_long
copy_from_user_eabi_flock64(struct flock64
*fl
,
6499 abi_ulong target_flock_addr
)
6501 struct target_eabi_flock64
*target_fl
;
6504 if (!lock_user_struct(VERIFY_READ
, target_fl
, target_flock_addr
, 1)) {
6505 return -TARGET_EFAULT
;
6508 __get_user(l_type
, &target_fl
->l_type
);
6509 fl
->l_type
= target_to_host_bitmask(l_type
, flock_tbl
);
6510 __get_user(fl
->l_whence
, &target_fl
->l_whence
);
6511 __get_user(fl
->l_start
, &target_fl
->l_start
);
6512 __get_user(fl
->l_len
, &target_fl
->l_len
);
6513 __get_user(fl
->l_pid
, &target_fl
->l_pid
);
6514 unlock_user_struct(target_fl
, target_flock_addr
, 0);
6518 static inline abi_long
copy_to_user_eabi_flock64(abi_ulong target_flock_addr
,
6519 const struct flock64
*fl
)
6521 struct target_eabi_flock64
*target_fl
;
6524 if (!lock_user_struct(VERIFY_WRITE
, target_fl
, target_flock_addr
, 0)) {
6525 return -TARGET_EFAULT
;
6528 l_type
= host_to_target_bitmask(fl
->l_type
, flock_tbl
);
6529 __put_user(l_type
, &target_fl
->l_type
);
6530 __put_user(fl
->l_whence
, &target_fl
->l_whence
);
6531 __put_user(fl
->l_start
, &target_fl
->l_start
);
6532 __put_user(fl
->l_len
, &target_fl
->l_len
);
6533 __put_user(fl
->l_pid
, &target_fl
->l_pid
);
6534 unlock_user_struct(target_fl
, target_flock_addr
, 1);
6539 static inline abi_long
copy_from_user_flock64(struct flock64
*fl
,
6540 abi_ulong target_flock_addr
)
6542 struct target_flock64
*target_fl
;
6545 if (!lock_user_struct(VERIFY_READ
, target_fl
, target_flock_addr
, 1)) {
6546 return -TARGET_EFAULT
;
6549 __get_user(l_type
, &target_fl
->l_type
);
6550 fl
->l_type
= target_to_host_bitmask(l_type
, flock_tbl
);
6551 __get_user(fl
->l_whence
, &target_fl
->l_whence
);
6552 __get_user(fl
->l_start
, &target_fl
->l_start
);
6553 __get_user(fl
->l_len
, &target_fl
->l_len
);
6554 __get_user(fl
->l_pid
, &target_fl
->l_pid
);
6555 unlock_user_struct(target_fl
, target_flock_addr
, 0);
6559 static inline abi_long
copy_to_user_flock64(abi_ulong target_flock_addr
,
6560 const struct flock64
*fl
)
6562 struct target_flock64
*target_fl
;
6565 if (!lock_user_struct(VERIFY_WRITE
, target_fl
, target_flock_addr
, 0)) {
6566 return -TARGET_EFAULT
;
6569 l_type
= host_to_target_bitmask(fl
->l_type
, flock_tbl
);
6570 __put_user(l_type
, &target_fl
->l_type
);
6571 __put_user(fl
->l_whence
, &target_fl
->l_whence
);
6572 __put_user(fl
->l_start
, &target_fl
->l_start
);
6573 __put_user(fl
->l_len
, &target_fl
->l_len
);
6574 __put_user(fl
->l_pid
, &target_fl
->l_pid
);
6575 unlock_user_struct(target_fl
, target_flock_addr
, 1);
6579 static abi_long
do_fcntl(int fd
, int cmd
, abi_ulong arg
)
6581 struct flock64 fl64
;
6583 struct f_owner_ex fox
;
6584 struct target_f_owner_ex
*target_fox
;
6587 int host_cmd
= target_to_host_fcntl_cmd(cmd
);
6589 if (host_cmd
== -TARGET_EINVAL
)
6593 case TARGET_F_GETLK
:
6594 ret
= copy_from_user_flock(&fl64
, arg
);
6598 ret
= get_errno(safe_fcntl(fd
, host_cmd
, &fl64
));
6600 ret
= copy_to_user_flock(arg
, &fl64
);
6604 case TARGET_F_SETLK
:
6605 case TARGET_F_SETLKW
:
6606 ret
= copy_from_user_flock(&fl64
, arg
);
6610 ret
= get_errno(safe_fcntl(fd
, host_cmd
, &fl64
));
6613 case TARGET_F_GETLK64
:
6614 ret
= copy_from_user_flock64(&fl64
, arg
);
6618 ret
= get_errno(safe_fcntl(fd
, host_cmd
, &fl64
));
6620 ret
= copy_to_user_flock64(arg
, &fl64
);
6623 case TARGET_F_SETLK64
:
6624 case TARGET_F_SETLKW64
:
6625 ret
= copy_from_user_flock64(&fl64
, arg
);
6629 ret
= get_errno(safe_fcntl(fd
, host_cmd
, &fl64
));
6632 case TARGET_F_GETFL
:
6633 ret
= get_errno(safe_fcntl(fd
, host_cmd
, arg
));
6635 ret
= host_to_target_bitmask(ret
, fcntl_flags_tbl
);
6639 case TARGET_F_SETFL
:
6640 ret
= get_errno(safe_fcntl(fd
, host_cmd
,
6641 target_to_host_bitmask(arg
,
6646 case TARGET_F_GETOWN_EX
:
6647 ret
= get_errno(safe_fcntl(fd
, host_cmd
, &fox
));
6649 if (!lock_user_struct(VERIFY_WRITE
, target_fox
, arg
, 0))
6650 return -TARGET_EFAULT
;
6651 target_fox
->type
= tswap32(fox
.type
);
6652 target_fox
->pid
= tswap32(fox
.pid
);
6653 unlock_user_struct(target_fox
, arg
, 1);
6659 case TARGET_F_SETOWN_EX
:
6660 if (!lock_user_struct(VERIFY_READ
, target_fox
, arg
, 1))
6661 return -TARGET_EFAULT
;
6662 fox
.type
= tswap32(target_fox
->type
);
6663 fox
.pid
= tswap32(target_fox
->pid
);
6664 unlock_user_struct(target_fox
, arg
, 0);
6665 ret
= get_errno(safe_fcntl(fd
, host_cmd
, &fox
));
6669 case TARGET_F_SETOWN
:
6670 case TARGET_F_GETOWN
:
6671 case TARGET_F_SETSIG
:
6672 case TARGET_F_GETSIG
:
6673 case TARGET_F_SETLEASE
:
6674 case TARGET_F_GETLEASE
:
6675 case TARGET_F_SETPIPE_SZ
:
6676 case TARGET_F_GETPIPE_SZ
:
6677 ret
= get_errno(safe_fcntl(fd
, host_cmd
, arg
));
6681 ret
= get_errno(safe_fcntl(fd
, cmd
, arg
));
6689 static inline int high2lowuid(int uid
)
6697 static inline int high2lowgid(int gid
)
6705 static inline int low2highuid(int uid
)
6707 if ((int16_t)uid
== -1)
6713 static inline int low2highgid(int gid
)
6715 if ((int16_t)gid
== -1)
6720 static inline int tswapid(int id
)
6725 #define put_user_id(x, gaddr) put_user_u16(x, gaddr)
6727 #else /* !USE_UID16 */
6728 static inline int high2lowuid(int uid
)
6732 static inline int high2lowgid(int gid
)
6736 static inline int low2highuid(int uid
)
6740 static inline int low2highgid(int gid
)
6744 static inline int tswapid(int id
)
6749 #define put_user_id(x, gaddr) put_user_u32(x, gaddr)
6751 #endif /* USE_UID16 */
6753 /* We must do direct syscalls for setting UID/GID, because we want to
6754 * implement the Linux system call semantics of "change only for this thread",
6755 * not the libc/POSIX semantics of "change for all threads in process".
6756 * (See http://ewontfix.com/17/ for more details.)
6757 * We use the 32-bit version of the syscalls if present; if it is not
6758 * then either the host architecture supports 32-bit UIDs natively with
6759 * the standard syscall, or the 16-bit UID is the best we can do.
6761 #ifdef __NR_setuid32
6762 #define __NR_sys_setuid __NR_setuid32
6764 #define __NR_sys_setuid __NR_setuid
6766 #ifdef __NR_setgid32
6767 #define __NR_sys_setgid __NR_setgid32
6769 #define __NR_sys_setgid __NR_setgid
6771 #ifdef __NR_setresuid32
6772 #define __NR_sys_setresuid __NR_setresuid32
6774 #define __NR_sys_setresuid __NR_setresuid
6776 #ifdef __NR_setresgid32
6777 #define __NR_sys_setresgid __NR_setresgid32
6779 #define __NR_sys_setresgid __NR_setresgid
6782 _syscall1(int, sys_setuid
, uid_t
, uid
)
6783 _syscall1(int, sys_setgid
, gid_t
, gid
)
6784 _syscall3(int, sys_setresuid
, uid_t
, ruid
, uid_t
, euid
, uid_t
, suid
)
6785 _syscall3(int, sys_setresgid
, gid_t
, rgid
, gid_t
, egid
, gid_t
, sgid
)
6787 void syscall_init(void)
6790 const argtype
*arg_type
;
6794 thunk_init(STRUCT_MAX
);
6796 #define STRUCT(name, ...) thunk_register_struct(STRUCT_ ## name, #name, struct_ ## name ## _def);
6797 #define STRUCT_SPECIAL(name) thunk_register_struct_direct(STRUCT_ ## name, #name, &struct_ ## name ## _def);
6798 #include "syscall_types.h"
6800 #undef STRUCT_SPECIAL
6802 /* Build target_to_host_errno_table[] table from
6803 * host_to_target_errno_table[]. */
6804 for (i
= 0; i
< ERRNO_TABLE_SIZE
; i
++) {
6805 target_to_host_errno_table
[host_to_target_errno_table
[i
]] = i
;
6808 /* we patch the ioctl size if necessary. We rely on the fact that
6809 no ioctl has all the bits at '1' in the size field */
6811 while (ie
->target_cmd
!= 0) {
6812 if (((ie
->target_cmd
>> TARGET_IOC_SIZESHIFT
) & TARGET_IOC_SIZEMASK
) ==
6813 TARGET_IOC_SIZEMASK
) {
6814 arg_type
= ie
->arg_type
;
6815 if (arg_type
[0] != TYPE_PTR
) {
6816 fprintf(stderr
, "cannot patch size for ioctl 0x%x\n",
6821 size
= thunk_type_size(arg_type
, 0);
6822 ie
->target_cmd
= (ie
->target_cmd
&
6823 ~(TARGET_IOC_SIZEMASK
<< TARGET_IOC_SIZESHIFT
)) |
6824 (size
<< TARGET_IOC_SIZESHIFT
);
6827 /* automatic consistency check if same arch */
6828 #if (defined(__i386__) && defined(TARGET_I386) && defined(TARGET_ABI32)) || \
6829 (defined(__x86_64__) && defined(TARGET_X86_64))
6830 if (unlikely(ie
->target_cmd
!= ie
->host_cmd
)) {
6831 fprintf(stderr
, "ERROR: ioctl(%s): target=0x%x host=0x%x\n",
6832 ie
->name
, ie
->target_cmd
, ie
->host_cmd
);
6839 #if TARGET_ABI_BITS == 32
6840 static inline uint64_t target_offset64(uint32_t word0
, uint32_t word1
)
6842 #ifdef TARGET_WORDS_BIGENDIAN
6843 return ((uint64_t)word0
<< 32) | word1
;
6845 return ((uint64_t)word1
<< 32) | word0
;
6848 #else /* TARGET_ABI_BITS == 32 */
6849 static inline uint64_t target_offset64(uint64_t word0
, uint64_t word1
)
6853 #endif /* TARGET_ABI_BITS != 32 */
6855 #ifdef TARGET_NR_truncate64
6856 static inline abi_long
target_truncate64(void *cpu_env
, const char *arg1
,
6861 if (regpairs_aligned(cpu_env
)) {
6865 return get_errno(truncate64(arg1
, target_offset64(arg2
, arg3
)));
6869 #ifdef TARGET_NR_ftruncate64
6870 static inline abi_long
target_ftruncate64(void *cpu_env
, abi_long arg1
,
6875 if (regpairs_aligned(cpu_env
)) {
6879 return get_errno(ftruncate64(arg1
, target_offset64(arg2
, arg3
)));
6883 static inline abi_long
target_to_host_timespec(struct timespec
*host_ts
,
6884 abi_ulong target_addr
)
6886 struct target_timespec
*target_ts
;
6888 if (!lock_user_struct(VERIFY_READ
, target_ts
, target_addr
, 1))
6889 return -TARGET_EFAULT
;
6890 __get_user(host_ts
->tv_sec
, &target_ts
->tv_sec
);
6891 __get_user(host_ts
->tv_nsec
, &target_ts
->tv_nsec
);
6892 unlock_user_struct(target_ts
, target_addr
, 0);
6896 static inline abi_long
host_to_target_timespec(abi_ulong target_addr
,
6897 struct timespec
*host_ts
)
6899 struct target_timespec
*target_ts
;
6901 if (!lock_user_struct(VERIFY_WRITE
, target_ts
, target_addr
, 0))
6902 return -TARGET_EFAULT
;
6903 __put_user(host_ts
->tv_sec
, &target_ts
->tv_sec
);
6904 __put_user(host_ts
->tv_nsec
, &target_ts
->tv_nsec
);
6905 unlock_user_struct(target_ts
, target_addr
, 1);
6909 static inline abi_long
target_to_host_itimerspec(struct itimerspec
*host_itspec
,
6910 abi_ulong target_addr
)
6912 struct target_itimerspec
*target_itspec
;
6914 if (!lock_user_struct(VERIFY_READ
, target_itspec
, target_addr
, 1)) {
6915 return -TARGET_EFAULT
;
6918 host_itspec
->it_interval
.tv_sec
=
6919 tswapal(target_itspec
->it_interval
.tv_sec
);
6920 host_itspec
->it_interval
.tv_nsec
=
6921 tswapal(target_itspec
->it_interval
.tv_nsec
);
6922 host_itspec
->it_value
.tv_sec
= tswapal(target_itspec
->it_value
.tv_sec
);
6923 host_itspec
->it_value
.tv_nsec
= tswapal(target_itspec
->it_value
.tv_nsec
);
6925 unlock_user_struct(target_itspec
, target_addr
, 1);
6929 static inline abi_long
host_to_target_itimerspec(abi_ulong target_addr
,
6930 struct itimerspec
*host_its
)
6932 struct target_itimerspec
*target_itspec
;
6934 if (!lock_user_struct(VERIFY_WRITE
, target_itspec
, target_addr
, 0)) {
6935 return -TARGET_EFAULT
;
6938 target_itspec
->it_interval
.tv_sec
= tswapal(host_its
->it_interval
.tv_sec
);
6939 target_itspec
->it_interval
.tv_nsec
= tswapal(host_its
->it_interval
.tv_nsec
);
6941 target_itspec
->it_value
.tv_sec
= tswapal(host_its
->it_value
.tv_sec
);
6942 target_itspec
->it_value
.tv_nsec
= tswapal(host_its
->it_value
.tv_nsec
);
6944 unlock_user_struct(target_itspec
, target_addr
, 0);
6948 static inline abi_long
target_to_host_timex(struct timex
*host_tx
,
6949 abi_long target_addr
)
6951 struct target_timex
*target_tx
;
6953 if (!lock_user_struct(VERIFY_READ
, target_tx
, target_addr
, 1)) {
6954 return -TARGET_EFAULT
;
6957 __get_user(host_tx
->modes
, &target_tx
->modes
);
6958 __get_user(host_tx
->offset
, &target_tx
->offset
);
6959 __get_user(host_tx
->freq
, &target_tx
->freq
);
6960 __get_user(host_tx
->maxerror
, &target_tx
->maxerror
);
6961 __get_user(host_tx
->esterror
, &target_tx
->esterror
);
6962 __get_user(host_tx
->status
, &target_tx
->status
);
6963 __get_user(host_tx
->constant
, &target_tx
->constant
);
6964 __get_user(host_tx
->precision
, &target_tx
->precision
);
6965 __get_user(host_tx
->tolerance
, &target_tx
->tolerance
);
6966 __get_user(host_tx
->time
.tv_sec
, &target_tx
->time
.tv_sec
);
6967 __get_user(host_tx
->time
.tv_usec
, &target_tx
->time
.tv_usec
);
6968 __get_user(host_tx
->tick
, &target_tx
->tick
);
6969 __get_user(host_tx
->ppsfreq
, &target_tx
->ppsfreq
);
6970 __get_user(host_tx
->jitter
, &target_tx
->jitter
);
6971 __get_user(host_tx
->shift
, &target_tx
->shift
);
6972 __get_user(host_tx
->stabil
, &target_tx
->stabil
);
6973 __get_user(host_tx
->jitcnt
, &target_tx
->jitcnt
);
6974 __get_user(host_tx
->calcnt
, &target_tx
->calcnt
);
6975 __get_user(host_tx
->errcnt
, &target_tx
->errcnt
);
6976 __get_user(host_tx
->stbcnt
, &target_tx
->stbcnt
);
6977 __get_user(host_tx
->tai
, &target_tx
->tai
);
6979 unlock_user_struct(target_tx
, target_addr
, 0);
6983 static inline abi_long
host_to_target_timex(abi_long target_addr
,
6984 struct timex
*host_tx
)
6986 struct target_timex
*target_tx
;
6988 if (!lock_user_struct(VERIFY_WRITE
, target_tx
, target_addr
, 0)) {
6989 return -TARGET_EFAULT
;
6992 __put_user(host_tx
->modes
, &target_tx
->modes
);
6993 __put_user(host_tx
->offset
, &target_tx
->offset
);
6994 __put_user(host_tx
->freq
, &target_tx
->freq
);
6995 __put_user(host_tx
->maxerror
, &target_tx
->maxerror
);
6996 __put_user(host_tx
->esterror
, &target_tx
->esterror
);
6997 __put_user(host_tx
->status
, &target_tx
->status
);
6998 __put_user(host_tx
->constant
, &target_tx
->constant
);
6999 __put_user(host_tx
->precision
, &target_tx
->precision
);
7000 __put_user(host_tx
->tolerance
, &target_tx
->tolerance
);
7001 __put_user(host_tx
->time
.tv_sec
, &target_tx
->time
.tv_sec
);
7002 __put_user(host_tx
->time
.tv_usec
, &target_tx
->time
.tv_usec
);
7003 __put_user(host_tx
->tick
, &target_tx
->tick
);
7004 __put_user(host_tx
->ppsfreq
, &target_tx
->ppsfreq
);
7005 __put_user(host_tx
->jitter
, &target_tx
->jitter
);
7006 __put_user(host_tx
->shift
, &target_tx
->shift
);
7007 __put_user(host_tx
->stabil
, &target_tx
->stabil
);
7008 __put_user(host_tx
->jitcnt
, &target_tx
->jitcnt
);
7009 __put_user(host_tx
->calcnt
, &target_tx
->calcnt
);
7010 __put_user(host_tx
->errcnt
, &target_tx
->errcnt
);
7011 __put_user(host_tx
->stbcnt
, &target_tx
->stbcnt
);
7012 __put_user(host_tx
->tai
, &target_tx
->tai
);
7014 unlock_user_struct(target_tx
, target_addr
, 1);
7019 static inline abi_long
target_to_host_sigevent(struct sigevent
*host_sevp
,
7020 abi_ulong target_addr
)
7022 struct target_sigevent
*target_sevp
;
7024 if (!lock_user_struct(VERIFY_READ
, target_sevp
, target_addr
, 1)) {
7025 return -TARGET_EFAULT
;
7028 /* This union is awkward on 64 bit systems because it has a 32 bit
7029 * integer and a pointer in it; we follow the conversion approach
7030 * used for handling sigval types in signal.c so the guest should get
7031 * the correct value back even if we did a 64 bit byteswap and it's
7032 * using the 32 bit integer.
7034 host_sevp
->sigev_value
.sival_ptr
=
7035 (void *)(uintptr_t)tswapal(target_sevp
->sigev_value
.sival_ptr
);
7036 host_sevp
->sigev_signo
=
7037 target_to_host_signal(tswap32(target_sevp
->sigev_signo
));
7038 host_sevp
->sigev_notify
= tswap32(target_sevp
->sigev_notify
);
7039 host_sevp
->_sigev_un
._tid
= tswap32(target_sevp
->_sigev_un
._tid
);
7041 unlock_user_struct(target_sevp
, target_addr
, 1);
7045 #if defined(TARGET_NR_mlockall)
7046 static inline int target_to_host_mlockall_arg(int arg
)
7050 if (arg
& TARGET_MLOCKALL_MCL_CURRENT
) {
7051 result
|= MCL_CURRENT
;
7053 if (arg
& TARGET_MLOCKALL_MCL_FUTURE
) {
7054 result
|= MCL_FUTURE
;
7060 static inline abi_long
host_to_target_stat64(void *cpu_env
,
7061 abi_ulong target_addr
,
7062 struct stat
*host_st
)
7064 #if defined(TARGET_ARM) && defined(TARGET_ABI32)
7065 if (((CPUARMState
*)cpu_env
)->eabi
) {
7066 struct target_eabi_stat64
*target_st
;
7068 if (!lock_user_struct(VERIFY_WRITE
, target_st
, target_addr
, 0))
7069 return -TARGET_EFAULT
;
7070 memset(target_st
, 0, sizeof(struct target_eabi_stat64
));
7071 __put_user(host_st
->st_dev
, &target_st
->st_dev
);
7072 __put_user(host_st
->st_ino
, &target_st
->st_ino
);
7073 #ifdef TARGET_STAT64_HAS_BROKEN_ST_INO
7074 __put_user(host_st
->st_ino
, &target_st
->__st_ino
);
7076 __put_user(host_st
->st_mode
, &target_st
->st_mode
);
7077 __put_user(host_st
->st_nlink
, &target_st
->st_nlink
);
7078 __put_user(host_st
->st_uid
, &target_st
->st_uid
);
7079 __put_user(host_st
->st_gid
, &target_st
->st_gid
);
7080 __put_user(host_st
->st_rdev
, &target_st
->st_rdev
);
7081 __put_user(host_st
->st_size
, &target_st
->st_size
);
7082 __put_user(host_st
->st_blksize
, &target_st
->st_blksize
);
7083 __put_user(host_st
->st_blocks
, &target_st
->st_blocks
);
7084 __put_user(host_st
->st_atime
, &target_st
->target_st_atime
);
7085 __put_user(host_st
->st_mtime
, &target_st
->target_st_mtime
);
7086 __put_user(host_st
->st_ctime
, &target_st
->target_st_ctime
);
7087 unlock_user_struct(target_st
, target_addr
, 1);
7091 #if defined(TARGET_HAS_STRUCT_STAT64)
7092 struct target_stat64
*target_st
;
7094 struct target_stat
*target_st
;
7097 if (!lock_user_struct(VERIFY_WRITE
, target_st
, target_addr
, 0))
7098 return -TARGET_EFAULT
;
7099 memset(target_st
, 0, sizeof(*target_st
));
7100 __put_user(host_st
->st_dev
, &target_st
->st_dev
);
7101 __put_user(host_st
->st_ino
, &target_st
->st_ino
);
7102 #ifdef TARGET_STAT64_HAS_BROKEN_ST_INO
7103 __put_user(host_st
->st_ino
, &target_st
->__st_ino
);
7105 __put_user(host_st
->st_mode
, &target_st
->st_mode
);
7106 __put_user(host_st
->st_nlink
, &target_st
->st_nlink
);
7107 __put_user(host_st
->st_uid
, &target_st
->st_uid
);
7108 __put_user(host_st
->st_gid
, &target_st
->st_gid
);
7109 __put_user(host_st
->st_rdev
, &target_st
->st_rdev
);
7110 /* XXX: better use of kernel struct */
7111 __put_user(host_st
->st_size
, &target_st
->st_size
);
7112 __put_user(host_st
->st_blksize
, &target_st
->st_blksize
);
7113 __put_user(host_st
->st_blocks
, &target_st
->st_blocks
);
7114 __put_user(host_st
->st_atime
, &target_st
->target_st_atime
);
7115 __put_user(host_st
->st_mtime
, &target_st
->target_st_mtime
);
7116 __put_user(host_st
->st_ctime
, &target_st
->target_st_ctime
);
7117 unlock_user_struct(target_st
, target_addr
, 1);
7123 /* ??? Using host futex calls even when target atomic operations
7124 are not really atomic probably breaks things. However implementing
7125 futexes locally would make futexes shared between multiple processes
7126 tricky. However they're probably useless because guest atomic
7127 operations won't work either. */
7128 static int do_futex(target_ulong uaddr
, int op
, int val
, target_ulong timeout
,
7129 target_ulong uaddr2
, int val3
)
7131 struct timespec ts
, *pts
;
7134 /* ??? We assume FUTEX_* constants are the same on both host
7136 #ifdef FUTEX_CMD_MASK
7137 base_op
= op
& FUTEX_CMD_MASK
;
7143 case FUTEX_WAIT_BITSET
:
7146 target_to_host_timespec(pts
, timeout
);
7150 return get_errno(safe_futex(g2h(uaddr
), op
, tswap32(val
),
7153 return get_errno(safe_futex(g2h(uaddr
), op
, val
, NULL
, NULL
, 0));
7155 return get_errno(safe_futex(g2h(uaddr
), op
, val
, NULL
, NULL
, 0));
7157 case FUTEX_CMP_REQUEUE
:
7159 /* For FUTEX_REQUEUE, FUTEX_CMP_REQUEUE, and FUTEX_WAKE_OP, the
7160 TIMEOUT parameter is interpreted as a uint32_t by the kernel.
7161 But the prototype takes a `struct timespec *'; insert casts
7162 to satisfy the compiler. We do not need to tswap TIMEOUT
7163 since it's not compared to guest memory. */
7164 pts
= (struct timespec
*)(uintptr_t) timeout
;
7165 return get_errno(safe_futex(g2h(uaddr
), op
, val
, pts
,
7167 (base_op
== FUTEX_CMP_REQUEUE
7171 return -TARGET_ENOSYS
;
7174 #if defined(TARGET_NR_name_to_handle_at) && defined(CONFIG_OPEN_BY_HANDLE)
7175 static abi_long
do_name_to_handle_at(abi_long dirfd
, abi_long pathname
,
7176 abi_long handle
, abi_long mount_id
,
7179 struct file_handle
*target_fh
;
7180 struct file_handle
*fh
;
7184 unsigned int size
, total_size
;
7186 if (get_user_s32(size
, handle
)) {
7187 return -TARGET_EFAULT
;
7190 name
= lock_user_string(pathname
);
7192 return -TARGET_EFAULT
;
7195 total_size
= sizeof(struct file_handle
) + size
;
7196 target_fh
= lock_user(VERIFY_WRITE
, handle
, total_size
, 0);
7198 unlock_user(name
, pathname
, 0);
7199 return -TARGET_EFAULT
;
7202 fh
= g_malloc0(total_size
);
7203 fh
->handle_bytes
= size
;
7205 ret
= get_errno(name_to_handle_at(dirfd
, path(name
), fh
, &mid
, flags
));
7206 unlock_user(name
, pathname
, 0);
7208 /* man name_to_handle_at(2):
7209 * Other than the use of the handle_bytes field, the caller should treat
7210 * the file_handle structure as an opaque data type
7213 memcpy(target_fh
, fh
, total_size
);
7214 target_fh
->handle_bytes
= tswap32(fh
->handle_bytes
);
7215 target_fh
->handle_type
= tswap32(fh
->handle_type
);
7217 unlock_user(target_fh
, handle
, total_size
);
7219 if (put_user_s32(mid
, mount_id
)) {
7220 return -TARGET_EFAULT
;
7228 #if defined(TARGET_NR_open_by_handle_at) && defined(CONFIG_OPEN_BY_HANDLE)
7229 static abi_long
do_open_by_handle_at(abi_long mount_fd
, abi_long handle
,
7232 struct file_handle
*target_fh
;
7233 struct file_handle
*fh
;
7234 unsigned int size
, total_size
;
7237 if (get_user_s32(size
, handle
)) {
7238 return -TARGET_EFAULT
;
7241 total_size
= sizeof(struct file_handle
) + size
;
7242 target_fh
= lock_user(VERIFY_READ
, handle
, total_size
, 1);
7244 return -TARGET_EFAULT
;
7247 fh
= g_memdup(target_fh
, total_size
);
7248 fh
->handle_bytes
= size
;
7249 fh
->handle_type
= tswap32(target_fh
->handle_type
);
7251 ret
= get_errno(open_by_handle_at(mount_fd
, fh
,
7252 target_to_host_bitmask(flags
, fcntl_flags_tbl
)));
7256 unlock_user(target_fh
, handle
, total_size
);
7262 #if defined(TARGET_NR_signalfd) || defined(TARGET_NR_signalfd4)
7264 /* signalfd siginfo conversion */
7267 host_to_target_signalfd_siginfo(struct signalfd_siginfo
*tinfo
,
7268 const struct signalfd_siginfo
*info
)
7270 int sig
= host_to_target_signal(info
->ssi_signo
);
7272 /* linux/signalfd.h defines a ssi_addr_lsb
7273 * not defined in sys/signalfd.h but used by some kernels
7276 #ifdef BUS_MCEERR_AO
7277 if (tinfo
->ssi_signo
== SIGBUS
&&
7278 (tinfo
->ssi_code
== BUS_MCEERR_AR
||
7279 tinfo
->ssi_code
== BUS_MCEERR_AO
)) {
7280 uint16_t *ssi_addr_lsb
= (uint16_t *)(&info
->ssi_addr
+ 1);
7281 uint16_t *tssi_addr_lsb
= (uint16_t *)(&tinfo
->ssi_addr
+ 1);
7282 *tssi_addr_lsb
= tswap16(*ssi_addr_lsb
);
7286 tinfo
->ssi_signo
= tswap32(sig
);
7287 tinfo
->ssi_errno
= tswap32(tinfo
->ssi_errno
);
7288 tinfo
->ssi_code
= tswap32(info
->ssi_code
);
7289 tinfo
->ssi_pid
= tswap32(info
->ssi_pid
);
7290 tinfo
->ssi_uid
= tswap32(info
->ssi_uid
);
7291 tinfo
->ssi_fd
= tswap32(info
->ssi_fd
);
7292 tinfo
->ssi_tid
= tswap32(info
->ssi_tid
);
7293 tinfo
->ssi_band
= tswap32(info
->ssi_band
);
7294 tinfo
->ssi_overrun
= tswap32(info
->ssi_overrun
);
7295 tinfo
->ssi_trapno
= tswap32(info
->ssi_trapno
);
7296 tinfo
->ssi_status
= tswap32(info
->ssi_status
);
7297 tinfo
->ssi_int
= tswap32(info
->ssi_int
);
7298 tinfo
->ssi_ptr
= tswap64(info
->ssi_ptr
);
7299 tinfo
->ssi_utime
= tswap64(info
->ssi_utime
);
7300 tinfo
->ssi_stime
= tswap64(info
->ssi_stime
);
7301 tinfo
->ssi_addr
= tswap64(info
->ssi_addr
);
7304 static abi_long
host_to_target_data_signalfd(void *buf
, size_t len
)
7308 for (i
= 0; i
< len
; i
+= sizeof(struct signalfd_siginfo
)) {
7309 host_to_target_signalfd_siginfo(buf
+ i
, buf
+ i
);
7315 static TargetFdTrans target_signalfd_trans
= {
7316 .host_to_target_data
= host_to_target_data_signalfd
,
7319 static abi_long
do_signalfd4(int fd
, abi_long mask
, int flags
)
7322 target_sigset_t
*target_mask
;
7326 if (flags
& ~(TARGET_O_NONBLOCK
| TARGET_O_CLOEXEC
)) {
7327 return -TARGET_EINVAL
;
7329 if (!lock_user_struct(VERIFY_READ
, target_mask
, mask
, 1)) {
7330 return -TARGET_EFAULT
;
7333 target_to_host_sigset(&host_mask
, target_mask
);
7335 host_flags
= target_to_host_bitmask(flags
, fcntl_flags_tbl
);
7337 ret
= get_errno(signalfd(fd
, &host_mask
, host_flags
));
7339 fd_trans_register(ret
, &target_signalfd_trans
);
7342 unlock_user_struct(target_mask
, mask
, 0);
7348 /* Map host to target signal numbers for the wait family of syscalls.
7349 Assume all other status bits are the same. */
7350 int host_to_target_waitstatus(int status
)
7352 if (WIFSIGNALED(status
)) {
7353 return host_to_target_signal(WTERMSIG(status
)) | (status
& ~0x7f);
7355 if (WIFSTOPPED(status
)) {
7356 return (host_to_target_signal(WSTOPSIG(status
)) << 8)
7362 static int open_self_cmdline(void *cpu_env
, int fd
)
7364 CPUState
*cpu
= ENV_GET_CPU((CPUArchState
*)cpu_env
);
7365 struct linux_binprm
*bprm
= ((TaskState
*)cpu
->opaque
)->bprm
;
7368 for (i
= 0; i
< bprm
->argc
; i
++) {
7369 size_t len
= strlen(bprm
->argv
[i
]) + 1;
7371 if (write(fd
, bprm
->argv
[i
], len
) != len
) {
7379 static int open_self_maps(void *cpu_env
, int fd
)
7381 CPUState
*cpu
= ENV_GET_CPU((CPUArchState
*)cpu_env
);
7382 TaskState
*ts
= cpu
->opaque
;
7388 fp
= fopen("/proc/self/maps", "r");
7393 while ((read
= getline(&line
, &len
, fp
)) != -1) {
7394 int fields
, dev_maj
, dev_min
, inode
;
7395 uint64_t min
, max
, offset
;
7396 char flag_r
, flag_w
, flag_x
, flag_p
;
7397 char path
[512] = "";
7398 fields
= sscanf(line
, "%"PRIx64
"-%"PRIx64
" %c%c%c%c %"PRIx64
" %x:%x %d"
7399 " %512s", &min
, &max
, &flag_r
, &flag_w
, &flag_x
,
7400 &flag_p
, &offset
, &dev_maj
, &dev_min
, &inode
, path
);
7402 if ((fields
< 10) || (fields
> 11)) {
7405 if (h2g_valid(min
)) {
7406 int flags
= page_get_flags(h2g(min
));
7407 max
= h2g_valid(max
- 1) ? max
: (uintptr_t)g2h(GUEST_ADDR_MAX
);
7408 if (page_check_range(h2g(min
), max
- min
, flags
) == -1) {
7411 if (h2g(min
) == ts
->info
->stack_limit
) {
7412 pstrcpy(path
, sizeof(path
), " [stack]");
7414 dprintf(fd
, TARGET_ABI_FMT_lx
"-" TARGET_ABI_FMT_lx
7415 " %c%c%c%c %08" PRIx64
" %02x:%02x %d %s%s\n",
7416 h2g(min
), h2g(max
- 1) + 1, flag_r
, flag_w
,
7417 flag_x
, flag_p
, offset
, dev_maj
, dev_min
, inode
,
7418 path
[0] ? " " : "", path
);
7428 static int open_self_stat(void *cpu_env
, int fd
)
7430 CPUState
*cpu
= ENV_GET_CPU((CPUArchState
*)cpu_env
);
7431 TaskState
*ts
= cpu
->opaque
;
7432 abi_ulong start_stack
= ts
->info
->start_stack
;
7435 for (i
= 0; i
< 44; i
++) {
7443 snprintf(buf
, sizeof(buf
), "%"PRId64
" ", val
);
7444 } else if (i
== 1) {
7446 snprintf(buf
, sizeof(buf
), "(%s) ", ts
->bprm
->argv
[0]);
7447 } else if (i
== 27) {
7450 snprintf(buf
, sizeof(buf
), "%"PRId64
" ", val
);
7452 /* for the rest, there is MasterCard */
7453 snprintf(buf
, sizeof(buf
), "0%c", i
== 43 ? '\n' : ' ');
7457 if (write(fd
, buf
, len
) != len
) {
7465 static int open_self_auxv(void *cpu_env
, int fd
)
7467 CPUState
*cpu
= ENV_GET_CPU((CPUArchState
*)cpu_env
);
7468 TaskState
*ts
= cpu
->opaque
;
7469 abi_ulong auxv
= ts
->info
->saved_auxv
;
7470 abi_ulong len
= ts
->info
->auxv_len
;
7474 * Auxiliary vector is stored in target process stack.
7475 * read in whole auxv vector and copy it to file
7477 ptr
= lock_user(VERIFY_READ
, auxv
, len
, 0);
7481 r
= write(fd
, ptr
, len
);
7488 lseek(fd
, 0, SEEK_SET
);
7489 unlock_user(ptr
, auxv
, len
);
7495 static int is_proc_myself(const char *filename
, const char *entry
)
7497 if (!strncmp(filename
, "/proc/", strlen("/proc/"))) {
7498 filename
+= strlen("/proc/");
7499 if (!strncmp(filename
, "self/", strlen("self/"))) {
7500 filename
+= strlen("self/");
7501 } else if (*filename
>= '1' && *filename
<= '9') {
7503 snprintf(myself
, sizeof(myself
), "%d/", getpid());
7504 if (!strncmp(filename
, myself
, strlen(myself
))) {
7505 filename
+= strlen(myself
);
7512 if (!strcmp(filename
, entry
)) {
7519 #if defined(HOST_WORDS_BIGENDIAN) != defined(TARGET_WORDS_BIGENDIAN)
7520 static int is_proc(const char *filename
, const char *entry
)
7522 return strcmp(filename
, entry
) == 0;
7525 static int open_net_route(void *cpu_env
, int fd
)
7532 fp
= fopen("/proc/net/route", "r");
7539 read
= getline(&line
, &len
, fp
);
7540 dprintf(fd
, "%s", line
);
7544 while ((read
= getline(&line
, &len
, fp
)) != -1) {
7546 uint32_t dest
, gw
, mask
;
7547 unsigned int flags
, refcnt
, use
, metric
, mtu
, window
, irtt
;
7548 sscanf(line
, "%s\t%08x\t%08x\t%04x\t%d\t%d\t%d\t%08x\t%d\t%u\t%u\n",
7549 iface
, &dest
, &gw
, &flags
, &refcnt
, &use
, &metric
,
7550 &mask
, &mtu
, &window
, &irtt
);
7551 dprintf(fd
, "%s\t%08x\t%08x\t%04x\t%d\t%d\t%d\t%08x\t%d\t%u\t%u\n",
7552 iface
, tswap32(dest
), tswap32(gw
), flags
, refcnt
, use
,
7553 metric
, tswap32(mask
), mtu
, window
, irtt
);
7563 static int do_openat(void *cpu_env
, int dirfd
, const char *pathname
, int flags
, mode_t mode
)
7566 const char *filename
;
7567 int (*fill
)(void *cpu_env
, int fd
);
7568 int (*cmp
)(const char *s1
, const char *s2
);
7570 const struct fake_open
*fake_open
;
7571 static const struct fake_open fakes
[] = {
7572 { "maps", open_self_maps
, is_proc_myself
},
7573 { "stat", open_self_stat
, is_proc_myself
},
7574 { "auxv", open_self_auxv
, is_proc_myself
},
7575 { "cmdline", open_self_cmdline
, is_proc_myself
},
7576 #if defined(HOST_WORDS_BIGENDIAN) != defined(TARGET_WORDS_BIGENDIAN)
7577 { "/proc/net/route", open_net_route
, is_proc
},
7579 { NULL
, NULL
, NULL
}
7582 if (is_proc_myself(pathname
, "exe")) {
7583 int execfd
= qemu_getauxval(AT_EXECFD
);
7584 return execfd
? execfd
: safe_openat(dirfd
, exec_path
, flags
, mode
);
7587 for (fake_open
= fakes
; fake_open
->filename
; fake_open
++) {
7588 if (fake_open
->cmp(pathname
, fake_open
->filename
)) {
7593 if (fake_open
->filename
) {
7595 char filename
[PATH_MAX
];
7598 /* create temporary file to map stat to */
7599 tmpdir
= getenv("TMPDIR");
7602 snprintf(filename
, sizeof(filename
), "%s/qemu-open.XXXXXX", tmpdir
);
7603 fd
= mkstemp(filename
);
7609 if ((r
= fake_open
->fill(cpu_env
, fd
))) {
7615 lseek(fd
, 0, SEEK_SET
);
7620 return safe_openat(dirfd
, path(pathname
), flags
, mode
);
7623 #define TIMER_MAGIC 0x0caf0000
7624 #define TIMER_MAGIC_MASK 0xffff0000
7626 /* Convert QEMU provided timer ID back to internal 16bit index format */
7627 static target_timer_t
get_timer_id(abi_long arg
)
7629 target_timer_t timerid
= arg
;
7631 if ((timerid
& TIMER_MAGIC_MASK
) != TIMER_MAGIC
) {
7632 return -TARGET_EINVAL
;
7637 if (timerid
>= ARRAY_SIZE(g_posix_timers
)) {
7638 return -TARGET_EINVAL
;
7644 static abi_long
swap_data_eventfd(void *buf
, size_t len
)
7646 uint64_t *counter
= buf
;
7649 if (len
< sizeof(uint64_t)) {
7653 for (i
= 0; i
< len
; i
+= sizeof(uint64_t)) {
7654 *counter
= tswap64(*counter
);
7661 static TargetFdTrans target_eventfd_trans
= {
7662 .host_to_target_data
= swap_data_eventfd
,
7663 .target_to_host_data
= swap_data_eventfd
,
7666 #if (defined(TARGET_NR_inotify_init) && defined(__NR_inotify_init)) || \
7667 (defined(CONFIG_INOTIFY1) && defined(TARGET_NR_inotify_init1) && \
7668 defined(__NR_inotify_init1))
7669 static abi_long
host_to_target_data_inotify(void *buf
, size_t len
)
7671 struct inotify_event
*ev
;
7675 for (i
= 0; i
< len
; i
+= sizeof(struct inotify_event
) + name_len
) {
7676 ev
= (struct inotify_event
*)((char *)buf
+ i
);
7679 ev
->wd
= tswap32(ev
->wd
);
7680 ev
->mask
= tswap32(ev
->mask
);
7681 ev
->cookie
= tswap32(ev
->cookie
);
7682 ev
->len
= tswap32(name_len
);
7688 static TargetFdTrans target_inotify_trans
= {
7689 .host_to_target_data
= host_to_target_data_inotify
,
7693 /* do_syscall() should always have a single exit point at the end so
7694 that actions, such as logging of syscall results, can be performed.
7695 All errnos that do_syscall() returns must be -TARGET_<errcode>. */
7696 abi_long
do_syscall(void *cpu_env
, int num
, abi_long arg1
,
7697 abi_long arg2
, abi_long arg3
, abi_long arg4
,
7698 abi_long arg5
, abi_long arg6
, abi_long arg7
,
7701 CPUState
*cpu
= ENV_GET_CPU(cpu_env
);
7707 #if defined(DEBUG_ERESTARTSYS)
7708 /* Debug-only code for exercising the syscall-restart code paths
7709 * in the per-architecture cpu main loops: restart every syscall
7710 * the guest makes once before letting it through.
7717 return -TARGET_ERESTARTSYS
;
7723 gemu_log("syscall %d", num
);
7725 trace_guest_user_syscall(cpu
, num
, arg1
, arg2
, arg3
, arg4
, arg5
, arg6
, arg7
, arg8
);
7727 print_syscall(num
, arg1
, arg2
, arg3
, arg4
, arg5
, arg6
);
7730 case TARGET_NR_exit
:
7731 /* In old applications this may be used to implement _exit(2).
7732 However in threaded applictions it is used for thread termination,
7733 and _exit_group is used for application termination.
7734 Do thread termination if we have more then one thread. */
7736 if (block_signals()) {
7737 ret
= -TARGET_ERESTARTSYS
;
7743 if (CPU_NEXT(first_cpu
)) {
7746 /* Remove the CPU from the list. */
7747 QTAILQ_REMOVE(&cpus
, cpu
, node
);
7752 if (ts
->child_tidptr
) {
7753 put_user_u32(0, ts
->child_tidptr
);
7754 sys_futex(g2h(ts
->child_tidptr
), FUTEX_WAKE
, INT_MAX
,
7758 object_unref(OBJECT(cpu
));
7760 rcu_unregister_thread();
7768 gdb_exit(cpu_env
, arg1
);
7770 ret
= 0; /* avoid warning */
7772 case TARGET_NR_read
:
7776 if (!(p
= lock_user(VERIFY_WRITE
, arg2
, arg3
, 0)))
7778 ret
= get_errno(safe_read(arg1
, p
, arg3
));
7780 fd_trans_host_to_target_data(arg1
)) {
7781 ret
= fd_trans_host_to_target_data(arg1
)(p
, ret
);
7783 unlock_user(p
, arg2
, ret
);
7786 case TARGET_NR_write
:
7787 if (!(p
= lock_user(VERIFY_READ
, arg2
, arg3
, 1)))
7789 if (fd_trans_target_to_host_data(arg1
)) {
7790 void *copy
= g_malloc(arg3
);
7791 memcpy(copy
, p
, arg3
);
7792 ret
= fd_trans_target_to_host_data(arg1
)(copy
, arg3
);
7794 ret
= get_errno(safe_write(arg1
, copy
, ret
));
7798 ret
= get_errno(safe_write(arg1
, p
, arg3
));
7800 unlock_user(p
, arg2
, 0);
7802 #ifdef TARGET_NR_open
7803 case TARGET_NR_open
:
7804 if (!(p
= lock_user_string(arg1
)))
7806 ret
= get_errno(do_openat(cpu_env
, AT_FDCWD
, p
,
7807 target_to_host_bitmask(arg2
, fcntl_flags_tbl
),
7809 fd_trans_unregister(ret
);
7810 unlock_user(p
, arg1
, 0);
7813 case TARGET_NR_openat
:
7814 if (!(p
= lock_user_string(arg2
)))
7816 ret
= get_errno(do_openat(cpu_env
, arg1
, p
,
7817 target_to_host_bitmask(arg3
, fcntl_flags_tbl
),
7819 fd_trans_unregister(ret
);
7820 unlock_user(p
, arg2
, 0);
7822 #if defined(TARGET_NR_name_to_handle_at) && defined(CONFIG_OPEN_BY_HANDLE)
7823 case TARGET_NR_name_to_handle_at
:
7824 ret
= do_name_to_handle_at(arg1
, arg2
, arg3
, arg4
, arg5
);
7827 #if defined(TARGET_NR_open_by_handle_at) && defined(CONFIG_OPEN_BY_HANDLE)
7828 case TARGET_NR_open_by_handle_at
:
7829 ret
= do_open_by_handle_at(arg1
, arg2
, arg3
);
7830 fd_trans_unregister(ret
);
7833 case TARGET_NR_close
:
7834 fd_trans_unregister(arg1
);
7835 ret
= get_errno(close(arg1
));
7840 #ifdef TARGET_NR_fork
7841 case TARGET_NR_fork
:
7842 ret
= get_errno(do_fork(cpu_env
, TARGET_SIGCHLD
, 0, 0, 0, 0));
7845 #ifdef TARGET_NR_waitpid
7846 case TARGET_NR_waitpid
:
7849 ret
= get_errno(safe_wait4(arg1
, &status
, arg3
, 0));
7850 if (!is_error(ret
) && arg2
&& ret
7851 && put_user_s32(host_to_target_waitstatus(status
), arg2
))
7856 #ifdef TARGET_NR_waitid
7857 case TARGET_NR_waitid
:
7861 ret
= get_errno(safe_waitid(arg1
, arg2
, &info
, arg4
, NULL
));
7862 if (!is_error(ret
) && arg3
&& info
.si_pid
!= 0) {
7863 if (!(p
= lock_user(VERIFY_WRITE
, arg3
, sizeof(target_siginfo_t
), 0)))
7865 host_to_target_siginfo(p
, &info
);
7866 unlock_user(p
, arg3
, sizeof(target_siginfo_t
));
7871 #ifdef TARGET_NR_creat /* not on alpha */
7872 case TARGET_NR_creat
:
7873 if (!(p
= lock_user_string(arg1
)))
7875 ret
= get_errno(creat(p
, arg2
));
7876 fd_trans_unregister(ret
);
7877 unlock_user(p
, arg1
, 0);
7880 #ifdef TARGET_NR_link
7881 case TARGET_NR_link
:
7884 p
= lock_user_string(arg1
);
7885 p2
= lock_user_string(arg2
);
7887 ret
= -TARGET_EFAULT
;
7889 ret
= get_errno(link(p
, p2
));
7890 unlock_user(p2
, arg2
, 0);
7891 unlock_user(p
, arg1
, 0);
7895 #if defined(TARGET_NR_linkat)
7896 case TARGET_NR_linkat
:
7901 p
= lock_user_string(arg2
);
7902 p2
= lock_user_string(arg4
);
7904 ret
= -TARGET_EFAULT
;
7906 ret
= get_errno(linkat(arg1
, p
, arg3
, p2
, arg5
));
7907 unlock_user(p
, arg2
, 0);
7908 unlock_user(p2
, arg4
, 0);
7912 #ifdef TARGET_NR_unlink
7913 case TARGET_NR_unlink
:
7914 if (!(p
= lock_user_string(arg1
)))
7916 ret
= get_errno(unlink(p
));
7917 unlock_user(p
, arg1
, 0);
7920 #if defined(TARGET_NR_unlinkat)
7921 case TARGET_NR_unlinkat
:
7922 if (!(p
= lock_user_string(arg2
)))
7924 ret
= get_errno(unlinkat(arg1
, p
, arg3
));
7925 unlock_user(p
, arg2
, 0);
7928 case TARGET_NR_execve
:
7930 char **argp
, **envp
;
7933 abi_ulong guest_argp
;
7934 abi_ulong guest_envp
;
7941 for (gp
= guest_argp
; gp
; gp
+= sizeof(abi_ulong
)) {
7942 if (get_user_ual(addr
, gp
))
7950 for (gp
= guest_envp
; gp
; gp
+= sizeof(abi_ulong
)) {
7951 if (get_user_ual(addr
, gp
))
7958 argp
= g_new0(char *, argc
+ 1);
7959 envp
= g_new0(char *, envc
+ 1);
7961 for (gp
= guest_argp
, q
= argp
; gp
;
7962 gp
+= sizeof(abi_ulong
), q
++) {
7963 if (get_user_ual(addr
, gp
))
7967 if (!(*q
= lock_user_string(addr
)))
7969 total_size
+= strlen(*q
) + 1;
7973 for (gp
= guest_envp
, q
= envp
; gp
;
7974 gp
+= sizeof(abi_ulong
), q
++) {
7975 if (get_user_ual(addr
, gp
))
7979 if (!(*q
= lock_user_string(addr
)))
7981 total_size
+= strlen(*q
) + 1;
7985 if (!(p
= lock_user_string(arg1
)))
7987 /* Although execve() is not an interruptible syscall it is
7988 * a special case where we must use the safe_syscall wrapper:
7989 * if we allow a signal to happen before we make the host
7990 * syscall then we will 'lose' it, because at the point of
7991 * execve the process leaves QEMU's control. So we use the
7992 * safe syscall wrapper to ensure that we either take the
7993 * signal as a guest signal, or else it does not happen
7994 * before the execve completes and makes it the other
7995 * program's problem.
7997 ret
= get_errno(safe_execve(p
, argp
, envp
));
7998 unlock_user(p
, arg1
, 0);
8003 ret
= -TARGET_EFAULT
;
8006 for (gp
= guest_argp
, q
= argp
; *q
;
8007 gp
+= sizeof(abi_ulong
), q
++) {
8008 if (get_user_ual(addr
, gp
)
8011 unlock_user(*q
, addr
, 0);
8013 for (gp
= guest_envp
, q
= envp
; *q
;
8014 gp
+= sizeof(abi_ulong
), q
++) {
8015 if (get_user_ual(addr
, gp
)
8018 unlock_user(*q
, addr
, 0);
8025 case TARGET_NR_chdir
:
8026 if (!(p
= lock_user_string(arg1
)))
8028 ret
= get_errno(chdir(p
));
8029 unlock_user(p
, arg1
, 0);
8031 #ifdef TARGET_NR_time
8032 case TARGET_NR_time
:
8035 ret
= get_errno(time(&host_time
));
8038 && put_user_sal(host_time
, arg1
))
8043 #ifdef TARGET_NR_mknod
8044 case TARGET_NR_mknod
:
8045 if (!(p
= lock_user_string(arg1
)))
8047 ret
= get_errno(mknod(p
, arg2
, arg3
));
8048 unlock_user(p
, arg1
, 0);
8051 #if defined(TARGET_NR_mknodat)
8052 case TARGET_NR_mknodat
:
8053 if (!(p
= lock_user_string(arg2
)))
8055 ret
= get_errno(mknodat(arg1
, p
, arg3
, arg4
));
8056 unlock_user(p
, arg2
, 0);
8059 #ifdef TARGET_NR_chmod
8060 case TARGET_NR_chmod
:
8061 if (!(p
= lock_user_string(arg1
)))
8063 ret
= get_errno(chmod(p
, arg2
));
8064 unlock_user(p
, arg1
, 0);
8067 #ifdef TARGET_NR_break
8068 case TARGET_NR_break
:
8071 #ifdef TARGET_NR_oldstat
8072 case TARGET_NR_oldstat
:
8075 case TARGET_NR_lseek
:
8076 ret
= get_errno(lseek(arg1
, arg2
, arg3
));
8078 #if defined(TARGET_NR_getxpid) && defined(TARGET_ALPHA)
8079 /* Alpha specific */
8080 case TARGET_NR_getxpid
:
8081 ((CPUAlphaState
*)cpu_env
)->ir
[IR_A4
] = getppid();
8082 ret
= get_errno(getpid());
8085 #ifdef TARGET_NR_getpid
8086 case TARGET_NR_getpid
:
8087 ret
= get_errno(getpid());
8090 case TARGET_NR_mount
:
8092 /* need to look at the data field */
8096 p
= lock_user_string(arg1
);
8104 p2
= lock_user_string(arg2
);
8107 unlock_user(p
, arg1
, 0);
8113 p3
= lock_user_string(arg3
);
8116 unlock_user(p
, arg1
, 0);
8118 unlock_user(p2
, arg2
, 0);
8125 /* FIXME - arg5 should be locked, but it isn't clear how to
8126 * do that since it's not guaranteed to be a NULL-terminated
8130 ret
= mount(p
, p2
, p3
, (unsigned long)arg4
, NULL
);
8132 ret
= mount(p
, p2
, p3
, (unsigned long)arg4
, g2h(arg5
));
8134 ret
= get_errno(ret
);
8137 unlock_user(p
, arg1
, 0);
8139 unlock_user(p2
, arg2
, 0);
8141 unlock_user(p3
, arg3
, 0);
8145 #ifdef TARGET_NR_umount
8146 case TARGET_NR_umount
:
8147 if (!(p
= lock_user_string(arg1
)))
8149 ret
= get_errno(umount(p
));
8150 unlock_user(p
, arg1
, 0);
8153 #ifdef TARGET_NR_stime /* not on alpha */
8154 case TARGET_NR_stime
:
8157 if (get_user_sal(host_time
, arg1
))
8159 ret
= get_errno(stime(&host_time
));
8163 case TARGET_NR_ptrace
:
8165 #ifdef TARGET_NR_alarm /* not on alpha */
8166 case TARGET_NR_alarm
:
8170 #ifdef TARGET_NR_oldfstat
8171 case TARGET_NR_oldfstat
:
8174 #ifdef TARGET_NR_pause /* not on alpha */
8175 case TARGET_NR_pause
:
8176 if (!block_signals()) {
8177 sigsuspend(&((TaskState
*)cpu
->opaque
)->signal_mask
);
8179 ret
= -TARGET_EINTR
;
8182 #ifdef TARGET_NR_utime
8183 case TARGET_NR_utime
:
8185 struct utimbuf tbuf
, *host_tbuf
;
8186 struct target_utimbuf
*target_tbuf
;
8188 if (!lock_user_struct(VERIFY_READ
, target_tbuf
, arg2
, 1))
8190 tbuf
.actime
= tswapal(target_tbuf
->actime
);
8191 tbuf
.modtime
= tswapal(target_tbuf
->modtime
);
8192 unlock_user_struct(target_tbuf
, arg2
, 0);
8197 if (!(p
= lock_user_string(arg1
)))
8199 ret
= get_errno(utime(p
, host_tbuf
));
8200 unlock_user(p
, arg1
, 0);
8204 #ifdef TARGET_NR_utimes
8205 case TARGET_NR_utimes
:
8207 struct timeval
*tvp
, tv
[2];
8209 if (copy_from_user_timeval(&tv
[0], arg2
)
8210 || copy_from_user_timeval(&tv
[1],
8211 arg2
+ sizeof(struct target_timeval
)))
8217 if (!(p
= lock_user_string(arg1
)))
8219 ret
= get_errno(utimes(p
, tvp
));
8220 unlock_user(p
, arg1
, 0);
8224 #if defined(TARGET_NR_futimesat)
8225 case TARGET_NR_futimesat
:
8227 struct timeval
*tvp
, tv
[2];
8229 if (copy_from_user_timeval(&tv
[0], arg3
)
8230 || copy_from_user_timeval(&tv
[1],
8231 arg3
+ sizeof(struct target_timeval
)))
8237 if (!(p
= lock_user_string(arg2
)))
8239 ret
= get_errno(futimesat(arg1
, path(p
), tvp
));
8240 unlock_user(p
, arg2
, 0);
8244 #ifdef TARGET_NR_stty
8245 case TARGET_NR_stty
:
8248 #ifdef TARGET_NR_gtty
8249 case TARGET_NR_gtty
:
8252 #ifdef TARGET_NR_access
8253 case TARGET_NR_access
:
8254 if (!(p
= lock_user_string(arg1
)))
8256 ret
= get_errno(access(path(p
), arg2
));
8257 unlock_user(p
, arg1
, 0);
8260 #if defined(TARGET_NR_faccessat) && defined(__NR_faccessat)
8261 case TARGET_NR_faccessat
:
8262 if (!(p
= lock_user_string(arg2
)))
8264 ret
= get_errno(faccessat(arg1
, p
, arg3
, 0));
8265 unlock_user(p
, arg2
, 0);
8268 #ifdef TARGET_NR_nice /* not on alpha */
8269 case TARGET_NR_nice
:
8270 ret
= get_errno(nice(arg1
));
8273 #ifdef TARGET_NR_ftime
8274 case TARGET_NR_ftime
:
8277 case TARGET_NR_sync
:
8281 #if defined(TARGET_NR_syncfs) && defined(CONFIG_SYNCFS)
8282 case TARGET_NR_syncfs
:
8283 ret
= get_errno(syncfs(arg1
));
8286 case TARGET_NR_kill
:
8287 ret
= get_errno(safe_kill(arg1
, target_to_host_signal(arg2
)));
8289 #ifdef TARGET_NR_rename
8290 case TARGET_NR_rename
:
8293 p
= lock_user_string(arg1
);
8294 p2
= lock_user_string(arg2
);
8296 ret
= -TARGET_EFAULT
;
8298 ret
= get_errno(rename(p
, p2
));
8299 unlock_user(p2
, arg2
, 0);
8300 unlock_user(p
, arg1
, 0);
8304 #if defined(TARGET_NR_renameat)
8305 case TARGET_NR_renameat
:
8308 p
= lock_user_string(arg2
);
8309 p2
= lock_user_string(arg4
);
8311 ret
= -TARGET_EFAULT
;
8313 ret
= get_errno(renameat(arg1
, p
, arg3
, p2
));
8314 unlock_user(p2
, arg4
, 0);
8315 unlock_user(p
, arg2
, 0);
8319 #ifdef TARGET_NR_mkdir
8320 case TARGET_NR_mkdir
:
8321 if (!(p
= lock_user_string(arg1
)))
8323 ret
= get_errno(mkdir(p
, arg2
));
8324 unlock_user(p
, arg1
, 0);
8327 #if defined(TARGET_NR_mkdirat)
8328 case TARGET_NR_mkdirat
:
8329 if (!(p
= lock_user_string(arg2
)))
8331 ret
= get_errno(mkdirat(arg1
, p
, arg3
));
8332 unlock_user(p
, arg2
, 0);
8335 #ifdef TARGET_NR_rmdir
8336 case TARGET_NR_rmdir
:
8337 if (!(p
= lock_user_string(arg1
)))
8339 ret
= get_errno(rmdir(p
));
8340 unlock_user(p
, arg1
, 0);
8344 ret
= get_errno(dup(arg1
));
8346 fd_trans_dup(arg1
, ret
);
8349 #ifdef TARGET_NR_pipe
8350 case TARGET_NR_pipe
:
8351 ret
= do_pipe(cpu_env
, arg1
, 0, 0);
8354 #ifdef TARGET_NR_pipe2
8355 case TARGET_NR_pipe2
:
8356 ret
= do_pipe(cpu_env
, arg1
,
8357 target_to_host_bitmask(arg2
, fcntl_flags_tbl
), 1);
8360 case TARGET_NR_times
:
8362 struct target_tms
*tmsp
;
8364 ret
= get_errno(times(&tms
));
8366 tmsp
= lock_user(VERIFY_WRITE
, arg1
, sizeof(struct target_tms
), 0);
8369 tmsp
->tms_utime
= tswapal(host_to_target_clock_t(tms
.tms_utime
));
8370 tmsp
->tms_stime
= tswapal(host_to_target_clock_t(tms
.tms_stime
));
8371 tmsp
->tms_cutime
= tswapal(host_to_target_clock_t(tms
.tms_cutime
));
8372 tmsp
->tms_cstime
= tswapal(host_to_target_clock_t(tms
.tms_cstime
));
8375 ret
= host_to_target_clock_t(ret
);
8378 #ifdef TARGET_NR_prof
8379 case TARGET_NR_prof
:
8382 #ifdef TARGET_NR_signal
8383 case TARGET_NR_signal
:
8386 case TARGET_NR_acct
:
8388 ret
= get_errno(acct(NULL
));
8390 if (!(p
= lock_user_string(arg1
)))
8392 ret
= get_errno(acct(path(p
)));
8393 unlock_user(p
, arg1
, 0);
8396 #ifdef TARGET_NR_umount2
8397 case TARGET_NR_umount2
:
8398 if (!(p
= lock_user_string(arg1
)))
8400 ret
= get_errno(umount2(p
, arg2
));
8401 unlock_user(p
, arg1
, 0);
8404 #ifdef TARGET_NR_lock
8405 case TARGET_NR_lock
:
8408 case TARGET_NR_ioctl
:
8409 ret
= do_ioctl(arg1
, arg2
, arg3
);
8411 case TARGET_NR_fcntl
:
8412 ret
= do_fcntl(arg1
, arg2
, arg3
);
8414 #ifdef TARGET_NR_mpx
8418 case TARGET_NR_setpgid
:
8419 ret
= get_errno(setpgid(arg1
, arg2
));
8421 #ifdef TARGET_NR_ulimit
8422 case TARGET_NR_ulimit
:
8425 #ifdef TARGET_NR_oldolduname
8426 case TARGET_NR_oldolduname
:
8429 case TARGET_NR_umask
:
8430 ret
= get_errno(umask(arg1
));
8432 case TARGET_NR_chroot
:
8433 if (!(p
= lock_user_string(arg1
)))
8435 ret
= get_errno(chroot(p
));
8436 unlock_user(p
, arg1
, 0);
8438 #ifdef TARGET_NR_ustat
8439 case TARGET_NR_ustat
:
8442 #ifdef TARGET_NR_dup2
8443 case TARGET_NR_dup2
:
8444 ret
= get_errno(dup2(arg1
, arg2
));
8446 fd_trans_dup(arg1
, arg2
);
8450 #if defined(CONFIG_DUP3) && defined(TARGET_NR_dup3)
8451 case TARGET_NR_dup3
:
8452 ret
= get_errno(dup3(arg1
, arg2
, arg3
));
8454 fd_trans_dup(arg1
, arg2
);
8458 #ifdef TARGET_NR_getppid /* not on alpha */
8459 case TARGET_NR_getppid
:
8460 ret
= get_errno(getppid());
8463 #ifdef TARGET_NR_getpgrp
8464 case TARGET_NR_getpgrp
:
8465 ret
= get_errno(getpgrp());
8468 case TARGET_NR_setsid
:
8469 ret
= get_errno(setsid());
8471 #ifdef TARGET_NR_sigaction
8472 case TARGET_NR_sigaction
:
8474 #if defined(TARGET_ALPHA)
8475 struct target_sigaction act
, oact
, *pact
= 0;
8476 struct target_old_sigaction
*old_act
;
8478 if (!lock_user_struct(VERIFY_READ
, old_act
, arg2
, 1))
8480 act
._sa_handler
= old_act
->_sa_handler
;
8481 target_siginitset(&act
.sa_mask
, old_act
->sa_mask
);
8482 act
.sa_flags
= old_act
->sa_flags
;
8483 act
.sa_restorer
= 0;
8484 unlock_user_struct(old_act
, arg2
, 0);
8487 ret
= get_errno(do_sigaction(arg1
, pact
, &oact
));
8488 if (!is_error(ret
) && arg3
) {
8489 if (!lock_user_struct(VERIFY_WRITE
, old_act
, arg3
, 0))
8491 old_act
->_sa_handler
= oact
._sa_handler
;
8492 old_act
->sa_mask
= oact
.sa_mask
.sig
[0];
8493 old_act
->sa_flags
= oact
.sa_flags
;
8494 unlock_user_struct(old_act
, arg3
, 1);
8496 #elif defined(TARGET_MIPS)
8497 struct target_sigaction act
, oact
, *pact
, *old_act
;
8500 if (!lock_user_struct(VERIFY_READ
, old_act
, arg2
, 1))
8502 act
._sa_handler
= old_act
->_sa_handler
;
8503 target_siginitset(&act
.sa_mask
, old_act
->sa_mask
.sig
[0]);
8504 act
.sa_flags
= old_act
->sa_flags
;
8505 unlock_user_struct(old_act
, arg2
, 0);
8511 ret
= get_errno(do_sigaction(arg1
, pact
, &oact
));
8513 if (!is_error(ret
) && arg3
) {
8514 if (!lock_user_struct(VERIFY_WRITE
, old_act
, arg3
, 0))
8516 old_act
->_sa_handler
= oact
._sa_handler
;
8517 old_act
->sa_flags
= oact
.sa_flags
;
8518 old_act
->sa_mask
.sig
[0] = oact
.sa_mask
.sig
[0];
8519 old_act
->sa_mask
.sig
[1] = 0;
8520 old_act
->sa_mask
.sig
[2] = 0;
8521 old_act
->sa_mask
.sig
[3] = 0;
8522 unlock_user_struct(old_act
, arg3
, 1);
8525 struct target_old_sigaction
*old_act
;
8526 struct target_sigaction act
, oact
, *pact
;
8528 if (!lock_user_struct(VERIFY_READ
, old_act
, arg2
, 1))
8530 act
._sa_handler
= old_act
->_sa_handler
;
8531 target_siginitset(&act
.sa_mask
, old_act
->sa_mask
);
8532 act
.sa_flags
= old_act
->sa_flags
;
8533 act
.sa_restorer
= old_act
->sa_restorer
;
8534 unlock_user_struct(old_act
, arg2
, 0);
8539 ret
= get_errno(do_sigaction(arg1
, pact
, &oact
));
8540 if (!is_error(ret
) && arg3
) {
8541 if (!lock_user_struct(VERIFY_WRITE
, old_act
, arg3
, 0))
8543 old_act
->_sa_handler
= oact
._sa_handler
;
8544 old_act
->sa_mask
= oact
.sa_mask
.sig
[0];
8545 old_act
->sa_flags
= oact
.sa_flags
;
8546 old_act
->sa_restorer
= oact
.sa_restorer
;
8547 unlock_user_struct(old_act
, arg3
, 1);
8553 case TARGET_NR_rt_sigaction
:
8555 #if defined(TARGET_ALPHA)
8556 struct target_sigaction act
, oact
, *pact
= 0;
8557 struct target_rt_sigaction
*rt_act
;
8559 if (arg4
!= sizeof(target_sigset_t
)) {
8560 ret
= -TARGET_EINVAL
;
8564 if (!lock_user_struct(VERIFY_READ
, rt_act
, arg2
, 1))
8566 act
._sa_handler
= rt_act
->_sa_handler
;
8567 act
.sa_mask
= rt_act
->sa_mask
;
8568 act
.sa_flags
= rt_act
->sa_flags
;
8569 act
.sa_restorer
= arg5
;
8570 unlock_user_struct(rt_act
, arg2
, 0);
8573 ret
= get_errno(do_sigaction(arg1
, pact
, &oact
));
8574 if (!is_error(ret
) && arg3
) {
8575 if (!lock_user_struct(VERIFY_WRITE
, rt_act
, arg3
, 0))
8577 rt_act
->_sa_handler
= oact
._sa_handler
;
8578 rt_act
->sa_mask
= oact
.sa_mask
;
8579 rt_act
->sa_flags
= oact
.sa_flags
;
8580 unlock_user_struct(rt_act
, arg3
, 1);
8583 struct target_sigaction
*act
;
8584 struct target_sigaction
*oact
;
8586 if (arg4
!= sizeof(target_sigset_t
)) {
8587 ret
= -TARGET_EINVAL
;
8591 if (!lock_user_struct(VERIFY_READ
, act
, arg2
, 1))
8596 if (!lock_user_struct(VERIFY_WRITE
, oact
, arg3
, 0)) {
8597 ret
= -TARGET_EFAULT
;
8598 goto rt_sigaction_fail
;
8602 ret
= get_errno(do_sigaction(arg1
, act
, oact
));
8605 unlock_user_struct(act
, arg2
, 0);
8607 unlock_user_struct(oact
, arg3
, 1);
8611 #ifdef TARGET_NR_sgetmask /* not on alpha */
8612 case TARGET_NR_sgetmask
:
8615 abi_ulong target_set
;
8616 ret
= do_sigprocmask(0, NULL
, &cur_set
);
8618 host_to_target_old_sigset(&target_set
, &cur_set
);
8624 #ifdef TARGET_NR_ssetmask /* not on alpha */
8625 case TARGET_NR_ssetmask
:
8628 abi_ulong target_set
= arg1
;
8629 target_to_host_old_sigset(&set
, &target_set
);
8630 ret
= do_sigprocmask(SIG_SETMASK
, &set
, &oset
);
8632 host_to_target_old_sigset(&target_set
, &oset
);
8638 #ifdef TARGET_NR_sigprocmask
8639 case TARGET_NR_sigprocmask
:
8641 #if defined(TARGET_ALPHA)
8642 sigset_t set
, oldset
;
8647 case TARGET_SIG_BLOCK
:
8650 case TARGET_SIG_UNBLOCK
:
8653 case TARGET_SIG_SETMASK
:
8657 ret
= -TARGET_EINVAL
;
8661 target_to_host_old_sigset(&set
, &mask
);
8663 ret
= do_sigprocmask(how
, &set
, &oldset
);
8664 if (!is_error(ret
)) {
8665 host_to_target_old_sigset(&mask
, &oldset
);
8667 ((CPUAlphaState
*)cpu_env
)->ir
[IR_V0
] = 0; /* force no error */
8670 sigset_t set
, oldset
, *set_ptr
;
8675 case TARGET_SIG_BLOCK
:
8678 case TARGET_SIG_UNBLOCK
:
8681 case TARGET_SIG_SETMASK
:
8685 ret
= -TARGET_EINVAL
;
8688 if (!(p
= lock_user(VERIFY_READ
, arg2
, sizeof(target_sigset_t
), 1)))
8690 target_to_host_old_sigset(&set
, p
);
8691 unlock_user(p
, arg2
, 0);
8697 ret
= do_sigprocmask(how
, set_ptr
, &oldset
);
8698 if (!is_error(ret
) && arg3
) {
8699 if (!(p
= lock_user(VERIFY_WRITE
, arg3
, sizeof(target_sigset_t
), 0)))
8701 host_to_target_old_sigset(p
, &oldset
);
8702 unlock_user(p
, arg3
, sizeof(target_sigset_t
));
8708 case TARGET_NR_rt_sigprocmask
:
8711 sigset_t set
, oldset
, *set_ptr
;
8713 if (arg4
!= sizeof(target_sigset_t
)) {
8714 ret
= -TARGET_EINVAL
;
8720 case TARGET_SIG_BLOCK
:
8723 case TARGET_SIG_UNBLOCK
:
8726 case TARGET_SIG_SETMASK
:
8730 ret
= -TARGET_EINVAL
;
8733 if (!(p
= lock_user(VERIFY_READ
, arg2
, sizeof(target_sigset_t
), 1)))
8735 target_to_host_sigset(&set
, p
);
8736 unlock_user(p
, arg2
, 0);
8742 ret
= do_sigprocmask(how
, set_ptr
, &oldset
);
8743 if (!is_error(ret
) && arg3
) {
8744 if (!(p
= lock_user(VERIFY_WRITE
, arg3
, sizeof(target_sigset_t
), 0)))
8746 host_to_target_sigset(p
, &oldset
);
8747 unlock_user(p
, arg3
, sizeof(target_sigset_t
));
8751 #ifdef TARGET_NR_sigpending
8752 case TARGET_NR_sigpending
:
8755 ret
= get_errno(sigpending(&set
));
8756 if (!is_error(ret
)) {
8757 if (!(p
= lock_user(VERIFY_WRITE
, arg1
, sizeof(target_sigset_t
), 0)))
8759 host_to_target_old_sigset(p
, &set
);
8760 unlock_user(p
, arg1
, sizeof(target_sigset_t
));
8765 case TARGET_NR_rt_sigpending
:
8769 /* Yes, this check is >, not != like most. We follow the kernel's
8770 * logic and it does it like this because it implements
8771 * NR_sigpending through the same code path, and in that case
8772 * the old_sigset_t is smaller in size.
8774 if (arg2
> sizeof(target_sigset_t
)) {
8775 ret
= -TARGET_EINVAL
;
8779 ret
= get_errno(sigpending(&set
));
8780 if (!is_error(ret
)) {
8781 if (!(p
= lock_user(VERIFY_WRITE
, arg1
, sizeof(target_sigset_t
), 0)))
8783 host_to_target_sigset(p
, &set
);
8784 unlock_user(p
, arg1
, sizeof(target_sigset_t
));
8788 #ifdef TARGET_NR_sigsuspend
8789 case TARGET_NR_sigsuspend
:
8791 TaskState
*ts
= cpu
->opaque
;
8792 #if defined(TARGET_ALPHA)
8793 abi_ulong mask
= arg1
;
8794 target_to_host_old_sigset(&ts
->sigsuspend_mask
, &mask
);
8796 if (!(p
= lock_user(VERIFY_READ
, arg1
, sizeof(target_sigset_t
), 1)))
8798 target_to_host_old_sigset(&ts
->sigsuspend_mask
, p
);
8799 unlock_user(p
, arg1
, 0);
8801 ret
= get_errno(safe_rt_sigsuspend(&ts
->sigsuspend_mask
,
8803 if (ret
!= -TARGET_ERESTARTSYS
) {
8804 ts
->in_sigsuspend
= 1;
8809 case TARGET_NR_rt_sigsuspend
:
8811 TaskState
*ts
= cpu
->opaque
;
8813 if (arg2
!= sizeof(target_sigset_t
)) {
8814 ret
= -TARGET_EINVAL
;
8817 if (!(p
= lock_user(VERIFY_READ
, arg1
, sizeof(target_sigset_t
), 1)))
8819 target_to_host_sigset(&ts
->sigsuspend_mask
, p
);
8820 unlock_user(p
, arg1
, 0);
8821 ret
= get_errno(safe_rt_sigsuspend(&ts
->sigsuspend_mask
,
8823 if (ret
!= -TARGET_ERESTARTSYS
) {
8824 ts
->in_sigsuspend
= 1;
8828 case TARGET_NR_rt_sigtimedwait
:
8831 struct timespec uts
, *puts
;
8834 if (arg4
!= sizeof(target_sigset_t
)) {
8835 ret
= -TARGET_EINVAL
;
8839 if (!(p
= lock_user(VERIFY_READ
, arg1
, sizeof(target_sigset_t
), 1)))
8841 target_to_host_sigset(&set
, p
);
8842 unlock_user(p
, arg1
, 0);
8845 target_to_host_timespec(puts
, arg3
);
8849 ret
= get_errno(safe_rt_sigtimedwait(&set
, &uinfo
, puts
,
8851 if (!is_error(ret
)) {
8853 p
= lock_user(VERIFY_WRITE
, arg2
, sizeof(target_siginfo_t
),
8858 host_to_target_siginfo(p
, &uinfo
);
8859 unlock_user(p
, arg2
, sizeof(target_siginfo_t
));
8861 ret
= host_to_target_signal(ret
);
8865 case TARGET_NR_rt_sigqueueinfo
:
8869 p
= lock_user(VERIFY_READ
, arg3
, sizeof(target_siginfo_t
), 1);
8873 target_to_host_siginfo(&uinfo
, p
);
8874 unlock_user(p
, arg3
, 0);
8875 ret
= get_errno(sys_rt_sigqueueinfo(arg1
, arg2
, &uinfo
));
8878 case TARGET_NR_rt_tgsigqueueinfo
:
8882 p
= lock_user(VERIFY_READ
, arg4
, sizeof(target_siginfo_t
), 1);
8886 target_to_host_siginfo(&uinfo
, p
);
8887 unlock_user(p
, arg4
, 0);
8888 ret
= get_errno(sys_rt_tgsigqueueinfo(arg1
, arg2
, arg3
, &uinfo
));
8891 #ifdef TARGET_NR_sigreturn
8892 case TARGET_NR_sigreturn
:
8893 if (block_signals()) {
8894 ret
= -TARGET_ERESTARTSYS
;
8896 ret
= do_sigreturn(cpu_env
);
8900 case TARGET_NR_rt_sigreturn
:
8901 if (block_signals()) {
8902 ret
= -TARGET_ERESTARTSYS
;
8904 ret
= do_rt_sigreturn(cpu_env
);
8907 case TARGET_NR_sethostname
:
8908 if (!(p
= lock_user_string(arg1
)))
8910 ret
= get_errno(sethostname(p
, arg2
));
8911 unlock_user(p
, arg1
, 0);
8913 case TARGET_NR_setrlimit
:
8915 int resource
= target_to_host_resource(arg1
);
8916 struct target_rlimit
*target_rlim
;
8918 if (!lock_user_struct(VERIFY_READ
, target_rlim
, arg2
, 1))
8920 rlim
.rlim_cur
= target_to_host_rlim(target_rlim
->rlim_cur
);
8921 rlim
.rlim_max
= target_to_host_rlim(target_rlim
->rlim_max
);
8922 unlock_user_struct(target_rlim
, arg2
, 0);
8923 ret
= get_errno(setrlimit(resource
, &rlim
));
8926 case TARGET_NR_getrlimit
:
8928 int resource
= target_to_host_resource(arg1
);
8929 struct target_rlimit
*target_rlim
;
8932 ret
= get_errno(getrlimit(resource
, &rlim
));
8933 if (!is_error(ret
)) {
8934 if (!lock_user_struct(VERIFY_WRITE
, target_rlim
, arg2
, 0))
8936 target_rlim
->rlim_cur
= host_to_target_rlim(rlim
.rlim_cur
);
8937 target_rlim
->rlim_max
= host_to_target_rlim(rlim
.rlim_max
);
8938 unlock_user_struct(target_rlim
, arg2
, 1);
8942 case TARGET_NR_getrusage
:
8944 struct rusage rusage
;
8945 ret
= get_errno(getrusage(arg1
, &rusage
));
8946 if (!is_error(ret
)) {
8947 ret
= host_to_target_rusage(arg2
, &rusage
);
8951 case TARGET_NR_gettimeofday
:
8954 ret
= get_errno(gettimeofday(&tv
, NULL
));
8955 if (!is_error(ret
)) {
8956 if (copy_to_user_timeval(arg1
, &tv
))
8961 case TARGET_NR_settimeofday
:
8963 struct timeval tv
, *ptv
= NULL
;
8964 struct timezone tz
, *ptz
= NULL
;
8967 if (copy_from_user_timeval(&tv
, arg1
)) {
8974 if (copy_from_user_timezone(&tz
, arg2
)) {
8980 ret
= get_errno(settimeofday(ptv
, ptz
));
8983 #if defined(TARGET_NR_select)
8984 case TARGET_NR_select
:
8985 #if defined(TARGET_WANT_NI_OLD_SELECT)
8986 /* some architectures used to have old_select here
8987 * but now ENOSYS it.
8989 ret
= -TARGET_ENOSYS
;
8990 #elif defined(TARGET_WANT_OLD_SYS_SELECT)
8991 ret
= do_old_select(arg1
);
8993 ret
= do_select(arg1
, arg2
, arg3
, arg4
, arg5
);
8997 #ifdef TARGET_NR_pselect6
8998 case TARGET_NR_pselect6
:
9000 abi_long rfd_addr
, wfd_addr
, efd_addr
, n
, ts_addr
;
9001 fd_set rfds
, wfds
, efds
;
9002 fd_set
*rfds_ptr
, *wfds_ptr
, *efds_ptr
;
9003 struct timespec ts
, *ts_ptr
;
9006 * The 6th arg is actually two args smashed together,
9007 * so we cannot use the C library.
9015 abi_ulong arg_sigset
, arg_sigsize
, *arg7
;
9016 target_sigset_t
*target_sigset
;
9024 ret
= copy_from_user_fdset_ptr(&rfds
, &rfds_ptr
, rfd_addr
, n
);
9028 ret
= copy_from_user_fdset_ptr(&wfds
, &wfds_ptr
, wfd_addr
, n
);
9032 ret
= copy_from_user_fdset_ptr(&efds
, &efds_ptr
, efd_addr
, n
);
9038 * This takes a timespec, and not a timeval, so we cannot
9039 * use the do_select() helper ...
9042 if (target_to_host_timespec(&ts
, ts_addr
)) {
9050 /* Extract the two packed args for the sigset */
9053 sig
.size
= SIGSET_T_SIZE
;
9055 arg7
= lock_user(VERIFY_READ
, arg6
, sizeof(*arg7
) * 2, 1);
9059 arg_sigset
= tswapal(arg7
[0]);
9060 arg_sigsize
= tswapal(arg7
[1]);
9061 unlock_user(arg7
, arg6
, 0);
9065 if (arg_sigsize
!= sizeof(*target_sigset
)) {
9066 /* Like the kernel, we enforce correct size sigsets */
9067 ret
= -TARGET_EINVAL
;
9070 target_sigset
= lock_user(VERIFY_READ
, arg_sigset
,
9071 sizeof(*target_sigset
), 1);
9072 if (!target_sigset
) {
9075 target_to_host_sigset(&set
, target_sigset
);
9076 unlock_user(target_sigset
, arg_sigset
, 0);
9084 ret
= get_errno(safe_pselect6(n
, rfds_ptr
, wfds_ptr
, efds_ptr
,
9087 if (!is_error(ret
)) {
9088 if (rfd_addr
&& copy_to_user_fdset(rfd_addr
, &rfds
, n
))
9090 if (wfd_addr
&& copy_to_user_fdset(wfd_addr
, &wfds
, n
))
9092 if (efd_addr
&& copy_to_user_fdset(efd_addr
, &efds
, n
))
9095 if (ts_addr
&& host_to_target_timespec(ts_addr
, &ts
))
9101 #ifdef TARGET_NR_symlink
9102 case TARGET_NR_symlink
:
9105 p
= lock_user_string(arg1
);
9106 p2
= lock_user_string(arg2
);
9108 ret
= -TARGET_EFAULT
;
9110 ret
= get_errno(symlink(p
, p2
));
9111 unlock_user(p2
, arg2
, 0);
9112 unlock_user(p
, arg1
, 0);
9116 #if defined(TARGET_NR_symlinkat)
9117 case TARGET_NR_symlinkat
:
9120 p
= lock_user_string(arg1
);
9121 p2
= lock_user_string(arg3
);
9123 ret
= -TARGET_EFAULT
;
9125 ret
= get_errno(symlinkat(p
, arg2
, p2
));
9126 unlock_user(p2
, arg3
, 0);
9127 unlock_user(p
, arg1
, 0);
9131 #ifdef TARGET_NR_oldlstat
9132 case TARGET_NR_oldlstat
:
9135 #ifdef TARGET_NR_readlink
9136 case TARGET_NR_readlink
:
9139 p
= lock_user_string(arg1
);
9140 p2
= lock_user(VERIFY_WRITE
, arg2
, arg3
, 0);
9142 ret
= -TARGET_EFAULT
;
9144 /* Short circuit this for the magic exe check. */
9145 ret
= -TARGET_EINVAL
;
9146 } else if (is_proc_myself((const char *)p
, "exe")) {
9147 char real
[PATH_MAX
], *temp
;
9148 temp
= realpath(exec_path
, real
);
9149 /* Return value is # of bytes that we wrote to the buffer. */
9151 ret
= get_errno(-1);
9153 /* Don't worry about sign mismatch as earlier mapping
9154 * logic would have thrown a bad address error. */
9155 ret
= MIN(strlen(real
), arg3
);
9156 /* We cannot NUL terminate the string. */
9157 memcpy(p2
, real
, ret
);
9160 ret
= get_errno(readlink(path(p
), p2
, arg3
));
9162 unlock_user(p2
, arg2
, ret
);
9163 unlock_user(p
, arg1
, 0);
9167 #if defined(TARGET_NR_readlinkat)
9168 case TARGET_NR_readlinkat
:
9171 p
= lock_user_string(arg2
);
9172 p2
= lock_user(VERIFY_WRITE
, arg3
, arg4
, 0);
9174 ret
= -TARGET_EFAULT
;
9175 } else if (is_proc_myself((const char *)p
, "exe")) {
9176 char real
[PATH_MAX
], *temp
;
9177 temp
= realpath(exec_path
, real
);
9178 ret
= temp
== NULL
? get_errno(-1) : strlen(real
) ;
9179 snprintf((char *)p2
, arg4
, "%s", real
);
9181 ret
= get_errno(readlinkat(arg1
, path(p
), p2
, arg4
));
9183 unlock_user(p2
, arg3
, ret
);
9184 unlock_user(p
, arg2
, 0);
9188 #ifdef TARGET_NR_uselib
9189 case TARGET_NR_uselib
:
9192 #ifdef TARGET_NR_swapon
9193 case TARGET_NR_swapon
:
9194 if (!(p
= lock_user_string(arg1
)))
9196 ret
= get_errno(swapon(p
, arg2
));
9197 unlock_user(p
, arg1
, 0);
9200 case TARGET_NR_reboot
:
9201 if (arg3
== LINUX_REBOOT_CMD_RESTART2
) {
9202 /* arg4 must be ignored in all other cases */
9203 p
= lock_user_string(arg4
);
9207 ret
= get_errno(reboot(arg1
, arg2
, arg3
, p
));
9208 unlock_user(p
, arg4
, 0);
9210 ret
= get_errno(reboot(arg1
, arg2
, arg3
, NULL
));
9213 #ifdef TARGET_NR_readdir
9214 case TARGET_NR_readdir
:
9217 #ifdef TARGET_NR_mmap
9218 case TARGET_NR_mmap
:
9219 #if (defined(TARGET_I386) && defined(TARGET_ABI32)) || \
9220 (defined(TARGET_ARM) && defined(TARGET_ABI32)) || \
9221 defined(TARGET_M68K) || defined(TARGET_CRIS) || defined(TARGET_MICROBLAZE) \
9222 || defined(TARGET_S390X)
9225 abi_ulong v1
, v2
, v3
, v4
, v5
, v6
;
9226 if (!(v
= lock_user(VERIFY_READ
, arg1
, 6 * sizeof(abi_ulong
), 1)))
9234 unlock_user(v
, arg1
, 0);
9235 ret
= get_errno(target_mmap(v1
, v2
, v3
,
9236 target_to_host_bitmask(v4
, mmap_flags_tbl
),
9240 ret
= get_errno(target_mmap(arg1
, arg2
, arg3
,
9241 target_to_host_bitmask(arg4
, mmap_flags_tbl
),
9247 #ifdef TARGET_NR_mmap2
9248 case TARGET_NR_mmap2
:
9250 #define MMAP_SHIFT 12
9252 ret
= get_errno(target_mmap(arg1
, arg2
, arg3
,
9253 target_to_host_bitmask(arg4
, mmap_flags_tbl
),
9255 arg6
<< MMAP_SHIFT
));
9258 case TARGET_NR_munmap
:
9259 ret
= get_errno(target_munmap(arg1
, arg2
));
9261 case TARGET_NR_mprotect
:
9263 TaskState
*ts
= cpu
->opaque
;
9264 /* Special hack to detect libc making the stack executable. */
9265 if ((arg3
& PROT_GROWSDOWN
)
9266 && arg1
>= ts
->info
->stack_limit
9267 && arg1
<= ts
->info
->start_stack
) {
9268 arg3
&= ~PROT_GROWSDOWN
;
9269 arg2
= arg2
+ arg1
- ts
->info
->stack_limit
;
9270 arg1
= ts
->info
->stack_limit
;
9273 ret
= get_errno(target_mprotect(arg1
, arg2
, arg3
));
9275 #ifdef TARGET_NR_mremap
9276 case TARGET_NR_mremap
:
9277 ret
= get_errno(target_mremap(arg1
, arg2
, arg3
, arg4
, arg5
));
9280 /* ??? msync/mlock/munlock are broken for softmmu. */
9281 #ifdef TARGET_NR_msync
9282 case TARGET_NR_msync
:
9283 ret
= get_errno(msync(g2h(arg1
), arg2
, arg3
));
9286 #ifdef TARGET_NR_mlock
9287 case TARGET_NR_mlock
:
9288 ret
= get_errno(mlock(g2h(arg1
), arg2
));
9291 #ifdef TARGET_NR_munlock
9292 case TARGET_NR_munlock
:
9293 ret
= get_errno(munlock(g2h(arg1
), arg2
));
9296 #ifdef TARGET_NR_mlockall
9297 case TARGET_NR_mlockall
:
9298 ret
= get_errno(mlockall(target_to_host_mlockall_arg(arg1
)));
9301 #ifdef TARGET_NR_munlockall
9302 case TARGET_NR_munlockall
:
9303 ret
= get_errno(munlockall());
9306 case TARGET_NR_truncate
:
9307 if (!(p
= lock_user_string(arg1
)))
9309 ret
= get_errno(truncate(p
, arg2
));
9310 unlock_user(p
, arg1
, 0);
9312 case TARGET_NR_ftruncate
:
9313 ret
= get_errno(ftruncate(arg1
, arg2
));
9315 case TARGET_NR_fchmod
:
9316 ret
= get_errno(fchmod(arg1
, arg2
));
9318 #if defined(TARGET_NR_fchmodat)
9319 case TARGET_NR_fchmodat
:
9320 if (!(p
= lock_user_string(arg2
)))
9322 ret
= get_errno(fchmodat(arg1
, p
, arg3
, 0));
9323 unlock_user(p
, arg2
, 0);
9326 case TARGET_NR_getpriority
:
9327 /* Note that negative values are valid for getpriority, so we must
9328 differentiate based on errno settings. */
9330 ret
= getpriority(arg1
, arg2
);
9331 if (ret
== -1 && errno
!= 0) {
9332 ret
= -host_to_target_errno(errno
);
9336 /* Return value is the unbiased priority. Signal no error. */
9337 ((CPUAlphaState
*)cpu_env
)->ir
[IR_V0
] = 0;
9339 /* Return value is a biased priority to avoid negative numbers. */
9343 case TARGET_NR_setpriority
:
9344 ret
= get_errno(setpriority(arg1
, arg2
, arg3
));
9346 #ifdef TARGET_NR_profil
9347 case TARGET_NR_profil
:
9350 case TARGET_NR_statfs
:
9351 if (!(p
= lock_user_string(arg1
)))
9353 ret
= get_errno(statfs(path(p
), &stfs
));
9354 unlock_user(p
, arg1
, 0);
9356 if (!is_error(ret
)) {
9357 struct target_statfs
*target_stfs
;
9359 if (!lock_user_struct(VERIFY_WRITE
, target_stfs
, arg2
, 0))
9361 __put_user(stfs
.f_type
, &target_stfs
->f_type
);
9362 __put_user(stfs
.f_bsize
, &target_stfs
->f_bsize
);
9363 __put_user(stfs
.f_blocks
, &target_stfs
->f_blocks
);
9364 __put_user(stfs
.f_bfree
, &target_stfs
->f_bfree
);
9365 __put_user(stfs
.f_bavail
, &target_stfs
->f_bavail
);
9366 __put_user(stfs
.f_files
, &target_stfs
->f_files
);
9367 __put_user(stfs
.f_ffree
, &target_stfs
->f_ffree
);
9368 __put_user(stfs
.f_fsid
.__val
[0], &target_stfs
->f_fsid
.val
[0]);
9369 __put_user(stfs
.f_fsid
.__val
[1], &target_stfs
->f_fsid
.val
[1]);
9370 __put_user(stfs
.f_namelen
, &target_stfs
->f_namelen
);
9371 __put_user(stfs
.f_frsize
, &target_stfs
->f_frsize
);
9372 memset(target_stfs
->f_spare
, 0, sizeof(target_stfs
->f_spare
));
9373 unlock_user_struct(target_stfs
, arg2
, 1);
9376 case TARGET_NR_fstatfs
:
9377 ret
= get_errno(fstatfs(arg1
, &stfs
));
9378 goto convert_statfs
;
9379 #ifdef TARGET_NR_statfs64
9380 case TARGET_NR_statfs64
:
9381 if (!(p
= lock_user_string(arg1
)))
9383 ret
= get_errno(statfs(path(p
), &stfs
));
9384 unlock_user(p
, arg1
, 0);
9386 if (!is_error(ret
)) {
9387 struct target_statfs64
*target_stfs
;
9389 if (!lock_user_struct(VERIFY_WRITE
, target_stfs
, arg3
, 0))
9391 __put_user(stfs
.f_type
, &target_stfs
->f_type
);
9392 __put_user(stfs
.f_bsize
, &target_stfs
->f_bsize
);
9393 __put_user(stfs
.f_blocks
, &target_stfs
->f_blocks
);
9394 __put_user(stfs
.f_bfree
, &target_stfs
->f_bfree
);
9395 __put_user(stfs
.f_bavail
, &target_stfs
->f_bavail
);
9396 __put_user(stfs
.f_files
, &target_stfs
->f_files
);
9397 __put_user(stfs
.f_ffree
, &target_stfs
->f_ffree
);
9398 __put_user(stfs
.f_fsid
.__val
[0], &target_stfs
->f_fsid
.val
[0]);
9399 __put_user(stfs
.f_fsid
.__val
[1], &target_stfs
->f_fsid
.val
[1]);
9400 __put_user(stfs
.f_namelen
, &target_stfs
->f_namelen
);
9401 __put_user(stfs
.f_frsize
, &target_stfs
->f_frsize
);
9402 memset(target_stfs
->f_spare
, 0, sizeof(target_stfs
->f_spare
));
9403 unlock_user_struct(target_stfs
, arg3
, 1);
9406 case TARGET_NR_fstatfs64
:
9407 ret
= get_errno(fstatfs(arg1
, &stfs
));
9408 goto convert_statfs64
;
9410 #ifdef TARGET_NR_ioperm
9411 case TARGET_NR_ioperm
:
9414 #ifdef TARGET_NR_socketcall
9415 case TARGET_NR_socketcall
:
9416 ret
= do_socketcall(arg1
, arg2
);
9419 #ifdef TARGET_NR_accept
9420 case TARGET_NR_accept
:
9421 ret
= do_accept4(arg1
, arg2
, arg3
, 0);
9424 #ifdef TARGET_NR_accept4
9425 case TARGET_NR_accept4
:
9426 ret
= do_accept4(arg1
, arg2
, arg3
, arg4
);
9429 #ifdef TARGET_NR_bind
9430 case TARGET_NR_bind
:
9431 ret
= do_bind(arg1
, arg2
, arg3
);
9434 #ifdef TARGET_NR_connect
9435 case TARGET_NR_connect
:
9436 ret
= do_connect(arg1
, arg2
, arg3
);
9439 #ifdef TARGET_NR_getpeername
9440 case TARGET_NR_getpeername
:
9441 ret
= do_getpeername(arg1
, arg2
, arg3
);
9444 #ifdef TARGET_NR_getsockname
9445 case TARGET_NR_getsockname
:
9446 ret
= do_getsockname(arg1
, arg2
, arg3
);
9449 #ifdef TARGET_NR_getsockopt
9450 case TARGET_NR_getsockopt
:
9451 ret
= do_getsockopt(arg1
, arg2
, arg3
, arg4
, arg5
);
9454 #ifdef TARGET_NR_listen
9455 case TARGET_NR_listen
:
9456 ret
= get_errno(listen(arg1
, arg2
));
9459 #ifdef TARGET_NR_recv
9460 case TARGET_NR_recv
:
9461 ret
= do_recvfrom(arg1
, arg2
, arg3
, arg4
, 0, 0);
9464 #ifdef TARGET_NR_recvfrom
9465 case TARGET_NR_recvfrom
:
9466 ret
= do_recvfrom(arg1
, arg2
, arg3
, arg4
, arg5
, arg6
);
9469 #ifdef TARGET_NR_recvmsg
9470 case TARGET_NR_recvmsg
:
9471 ret
= do_sendrecvmsg(arg1
, arg2
, arg3
, 0);
9474 #ifdef TARGET_NR_send
9475 case TARGET_NR_send
:
9476 ret
= do_sendto(arg1
, arg2
, arg3
, arg4
, 0, 0);
9479 #ifdef TARGET_NR_sendmsg
9480 case TARGET_NR_sendmsg
:
9481 ret
= do_sendrecvmsg(arg1
, arg2
, arg3
, 1);
9484 #ifdef TARGET_NR_sendmmsg
9485 case TARGET_NR_sendmmsg
:
9486 ret
= do_sendrecvmmsg(arg1
, arg2
, arg3
, arg4
, 1);
9488 case TARGET_NR_recvmmsg
:
9489 ret
= do_sendrecvmmsg(arg1
, arg2
, arg3
, arg4
, 0);
9492 #ifdef TARGET_NR_sendto
9493 case TARGET_NR_sendto
:
9494 ret
= do_sendto(arg1
, arg2
, arg3
, arg4
, arg5
, arg6
);
9497 #ifdef TARGET_NR_shutdown
9498 case TARGET_NR_shutdown
:
9499 ret
= get_errno(shutdown(arg1
, arg2
));
9502 #if defined(TARGET_NR_getrandom) && defined(__NR_getrandom)
9503 case TARGET_NR_getrandom
:
9504 p
= lock_user(VERIFY_WRITE
, arg1
, arg2
, 0);
9508 ret
= get_errno(getrandom(p
, arg2
, arg3
));
9509 unlock_user(p
, arg1
, ret
);
9512 #ifdef TARGET_NR_socket
9513 case TARGET_NR_socket
:
9514 ret
= do_socket(arg1
, arg2
, arg3
);
9517 #ifdef TARGET_NR_socketpair
9518 case TARGET_NR_socketpair
:
9519 ret
= do_socketpair(arg1
, arg2
, arg3
, arg4
);
9522 #ifdef TARGET_NR_setsockopt
9523 case TARGET_NR_setsockopt
:
9524 ret
= do_setsockopt(arg1
, arg2
, arg3
, arg4
, (socklen_t
) arg5
);
9527 #if defined(TARGET_NR_syslog)
9528 case TARGET_NR_syslog
:
9533 case TARGET_SYSLOG_ACTION_CLOSE
: /* Close log */
9534 case TARGET_SYSLOG_ACTION_OPEN
: /* Open log */
9535 case TARGET_SYSLOG_ACTION_CLEAR
: /* Clear ring buffer */
9536 case TARGET_SYSLOG_ACTION_CONSOLE_OFF
: /* Disable logging */
9537 case TARGET_SYSLOG_ACTION_CONSOLE_ON
: /* Enable logging */
9538 case TARGET_SYSLOG_ACTION_CONSOLE_LEVEL
: /* Set messages level */
9539 case TARGET_SYSLOG_ACTION_SIZE_UNREAD
: /* Number of chars */
9540 case TARGET_SYSLOG_ACTION_SIZE_BUFFER
: /* Size of the buffer */
9542 ret
= get_errno(sys_syslog((int)arg1
, NULL
, (int)arg3
));
9545 case TARGET_SYSLOG_ACTION_READ
: /* Read from log */
9546 case TARGET_SYSLOG_ACTION_READ_CLEAR
: /* Read/clear msgs */
9547 case TARGET_SYSLOG_ACTION_READ_ALL
: /* Read last messages */
9549 ret
= -TARGET_EINVAL
;
9557 p
= lock_user(VERIFY_WRITE
, arg2
, arg3
, 0);
9559 ret
= -TARGET_EFAULT
;
9562 ret
= get_errno(sys_syslog((int)arg1
, p
, (int)arg3
));
9563 unlock_user(p
, arg2
, arg3
);
9573 case TARGET_NR_setitimer
:
9575 struct itimerval value
, ovalue
, *pvalue
;
9579 if (copy_from_user_timeval(&pvalue
->it_interval
, arg2
)
9580 || copy_from_user_timeval(&pvalue
->it_value
,
9581 arg2
+ sizeof(struct target_timeval
)))
9586 ret
= get_errno(setitimer(arg1
, pvalue
, &ovalue
));
9587 if (!is_error(ret
) && arg3
) {
9588 if (copy_to_user_timeval(arg3
,
9589 &ovalue
.it_interval
)
9590 || copy_to_user_timeval(arg3
+ sizeof(struct target_timeval
),
9596 case TARGET_NR_getitimer
:
9598 struct itimerval value
;
9600 ret
= get_errno(getitimer(arg1
, &value
));
9601 if (!is_error(ret
) && arg2
) {
9602 if (copy_to_user_timeval(arg2
,
9604 || copy_to_user_timeval(arg2
+ sizeof(struct target_timeval
),
9610 #ifdef TARGET_NR_stat
9611 case TARGET_NR_stat
:
9612 if (!(p
= lock_user_string(arg1
)))
9614 ret
= get_errno(stat(path(p
), &st
));
9615 unlock_user(p
, arg1
, 0);
9618 #ifdef TARGET_NR_lstat
9619 case TARGET_NR_lstat
:
9620 if (!(p
= lock_user_string(arg1
)))
9622 ret
= get_errno(lstat(path(p
), &st
));
9623 unlock_user(p
, arg1
, 0);
9626 case TARGET_NR_fstat
:
9628 ret
= get_errno(fstat(arg1
, &st
));
9629 #if defined(TARGET_NR_stat) || defined(TARGET_NR_lstat)
9632 if (!is_error(ret
)) {
9633 struct target_stat
*target_st
;
9635 if (!lock_user_struct(VERIFY_WRITE
, target_st
, arg2
, 0))
9637 memset(target_st
, 0, sizeof(*target_st
));
9638 __put_user(st
.st_dev
, &target_st
->st_dev
);
9639 __put_user(st
.st_ino
, &target_st
->st_ino
);
9640 __put_user(st
.st_mode
, &target_st
->st_mode
);
9641 __put_user(st
.st_uid
, &target_st
->st_uid
);
9642 __put_user(st
.st_gid
, &target_st
->st_gid
);
9643 __put_user(st
.st_nlink
, &target_st
->st_nlink
);
9644 __put_user(st
.st_rdev
, &target_st
->st_rdev
);
9645 __put_user(st
.st_size
, &target_st
->st_size
);
9646 __put_user(st
.st_blksize
, &target_st
->st_blksize
);
9647 __put_user(st
.st_blocks
, &target_st
->st_blocks
);
9648 __put_user(st
.st_atime
, &target_st
->target_st_atime
);
9649 __put_user(st
.st_mtime
, &target_st
->target_st_mtime
);
9650 __put_user(st
.st_ctime
, &target_st
->target_st_ctime
);
9651 unlock_user_struct(target_st
, arg2
, 1);
9655 #ifdef TARGET_NR_olduname
9656 case TARGET_NR_olduname
:
9659 #ifdef TARGET_NR_iopl
9660 case TARGET_NR_iopl
:
9663 case TARGET_NR_vhangup
:
9664 ret
= get_errno(vhangup());
9666 #ifdef TARGET_NR_idle
9667 case TARGET_NR_idle
:
9670 #ifdef TARGET_NR_syscall
9671 case TARGET_NR_syscall
:
9672 ret
= do_syscall(cpu_env
, arg1
& 0xffff, arg2
, arg3
, arg4
, arg5
,
9673 arg6
, arg7
, arg8
, 0);
9676 case TARGET_NR_wait4
:
9679 abi_long status_ptr
= arg2
;
9680 struct rusage rusage
, *rusage_ptr
;
9681 abi_ulong target_rusage
= arg4
;
9682 abi_long rusage_err
;
9684 rusage_ptr
= &rusage
;
9687 ret
= get_errno(safe_wait4(arg1
, &status
, arg3
, rusage_ptr
));
9688 if (!is_error(ret
)) {
9689 if (status_ptr
&& ret
) {
9690 status
= host_to_target_waitstatus(status
);
9691 if (put_user_s32(status
, status_ptr
))
9694 if (target_rusage
) {
9695 rusage_err
= host_to_target_rusage(target_rusage
, &rusage
);
9703 #ifdef TARGET_NR_swapoff
9704 case TARGET_NR_swapoff
:
9705 if (!(p
= lock_user_string(arg1
)))
9707 ret
= get_errno(swapoff(p
));
9708 unlock_user(p
, arg1
, 0);
9711 case TARGET_NR_sysinfo
:
9713 struct target_sysinfo
*target_value
;
9714 struct sysinfo value
;
9715 ret
= get_errno(sysinfo(&value
));
9716 if (!is_error(ret
) && arg1
)
9718 if (!lock_user_struct(VERIFY_WRITE
, target_value
, arg1
, 0))
9720 __put_user(value
.uptime
, &target_value
->uptime
);
9721 __put_user(value
.loads
[0], &target_value
->loads
[0]);
9722 __put_user(value
.loads
[1], &target_value
->loads
[1]);
9723 __put_user(value
.loads
[2], &target_value
->loads
[2]);
9724 __put_user(value
.totalram
, &target_value
->totalram
);
9725 __put_user(value
.freeram
, &target_value
->freeram
);
9726 __put_user(value
.sharedram
, &target_value
->sharedram
);
9727 __put_user(value
.bufferram
, &target_value
->bufferram
);
9728 __put_user(value
.totalswap
, &target_value
->totalswap
);
9729 __put_user(value
.freeswap
, &target_value
->freeswap
);
9730 __put_user(value
.procs
, &target_value
->procs
);
9731 __put_user(value
.totalhigh
, &target_value
->totalhigh
);
9732 __put_user(value
.freehigh
, &target_value
->freehigh
);
9733 __put_user(value
.mem_unit
, &target_value
->mem_unit
);
9734 unlock_user_struct(target_value
, arg1
, 1);
9738 #ifdef TARGET_NR_ipc
9740 ret
= do_ipc(cpu_env
, arg1
, arg2
, arg3
, arg4
, arg5
, arg6
);
9743 #ifdef TARGET_NR_semget
9744 case TARGET_NR_semget
:
9745 ret
= get_errno(semget(arg1
, arg2
, arg3
));
9748 #ifdef TARGET_NR_semop
9749 case TARGET_NR_semop
:
9750 ret
= do_semop(arg1
, arg2
, arg3
);
9753 #ifdef TARGET_NR_semctl
9754 case TARGET_NR_semctl
:
9755 ret
= do_semctl(arg1
, arg2
, arg3
, arg4
);
9758 #ifdef TARGET_NR_msgctl
9759 case TARGET_NR_msgctl
:
9760 ret
= do_msgctl(arg1
, arg2
, arg3
);
9763 #ifdef TARGET_NR_msgget
9764 case TARGET_NR_msgget
:
9765 ret
= get_errno(msgget(arg1
, arg2
));
9768 #ifdef TARGET_NR_msgrcv
9769 case TARGET_NR_msgrcv
:
9770 ret
= do_msgrcv(arg1
, arg2
, arg3
, arg4
, arg5
);
9773 #ifdef TARGET_NR_msgsnd
9774 case TARGET_NR_msgsnd
:
9775 ret
= do_msgsnd(arg1
, arg2
, arg3
, arg4
);
9778 #ifdef TARGET_NR_shmget
9779 case TARGET_NR_shmget
:
9780 ret
= get_errno(shmget(arg1
, arg2
, arg3
));
9783 #ifdef TARGET_NR_shmctl
9784 case TARGET_NR_shmctl
:
9785 ret
= do_shmctl(arg1
, arg2
, arg3
);
9788 #ifdef TARGET_NR_shmat
9789 case TARGET_NR_shmat
:
9790 ret
= do_shmat(cpu_env
, arg1
, arg2
, arg3
);
9793 #ifdef TARGET_NR_shmdt
9794 case TARGET_NR_shmdt
:
9795 ret
= do_shmdt(arg1
);
9798 case TARGET_NR_fsync
:
9799 ret
= get_errno(fsync(arg1
));
9801 case TARGET_NR_clone
:
9802 /* Linux manages to have three different orderings for its
9803 * arguments to clone(); the BACKWARDS and BACKWARDS2 defines
9804 * match the kernel's CONFIG_CLONE_* settings.
9805 * Microblaze is further special in that it uses a sixth
9806 * implicit argument to clone for the TLS pointer.
9808 #if defined(TARGET_MICROBLAZE)
9809 ret
= get_errno(do_fork(cpu_env
, arg1
, arg2
, arg4
, arg6
, arg5
));
9810 #elif defined(TARGET_CLONE_BACKWARDS)
9811 ret
= get_errno(do_fork(cpu_env
, arg1
, arg2
, arg3
, arg4
, arg5
));
9812 #elif defined(TARGET_CLONE_BACKWARDS2)
9813 ret
= get_errno(do_fork(cpu_env
, arg2
, arg1
, arg3
, arg5
, arg4
));
9815 ret
= get_errno(do_fork(cpu_env
, arg1
, arg2
, arg3
, arg5
, arg4
));
9818 #ifdef __NR_exit_group
9819 /* new thread calls */
9820 case TARGET_NR_exit_group
:
9824 gdb_exit(cpu_env
, arg1
);
9825 ret
= get_errno(exit_group(arg1
));
9828 case TARGET_NR_setdomainname
:
9829 if (!(p
= lock_user_string(arg1
)))
9831 ret
= get_errno(setdomainname(p
, arg2
));
9832 unlock_user(p
, arg1
, 0);
9834 case TARGET_NR_uname
:
9835 /* no need to transcode because we use the linux syscall */
9837 struct new_utsname
* buf
;
9839 if (!lock_user_struct(VERIFY_WRITE
, buf
, arg1
, 0))
9841 ret
= get_errno(sys_uname(buf
));
9842 if (!is_error(ret
)) {
9843 /* Overwrite the native machine name with whatever is being
9845 strcpy (buf
->machine
, cpu_to_uname_machine(cpu_env
));
9846 /* Allow the user to override the reported release. */
9847 if (qemu_uname_release
&& *qemu_uname_release
) {
9848 g_strlcpy(buf
->release
, qemu_uname_release
,
9849 sizeof(buf
->release
));
9852 unlock_user_struct(buf
, arg1
, 1);
9856 case TARGET_NR_modify_ldt
:
9857 ret
= do_modify_ldt(cpu_env
, arg1
, arg2
, arg3
);
9859 #if !defined(TARGET_X86_64)
9860 case TARGET_NR_vm86old
:
9862 case TARGET_NR_vm86
:
9863 ret
= do_vm86(cpu_env
, arg1
, arg2
);
9867 case TARGET_NR_adjtimex
:
9869 struct timex host_buf
;
9871 if (target_to_host_timex(&host_buf
, arg1
) != 0) {
9874 ret
= get_errno(adjtimex(&host_buf
));
9875 if (!is_error(ret
)) {
9876 if (host_to_target_timex(arg1
, &host_buf
) != 0) {
9882 #if defined(TARGET_NR_clock_adjtime) && defined(CONFIG_CLOCK_ADJTIME)
9883 case TARGET_NR_clock_adjtime
:
9885 struct timex htx
, *phtx
= &htx
;
9887 if (target_to_host_timex(phtx
, arg2
) != 0) {
9890 ret
= get_errno(clock_adjtime(arg1
, phtx
));
9891 if (!is_error(ret
) && phtx
) {
9892 if (host_to_target_timex(arg2
, phtx
) != 0) {
9899 #ifdef TARGET_NR_create_module
9900 case TARGET_NR_create_module
:
9902 case TARGET_NR_init_module
:
9903 case TARGET_NR_delete_module
:
9904 #ifdef TARGET_NR_get_kernel_syms
9905 case TARGET_NR_get_kernel_syms
:
9908 case TARGET_NR_quotactl
:
9910 case TARGET_NR_getpgid
:
9911 ret
= get_errno(getpgid(arg1
));
9913 case TARGET_NR_fchdir
:
9914 ret
= get_errno(fchdir(arg1
));
9916 #ifdef TARGET_NR_bdflush /* not on x86_64 */
9917 case TARGET_NR_bdflush
:
9920 #ifdef TARGET_NR_sysfs
9921 case TARGET_NR_sysfs
:
9924 case TARGET_NR_personality
:
9925 ret
= get_errno(personality(arg1
));
9927 #ifdef TARGET_NR_afs_syscall
9928 case TARGET_NR_afs_syscall
:
9931 #ifdef TARGET_NR__llseek /* Not on alpha */
9932 case TARGET_NR__llseek
:
9935 #if !defined(__NR_llseek)
9936 res
= lseek(arg1
, ((uint64_t)arg2
<< 32) | (abi_ulong
)arg3
, arg5
);
9938 ret
= get_errno(res
);
9943 ret
= get_errno(_llseek(arg1
, arg2
, arg3
, &res
, arg5
));
9945 if ((ret
== 0) && put_user_s64(res
, arg4
)) {
9951 #ifdef TARGET_NR_getdents
9952 case TARGET_NR_getdents
:
9953 #ifdef __NR_getdents
9954 #if TARGET_ABI_BITS == 32 && HOST_LONG_BITS == 64
9956 struct target_dirent
*target_dirp
;
9957 struct linux_dirent
*dirp
;
9958 abi_long count
= arg3
;
9960 dirp
= g_try_malloc(count
);
9962 ret
= -TARGET_ENOMEM
;
9966 ret
= get_errno(sys_getdents(arg1
, dirp
, count
));
9967 if (!is_error(ret
)) {
9968 struct linux_dirent
*de
;
9969 struct target_dirent
*tde
;
9971 int reclen
, treclen
;
9972 int count1
, tnamelen
;
9976 if (!(target_dirp
= lock_user(VERIFY_WRITE
, arg2
, count
, 0)))
9980 reclen
= de
->d_reclen
;
9981 tnamelen
= reclen
- offsetof(struct linux_dirent
, d_name
);
9982 assert(tnamelen
>= 0);
9983 treclen
= tnamelen
+ offsetof(struct target_dirent
, d_name
);
9984 assert(count1
+ treclen
<= count
);
9985 tde
->d_reclen
= tswap16(treclen
);
9986 tde
->d_ino
= tswapal(de
->d_ino
);
9987 tde
->d_off
= tswapal(de
->d_off
);
9988 memcpy(tde
->d_name
, de
->d_name
, tnamelen
);
9989 de
= (struct linux_dirent
*)((char *)de
+ reclen
);
9991 tde
= (struct target_dirent
*)((char *)tde
+ treclen
);
9995 unlock_user(target_dirp
, arg2
, ret
);
10001 struct linux_dirent
*dirp
;
10002 abi_long count
= arg3
;
10004 if (!(dirp
= lock_user(VERIFY_WRITE
, arg2
, count
, 0)))
10006 ret
= get_errno(sys_getdents(arg1
, dirp
, count
));
10007 if (!is_error(ret
)) {
10008 struct linux_dirent
*de
;
10013 reclen
= de
->d_reclen
;
10016 de
->d_reclen
= tswap16(reclen
);
10017 tswapls(&de
->d_ino
);
10018 tswapls(&de
->d_off
);
10019 de
= (struct linux_dirent
*)((char *)de
+ reclen
);
10023 unlock_user(dirp
, arg2
, ret
);
10027 /* Implement getdents in terms of getdents64 */
10029 struct linux_dirent64
*dirp
;
10030 abi_long count
= arg3
;
10032 dirp
= lock_user(VERIFY_WRITE
, arg2
, count
, 0);
10036 ret
= get_errno(sys_getdents64(arg1
, dirp
, count
));
10037 if (!is_error(ret
)) {
10038 /* Convert the dirent64 structs to target dirent. We do this
10039 * in-place, since we can guarantee that a target_dirent is no
10040 * larger than a dirent64; however this means we have to be
10041 * careful to read everything before writing in the new format.
10043 struct linux_dirent64
*de
;
10044 struct target_dirent
*tde
;
10049 tde
= (struct target_dirent
*)dirp
;
10051 int namelen
, treclen
;
10052 int reclen
= de
->d_reclen
;
10053 uint64_t ino
= de
->d_ino
;
10054 int64_t off
= de
->d_off
;
10055 uint8_t type
= de
->d_type
;
10057 namelen
= strlen(de
->d_name
);
10058 treclen
= offsetof(struct target_dirent
, d_name
)
10060 treclen
= QEMU_ALIGN_UP(treclen
, sizeof(abi_long
));
10062 memmove(tde
->d_name
, de
->d_name
, namelen
+ 1);
10063 tde
->d_ino
= tswapal(ino
);
10064 tde
->d_off
= tswapal(off
);
10065 tde
->d_reclen
= tswap16(treclen
);
10066 /* The target_dirent type is in what was formerly a padding
10067 * byte at the end of the structure:
10069 *(((char *)tde
) + treclen
- 1) = type
;
10071 de
= (struct linux_dirent64
*)((char *)de
+ reclen
);
10072 tde
= (struct target_dirent
*)((char *)tde
+ treclen
);
10078 unlock_user(dirp
, arg2
, ret
);
10082 #endif /* TARGET_NR_getdents */
10083 #if defined(TARGET_NR_getdents64) && defined(__NR_getdents64)
10084 case TARGET_NR_getdents64
:
10086 struct linux_dirent64
*dirp
;
10087 abi_long count
= arg3
;
10088 if (!(dirp
= lock_user(VERIFY_WRITE
, arg2
, count
, 0)))
10090 ret
= get_errno(sys_getdents64(arg1
, dirp
, count
));
10091 if (!is_error(ret
)) {
10092 struct linux_dirent64
*de
;
10097 reclen
= de
->d_reclen
;
10100 de
->d_reclen
= tswap16(reclen
);
10101 tswap64s((uint64_t *)&de
->d_ino
);
10102 tswap64s((uint64_t *)&de
->d_off
);
10103 de
= (struct linux_dirent64
*)((char *)de
+ reclen
);
10107 unlock_user(dirp
, arg2
, ret
);
10110 #endif /* TARGET_NR_getdents64 */
10111 #if defined(TARGET_NR__newselect)
10112 case TARGET_NR__newselect
:
10113 ret
= do_select(arg1
, arg2
, arg3
, arg4
, arg5
);
10116 #if defined(TARGET_NR_poll) || defined(TARGET_NR_ppoll)
10117 # ifdef TARGET_NR_poll
10118 case TARGET_NR_poll
:
10120 # ifdef TARGET_NR_ppoll
10121 case TARGET_NR_ppoll
:
10124 struct target_pollfd
*target_pfd
;
10125 unsigned int nfds
= arg2
;
10126 struct pollfd
*pfd
;
10132 if (nfds
> (INT_MAX
/ sizeof(struct target_pollfd
))) {
10133 ret
= -TARGET_EINVAL
;
10137 target_pfd
= lock_user(VERIFY_WRITE
, arg1
,
10138 sizeof(struct target_pollfd
) * nfds
, 1);
10143 pfd
= alloca(sizeof(struct pollfd
) * nfds
);
10144 for (i
= 0; i
< nfds
; i
++) {
10145 pfd
[i
].fd
= tswap32(target_pfd
[i
].fd
);
10146 pfd
[i
].events
= tswap16(target_pfd
[i
].events
);
10151 # ifdef TARGET_NR_ppoll
10152 case TARGET_NR_ppoll
:
10154 struct timespec _timeout_ts
, *timeout_ts
= &_timeout_ts
;
10155 target_sigset_t
*target_set
;
10156 sigset_t _set
, *set
= &_set
;
10159 if (target_to_host_timespec(timeout_ts
, arg3
)) {
10160 unlock_user(target_pfd
, arg1
, 0);
10168 if (arg5
!= sizeof(target_sigset_t
)) {
10169 unlock_user(target_pfd
, arg1
, 0);
10170 ret
= -TARGET_EINVAL
;
10174 target_set
= lock_user(VERIFY_READ
, arg4
, sizeof(target_sigset_t
), 1);
10176 unlock_user(target_pfd
, arg1
, 0);
10179 target_to_host_sigset(set
, target_set
);
10184 ret
= get_errno(safe_ppoll(pfd
, nfds
, timeout_ts
,
10185 set
, SIGSET_T_SIZE
));
10187 if (!is_error(ret
) && arg3
) {
10188 host_to_target_timespec(arg3
, timeout_ts
);
10191 unlock_user(target_set
, arg4
, 0);
10196 # ifdef TARGET_NR_poll
10197 case TARGET_NR_poll
:
10199 struct timespec ts
, *pts
;
10202 /* Convert ms to secs, ns */
10203 ts
.tv_sec
= arg3
/ 1000;
10204 ts
.tv_nsec
= (arg3
% 1000) * 1000000LL;
10207 /* -ve poll() timeout means "infinite" */
10210 ret
= get_errno(safe_ppoll(pfd
, nfds
, pts
, NULL
, 0));
10215 g_assert_not_reached();
10218 if (!is_error(ret
)) {
10219 for(i
= 0; i
< nfds
; i
++) {
10220 target_pfd
[i
].revents
= tswap16(pfd
[i
].revents
);
10223 unlock_user(target_pfd
, arg1
, sizeof(struct target_pollfd
) * nfds
);
10227 case TARGET_NR_flock
:
10228 /* NOTE: the flock constant seems to be the same for every
10230 ret
= get_errno(safe_flock(arg1
, arg2
));
10232 case TARGET_NR_readv
:
10234 struct iovec
*vec
= lock_iovec(VERIFY_WRITE
, arg2
, arg3
, 0);
10236 ret
= get_errno(safe_readv(arg1
, vec
, arg3
));
10237 unlock_iovec(vec
, arg2
, arg3
, 1);
10239 ret
= -host_to_target_errno(errno
);
10243 case TARGET_NR_writev
:
10245 struct iovec
*vec
= lock_iovec(VERIFY_READ
, arg2
, arg3
, 1);
10247 ret
= get_errno(safe_writev(arg1
, vec
, arg3
));
10248 unlock_iovec(vec
, arg2
, arg3
, 0);
10250 ret
= -host_to_target_errno(errno
);
10254 #if defined(TARGET_NR_preadv)
10255 case TARGET_NR_preadv
:
10257 struct iovec
*vec
= lock_iovec(VERIFY_WRITE
, arg2
, arg3
, 0);
10259 ret
= get_errno(safe_preadv(arg1
, vec
, arg3
, arg4
, arg5
));
10260 unlock_iovec(vec
, arg2
, arg3
, 1);
10262 ret
= -host_to_target_errno(errno
);
10267 #if defined(TARGET_NR_pwritev)
10268 case TARGET_NR_pwritev
:
10270 struct iovec
*vec
= lock_iovec(VERIFY_READ
, arg2
, arg3
, 1);
10272 ret
= get_errno(safe_pwritev(arg1
, vec
, arg3
, arg4
, arg5
));
10273 unlock_iovec(vec
, arg2
, arg3
, 0);
10275 ret
= -host_to_target_errno(errno
);
10280 case TARGET_NR_getsid
:
10281 ret
= get_errno(getsid(arg1
));
10283 #if defined(TARGET_NR_fdatasync) /* Not on alpha (osf_datasync ?) */
10284 case TARGET_NR_fdatasync
:
10285 ret
= get_errno(fdatasync(arg1
));
10288 #ifdef TARGET_NR__sysctl
10289 case TARGET_NR__sysctl
:
10290 /* We don't implement this, but ENOTDIR is always a safe
10292 ret
= -TARGET_ENOTDIR
;
10295 case TARGET_NR_sched_getaffinity
:
10297 unsigned int mask_size
;
10298 unsigned long *mask
;
10301 * sched_getaffinity needs multiples of ulong, so need to take
10302 * care of mismatches between target ulong and host ulong sizes.
10304 if (arg2
& (sizeof(abi_ulong
) - 1)) {
10305 ret
= -TARGET_EINVAL
;
10308 mask_size
= (arg2
+ (sizeof(*mask
) - 1)) & ~(sizeof(*mask
) - 1);
10310 mask
= alloca(mask_size
);
10311 ret
= get_errno(sys_sched_getaffinity(arg1
, mask_size
, mask
));
10313 if (!is_error(ret
)) {
10315 /* More data returned than the caller's buffer will fit.
10316 * This only happens if sizeof(abi_long) < sizeof(long)
10317 * and the caller passed us a buffer holding an odd number
10318 * of abi_longs. If the host kernel is actually using the
10319 * extra 4 bytes then fail EINVAL; otherwise we can just
10320 * ignore them and only copy the interesting part.
10322 int numcpus
= sysconf(_SC_NPROCESSORS_CONF
);
10323 if (numcpus
> arg2
* 8) {
10324 ret
= -TARGET_EINVAL
;
10330 if (copy_to_user(arg3
, mask
, ret
)) {
10336 case TARGET_NR_sched_setaffinity
:
10338 unsigned int mask_size
;
10339 unsigned long *mask
;
10342 * sched_setaffinity needs multiples of ulong, so need to take
10343 * care of mismatches between target ulong and host ulong sizes.
10345 if (arg2
& (sizeof(abi_ulong
) - 1)) {
10346 ret
= -TARGET_EINVAL
;
10349 mask_size
= (arg2
+ (sizeof(*mask
) - 1)) & ~(sizeof(*mask
) - 1);
10351 mask
= alloca(mask_size
);
10352 if (!lock_user_struct(VERIFY_READ
, p
, arg3
, 1)) {
10355 memcpy(mask
, p
, arg2
);
10356 unlock_user_struct(p
, arg2
, 0);
10358 ret
= get_errno(sys_sched_setaffinity(arg1
, mask_size
, mask
));
10361 case TARGET_NR_sched_setparam
:
10363 struct sched_param
*target_schp
;
10364 struct sched_param schp
;
10367 return -TARGET_EINVAL
;
10369 if (!lock_user_struct(VERIFY_READ
, target_schp
, arg2
, 1))
10371 schp
.sched_priority
= tswap32(target_schp
->sched_priority
);
10372 unlock_user_struct(target_schp
, arg2
, 0);
10373 ret
= get_errno(sched_setparam(arg1
, &schp
));
10376 case TARGET_NR_sched_getparam
:
10378 struct sched_param
*target_schp
;
10379 struct sched_param schp
;
10382 return -TARGET_EINVAL
;
10384 ret
= get_errno(sched_getparam(arg1
, &schp
));
10385 if (!is_error(ret
)) {
10386 if (!lock_user_struct(VERIFY_WRITE
, target_schp
, arg2
, 0))
10388 target_schp
->sched_priority
= tswap32(schp
.sched_priority
);
10389 unlock_user_struct(target_schp
, arg2
, 1);
10393 case TARGET_NR_sched_setscheduler
:
10395 struct sched_param
*target_schp
;
10396 struct sched_param schp
;
10398 return -TARGET_EINVAL
;
10400 if (!lock_user_struct(VERIFY_READ
, target_schp
, arg3
, 1))
10402 schp
.sched_priority
= tswap32(target_schp
->sched_priority
);
10403 unlock_user_struct(target_schp
, arg3
, 0);
10404 ret
= get_errno(sched_setscheduler(arg1
, arg2
, &schp
));
10407 case TARGET_NR_sched_getscheduler
:
10408 ret
= get_errno(sched_getscheduler(arg1
));
10410 case TARGET_NR_sched_yield
:
10411 ret
= get_errno(sched_yield());
10413 case TARGET_NR_sched_get_priority_max
:
10414 ret
= get_errno(sched_get_priority_max(arg1
));
10416 case TARGET_NR_sched_get_priority_min
:
10417 ret
= get_errno(sched_get_priority_min(arg1
));
10419 case TARGET_NR_sched_rr_get_interval
:
10421 struct timespec ts
;
10422 ret
= get_errno(sched_rr_get_interval(arg1
, &ts
));
10423 if (!is_error(ret
)) {
10424 ret
= host_to_target_timespec(arg2
, &ts
);
10428 case TARGET_NR_nanosleep
:
10430 struct timespec req
, rem
;
10431 target_to_host_timespec(&req
, arg1
);
10432 ret
= get_errno(safe_nanosleep(&req
, &rem
));
10433 if (is_error(ret
) && arg2
) {
10434 host_to_target_timespec(arg2
, &rem
);
10438 #ifdef TARGET_NR_query_module
10439 case TARGET_NR_query_module
:
10440 goto unimplemented
;
10442 #ifdef TARGET_NR_nfsservctl
10443 case TARGET_NR_nfsservctl
:
10444 goto unimplemented
;
10446 case TARGET_NR_prctl
:
10448 case PR_GET_PDEATHSIG
:
10451 ret
= get_errno(prctl(arg1
, &deathsig
, arg3
, arg4
, arg5
));
10452 if (!is_error(ret
) && arg2
10453 && put_user_ual(deathsig
, arg2
)) {
10461 void *name
= lock_user(VERIFY_WRITE
, arg2
, 16, 1);
10465 ret
= get_errno(prctl(arg1
, (unsigned long)name
,
10466 arg3
, arg4
, arg5
));
10467 unlock_user(name
, arg2
, 16);
10472 void *name
= lock_user(VERIFY_READ
, arg2
, 16, 1);
10476 ret
= get_errno(prctl(arg1
, (unsigned long)name
,
10477 arg3
, arg4
, arg5
));
10478 unlock_user(name
, arg2
, 0);
10483 /* Most prctl options have no pointer arguments */
10484 ret
= get_errno(prctl(arg1
, arg2
, arg3
, arg4
, arg5
));
10488 #ifdef TARGET_NR_arch_prctl
10489 case TARGET_NR_arch_prctl
:
10490 #if defined(TARGET_I386) && !defined(TARGET_ABI32)
10491 ret
= do_arch_prctl(cpu_env
, arg1
, arg2
);
10494 goto unimplemented
;
10497 #ifdef TARGET_NR_pread64
10498 case TARGET_NR_pread64
:
10499 if (regpairs_aligned(cpu_env
)) {
10503 if (!(p
= lock_user(VERIFY_WRITE
, arg2
, arg3
, 0)))
10505 ret
= get_errno(pread64(arg1
, p
, arg3
, target_offset64(arg4
, arg5
)));
10506 unlock_user(p
, arg2
, ret
);
10508 case TARGET_NR_pwrite64
:
10509 if (regpairs_aligned(cpu_env
)) {
10513 if (!(p
= lock_user(VERIFY_READ
, arg2
, arg3
, 1)))
10515 ret
= get_errno(pwrite64(arg1
, p
, arg3
, target_offset64(arg4
, arg5
)));
10516 unlock_user(p
, arg2
, 0);
10519 case TARGET_NR_getcwd
:
10520 if (!(p
= lock_user(VERIFY_WRITE
, arg1
, arg2
, 0)))
10522 ret
= get_errno(sys_getcwd1(p
, arg2
));
10523 unlock_user(p
, arg1
, ret
);
10525 case TARGET_NR_capget
:
10526 case TARGET_NR_capset
:
10528 struct target_user_cap_header
*target_header
;
10529 struct target_user_cap_data
*target_data
= NULL
;
10530 struct __user_cap_header_struct header
;
10531 struct __user_cap_data_struct data
[2];
10532 struct __user_cap_data_struct
*dataptr
= NULL
;
10533 int i
, target_datalen
;
10534 int data_items
= 1;
10536 if (!lock_user_struct(VERIFY_WRITE
, target_header
, arg1
, 1)) {
10539 header
.version
= tswap32(target_header
->version
);
10540 header
.pid
= tswap32(target_header
->pid
);
10542 if (header
.version
!= _LINUX_CAPABILITY_VERSION
) {
10543 /* Version 2 and up takes pointer to two user_data structs */
10547 target_datalen
= sizeof(*target_data
) * data_items
;
10550 if (num
== TARGET_NR_capget
) {
10551 target_data
= lock_user(VERIFY_WRITE
, arg2
, target_datalen
, 0);
10553 target_data
= lock_user(VERIFY_READ
, arg2
, target_datalen
, 1);
10555 if (!target_data
) {
10556 unlock_user_struct(target_header
, arg1
, 0);
10560 if (num
== TARGET_NR_capset
) {
10561 for (i
= 0; i
< data_items
; i
++) {
10562 data
[i
].effective
= tswap32(target_data
[i
].effective
);
10563 data
[i
].permitted
= tswap32(target_data
[i
].permitted
);
10564 data
[i
].inheritable
= tswap32(target_data
[i
].inheritable
);
10571 if (num
== TARGET_NR_capget
) {
10572 ret
= get_errno(capget(&header
, dataptr
));
10574 ret
= get_errno(capset(&header
, dataptr
));
10577 /* The kernel always updates version for both capget and capset */
10578 target_header
->version
= tswap32(header
.version
);
10579 unlock_user_struct(target_header
, arg1
, 1);
10582 if (num
== TARGET_NR_capget
) {
10583 for (i
= 0; i
< data_items
; i
++) {
10584 target_data
[i
].effective
= tswap32(data
[i
].effective
);
10585 target_data
[i
].permitted
= tswap32(data
[i
].permitted
);
10586 target_data
[i
].inheritable
= tswap32(data
[i
].inheritable
);
10588 unlock_user(target_data
, arg2
, target_datalen
);
10590 unlock_user(target_data
, arg2
, 0);
10595 case TARGET_NR_sigaltstack
:
10596 ret
= do_sigaltstack(arg1
, arg2
, get_sp_from_cpustate((CPUArchState
*)cpu_env
));
10599 #ifdef CONFIG_SENDFILE
10600 case TARGET_NR_sendfile
:
10602 off_t
*offp
= NULL
;
10605 ret
= get_user_sal(off
, arg3
);
10606 if (is_error(ret
)) {
10611 ret
= get_errno(sendfile(arg1
, arg2
, offp
, arg4
));
10612 if (!is_error(ret
) && arg3
) {
10613 abi_long ret2
= put_user_sal(off
, arg3
);
10614 if (is_error(ret2
)) {
10620 #ifdef TARGET_NR_sendfile64
10621 case TARGET_NR_sendfile64
:
10623 off_t
*offp
= NULL
;
10626 ret
= get_user_s64(off
, arg3
);
10627 if (is_error(ret
)) {
10632 ret
= get_errno(sendfile(arg1
, arg2
, offp
, arg4
));
10633 if (!is_error(ret
) && arg3
) {
10634 abi_long ret2
= put_user_s64(off
, arg3
);
10635 if (is_error(ret2
)) {
10643 case TARGET_NR_sendfile
:
10644 #ifdef TARGET_NR_sendfile64
10645 case TARGET_NR_sendfile64
:
10647 goto unimplemented
;
10650 #ifdef TARGET_NR_getpmsg
10651 case TARGET_NR_getpmsg
:
10652 goto unimplemented
;
10654 #ifdef TARGET_NR_putpmsg
10655 case TARGET_NR_putpmsg
:
10656 goto unimplemented
;
10658 #ifdef TARGET_NR_vfork
10659 case TARGET_NR_vfork
:
10660 ret
= get_errno(do_fork(cpu_env
,
10661 CLONE_VFORK
| CLONE_VM
| TARGET_SIGCHLD
,
10665 #ifdef TARGET_NR_ugetrlimit
10666 case TARGET_NR_ugetrlimit
:
10668 struct rlimit rlim
;
10669 int resource
= target_to_host_resource(arg1
);
10670 ret
= get_errno(getrlimit(resource
, &rlim
));
10671 if (!is_error(ret
)) {
10672 struct target_rlimit
*target_rlim
;
10673 if (!lock_user_struct(VERIFY_WRITE
, target_rlim
, arg2
, 0))
10675 target_rlim
->rlim_cur
= host_to_target_rlim(rlim
.rlim_cur
);
10676 target_rlim
->rlim_max
= host_to_target_rlim(rlim
.rlim_max
);
10677 unlock_user_struct(target_rlim
, arg2
, 1);
10682 #ifdef TARGET_NR_truncate64
10683 case TARGET_NR_truncate64
:
10684 if (!(p
= lock_user_string(arg1
)))
10686 ret
= target_truncate64(cpu_env
, p
, arg2
, arg3
, arg4
);
10687 unlock_user(p
, arg1
, 0);
10690 #ifdef TARGET_NR_ftruncate64
10691 case TARGET_NR_ftruncate64
:
10692 ret
= target_ftruncate64(cpu_env
, arg1
, arg2
, arg3
, arg4
);
10695 #ifdef TARGET_NR_stat64
10696 case TARGET_NR_stat64
:
10697 if (!(p
= lock_user_string(arg1
)))
10699 ret
= get_errno(stat(path(p
), &st
));
10700 unlock_user(p
, arg1
, 0);
10701 if (!is_error(ret
))
10702 ret
= host_to_target_stat64(cpu_env
, arg2
, &st
);
10705 #ifdef TARGET_NR_lstat64
10706 case TARGET_NR_lstat64
:
10707 if (!(p
= lock_user_string(arg1
)))
10709 ret
= get_errno(lstat(path(p
), &st
));
10710 unlock_user(p
, arg1
, 0);
10711 if (!is_error(ret
))
10712 ret
= host_to_target_stat64(cpu_env
, arg2
, &st
);
10715 #ifdef TARGET_NR_fstat64
10716 case TARGET_NR_fstat64
:
10717 ret
= get_errno(fstat(arg1
, &st
));
10718 if (!is_error(ret
))
10719 ret
= host_to_target_stat64(cpu_env
, arg2
, &st
);
10722 #if (defined(TARGET_NR_fstatat64) || defined(TARGET_NR_newfstatat))
10723 #ifdef TARGET_NR_fstatat64
10724 case TARGET_NR_fstatat64
:
10726 #ifdef TARGET_NR_newfstatat
10727 case TARGET_NR_newfstatat
:
10729 if (!(p
= lock_user_string(arg2
)))
10731 ret
= get_errno(fstatat(arg1
, path(p
), &st
, arg4
));
10732 if (!is_error(ret
))
10733 ret
= host_to_target_stat64(cpu_env
, arg3
, &st
);
10736 #ifdef TARGET_NR_lchown
10737 case TARGET_NR_lchown
:
10738 if (!(p
= lock_user_string(arg1
)))
10740 ret
= get_errno(lchown(p
, low2highuid(arg2
), low2highgid(arg3
)));
10741 unlock_user(p
, arg1
, 0);
10744 #ifdef TARGET_NR_getuid
10745 case TARGET_NR_getuid
:
10746 ret
= get_errno(high2lowuid(getuid()));
10749 #ifdef TARGET_NR_getgid
10750 case TARGET_NR_getgid
:
10751 ret
= get_errno(high2lowgid(getgid()));
10754 #ifdef TARGET_NR_geteuid
10755 case TARGET_NR_geteuid
:
10756 ret
= get_errno(high2lowuid(geteuid()));
10759 #ifdef TARGET_NR_getegid
10760 case TARGET_NR_getegid
:
10761 ret
= get_errno(high2lowgid(getegid()));
10764 case TARGET_NR_setreuid
:
10765 ret
= get_errno(setreuid(low2highuid(arg1
), low2highuid(arg2
)));
10767 case TARGET_NR_setregid
:
10768 ret
= get_errno(setregid(low2highgid(arg1
), low2highgid(arg2
)));
10770 case TARGET_NR_getgroups
:
10772 int gidsetsize
= arg1
;
10773 target_id
*target_grouplist
;
10777 grouplist
= alloca(gidsetsize
* sizeof(gid_t
));
10778 ret
= get_errno(getgroups(gidsetsize
, grouplist
));
10779 if (gidsetsize
== 0)
10781 if (!is_error(ret
)) {
10782 target_grouplist
= lock_user(VERIFY_WRITE
, arg2
, gidsetsize
* sizeof(target_id
), 0);
10783 if (!target_grouplist
)
10785 for(i
= 0;i
< ret
; i
++)
10786 target_grouplist
[i
] = tswapid(high2lowgid(grouplist
[i
]));
10787 unlock_user(target_grouplist
, arg2
, gidsetsize
* sizeof(target_id
));
10791 case TARGET_NR_setgroups
:
10793 int gidsetsize
= arg1
;
10794 target_id
*target_grouplist
;
10795 gid_t
*grouplist
= NULL
;
10798 grouplist
= alloca(gidsetsize
* sizeof(gid_t
));
10799 target_grouplist
= lock_user(VERIFY_READ
, arg2
, gidsetsize
* sizeof(target_id
), 1);
10800 if (!target_grouplist
) {
10801 ret
= -TARGET_EFAULT
;
10804 for (i
= 0; i
< gidsetsize
; i
++) {
10805 grouplist
[i
] = low2highgid(tswapid(target_grouplist
[i
]));
10807 unlock_user(target_grouplist
, arg2
, 0);
10809 ret
= get_errno(setgroups(gidsetsize
, grouplist
));
10812 case TARGET_NR_fchown
:
10813 ret
= get_errno(fchown(arg1
, low2highuid(arg2
), low2highgid(arg3
)));
10815 #if defined(TARGET_NR_fchownat)
10816 case TARGET_NR_fchownat
:
10817 if (!(p
= lock_user_string(arg2
)))
10819 ret
= get_errno(fchownat(arg1
, p
, low2highuid(arg3
),
10820 low2highgid(arg4
), arg5
));
10821 unlock_user(p
, arg2
, 0);
10824 #ifdef TARGET_NR_setresuid
10825 case TARGET_NR_setresuid
:
10826 ret
= get_errno(sys_setresuid(low2highuid(arg1
),
10828 low2highuid(arg3
)));
10831 #ifdef TARGET_NR_getresuid
10832 case TARGET_NR_getresuid
:
10834 uid_t ruid
, euid
, suid
;
10835 ret
= get_errno(getresuid(&ruid
, &euid
, &suid
));
10836 if (!is_error(ret
)) {
10837 if (put_user_id(high2lowuid(ruid
), arg1
)
10838 || put_user_id(high2lowuid(euid
), arg2
)
10839 || put_user_id(high2lowuid(suid
), arg3
))
10845 #ifdef TARGET_NR_getresgid
10846 case TARGET_NR_setresgid
:
10847 ret
= get_errno(sys_setresgid(low2highgid(arg1
),
10849 low2highgid(arg3
)));
10852 #ifdef TARGET_NR_getresgid
10853 case TARGET_NR_getresgid
:
10855 gid_t rgid
, egid
, sgid
;
10856 ret
= get_errno(getresgid(&rgid
, &egid
, &sgid
));
10857 if (!is_error(ret
)) {
10858 if (put_user_id(high2lowgid(rgid
), arg1
)
10859 || put_user_id(high2lowgid(egid
), arg2
)
10860 || put_user_id(high2lowgid(sgid
), arg3
))
10866 #ifdef TARGET_NR_chown
10867 case TARGET_NR_chown
:
10868 if (!(p
= lock_user_string(arg1
)))
10870 ret
= get_errno(chown(p
, low2highuid(arg2
), low2highgid(arg3
)));
10871 unlock_user(p
, arg1
, 0);
10874 case TARGET_NR_setuid
:
10875 ret
= get_errno(sys_setuid(low2highuid(arg1
)));
10877 case TARGET_NR_setgid
:
10878 ret
= get_errno(sys_setgid(low2highgid(arg1
)));
10880 case TARGET_NR_setfsuid
:
10881 ret
= get_errno(setfsuid(arg1
));
10883 case TARGET_NR_setfsgid
:
10884 ret
= get_errno(setfsgid(arg1
));
10887 #ifdef TARGET_NR_lchown32
10888 case TARGET_NR_lchown32
:
10889 if (!(p
= lock_user_string(arg1
)))
10891 ret
= get_errno(lchown(p
, arg2
, arg3
));
10892 unlock_user(p
, arg1
, 0);
10895 #ifdef TARGET_NR_getuid32
10896 case TARGET_NR_getuid32
:
10897 ret
= get_errno(getuid());
10901 #if defined(TARGET_NR_getxuid) && defined(TARGET_ALPHA)
10902 /* Alpha specific */
10903 case TARGET_NR_getxuid
:
10907 ((CPUAlphaState
*)cpu_env
)->ir
[IR_A4
]=euid
;
10909 ret
= get_errno(getuid());
10912 #if defined(TARGET_NR_getxgid) && defined(TARGET_ALPHA)
10913 /* Alpha specific */
10914 case TARGET_NR_getxgid
:
10918 ((CPUAlphaState
*)cpu_env
)->ir
[IR_A4
]=egid
;
10920 ret
= get_errno(getgid());
10923 #if defined(TARGET_NR_osf_getsysinfo) && defined(TARGET_ALPHA)
10924 /* Alpha specific */
10925 case TARGET_NR_osf_getsysinfo
:
10926 ret
= -TARGET_EOPNOTSUPP
;
10928 case TARGET_GSI_IEEE_FP_CONTROL
:
10930 uint64_t swcr
, fpcr
= cpu_alpha_load_fpcr (cpu_env
);
10932 /* Copied from linux ieee_fpcr_to_swcr. */
10933 swcr
= (fpcr
>> 35) & SWCR_STATUS_MASK
;
10934 swcr
|= (fpcr
>> 36) & SWCR_MAP_DMZ
;
10935 swcr
|= (~fpcr
>> 48) & (SWCR_TRAP_ENABLE_INV
10936 | SWCR_TRAP_ENABLE_DZE
10937 | SWCR_TRAP_ENABLE_OVF
);
10938 swcr
|= (~fpcr
>> 57) & (SWCR_TRAP_ENABLE_UNF
10939 | SWCR_TRAP_ENABLE_INE
);
10940 swcr
|= (fpcr
>> 47) & SWCR_MAP_UMZ
;
10941 swcr
|= (~fpcr
>> 41) & SWCR_TRAP_ENABLE_DNO
;
10943 if (put_user_u64 (swcr
, arg2
))
10949 /* case GSI_IEEE_STATE_AT_SIGNAL:
10950 -- Not implemented in linux kernel.
10952 -- Retrieves current unaligned access state; not much used.
10953 case GSI_PROC_TYPE:
10954 -- Retrieves implver information; surely not used.
10955 case GSI_GET_HWRPB:
10956 -- Grabs a copy of the HWRPB; surely not used.
10961 #if defined(TARGET_NR_osf_setsysinfo) && defined(TARGET_ALPHA)
10962 /* Alpha specific */
10963 case TARGET_NR_osf_setsysinfo
:
10964 ret
= -TARGET_EOPNOTSUPP
;
10966 case TARGET_SSI_IEEE_FP_CONTROL
:
10968 uint64_t swcr
, fpcr
, orig_fpcr
;
10970 if (get_user_u64 (swcr
, arg2
)) {
10973 orig_fpcr
= cpu_alpha_load_fpcr(cpu_env
);
10974 fpcr
= orig_fpcr
& FPCR_DYN_MASK
;
10976 /* Copied from linux ieee_swcr_to_fpcr. */
10977 fpcr
|= (swcr
& SWCR_STATUS_MASK
) << 35;
10978 fpcr
|= (swcr
& SWCR_MAP_DMZ
) << 36;
10979 fpcr
|= (~swcr
& (SWCR_TRAP_ENABLE_INV
10980 | SWCR_TRAP_ENABLE_DZE
10981 | SWCR_TRAP_ENABLE_OVF
)) << 48;
10982 fpcr
|= (~swcr
& (SWCR_TRAP_ENABLE_UNF
10983 | SWCR_TRAP_ENABLE_INE
)) << 57;
10984 fpcr
|= (swcr
& SWCR_MAP_UMZ
? FPCR_UNDZ
| FPCR_UNFD
: 0);
10985 fpcr
|= (~swcr
& SWCR_TRAP_ENABLE_DNO
) << 41;
10987 cpu_alpha_store_fpcr(cpu_env
, fpcr
);
10992 case TARGET_SSI_IEEE_RAISE_EXCEPTION
:
10994 uint64_t exc
, fpcr
, orig_fpcr
;
10997 if (get_user_u64(exc
, arg2
)) {
11001 orig_fpcr
= cpu_alpha_load_fpcr(cpu_env
);
11003 /* We only add to the exception status here. */
11004 fpcr
= orig_fpcr
| ((exc
& SWCR_STATUS_MASK
) << 35);
11006 cpu_alpha_store_fpcr(cpu_env
, fpcr
);
11009 /* Old exceptions are not signaled. */
11010 fpcr
&= ~(orig_fpcr
& FPCR_STATUS_MASK
);
11012 /* If any exceptions set by this call,
11013 and are unmasked, send a signal. */
11015 if ((fpcr
& (FPCR_INE
| FPCR_INED
)) == FPCR_INE
) {
11016 si_code
= TARGET_FPE_FLTRES
;
11018 if ((fpcr
& (FPCR_UNF
| FPCR_UNFD
)) == FPCR_UNF
) {
11019 si_code
= TARGET_FPE_FLTUND
;
11021 if ((fpcr
& (FPCR_OVF
| FPCR_OVFD
)) == FPCR_OVF
) {
11022 si_code
= TARGET_FPE_FLTOVF
;
11024 if ((fpcr
& (FPCR_DZE
| FPCR_DZED
)) == FPCR_DZE
) {
11025 si_code
= TARGET_FPE_FLTDIV
;
11027 if ((fpcr
& (FPCR_INV
| FPCR_INVD
)) == FPCR_INV
) {
11028 si_code
= TARGET_FPE_FLTINV
;
11030 if (si_code
!= 0) {
11031 target_siginfo_t info
;
11032 info
.si_signo
= SIGFPE
;
11034 info
.si_code
= si_code
;
11035 info
._sifields
._sigfault
._addr
11036 = ((CPUArchState
*)cpu_env
)->pc
;
11037 queue_signal((CPUArchState
*)cpu_env
, info
.si_signo
,
11038 QEMU_SI_FAULT
, &info
);
11043 /* case SSI_NVPAIRS:
11044 -- Used with SSIN_UACPROC to enable unaligned accesses.
11045 case SSI_IEEE_STATE_AT_SIGNAL:
11046 case SSI_IEEE_IGNORE_STATE_AT_SIGNAL:
11047 -- Not implemented in linux kernel
11052 #ifdef TARGET_NR_osf_sigprocmask
11053 /* Alpha specific. */
11054 case TARGET_NR_osf_sigprocmask
:
11058 sigset_t set
, oldset
;
11061 case TARGET_SIG_BLOCK
:
11064 case TARGET_SIG_UNBLOCK
:
11067 case TARGET_SIG_SETMASK
:
11071 ret
= -TARGET_EINVAL
;
11075 target_to_host_old_sigset(&set
, &mask
);
11076 ret
= do_sigprocmask(how
, &set
, &oldset
);
11078 host_to_target_old_sigset(&mask
, &oldset
);
11085 #ifdef TARGET_NR_getgid32
11086 case TARGET_NR_getgid32
:
11087 ret
= get_errno(getgid());
11090 #ifdef TARGET_NR_geteuid32
11091 case TARGET_NR_geteuid32
:
11092 ret
= get_errno(geteuid());
11095 #ifdef TARGET_NR_getegid32
11096 case TARGET_NR_getegid32
:
11097 ret
= get_errno(getegid());
11100 #ifdef TARGET_NR_setreuid32
11101 case TARGET_NR_setreuid32
:
11102 ret
= get_errno(setreuid(arg1
, arg2
));
11105 #ifdef TARGET_NR_setregid32
11106 case TARGET_NR_setregid32
:
11107 ret
= get_errno(setregid(arg1
, arg2
));
11110 #ifdef TARGET_NR_getgroups32
11111 case TARGET_NR_getgroups32
:
11113 int gidsetsize
= arg1
;
11114 uint32_t *target_grouplist
;
11118 grouplist
= alloca(gidsetsize
* sizeof(gid_t
));
11119 ret
= get_errno(getgroups(gidsetsize
, grouplist
));
11120 if (gidsetsize
== 0)
11122 if (!is_error(ret
)) {
11123 target_grouplist
= lock_user(VERIFY_WRITE
, arg2
, gidsetsize
* 4, 0);
11124 if (!target_grouplist
) {
11125 ret
= -TARGET_EFAULT
;
11128 for(i
= 0;i
< ret
; i
++)
11129 target_grouplist
[i
] = tswap32(grouplist
[i
]);
11130 unlock_user(target_grouplist
, arg2
, gidsetsize
* 4);
11135 #ifdef TARGET_NR_setgroups32
11136 case TARGET_NR_setgroups32
:
11138 int gidsetsize
= arg1
;
11139 uint32_t *target_grouplist
;
11143 grouplist
= alloca(gidsetsize
* sizeof(gid_t
));
11144 target_grouplist
= lock_user(VERIFY_READ
, arg2
, gidsetsize
* 4, 1);
11145 if (!target_grouplist
) {
11146 ret
= -TARGET_EFAULT
;
11149 for(i
= 0;i
< gidsetsize
; i
++)
11150 grouplist
[i
] = tswap32(target_grouplist
[i
]);
11151 unlock_user(target_grouplist
, arg2
, 0);
11152 ret
= get_errno(setgroups(gidsetsize
, grouplist
));
11156 #ifdef TARGET_NR_fchown32
11157 case TARGET_NR_fchown32
:
11158 ret
= get_errno(fchown(arg1
, arg2
, arg3
));
11161 #ifdef TARGET_NR_setresuid32
11162 case TARGET_NR_setresuid32
:
11163 ret
= get_errno(sys_setresuid(arg1
, arg2
, arg3
));
11166 #ifdef TARGET_NR_getresuid32
11167 case TARGET_NR_getresuid32
:
11169 uid_t ruid
, euid
, suid
;
11170 ret
= get_errno(getresuid(&ruid
, &euid
, &suid
));
11171 if (!is_error(ret
)) {
11172 if (put_user_u32(ruid
, arg1
)
11173 || put_user_u32(euid
, arg2
)
11174 || put_user_u32(suid
, arg3
))
11180 #ifdef TARGET_NR_setresgid32
11181 case TARGET_NR_setresgid32
:
11182 ret
= get_errno(sys_setresgid(arg1
, arg2
, arg3
));
11185 #ifdef TARGET_NR_getresgid32
11186 case TARGET_NR_getresgid32
:
11188 gid_t rgid
, egid
, sgid
;
11189 ret
= get_errno(getresgid(&rgid
, &egid
, &sgid
));
11190 if (!is_error(ret
)) {
11191 if (put_user_u32(rgid
, arg1
)
11192 || put_user_u32(egid
, arg2
)
11193 || put_user_u32(sgid
, arg3
))
11199 #ifdef TARGET_NR_chown32
11200 case TARGET_NR_chown32
:
11201 if (!(p
= lock_user_string(arg1
)))
11203 ret
= get_errno(chown(p
, arg2
, arg3
));
11204 unlock_user(p
, arg1
, 0);
11207 #ifdef TARGET_NR_setuid32
11208 case TARGET_NR_setuid32
:
11209 ret
= get_errno(sys_setuid(arg1
));
11212 #ifdef TARGET_NR_setgid32
11213 case TARGET_NR_setgid32
:
11214 ret
= get_errno(sys_setgid(arg1
));
11217 #ifdef TARGET_NR_setfsuid32
11218 case TARGET_NR_setfsuid32
:
11219 ret
= get_errno(setfsuid(arg1
));
11222 #ifdef TARGET_NR_setfsgid32
11223 case TARGET_NR_setfsgid32
:
11224 ret
= get_errno(setfsgid(arg1
));
11228 case TARGET_NR_pivot_root
:
11229 goto unimplemented
;
11230 #ifdef TARGET_NR_mincore
11231 case TARGET_NR_mincore
:
11234 ret
= -TARGET_ENOMEM
;
11235 a
= lock_user(VERIFY_READ
, arg1
, arg2
, 0);
11239 ret
= -TARGET_EFAULT
;
11240 p
= lock_user_string(arg3
);
11244 ret
= get_errno(mincore(a
, arg2
, p
));
11245 unlock_user(p
, arg3
, ret
);
11247 unlock_user(a
, arg1
, 0);
11251 #ifdef TARGET_NR_arm_fadvise64_64
11252 case TARGET_NR_arm_fadvise64_64
:
11253 /* arm_fadvise64_64 looks like fadvise64_64 but
11254 * with different argument order: fd, advice, offset, len
11255 * rather than the usual fd, offset, len, advice.
11256 * Note that offset and len are both 64-bit so appear as
11257 * pairs of 32-bit registers.
11259 ret
= posix_fadvise(arg1
, target_offset64(arg3
, arg4
),
11260 target_offset64(arg5
, arg6
), arg2
);
11261 ret
= -host_to_target_errno(ret
);
11265 #if TARGET_ABI_BITS == 32
11267 #ifdef TARGET_NR_fadvise64_64
11268 case TARGET_NR_fadvise64_64
:
11269 #if defined(TARGET_PPC)
11270 /* 6 args: fd, advice, offset (high, low), len (high, low) */
11278 /* 6 args: fd, offset (high, low), len (high, low), advice */
11279 if (regpairs_aligned(cpu_env
)) {
11280 /* offset is in (3,4), len in (5,6) and advice in 7 */
11288 ret
= -host_to_target_errno(posix_fadvise(arg1
,
11289 target_offset64(arg2
, arg3
),
11290 target_offset64(arg4
, arg5
),
11295 #ifdef TARGET_NR_fadvise64
11296 case TARGET_NR_fadvise64
:
11297 /* 5 args: fd, offset (high, low), len, advice */
11298 if (regpairs_aligned(cpu_env
)) {
11299 /* offset is in (3,4), len in 5 and advice in 6 */
11305 ret
= -host_to_target_errno(posix_fadvise(arg1
,
11306 target_offset64(arg2
, arg3
),
11311 #else /* not a 32-bit ABI */
11312 #if defined(TARGET_NR_fadvise64_64) || defined(TARGET_NR_fadvise64)
11313 #ifdef TARGET_NR_fadvise64_64
11314 case TARGET_NR_fadvise64_64
:
11316 #ifdef TARGET_NR_fadvise64
11317 case TARGET_NR_fadvise64
:
11319 #ifdef TARGET_S390X
11321 case 4: arg4
= POSIX_FADV_NOREUSE
+ 1; break; /* make sure it's an invalid value */
11322 case 5: arg4
= POSIX_FADV_NOREUSE
+ 2; break; /* ditto */
11323 case 6: arg4
= POSIX_FADV_DONTNEED
; break;
11324 case 7: arg4
= POSIX_FADV_NOREUSE
; break;
11328 ret
= -host_to_target_errno(posix_fadvise(arg1
, arg2
, arg3
, arg4
));
11331 #endif /* end of 64-bit ABI fadvise handling */
11333 #ifdef TARGET_NR_madvise
11334 case TARGET_NR_madvise
:
11335 /* A straight passthrough may not be safe because qemu sometimes
11336 turns private file-backed mappings into anonymous mappings.
11337 This will break MADV_DONTNEED.
11338 This is a hint, so ignoring and returning success is ok. */
11339 ret
= get_errno(0);
11342 #if TARGET_ABI_BITS == 32
11343 case TARGET_NR_fcntl64
:
11347 from_flock64_fn
*copyfrom
= copy_from_user_flock64
;
11348 to_flock64_fn
*copyto
= copy_to_user_flock64
;
11351 if (((CPUARMState
*)cpu_env
)->eabi
) {
11352 copyfrom
= copy_from_user_eabi_flock64
;
11353 copyto
= copy_to_user_eabi_flock64
;
11357 cmd
= target_to_host_fcntl_cmd(arg2
);
11358 if (cmd
== -TARGET_EINVAL
) {
11364 case TARGET_F_GETLK64
:
11365 ret
= copyfrom(&fl
, arg3
);
11369 ret
= get_errno(fcntl(arg1
, cmd
, &fl
));
11371 ret
= copyto(arg3
, &fl
);
11375 case TARGET_F_SETLK64
:
11376 case TARGET_F_SETLKW64
:
11377 ret
= copyfrom(&fl
, arg3
);
11381 ret
= get_errno(safe_fcntl(arg1
, cmd
, &fl
));
11384 ret
= do_fcntl(arg1
, arg2
, arg3
);
11390 #ifdef TARGET_NR_cacheflush
11391 case TARGET_NR_cacheflush
:
11392 /* self-modifying code is handled automatically, so nothing needed */
11396 #ifdef TARGET_NR_security
11397 case TARGET_NR_security
:
11398 goto unimplemented
;
11400 #ifdef TARGET_NR_getpagesize
11401 case TARGET_NR_getpagesize
:
11402 ret
= TARGET_PAGE_SIZE
;
11405 case TARGET_NR_gettid
:
11406 ret
= get_errno(gettid());
11408 #ifdef TARGET_NR_readahead
11409 case TARGET_NR_readahead
:
11410 #if TARGET_ABI_BITS == 32
11411 if (regpairs_aligned(cpu_env
)) {
11416 ret
= get_errno(readahead(arg1
, target_offset64(arg2
, arg3
) , arg4
));
11418 ret
= get_errno(readahead(arg1
, arg2
, arg3
));
11423 #ifdef TARGET_NR_setxattr
11424 case TARGET_NR_listxattr
:
11425 case TARGET_NR_llistxattr
:
11429 b
= lock_user(VERIFY_WRITE
, arg2
, arg3
, 0);
11431 ret
= -TARGET_EFAULT
;
11435 p
= lock_user_string(arg1
);
11437 if (num
== TARGET_NR_listxattr
) {
11438 ret
= get_errno(listxattr(p
, b
, arg3
));
11440 ret
= get_errno(llistxattr(p
, b
, arg3
));
11443 ret
= -TARGET_EFAULT
;
11445 unlock_user(p
, arg1
, 0);
11446 unlock_user(b
, arg2
, arg3
);
11449 case TARGET_NR_flistxattr
:
11453 b
= lock_user(VERIFY_WRITE
, arg2
, arg3
, 0);
11455 ret
= -TARGET_EFAULT
;
11459 ret
= get_errno(flistxattr(arg1
, b
, arg3
));
11460 unlock_user(b
, arg2
, arg3
);
11463 case TARGET_NR_setxattr
:
11464 case TARGET_NR_lsetxattr
:
11466 void *p
, *n
, *v
= 0;
11468 v
= lock_user(VERIFY_READ
, arg3
, arg4
, 1);
11470 ret
= -TARGET_EFAULT
;
11474 p
= lock_user_string(arg1
);
11475 n
= lock_user_string(arg2
);
11477 if (num
== TARGET_NR_setxattr
) {
11478 ret
= get_errno(setxattr(p
, n
, v
, arg4
, arg5
));
11480 ret
= get_errno(lsetxattr(p
, n
, v
, arg4
, arg5
));
11483 ret
= -TARGET_EFAULT
;
11485 unlock_user(p
, arg1
, 0);
11486 unlock_user(n
, arg2
, 0);
11487 unlock_user(v
, arg3
, 0);
11490 case TARGET_NR_fsetxattr
:
11494 v
= lock_user(VERIFY_READ
, arg3
, arg4
, 1);
11496 ret
= -TARGET_EFAULT
;
11500 n
= lock_user_string(arg2
);
11502 ret
= get_errno(fsetxattr(arg1
, n
, v
, arg4
, arg5
));
11504 ret
= -TARGET_EFAULT
;
11506 unlock_user(n
, arg2
, 0);
11507 unlock_user(v
, arg3
, 0);
11510 case TARGET_NR_getxattr
:
11511 case TARGET_NR_lgetxattr
:
11513 void *p
, *n
, *v
= 0;
11515 v
= lock_user(VERIFY_WRITE
, arg3
, arg4
, 0);
11517 ret
= -TARGET_EFAULT
;
11521 p
= lock_user_string(arg1
);
11522 n
= lock_user_string(arg2
);
11524 if (num
== TARGET_NR_getxattr
) {
11525 ret
= get_errno(getxattr(p
, n
, v
, arg4
));
11527 ret
= get_errno(lgetxattr(p
, n
, v
, arg4
));
11530 ret
= -TARGET_EFAULT
;
11532 unlock_user(p
, arg1
, 0);
11533 unlock_user(n
, arg2
, 0);
11534 unlock_user(v
, arg3
, arg4
);
11537 case TARGET_NR_fgetxattr
:
11541 v
= lock_user(VERIFY_WRITE
, arg3
, arg4
, 0);
11543 ret
= -TARGET_EFAULT
;
11547 n
= lock_user_string(arg2
);
11549 ret
= get_errno(fgetxattr(arg1
, n
, v
, arg4
));
11551 ret
= -TARGET_EFAULT
;
11553 unlock_user(n
, arg2
, 0);
11554 unlock_user(v
, arg3
, arg4
);
11557 case TARGET_NR_removexattr
:
11558 case TARGET_NR_lremovexattr
:
11561 p
= lock_user_string(arg1
);
11562 n
= lock_user_string(arg2
);
11564 if (num
== TARGET_NR_removexattr
) {
11565 ret
= get_errno(removexattr(p
, n
));
11567 ret
= get_errno(lremovexattr(p
, n
));
11570 ret
= -TARGET_EFAULT
;
11572 unlock_user(p
, arg1
, 0);
11573 unlock_user(n
, arg2
, 0);
11576 case TARGET_NR_fremovexattr
:
11579 n
= lock_user_string(arg2
);
11581 ret
= get_errno(fremovexattr(arg1
, n
));
11583 ret
= -TARGET_EFAULT
;
11585 unlock_user(n
, arg2
, 0);
11589 #endif /* CONFIG_ATTR */
11590 #ifdef TARGET_NR_set_thread_area
11591 case TARGET_NR_set_thread_area
:
11592 #if defined(TARGET_MIPS)
11593 ((CPUMIPSState
*) cpu_env
)->active_tc
.CP0_UserLocal
= arg1
;
11596 #elif defined(TARGET_CRIS)
11598 ret
= -TARGET_EINVAL
;
11600 ((CPUCRISState
*) cpu_env
)->pregs
[PR_PID
] = arg1
;
11604 #elif defined(TARGET_I386) && defined(TARGET_ABI32)
11605 ret
= do_set_thread_area(cpu_env
, arg1
);
11607 #elif defined(TARGET_M68K)
11609 TaskState
*ts
= cpu
->opaque
;
11610 ts
->tp_value
= arg1
;
11615 goto unimplemented_nowarn
;
11618 #ifdef TARGET_NR_get_thread_area
11619 case TARGET_NR_get_thread_area
:
11620 #if defined(TARGET_I386) && defined(TARGET_ABI32)
11621 ret
= do_get_thread_area(cpu_env
, arg1
);
11623 #elif defined(TARGET_M68K)
11625 TaskState
*ts
= cpu
->opaque
;
11626 ret
= ts
->tp_value
;
11630 goto unimplemented_nowarn
;
11633 #ifdef TARGET_NR_getdomainname
11634 case TARGET_NR_getdomainname
:
11635 goto unimplemented_nowarn
;
11638 #ifdef TARGET_NR_clock_gettime
11639 case TARGET_NR_clock_gettime
:
11641 struct timespec ts
;
11642 ret
= get_errno(clock_gettime(arg1
, &ts
));
11643 if (!is_error(ret
)) {
11644 host_to_target_timespec(arg2
, &ts
);
11649 #ifdef TARGET_NR_clock_getres
11650 case TARGET_NR_clock_getres
:
11652 struct timespec ts
;
11653 ret
= get_errno(clock_getres(arg1
, &ts
));
11654 if (!is_error(ret
)) {
11655 host_to_target_timespec(arg2
, &ts
);
11660 #ifdef TARGET_NR_clock_nanosleep
11661 case TARGET_NR_clock_nanosleep
:
11663 struct timespec ts
;
11664 target_to_host_timespec(&ts
, arg3
);
11665 ret
= get_errno(safe_clock_nanosleep(arg1
, arg2
,
11666 &ts
, arg4
? &ts
: NULL
));
11668 host_to_target_timespec(arg4
, &ts
);
11670 #if defined(TARGET_PPC)
11671 /* clock_nanosleep is odd in that it returns positive errno values.
11672 * On PPC, CR0 bit 3 should be set in such a situation. */
11673 if (ret
&& ret
!= -TARGET_ERESTARTSYS
) {
11674 ((CPUPPCState
*)cpu_env
)->crf
[0] |= 1;
11681 #if defined(TARGET_NR_set_tid_address) && defined(__NR_set_tid_address)
11682 case TARGET_NR_set_tid_address
:
11683 ret
= get_errno(set_tid_address((int *)g2h(arg1
)));
11687 case TARGET_NR_tkill
:
11688 ret
= get_errno(safe_tkill((int)arg1
, target_to_host_signal(arg2
)));
11691 case TARGET_NR_tgkill
:
11692 ret
= get_errno(safe_tgkill((int)arg1
, (int)arg2
,
11693 target_to_host_signal(arg3
)));
11696 #ifdef TARGET_NR_set_robust_list
11697 case TARGET_NR_set_robust_list
:
11698 case TARGET_NR_get_robust_list
:
11699 /* The ABI for supporting robust futexes has userspace pass
11700 * the kernel a pointer to a linked list which is updated by
11701 * userspace after the syscall; the list is walked by the kernel
11702 * when the thread exits. Since the linked list in QEMU guest
11703 * memory isn't a valid linked list for the host and we have
11704 * no way to reliably intercept the thread-death event, we can't
11705 * support these. Silently return ENOSYS so that guest userspace
11706 * falls back to a non-robust futex implementation (which should
11707 * be OK except in the corner case of the guest crashing while
11708 * holding a mutex that is shared with another process via
11711 goto unimplemented_nowarn
;
11714 #if defined(TARGET_NR_utimensat)
11715 case TARGET_NR_utimensat
:
11717 struct timespec
*tsp
, ts
[2];
11721 target_to_host_timespec(ts
, arg3
);
11722 target_to_host_timespec(ts
+1, arg3
+sizeof(struct target_timespec
));
11726 ret
= get_errno(sys_utimensat(arg1
, NULL
, tsp
, arg4
));
11728 if (!(p
= lock_user_string(arg2
))) {
11729 ret
= -TARGET_EFAULT
;
11732 ret
= get_errno(sys_utimensat(arg1
, path(p
), tsp
, arg4
));
11733 unlock_user(p
, arg2
, 0);
11738 case TARGET_NR_futex
:
11739 ret
= do_futex(arg1
, arg2
, arg3
, arg4
, arg5
, arg6
);
11741 #if defined(TARGET_NR_inotify_init) && defined(__NR_inotify_init)
11742 case TARGET_NR_inotify_init
:
11743 ret
= get_errno(sys_inotify_init());
11744 fd_trans_register(ret
, &target_inotify_trans
);
11747 #ifdef CONFIG_INOTIFY1
11748 #if defined(TARGET_NR_inotify_init1) && defined(__NR_inotify_init1)
11749 case TARGET_NR_inotify_init1
:
11750 ret
= get_errno(sys_inotify_init1(target_to_host_bitmask(arg1
,
11751 fcntl_flags_tbl
)));
11752 fd_trans_register(ret
, &target_inotify_trans
);
11756 #if defined(TARGET_NR_inotify_add_watch) && defined(__NR_inotify_add_watch)
11757 case TARGET_NR_inotify_add_watch
:
11758 p
= lock_user_string(arg2
);
11759 ret
= get_errno(sys_inotify_add_watch(arg1
, path(p
), arg3
));
11760 unlock_user(p
, arg2
, 0);
11763 #if defined(TARGET_NR_inotify_rm_watch) && defined(__NR_inotify_rm_watch)
11764 case TARGET_NR_inotify_rm_watch
:
11765 ret
= get_errno(sys_inotify_rm_watch(arg1
, arg2
));
11769 #if defined(TARGET_NR_mq_open) && defined(__NR_mq_open)
11770 case TARGET_NR_mq_open
:
11772 struct mq_attr posix_mq_attr
;
11773 struct mq_attr
*pposix_mq_attr
;
11776 host_flags
= target_to_host_bitmask(arg2
, fcntl_flags_tbl
);
11777 pposix_mq_attr
= NULL
;
11779 if (copy_from_user_mq_attr(&posix_mq_attr
, arg4
) != 0) {
11782 pposix_mq_attr
= &posix_mq_attr
;
11784 p
= lock_user_string(arg1
- 1);
11788 ret
= get_errno(mq_open(p
, host_flags
, arg3
, pposix_mq_attr
));
11789 unlock_user (p
, arg1
, 0);
11793 case TARGET_NR_mq_unlink
:
11794 p
= lock_user_string(arg1
- 1);
11796 ret
= -TARGET_EFAULT
;
11799 ret
= get_errno(mq_unlink(p
));
11800 unlock_user (p
, arg1
, 0);
11803 case TARGET_NR_mq_timedsend
:
11805 struct timespec ts
;
11807 p
= lock_user (VERIFY_READ
, arg2
, arg3
, 1);
11809 target_to_host_timespec(&ts
, arg5
);
11810 ret
= get_errno(safe_mq_timedsend(arg1
, p
, arg3
, arg4
, &ts
));
11811 host_to_target_timespec(arg5
, &ts
);
11813 ret
= get_errno(safe_mq_timedsend(arg1
, p
, arg3
, arg4
, NULL
));
11815 unlock_user (p
, arg2
, arg3
);
11819 case TARGET_NR_mq_timedreceive
:
11821 struct timespec ts
;
11824 p
= lock_user (VERIFY_READ
, arg2
, arg3
, 1);
11826 target_to_host_timespec(&ts
, arg5
);
11827 ret
= get_errno(safe_mq_timedreceive(arg1
, p
, arg3
,
11829 host_to_target_timespec(arg5
, &ts
);
11831 ret
= get_errno(safe_mq_timedreceive(arg1
, p
, arg3
,
11834 unlock_user (p
, arg2
, arg3
);
11836 put_user_u32(prio
, arg4
);
11840 /* Not implemented for now... */
11841 /* case TARGET_NR_mq_notify: */
11844 case TARGET_NR_mq_getsetattr
:
11846 struct mq_attr posix_mq_attr_in
, posix_mq_attr_out
;
11849 ret
= mq_getattr(arg1
, &posix_mq_attr_out
);
11850 copy_to_user_mq_attr(arg3
, &posix_mq_attr_out
);
11853 copy_from_user_mq_attr(&posix_mq_attr_in
, arg2
);
11854 ret
|= mq_setattr(arg1
, &posix_mq_attr_in
, &posix_mq_attr_out
);
11861 #ifdef CONFIG_SPLICE
11862 #ifdef TARGET_NR_tee
11863 case TARGET_NR_tee
:
11865 ret
= get_errno(tee(arg1
,arg2
,arg3
,arg4
));
11869 #ifdef TARGET_NR_splice
11870 case TARGET_NR_splice
:
11872 loff_t loff_in
, loff_out
;
11873 loff_t
*ploff_in
= NULL
, *ploff_out
= NULL
;
11875 if (get_user_u64(loff_in
, arg2
)) {
11878 ploff_in
= &loff_in
;
11881 if (get_user_u64(loff_out
, arg4
)) {
11884 ploff_out
= &loff_out
;
11886 ret
= get_errno(splice(arg1
, ploff_in
, arg3
, ploff_out
, arg5
, arg6
));
11888 if (put_user_u64(loff_in
, arg2
)) {
11893 if (put_user_u64(loff_out
, arg4
)) {
11900 #ifdef TARGET_NR_vmsplice
11901 case TARGET_NR_vmsplice
:
11903 struct iovec
*vec
= lock_iovec(VERIFY_READ
, arg2
, arg3
, 1);
11905 ret
= get_errno(vmsplice(arg1
, vec
, arg3
, arg4
));
11906 unlock_iovec(vec
, arg2
, arg3
, 0);
11908 ret
= -host_to_target_errno(errno
);
11913 #endif /* CONFIG_SPLICE */
11914 #ifdef CONFIG_EVENTFD
11915 #if defined(TARGET_NR_eventfd)
11916 case TARGET_NR_eventfd
:
11917 ret
= get_errno(eventfd(arg1
, 0));
11918 fd_trans_register(ret
, &target_eventfd_trans
);
11921 #if defined(TARGET_NR_eventfd2)
11922 case TARGET_NR_eventfd2
:
11924 int host_flags
= arg2
& (~(TARGET_O_NONBLOCK
| TARGET_O_CLOEXEC
));
11925 if (arg2
& TARGET_O_NONBLOCK
) {
11926 host_flags
|= O_NONBLOCK
;
11928 if (arg2
& TARGET_O_CLOEXEC
) {
11929 host_flags
|= O_CLOEXEC
;
11931 ret
= get_errno(eventfd(arg1
, host_flags
));
11932 fd_trans_register(ret
, &target_eventfd_trans
);
11936 #endif /* CONFIG_EVENTFD */
11937 #if defined(CONFIG_FALLOCATE) && defined(TARGET_NR_fallocate)
11938 case TARGET_NR_fallocate
:
11939 #if TARGET_ABI_BITS == 32
11940 ret
= get_errno(fallocate(arg1
, arg2
, target_offset64(arg3
, arg4
),
11941 target_offset64(arg5
, arg6
)));
11943 ret
= get_errno(fallocate(arg1
, arg2
, arg3
, arg4
));
11947 #if defined(CONFIG_SYNC_FILE_RANGE)
11948 #if defined(TARGET_NR_sync_file_range)
11949 case TARGET_NR_sync_file_range
:
11950 #if TARGET_ABI_BITS == 32
11951 #if defined(TARGET_MIPS)
11952 ret
= get_errno(sync_file_range(arg1
, target_offset64(arg3
, arg4
),
11953 target_offset64(arg5
, arg6
), arg7
));
11955 ret
= get_errno(sync_file_range(arg1
, target_offset64(arg2
, arg3
),
11956 target_offset64(arg4
, arg5
), arg6
));
11957 #endif /* !TARGET_MIPS */
11959 ret
= get_errno(sync_file_range(arg1
, arg2
, arg3
, arg4
));
11963 #if defined(TARGET_NR_sync_file_range2)
11964 case TARGET_NR_sync_file_range2
:
11965 /* This is like sync_file_range but the arguments are reordered */
11966 #if TARGET_ABI_BITS == 32
11967 ret
= get_errno(sync_file_range(arg1
, target_offset64(arg3
, arg4
),
11968 target_offset64(arg5
, arg6
), arg2
));
11970 ret
= get_errno(sync_file_range(arg1
, arg3
, arg4
, arg2
));
11975 #if defined(TARGET_NR_signalfd4)
11976 case TARGET_NR_signalfd4
:
11977 ret
= do_signalfd4(arg1
, arg2
, arg4
);
11980 #if defined(TARGET_NR_signalfd)
11981 case TARGET_NR_signalfd
:
11982 ret
= do_signalfd4(arg1
, arg2
, 0);
11985 #if defined(CONFIG_EPOLL)
11986 #if defined(TARGET_NR_epoll_create)
11987 case TARGET_NR_epoll_create
:
11988 ret
= get_errno(epoll_create(arg1
));
11991 #if defined(TARGET_NR_epoll_create1) && defined(CONFIG_EPOLL_CREATE1)
11992 case TARGET_NR_epoll_create1
:
11993 ret
= get_errno(epoll_create1(arg1
));
11996 #if defined(TARGET_NR_epoll_ctl)
11997 case TARGET_NR_epoll_ctl
:
11999 struct epoll_event ep
;
12000 struct epoll_event
*epp
= 0;
12002 struct target_epoll_event
*target_ep
;
12003 if (!lock_user_struct(VERIFY_READ
, target_ep
, arg4
, 1)) {
12006 ep
.events
= tswap32(target_ep
->events
);
12007 /* The epoll_data_t union is just opaque data to the kernel,
12008 * so we transfer all 64 bits across and need not worry what
12009 * actual data type it is.
12011 ep
.data
.u64
= tswap64(target_ep
->data
.u64
);
12012 unlock_user_struct(target_ep
, arg4
, 0);
12015 ret
= get_errno(epoll_ctl(arg1
, arg2
, arg3
, epp
));
12020 #if defined(TARGET_NR_epoll_wait) || defined(TARGET_NR_epoll_pwait)
12021 #if defined(TARGET_NR_epoll_wait)
12022 case TARGET_NR_epoll_wait
:
12024 #if defined(TARGET_NR_epoll_pwait)
12025 case TARGET_NR_epoll_pwait
:
12028 struct target_epoll_event
*target_ep
;
12029 struct epoll_event
*ep
;
12031 int maxevents
= arg3
;
12032 int timeout
= arg4
;
12034 if (maxevents
<= 0 || maxevents
> TARGET_EP_MAX_EVENTS
) {
12035 ret
= -TARGET_EINVAL
;
12039 target_ep
= lock_user(VERIFY_WRITE
, arg2
,
12040 maxevents
* sizeof(struct target_epoll_event
), 1);
12045 ep
= g_try_new(struct epoll_event
, maxevents
);
12047 unlock_user(target_ep
, arg2
, 0);
12048 ret
= -TARGET_ENOMEM
;
12053 #if defined(TARGET_NR_epoll_pwait)
12054 case TARGET_NR_epoll_pwait
:
12056 target_sigset_t
*target_set
;
12057 sigset_t _set
, *set
= &_set
;
12060 if (arg6
!= sizeof(target_sigset_t
)) {
12061 ret
= -TARGET_EINVAL
;
12065 target_set
= lock_user(VERIFY_READ
, arg5
,
12066 sizeof(target_sigset_t
), 1);
12068 ret
= -TARGET_EFAULT
;
12071 target_to_host_sigset(set
, target_set
);
12072 unlock_user(target_set
, arg5
, 0);
12077 ret
= get_errno(safe_epoll_pwait(epfd
, ep
, maxevents
, timeout
,
12078 set
, SIGSET_T_SIZE
));
12082 #if defined(TARGET_NR_epoll_wait)
12083 case TARGET_NR_epoll_wait
:
12084 ret
= get_errno(safe_epoll_pwait(epfd
, ep
, maxevents
, timeout
,
12089 ret
= -TARGET_ENOSYS
;
12091 if (!is_error(ret
)) {
12093 for (i
= 0; i
< ret
; i
++) {
12094 target_ep
[i
].events
= tswap32(ep
[i
].events
);
12095 target_ep
[i
].data
.u64
= tswap64(ep
[i
].data
.u64
);
12097 unlock_user(target_ep
, arg2
,
12098 ret
* sizeof(struct target_epoll_event
));
12100 unlock_user(target_ep
, arg2
, 0);
12107 #ifdef TARGET_NR_prlimit64
12108 case TARGET_NR_prlimit64
:
12110 /* args: pid, resource number, ptr to new rlimit, ptr to old rlimit */
12111 struct target_rlimit64
*target_rnew
, *target_rold
;
12112 struct host_rlimit64 rnew
, rold
, *rnewp
= 0;
12113 int resource
= target_to_host_resource(arg2
);
12115 if (!lock_user_struct(VERIFY_READ
, target_rnew
, arg3
, 1)) {
12118 rnew
.rlim_cur
= tswap64(target_rnew
->rlim_cur
);
12119 rnew
.rlim_max
= tswap64(target_rnew
->rlim_max
);
12120 unlock_user_struct(target_rnew
, arg3
, 0);
12124 ret
= get_errno(sys_prlimit64(arg1
, resource
, rnewp
, arg4
? &rold
: 0));
12125 if (!is_error(ret
) && arg4
) {
12126 if (!lock_user_struct(VERIFY_WRITE
, target_rold
, arg4
, 1)) {
12129 target_rold
->rlim_cur
= tswap64(rold
.rlim_cur
);
12130 target_rold
->rlim_max
= tswap64(rold
.rlim_max
);
12131 unlock_user_struct(target_rold
, arg4
, 1);
12136 #ifdef TARGET_NR_gethostname
12137 case TARGET_NR_gethostname
:
12139 char *name
= lock_user(VERIFY_WRITE
, arg1
, arg2
, 0);
12141 ret
= get_errno(gethostname(name
, arg2
));
12142 unlock_user(name
, arg1
, arg2
);
12144 ret
= -TARGET_EFAULT
;
12149 #ifdef TARGET_NR_atomic_cmpxchg_32
12150 case TARGET_NR_atomic_cmpxchg_32
:
12152 /* should use start_exclusive from main.c */
12153 abi_ulong mem_value
;
12154 if (get_user_u32(mem_value
, arg6
)) {
12155 target_siginfo_t info
;
12156 info
.si_signo
= SIGSEGV
;
12158 info
.si_code
= TARGET_SEGV_MAPERR
;
12159 info
._sifields
._sigfault
._addr
= arg6
;
12160 queue_signal((CPUArchState
*)cpu_env
, info
.si_signo
,
12161 QEMU_SI_FAULT
, &info
);
12165 if (mem_value
== arg2
)
12166 put_user_u32(arg1
, arg6
);
12171 #ifdef TARGET_NR_atomic_barrier
12172 case TARGET_NR_atomic_barrier
:
12174 /* Like the kernel implementation and the qemu arm barrier, no-op this? */
12180 #ifdef TARGET_NR_timer_create
12181 case TARGET_NR_timer_create
:
12183 /* args: clockid_t clockid, struct sigevent *sevp, timer_t *timerid */
12185 struct sigevent host_sevp
= { {0}, }, *phost_sevp
= NULL
;
12188 int timer_index
= next_free_host_timer();
12190 if (timer_index
< 0) {
12191 ret
= -TARGET_EAGAIN
;
12193 timer_t
*phtimer
= g_posix_timers
+ timer_index
;
12196 phost_sevp
= &host_sevp
;
12197 ret
= target_to_host_sigevent(phost_sevp
, arg2
);
12203 ret
= get_errno(timer_create(clkid
, phost_sevp
, phtimer
));
12207 if (put_user(TIMER_MAGIC
| timer_index
, arg3
, target_timer_t
)) {
12216 #ifdef TARGET_NR_timer_settime
12217 case TARGET_NR_timer_settime
:
12219 /* args: timer_t timerid, int flags, const struct itimerspec *new_value,
12220 * struct itimerspec * old_value */
12221 target_timer_t timerid
= get_timer_id(arg1
);
12225 } else if (arg3
== 0) {
12226 ret
= -TARGET_EINVAL
;
12228 timer_t htimer
= g_posix_timers
[timerid
];
12229 struct itimerspec hspec_new
= {{0},}, hspec_old
= {{0},};
12231 if (target_to_host_itimerspec(&hspec_new
, arg3
)) {
12235 timer_settime(htimer
, arg2
, &hspec_new
, &hspec_old
));
12236 if (arg4
&& host_to_target_itimerspec(arg4
, &hspec_old
)) {
12244 #ifdef TARGET_NR_timer_gettime
12245 case TARGET_NR_timer_gettime
:
12247 /* args: timer_t timerid, struct itimerspec *curr_value */
12248 target_timer_t timerid
= get_timer_id(arg1
);
12252 } else if (!arg2
) {
12253 ret
= -TARGET_EFAULT
;
12255 timer_t htimer
= g_posix_timers
[timerid
];
12256 struct itimerspec hspec
;
12257 ret
= get_errno(timer_gettime(htimer
, &hspec
));
12259 if (host_to_target_itimerspec(arg2
, &hspec
)) {
12260 ret
= -TARGET_EFAULT
;
12267 #ifdef TARGET_NR_timer_getoverrun
12268 case TARGET_NR_timer_getoverrun
:
12270 /* args: timer_t timerid */
12271 target_timer_t timerid
= get_timer_id(arg1
);
12276 timer_t htimer
= g_posix_timers
[timerid
];
12277 ret
= get_errno(timer_getoverrun(htimer
));
12279 fd_trans_unregister(ret
);
12284 #ifdef TARGET_NR_timer_delete
12285 case TARGET_NR_timer_delete
:
12287 /* args: timer_t timerid */
12288 target_timer_t timerid
= get_timer_id(arg1
);
12293 timer_t htimer
= g_posix_timers
[timerid
];
12294 ret
= get_errno(timer_delete(htimer
));
12295 g_posix_timers
[timerid
] = 0;
12301 #if defined(TARGET_NR_timerfd_create) && defined(CONFIG_TIMERFD)
12302 case TARGET_NR_timerfd_create
:
12303 ret
= get_errno(timerfd_create(arg1
,
12304 target_to_host_bitmask(arg2
, fcntl_flags_tbl
)));
12308 #if defined(TARGET_NR_timerfd_gettime) && defined(CONFIG_TIMERFD)
12309 case TARGET_NR_timerfd_gettime
:
12311 struct itimerspec its_curr
;
12313 ret
= get_errno(timerfd_gettime(arg1
, &its_curr
));
12315 if (arg2
&& host_to_target_itimerspec(arg2
, &its_curr
)) {
12322 #if defined(TARGET_NR_timerfd_settime) && defined(CONFIG_TIMERFD)
12323 case TARGET_NR_timerfd_settime
:
12325 struct itimerspec its_new
, its_old
, *p_new
;
12328 if (target_to_host_itimerspec(&its_new
, arg3
)) {
12336 ret
= get_errno(timerfd_settime(arg1
, arg2
, p_new
, &its_old
));
12338 if (arg4
&& host_to_target_itimerspec(arg4
, &its_old
)) {
12345 #if defined(TARGET_NR_ioprio_get) && defined(__NR_ioprio_get)
12346 case TARGET_NR_ioprio_get
:
12347 ret
= get_errno(ioprio_get(arg1
, arg2
));
12351 #if defined(TARGET_NR_ioprio_set) && defined(__NR_ioprio_set)
12352 case TARGET_NR_ioprio_set
:
12353 ret
= get_errno(ioprio_set(arg1
, arg2
, arg3
));
12357 #if defined(TARGET_NR_setns) && defined(CONFIG_SETNS)
12358 case TARGET_NR_setns
:
12359 ret
= get_errno(setns(arg1
, arg2
));
12362 #if defined(TARGET_NR_unshare) && defined(CONFIG_SETNS)
12363 case TARGET_NR_unshare
:
12364 ret
= get_errno(unshare(arg1
));
12367 #if defined(TARGET_NR_kcmp) && defined(__NR_kcmp)
12368 case TARGET_NR_kcmp
:
12369 ret
= get_errno(kcmp(arg1
, arg2
, arg3
, arg4
, arg5
));
12375 gemu_log("qemu: Unsupported syscall: %d\n", num
);
12376 #if defined(TARGET_NR_setxattr) || defined(TARGET_NR_get_thread_area) || defined(TARGET_NR_getdomainname) || defined(TARGET_NR_set_robust_list)
12377 unimplemented_nowarn
:
12379 ret
= -TARGET_ENOSYS
;
12384 gemu_log(" = " TARGET_ABI_FMT_ld
"\n", ret
);
12387 print_syscall_ret(num
, ret
);
12388 trace_guest_user_syscall_ret(cpu
, num
, ret
);
12391 ret
= -TARGET_EFAULT
;