提交 b49e452f 编写于 作者: P Peter Maydell

Merge remote-tracking branch 'remotes/riku/tags/pull-linux-user-20160921' into staging

Linux-user changes, mostly bugfixes and adding support for some
new syscalls and some obscure syscalls as well. Includes some
missed patches from earlier rounds, and dropping unicore32 target.

v2: fix the syslog patch and test build with clang-3.8
v3: drop ustat patch

# gpg: Signature made Fri 21 Oct 2016 13:38:06 BST
# gpg:                using RSA key 0xB44890DEDE3C9BC0
# gpg: Good signature from "Riku Voipio <riku.voipio@iki.fi>"
# gpg:                 aka "Riku Voipio <riku.voipio@linaro.org>"
# Primary key fingerprint: FF82 03C8 C391 98AE 0581  41EF B448 90DE DE3C 9BC0

* remotes/riku/tags/pull-linux-user-20160921: (21 commits)
  linux-user: disable unicore32 linux-user build
  linux-user: added support for pwritev() system call.
  linux-user: added support for preadv() system call.
  linux-user: Fix fadvise64() syscall support for Mips32
  linux-user: Redirect termbits.h for Mips64 to termbits.h for Mips32
  linux-user: Update ioctls definitions for Mips32
  linux-user: Update mips_syscall_args[] array in main.c
  linux-user: Add support for syncfs() syscall
  linux-user: Add support for clock_adjtime() syscall
  linux-user: Fix definition of target_sigevent for 32-bit guests
  linux-user: use libc wrapper instead of direct mremap syscall
  linux-user: Don't use alloca() for epoll_wait's epoll event array
  linux-user: add RTA_PRIORITY in netlink
  linux-user: add kcmp() syscall
  linux-user: sparc64: Use correct target SHMLBA in shmat()
  linux-user: Remove a duplicate item from strace.list
  linux-user: Fix syslog() syscall support
  linux-user: Fix socketcall() syscall support
  linux-user: Fix msgrcv() and msgsnd() syscalls support
  linux-user: Fix mq_open() syscall support
  ...
Signed-off-by: NPeter Maydell <peter.maydell@linaro.org>
......@@ -3911,6 +3911,36 @@ if compile_prog "" "" ; then
setns=yes
fi
# clock_adjtime probe
clock_adjtime=no
cat > $TMPC <<EOF
#include <time.h>
int main(void)
{
return clock_adjtime(0, 0);
}
EOF
clock_adjtime=no
if compile_prog "" "" ; then
clock_adjtime=yes
fi
# syncfs probe
syncfs=no
cat > $TMPC <<EOF
#include <unistd.h>
int main(void)
{
return syncfs(0);
}
EOF
syncfs=no
if compile_prog "" "" ; then
syncfs=yes
fi
# Check if tools are available to build documentation.
if test "$docs" != "no" ; then
if has makeinfo && has pod2man; then
......@@ -5196,6 +5226,12 @@ fi
if test "$setns" = "yes" ; then
echo "CONFIG_SETNS=y" >> $config_host_mak
fi
if test "$clock_adjtime" = "yes" ; then
echo "CONFIG_CLOCK_ADJTIME=y" >> $config_host_mak
fi
if test "$syncfs" = "yes" ; then
echo "CONFIG_SYNCFS=y" >> $config_host_mak
fi
if test "$inotify" = "yes" ; then
echo "CONFIG_INOTIFY=y" >> $config_host_mak
fi
......
# Default configuration for unicore32-linux-user
......@@ -2295,8 +2295,8 @@ static const uint8_t mips_syscall_args[] = {
MIPS_SYS(sys_dup3, 3)
MIPS_SYS(sys_pipe2, 2)
MIPS_SYS(sys_inotify_init1, 1)
MIPS_SYS(sys_preadv, 6) /* 4330 */
MIPS_SYS(sys_pwritev, 6)
MIPS_SYS(sys_preadv, 5) /* 4330 */
MIPS_SYS(sys_pwritev, 5)
MIPS_SYS(sys_rt_tgsigqueueinfo, 4)
MIPS_SYS(sys_perf_event_open, 5)
MIPS_SYS(sys_accept4, 4)
......@@ -2308,6 +2308,26 @@ static const uint8_t mips_syscall_args[] = {
MIPS_SYS(sys_open_by_handle_at, 3) /* 4340 */
MIPS_SYS(sys_clock_adjtime, 2)
MIPS_SYS(sys_syncfs, 1)
MIPS_SYS(sys_sendmmsg, 4)
MIPS_SYS(sys_setns, 2)
MIPS_SYS(sys_process_vm_readv, 6) /* 345 */
MIPS_SYS(sys_process_vm_writev, 6)
MIPS_SYS(sys_kcmp, 5)
MIPS_SYS(sys_finit_module, 3)
MIPS_SYS(sys_sched_setattr, 2)
MIPS_SYS(sys_sched_getattr, 3) /* 350 */
MIPS_SYS(sys_renameat2, 5)
MIPS_SYS(sys_seccomp, 3)
MIPS_SYS(sys_getrandom, 3)
MIPS_SYS(sys_memfd_create, 2)
MIPS_SYS(sys_bpf, 3) /* 355 */
MIPS_SYS(sys_execveat, 5)
MIPS_SYS(sys_userfaultfd, 1)
MIPS_SYS(sys_membarrier, 2)
MIPS_SYS(sys_mlock2, 3)
MIPS_SYS(sys_copy_file_range, 6) /* 360 */
MIPS_SYS(sys_preadv2, 6)
MIPS_SYS(sys_pwritev2, 6)
};
# undef MIPS_SYS
# endif /* O32 */
......
......@@ -256,7 +256,7 @@
#define TARGET_NR_remap_file_pages (TARGET_NR_Linux + 251)
#define TARGET_NR_set_tid_address (TARGET_NR_Linux + 252)
#define TARGET_NR_restart_syscall (TARGET_NR_Linux + 253)
#define TARGET_NR_fadvise64 (TARGET_NR_Linux + 254)
#define TARGET_NR_fadvise64_64 (TARGET_NR_Linux + 254)
#define TARGET_NR_statfs64 (TARGET_NR_Linux + 255)
#define TARGET_NR_fstatfs64 (TARGET_NR_Linux + 256)
#define TARGET_NR_timer_create (TARGET_NR_Linux + 257)
......
......@@ -219,8 +219,20 @@ struct target_termios {
#define TARGET_TIOCSBRK 0x5427 /* BSD compatibility */
#define TARGET_TIOCCBRK 0x5428 /* BSD compatibility */
#define TARGET_TIOCGSID 0x7416 /* Return the session ID of FD */
#define TARGET_TCGETS2 TARGET_IOR('T', 0x2A, struct termios2)
#define TARGET_TCSETS2 TARGET_IOW('T', 0x2B, struct termios2)
#define TARGET_TCSETSW2 TARGET_IOW('T', 0x2C, struct termios2)
#define TARGET_TCSETSF2 TARGET_IOW('T', 0x2D, struct termios2)
#define TARGET_TIOCGRS485 TARGET_IOR('T', 0x2E, struct serial_rs485)
#define TARGET_TIOCSRS485 TARGET_IOWR('T', 0x2F, struct serial_rs485)
#define TARGET_TIOCGPTN TARGET_IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */
#define TARGET_TIOCSPTLCK TARGET_IOW('T',0x31, int) /* Lock/unlock Pty */
#define TARGET_TIOCGDEV TARGET_IOR('T', 0x32, unsigned int)
#define TARGET_TIOCSIG TARGET_IOW('T', 0x36, int)
#define TARGET_TIOCVHANGUP 0x5437
#define TARGET_TIOCGPKT TARGET_IOR('T', 0x38, int)
#define TARGET_TIOCGPTLCK TARGET_IOR('T', 0x39, int)
#define TARGET_TIOCGEXCL TARGET_IOR('T', 0x40, int)
/* I hope the range from 0x5480 on is free ... */
#define TARGET_TIOCSCTTY 0x5480 /* become controlling tty */
......
/* from asm/termbits.h */
#include "../mips/termbits.h"
#define TARGET_NCCS 23
struct target_termios {
unsigned int c_iflag; /* input mode flags */
unsigned int c_oflag; /* output mode flags */
unsigned int c_cflag; /* control mode flags */
unsigned int c_lflag; /* local mode flags */
unsigned char c_line; /* line discipline */
unsigned char c_cc[TARGET_NCCS]; /* control characters */
};
/* c_iflag bits */
#define TARGET_IGNBRK 0000001
#define TARGET_BRKINT 0000002
#define TARGET_IGNPAR 0000004
#define TARGET_PARMRK 0000010
#define TARGET_INPCK 0000020
#define TARGET_ISTRIP 0000040
#define TARGET_INLCR 0000100
#define TARGET_IGNCR 0000200
#define TARGET_ICRNL 0000400
#define TARGET_IUCLC 0001000
#define TARGET_IXON 0002000
#define TARGET_IXANY 0004000
#define TARGET_IXOFF 0010000
#define TARGET_IMAXBEL 0020000
#define TARGET_IUTF8 0040000
/* c_oflag bits */
#define TARGET_OPOST 0000001
#define TARGET_OLCUC 0000002
#define TARGET_ONLCR 0000004
#define TARGET_OCRNL 0000010
#define TARGET_ONOCR 0000020
#define TARGET_ONLRET 0000040
#define TARGET_OFILL 0000100
#define TARGET_OFDEL 0000200
#define TARGET_NLDLY 0000400
#define TARGET_NL0 0000000
#define TARGET_NL1 0000400
#define TARGET_CRDLY 0003000
#define TARGET_CR0 0000000
#define TARGET_CR1 0001000
#define TARGET_CR2 0002000
#define TARGET_CR3 0003000
#define TARGET_TABDLY 0014000
#define TARGET_TAB0 0000000
#define TARGET_TAB1 0004000
#define TARGET_TAB2 0010000
#define TARGET_TAB3 0014000
#define TARGET_XTABS 0014000
#define TARGET_BSDLY 0020000
#define TARGET_BS0 0000000
#define TARGET_BS1 0020000
#define TARGET_VTDLY 0040000
#define TARGET_VT0 0000000
#define TARGET_VT1 0040000
#define TARGET_FFDLY 0100000
#define TARGET_FF0 0000000
#define TARGET_FF1 0100000
/* c_cflag bit meaning */
#define TARGET_CBAUD 0010017
#define TARGET_B0 0000000 /* hang up */
#define TARGET_B50 0000001
#define TARGET_B75 0000002
#define TARGET_B110 0000003
#define TARGET_B134 0000004
#define TARGET_B150 0000005
#define TARGET_B200 0000006
#define TARGET_B300 0000007
#define TARGET_B600 0000010
#define TARGET_B1200 0000011
#define TARGET_B1800 0000012
#define TARGET_B2400 0000013
#define TARGET_B4800 0000014
#define TARGET_B9600 0000015
#define TARGET_B19200 0000016
#define TARGET_B38400 0000017
#define TARGET_EXTA B19200
#define TARGET_EXTB B38400
#define TARGET_CSIZE 0000060
#define TARGET_CS5 0000000
#define TARGET_CS6 0000020
#define TARGET_CS7 0000040
#define TARGET_CS8 0000060
#define TARGET_CSTOPB 0000100
#define TARGET_CREAD 0000200
#define TARGET_PARENB 0000400
#define TARGET_PARODD 0001000
#define TARGET_HUPCL 0002000
#define TARGET_CLOCAL 0004000
#define TARGET_CBAUDEX 0010000
#define TARGET_BOTHER 0010000
#define TARGET_B57600 0010001
#define TARGET_B115200 0010002
#define TARGET_B230400 0010003
#define TARGET_B460800 0010004
#define TARGET_B500000 0010005
#define TARGET_B576000 0010006
#define TARGET_B921600 0010007
#define TARGET_B1000000 0010010
#define TARGET_B1152000 0010011
#define TARGET_B1500000 0010012
#define TARGET_B2000000 0010013
#define TARGET_B2500000 0010014
#define TARGET_B3000000 0010015
#define TARGET_B3500000 0010016
#define TARGET_B4000000 0010017
#define TARGET_CIBAUD 002003600000 /* input baud rate (not used) */
#define TARGET_CMSPAR 010000000000 /* mark or space (stick) parity */
#define TARGET_CRTSCTS 020000000000 /* flow control */
/* c_lflag bits */
#define TARGET_ISIG 0000001
#define TARGET_ICANON 0000002
#define TARGET_XCASE 0000004
#define TARGET_ECHO 0000010
#define TARGET_ECHOE 0000020
#define TARGET_ECHOK 0000040
#define TARGET_ECHONL 0000100
#define TARGET_NOFLSH 0000200
#define TARGET_IEXTEN 0000400
#define TARGET_ECHOCTL 0001000
#define TARGET_ECHOPRT 0002000
#define TARGET_ECHOKE 0004000
#define TARGET_FLUSHO 0010000
#define TARGET_PENDIN 0040000
#define TARGET_TOSTOP 0100000
#define TARGET_ITOSTOP TARGET_TOSTOP
/* c_cc character offsets */
#define TARGET_VINTR 0
#define TARGET_VQUIT 1
#define TARGET_VERASE 2
#define TARGET_VKILL 3
#define TARGET_VMIN 4
#define TARGET_VTIME 5
#define TARGET_VEOL2 6
#define TARGET_VSWTC 7
#define TARGET_VSTART 8
#define TARGET_VSTOP 9
#define TARGET_VSUSP 10
/* VDSUSP not supported */
#define TARGET_VREPRINT 12
#define TARGET_VDISCARD 13
#define TARGET_VWERASE 14
#define TARGET_VLNEXT 15
#define TARGET_VEOF 16
#define TARGET_VEOL 17
/* ioctls */
#define TARGET_TCGETA 0x5401
#define TARGET_TCSETA 0x5402 /* Clashes with SNDCTL_TMR_START sound ioctl */
#define TARGET_TCSETAW 0x5403
#define TARGET_TCSETAF 0x5404
#define TARGET_TCSBRK 0x5405
#define TARGET_TCXONC 0x5406
#define TARGET_TCFLSH 0x5407
#define TARGET_TCGETS 0x540d
#define TARGET_TCSETS 0x540e
#define TARGET_TCSETSW 0x540f
#define TARGET_TCSETSF 0x5410
#define TARGET_TIOCEXCL 0x740d /* set exclusive use of tty */
#define TARGET_TIOCNXCL 0x740e /* reset exclusive use of tty */
#define TARGET_TIOCOUTQ 0x7472 /* output queue size */
#define TARGET_TIOCSTI 0x5472 /* simulate terminal input */
#define TARGET_TIOCMGET 0x741d /* get all modem bits */
#define TARGET_TIOCMBIS 0x741b /* bis modem bits */
#define TARGET_TIOCMBIC 0x741c /* bic modem bits */
#define TARGET_TIOCMSET 0x741a /* set all modem bits */
#define TARGET_TIOCPKT 0x5470 /* pty: set/clear packet mode */
#define TARGET_TIOCPKT_DATA 0x00 /* data packet */
#define TARGET_TIOCPKT_FLUSHREAD 0x01 /* flush packet */
#define TARGET_TIOCPKT_FLUSHWRITE 0x02 /* flush packet */
#define TARGET_TIOCPKT_STOP 0x04 /* stop output */
#define TARGET_TIOCPKT_START 0x08 /* start output */
#define TARGET_TIOCPKT_NOSTOP 0x10 /* no more ^S, ^Q */
#define TARGET_TIOCPKT_DOSTOP 0x20 /* now do ^S ^Q */
/* #define TIOCPKT_IOCTL 0x40 state change of pty driver */
#define TARGET_TIOCSWINSZ TARGET_IOW('t', 103, struct winsize) /* set window size */
#define TARGET_TIOCGWINSZ TARGET_IOR('t', 104, struct winsize) /* get window size */
#define TARGET_TIOCNOTTY 0x5471 /* void tty association */
#define TARGET_TIOCSETD 0x7401
#define TARGET_TIOCGETD 0x7400
#define TARGET_FIOCLEX 0x6601
#define TARGET_FIONCLEX 0x6602
#define TARGET_FIOASYNC 0x667d
#define TARGET_FIONBIO 0x667e
#define TARGET_FIOQSIZE 0x667f
#define TARGET_TIOCGLTC 0x7474 /* get special local chars */
#define TARGET_TIOCSLTC 0x7475 /* set special local chars */
#define TARGET_TIOCSPGRP TARGET_IOW('t', 118, int) /* set pgrp of tty */
#define TARGET_TIOCGPGRP TARGET_IOR('t', 119, int) /* get pgrp of tty */
#define TARGET_TIOCCONS TARGET_IOW('t', 120, int) /* become virtual console */
#define TARGET_FIONREAD 0x467f
#define TARGET_TIOCINQ TARGET_FIONREAD
#define TARGET_TIOCGETP 0x7408
#define TARGET_TIOCSETP 0x7409
#define TARGET_TIOCSETN 0x740a /* TIOCSETP wo flush */
/* #define TARGET_TIOCSETA TARGET_IOW('t', 20, struct termios) set termios struct */
/* #define TARGET_TIOCSETAW TARGET_IOW('t', 21, struct termios) drain output, set */
/* #define TARGET_TIOCSETAF TARGET_IOW('t', 22, struct termios) drn out, fls in, set */
/* #define TARGET_TIOCGETD TARGET_IOR('t', 26, int) get line discipline */
/* #define TARGET_TIOCSETD TARGET_IOW('t', 27, int) set line discipline */
/* 127-124 compat */
#define TARGET_TIOCSBRK 0x5427 /* BSD compatibility */
#define TARGET_TIOCCBRK 0x5428 /* BSD compatibility */
#define TARGET_TIOCGSID 0x7416 /* Return the session ID of FD */
#define TARGET_TIOCGPTN TARGET_IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */
#define TARGET_TIOCSPTLCK TARGET_IOW('T',0x31, int) /* Lock/unlock Pty */
/* I hope the range from 0x5480 on is free ... */
#define TARGET_TIOCSCTTY 0x5480 /* become controlling tty */
#define TARGET_TIOCGSOFTCAR 0x5481
#define TARGET_TIOCSSOFTCAR 0x5482
#define TARGET_TIOCLINUX 0x5483
#define TARGET_TIOCGSERIAL 0x5484
#define TARGET_TIOCSSERIAL 0x5485
#define TARGET_TCSBRKP 0x5486 /* Needed for POSIX tcsendbreak() */
#define TARGET_TIOCSERCONFIG 0x5488
#define TARGET_TIOCSERGWILD 0x5489
#define TARGET_TIOCSERSWILD 0x548a
#define TARGET_TIOCGLCKTRMIOS 0x548b
#define TARGET_TIOCSLCKTRMIOS 0x548c
#define TARGET_TIOCSERGSTRUCT 0x548d /* For debugging only */
#define TARGET_TIOCSERGETLSR 0x548e /* Get line status register */
#define TARGET_TIOCSERGETMULTI 0x548f /* Get multiport config */
#define TARGET_TIOCSERSETMULTI 0x5490 /* Set multiport config */
#define TARGET_TIOCMIWAIT 0x5491 /* wait for a change on serial input line(s) */
#define TARGET_TIOCGICOUNT 0x5492 /* read serial port inline interrupt counts */
#define TARGET_TIOCGHAYESESP 0x5493 /* Get Hayes ESP configuration */
#define TARGET_TIOCSHAYESESP 0x5494 /* Set Hayes ESP configuration */
......@@ -17,8 +17,6 @@
* along with this program; if not, see <http://www.gnu.org/licenses/>.
*/
#include "qemu/osdep.h"
#include <linux/mman.h>
#include <linux/unistd.h>
#include "qemu.h"
#include "qemu-common.h"
......@@ -681,10 +679,8 @@ abi_long target_mremap(abi_ulong old_addr, abi_ulong old_size,
mmap_lock();
if (flags & MREMAP_FIXED) {
host_addr = (void *) syscall(__NR_mremap, g2h(old_addr),
old_size, new_size,
flags,
g2h(new_addr));
host_addr = mremap(g2h(old_addr), old_size, new_size,
flags, g2h(new_addr));
if (reserved_va && host_addr != MAP_FAILED) {
/* If new and old addresses overlap then the above mremap will
......@@ -700,10 +696,8 @@ abi_long target_mremap(abi_ulong old_addr, abi_ulong old_size,
errno = ENOMEM;
host_addr = MAP_FAILED;
} else {
host_addr = (void *) syscall(__NR_mremap, g2h(old_addr),
old_size, new_size,
flags | MREMAP_FIXED,
g2h(mmap_start));
host_addr = mremap(g2h(old_addr), old_size, new_size,
flags | MREMAP_FIXED, g2h(mmap_start));
if (reserved_va) {
mmap_reserve(old_addr, old_size);
}
......
......@@ -23,4 +23,11 @@ struct target_pt_regs {
#define TARGET_MLOCKALL_MCL_CURRENT 0x2000
#define TARGET_MLOCKALL_MCL_FUTURE 0x4000
#define TARGET_FORCE_SHMLBA
static inline abi_ulong target_shmlba(CPUSPARCState *env)
{
return MAX(TARGET_PAGE_SIZE, 16 * 1024);
}
#endif /* SPARC64_TARGET_SYSCALL_H */
......@@ -435,6 +435,69 @@ print_fdset(int n, abi_ulong target_fds_addr)
}
#endif
#ifdef TARGET_NR_clock_adjtime
/* IDs of the various system clocks */
#define TARGET_CLOCK_REALTIME 0
#define TARGET_CLOCK_MONOTONIC 1
#define TARGET_CLOCK_PROCESS_CPUTIME_ID 2
#define TARGET_CLOCK_THREAD_CPUTIME_ID 3
#define TARGET_CLOCK_MONOTONIC_RAW 4
#define TARGET_CLOCK_REALTIME_COARSE 5
#define TARGET_CLOCK_MONOTONIC_COARSE 6
#define TARGET_CLOCK_BOOTTIME 7
#define TARGET_CLOCK_REALTIME_ALARM 8
#define TARGET_CLOCK_BOOTTIME_ALARM 9
#define TARGET_CLOCK_SGI_CYCLE 10
#define TARGET_CLOCK_TAI 11
static void
print_clockid(int clockid, int last)
{
switch (clockid) {
case TARGET_CLOCK_REALTIME:
gemu_log("CLOCK_REALTIME");
break;
case TARGET_CLOCK_MONOTONIC:
gemu_log("CLOCK_MONOTONIC");
break;
case TARGET_CLOCK_PROCESS_CPUTIME_ID:
gemu_log("CLOCK_PROCESS_CPUTIME_ID");
break;
case TARGET_CLOCK_THREAD_CPUTIME_ID:
gemu_log("CLOCK_THREAD_CPUTIME_ID");
break;
case TARGET_CLOCK_MONOTONIC_RAW:
gemu_log("CLOCK_MONOTONIC_RAW");
break;
case TARGET_CLOCK_REALTIME_COARSE:
gemu_log("CLOCK_REALTIME_COARSE");
break;
case TARGET_CLOCK_MONOTONIC_COARSE:
gemu_log("CLOCK_MONOTONIC_COARSE");
break;
case TARGET_CLOCK_BOOTTIME:
gemu_log("CLOCK_BOOTTIME");
break;
case TARGET_CLOCK_REALTIME_ALARM:
gemu_log("CLOCK_REALTIME_ALARM");
break;
case TARGET_CLOCK_BOOTTIME_ALARM:
gemu_log("CLOCK_BOOTTIME_ALARM");
break;
case TARGET_CLOCK_SGI_CYCLE:
gemu_log("CLOCK_SGI_CYCLE");
break;
case TARGET_CLOCK_TAI:
gemu_log("CLOCK_TAI");
break;
default:
gemu_log("%d", clockid);
break;
}
gemu_log("%s", get_comma(last));
}
#endif
/*
* Sysycall specific output functions
*/
......@@ -577,6 +640,52 @@ print_syscall_ret_newselect(const struct syscallname *name, abi_long ret)
}
#endif
/* special meanings of adjtimex()' non-negative return values */
#define TARGET_TIME_OK 0 /* clock synchronized, no leap second */
#define TARGET_TIME_INS 1 /* insert leap second */
#define TARGET_TIME_DEL 2 /* delete leap second */
#define TARGET_TIME_OOP 3 /* leap second in progress */
#define TARGET_TIME_WAIT 4 /* leap second has occurred */
#define TARGET_TIME_ERROR 5 /* clock not synchronized */
static void
print_syscall_ret_adjtimex(const struct syscallname *name, abi_long ret)
{
const char *errstr = NULL;
gemu_log(" = ");
if (ret < 0) {
gemu_log("-1 errno=%d", errno);
errstr = target_strerror(-ret);
if (errstr) {
gemu_log(" (%s)", errstr);
}
} else {
gemu_log(TARGET_ABI_FMT_ld, ret);
switch (ret) {
case TARGET_TIME_OK:
gemu_log(" TIME_OK (clock synchronized, no leap second)");
break;
case TARGET_TIME_INS:
gemu_log(" TIME_INS (insert leap second)");
break;
case TARGET_TIME_DEL:
gemu_log(" TIME_DEL (delete leap second)");
break;
case TARGET_TIME_OOP:
gemu_log(" TIME_OOP (leap second in progress)");
break;
case TARGET_TIME_WAIT:
gemu_log(" TIME_WAIT (leap second has occurred)");
break;
case TARGET_TIME_ERROR:
gemu_log(" TIME_ERROR (clock not synchronized)");
break;
}
}
gemu_log("\n");
}
UNUSED static struct flags access_flags[] = {
FLAG_GENERIC(F_OK),
FLAG_GENERIC(R_OK),
......@@ -1050,6 +1159,19 @@ print_chmod(const struct syscallname *name,
}
#endif
#ifdef TARGET_NR_clock_adjtime
static void
print_clock_adjtime(const struct syscallname *name,
abi_long arg0, abi_long arg1, abi_long arg2,
abi_long arg3, abi_long arg4, abi_long arg5)
{
print_syscall_prologue(name);
print_clockid(arg0, 0);
print_pointer(arg1, 1);
print_syscall_epilogue(name);
}
#endif
#ifdef TARGET_NR_clone
static void do_print_clone(unsigned int flags, abi_ulong newsp,
abi_ulong parent_tidptr, target_ulong newtls,
......@@ -1629,29 +1751,32 @@ print_optint:
}
#define PRINT_SOCKOP(name, func) \
[SOCKOP_##name] = { #name, func }
[TARGET_SYS_##name] = { #name, func }
static struct {
const char *name;
void (*print)(const char *, abi_long);
} scall[] = {
PRINT_SOCKOP(socket, do_print_socket),
PRINT_SOCKOP(bind, do_print_sockaddr),
PRINT_SOCKOP(connect, do_print_sockaddr),
PRINT_SOCKOP(listen, do_print_listen),
PRINT_SOCKOP(accept, do_print_sockaddr),
PRINT_SOCKOP(getsockname, do_print_sockaddr),
PRINT_SOCKOP(getpeername, do_print_sockaddr),
PRINT_SOCKOP(socketpair, do_print_socketpair),
PRINT_SOCKOP(send, do_print_sendrecv),
PRINT_SOCKOP(recv, do_print_sendrecv),
PRINT_SOCKOP(sendto, do_print_msgaddr),
PRINT_SOCKOP(recvfrom, do_print_msgaddr),
PRINT_SOCKOP(shutdown, do_print_shutdown),
PRINT_SOCKOP(sendmsg, do_print_msg),
PRINT_SOCKOP(recvmsg, do_print_msg),
PRINT_SOCKOP(setsockopt, do_print_sockopt),
PRINT_SOCKOP(getsockopt, do_print_sockopt),
PRINT_SOCKOP(SOCKET, do_print_socket),
PRINT_SOCKOP(BIND, do_print_sockaddr),
PRINT_SOCKOP(CONNECT, do_print_sockaddr),
PRINT_SOCKOP(LISTEN, do_print_listen),
PRINT_SOCKOP(ACCEPT, do_print_sockaddr),
PRINT_SOCKOP(GETSOCKNAME, do_print_sockaddr),
PRINT_SOCKOP(GETPEERNAME, do_print_sockaddr),
PRINT_SOCKOP(SOCKETPAIR, do_print_socketpair),
PRINT_SOCKOP(SEND, do_print_sendrecv),
PRINT_SOCKOP(RECV, do_print_sendrecv),
PRINT_SOCKOP(SENDTO, do_print_msgaddr),
PRINT_SOCKOP(RECVFROM, do_print_msgaddr),
PRINT_SOCKOP(SHUTDOWN, do_print_shutdown),
PRINT_SOCKOP(SETSOCKOPT, do_print_sockopt),
PRINT_SOCKOP(GETSOCKOPT, do_print_sockopt),
PRINT_SOCKOP(SENDMSG, do_print_msg),
PRINT_SOCKOP(RECVMSG, do_print_msg),
PRINT_SOCKOP(ACCEPT4, NULL),
PRINT_SOCKOP(RECVMMSG, NULL),
PRINT_SOCKOP(SENDMMSG, NULL),
};
static void
......@@ -1778,6 +1903,78 @@ print_rt_sigprocmask(const struct syscallname *name,
}
#endif
#ifdef TARGET_NR_syslog
static void
print_syslog_action(abi_ulong arg, int last)
{
const char *type;
switch (arg) {
case TARGET_SYSLOG_ACTION_CLOSE: {
type = "SYSLOG_ACTION_CLOSE";
break;
}
case TARGET_SYSLOG_ACTION_OPEN: {
type = "SYSLOG_ACTION_OPEN";
break;
}
case TARGET_SYSLOG_ACTION_READ: {
type = "SYSLOG_ACTION_READ";
break;
}
case TARGET_SYSLOG_ACTION_READ_ALL: {
type = "SYSLOG_ACTION_READ_ALL";
break;
}
case TARGET_SYSLOG_ACTION_READ_CLEAR: {
type = "SYSLOG_ACTION_READ_CLEAR";
break;
}
case TARGET_SYSLOG_ACTION_CLEAR: {
type = "SYSLOG_ACTION_CLEAR";
break;
}
case TARGET_SYSLOG_ACTION_CONSOLE_OFF: {
type = "SYSLOG_ACTION_CONSOLE_OFF";
break;
}
case TARGET_SYSLOG_ACTION_CONSOLE_ON: {
type = "SYSLOG_ACTION_CONSOLE_ON";
break;
}
case TARGET_SYSLOG_ACTION_CONSOLE_LEVEL: {
type = "SYSLOG_ACTION_CONSOLE_LEVEL";
break;
}
case TARGET_SYSLOG_ACTION_SIZE_UNREAD: {
type = "SYSLOG_ACTION_SIZE_UNREAD";
break;
}
case TARGET_SYSLOG_ACTION_SIZE_BUFFER: {
type = "SYSLOG_ACTION_SIZE_BUFFER";
break;
}
default: {
print_raw_param("%ld", arg, last);
return;
}
}
gemu_log("%s%s", type, get_comma(last));
}
static void
print_syslog(const struct syscallname *name,
abi_long arg0, abi_long arg1, abi_long arg2,
abi_long arg3, abi_long arg4, abi_long arg5)
{
print_syscall_prologue(name);
print_syslog_action(arg0, 0);
print_pointer(arg1, 0);
print_raw_param("%d", arg2, 1);
print_syscall_epilogue(name);
}
#endif
#ifdef TARGET_NR_mknod
static void
print_mknod(const struct syscallname *name,
......
......@@ -19,7 +19,8 @@
{ TARGET_NR_add_key, "add_key" , NULL, NULL, NULL },
#endif
#ifdef TARGET_NR_adjtimex
{ TARGET_NR_adjtimex, "adjtimex" , NULL, NULL, NULL },
{ TARGET_NR_adjtimex, "adjtimex" , "%s(%p)", NULL,
print_syscall_ret_adjtimex },
#endif
#ifdef TARGET_NR_afs_syscall
{ TARGET_NR_afs_syscall, "afs_syscall" , NULL, NULL, NULL },
......@@ -78,6 +79,9 @@
#ifdef TARGET_NR_chroot
{ TARGET_NR_chroot, "chroot" , NULL, NULL, NULL },
#endif
#ifdef TARGET_NR_clock_adjtime
{ TARGET_NR_clock_adjtime, "clock_adjtime" , NULL, print_clock_adjtime, NULL },
#endif
#ifdef TARGET_NR_clock_getres
{ TARGET_NR_clock_getres, "clock_getres" , NULL, NULL, NULL },
#endif
......@@ -1454,11 +1458,8 @@
#ifdef TARGET_NR_sync
{ TARGET_NR_sync, "sync" , NULL, NULL, NULL },
#endif
#ifdef TARGET_NR_sync_file_range
{ TARGET_NR_sync_file_range, "sync_file_range" , NULL, NULL, NULL },
#endif
#ifdef TARGET_NR_syncfs
{ TARGET_NR_syncfs, "syncfs" , NULL, NULL, NULL },
{ TARGET_NR_syncfs, "syncfs" , "%s(%d)", NULL, NULL },
#endif
#ifdef TARGET_NR_syscall
{ TARGET_NR_syscall, "syscall" , NULL, NULL, NULL },
......@@ -1485,7 +1486,7 @@
{ TARGET_NR_sys_kexec_load, "sys_kexec_load" , NULL, NULL, NULL },
#endif
#ifdef TARGET_NR_syslog
{ TARGET_NR_syslog, "syslog" , NULL, NULL, NULL },
{ TARGET_NR_syslog, "syslog" , NULL, print_syslog, NULL },
#endif
#ifdef TARGET_NR_sysmips
{ TARGET_NR_sysmips, "sysmips" , NULL, NULL, NULL },
......
此差异已折叠。
......@@ -9,26 +9,28 @@
#include "syscall_nr.h"
#define SOCKOP_socket 1
#define SOCKOP_bind 2
#define SOCKOP_connect 3
#define SOCKOP_listen 4
#define SOCKOP_accept 5
#define SOCKOP_getsockname 6
#define SOCKOP_getpeername 7
#define SOCKOP_socketpair 8
#define SOCKOP_send 9
#define SOCKOP_recv 10
#define SOCKOP_sendto 11
#define SOCKOP_recvfrom 12
#define SOCKOP_shutdown 13
#define SOCKOP_setsockopt 14
#define SOCKOP_getsockopt 15
#define SOCKOP_sendmsg 16
#define SOCKOP_recvmsg 17
#define SOCKOP_accept4 18
#define SOCKOP_recvmmsg 19
#define SOCKOP_sendmmsg 20
/* socket operations for socketcall() */
#define TARGET_SYS_SOCKET 1 /* socket() */
#define TARGET_SYS_BIND 2 /* bind() */
#define TARGET_SYS_CONNECT 3 /* connect() */
#define TARGET_SYS_LISTEN 4 /* listen() */
#define TARGET_SYS_ACCEPT 5 /* accept() */
#define TARGET_SYS_GETSOCKNAME 6 /* getsockname() */
#define TARGET_SYS_GETPEERNAME 7 /* getpeername() */
#define TARGET_SYS_SOCKETPAIR 8 /* socketpair() */
#define TARGET_SYS_SEND 9 /* send() */
#define TARGET_SYS_RECV 10 /* recv() */
#define TARGET_SYS_SENDTO 11 /* sendto() */
#define TARGET_SYS_RECVFROM 12 /* recvfrom() */
#define TARGET_SYS_SHUTDOWN 13 /* shutdown() */
#define TARGET_SYS_SETSOCKOPT 14 /* setsockopt() */
#define TARGET_SYS_GETSOCKOPT 15 /* getsockopt() */
#define TARGET_SYS_SENDMSG 16 /* sendmsg() */
#define TARGET_SYS_RECVMSG 17 /* recvmsg() */
#define TARGET_SYS_ACCEPT4 18 /* accept4() */
#define TARGET_SYS_RECVMMSG 19 /* recvmmsg() */
#define TARGET_SYS_SENDMMSG 20 /* sendmmsg() */
#define IPCOP_semop 1
#define IPCOP_semget 2
......@@ -207,6 +209,34 @@ struct target_itimerspec {
struct target_timespec it_value;
};
struct target_timex {
abi_uint modes; /* Mode selector */
abi_long offset; /* Time offset */
abi_long freq; /* Frequency offset */
abi_long maxerror; /* Maximum error (microseconds) */
abi_long esterror; /* Estimated error (microseconds) */
abi_int status; /* Clock command/status */
abi_long constant; /* PLL (phase-locked loop) time constant */
abi_long precision; /* Clock precision (microseconds, ro) */
abi_long tolerance; /* Clock freq. tolerance (ppm, ro) */
struct target_timeval time; /* Current time */
abi_long tick; /* Microseconds between clock ticks */
abi_long ppsfreq; /* PPS (pulse per second) frequency */
abi_long jitter; /* PPS jitter (ro); nanoseconds */
abi_int shift; /* PPS interval duration (seconds) */
abi_long stabil; /* PPS stability */
abi_long jitcnt; /* PPS jitter limit exceeded (ro) */
abi_long calcnt; /* PPS calibration intervals */
abi_long errcnt; /* PPS calibration errors */
abi_long stbcnt; /* PPS stability limit exceeded */
abi_int tai; /* TAI offset */
/* Further padding bytes to allow for future expansion */
abi_int:32; abi_int:32; abi_int:32; abi_int:32;
abi_int:32; abi_int:32; abi_int:32; abi_int:32;
abi_int:32; abi_int:32; abi_int:32;
};
typedef abi_long target_clock_t;
#define TARGET_HZ 100
......@@ -2628,15 +2658,19 @@ typedef int32_t target_timer_t;
struct target_sigevent {
target_sigval_t sigev_value;
int32_t sigev_signo;
int32_t sigev_notify;
abi_int sigev_signo;
abi_int sigev_notify;
union {
int32_t _pad[TARGET_SIGEV_PAD_SIZE];
int32_t _tid;
abi_int _pad[TARGET_SIGEV_PAD_SIZE];
abi_int _tid;
/* The kernel (and thus QEMU) never looks at these;
* they're only used as part of the ABI between a
* userspace program and libc.
*/
struct {
void (*_function)(sigval_t);
void *_attribute;
abi_ulong _function;
abi_ulong _attribute;
} _sigev_thread;
} _sigev_un;
};
......@@ -2652,4 +2686,29 @@ struct target_user_cap_data {
uint32_t inheritable;
};
/* from kernel's include/linux/syslog.h */
/* Close the log. Currently a NOP. */
#define TARGET_SYSLOG_ACTION_CLOSE 0
/* Open the log. Currently a NOP. */
#define TARGET_SYSLOG_ACTION_OPEN 1
/* Read from the log. */
#define TARGET_SYSLOG_ACTION_READ 2
/* Read all messages remaining in the ring buffer. */
#define TARGET_SYSLOG_ACTION_READ_ALL 3
/* Read and clear all messages remaining in the ring buffer */
#define TARGET_SYSLOG_ACTION_READ_CLEAR 4
/* Clear ring buffer. */
#define TARGET_SYSLOG_ACTION_CLEAR 5
/* Disable printk's to console */
#define TARGET_SYSLOG_ACTION_CONSOLE_OFF 6
/* Enable printk's to console */
#define TARGET_SYSLOG_ACTION_CONSOLE_ON 7
/* Set level of messages printed to console */
#define TARGET_SYSLOG_ACTION_CONSOLE_LEVEL 8
/* Return number of unread characters in the log buffer */
#define TARGET_SYSLOG_ACTION_SIZE_UNREAD 9
/* Return size of the log buffer */
#define TARGET_SYSLOG_ACTION_SIZE_BUFFER 10
#endif
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册