mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-07-27 04:13:53 -06:00
linux-user: Fix socketcall() syscall support
Since not all Linux host platforms support socketcall() (most notably Intel), do_socketcall() function in Qemu's syscalls.c is implemented to mirror the corespondant implementation of socketcall() in Linux kernel, and to utilise individual socket operations that are supported on all Linux platforms. (see kernel source file net/socket.c, definition of socketcall). However, error codes produced by Qemu implementation are wrong for the cases of invalid values of the first argument. Also, naming of constants is not consistent with kernel one, and not consistant with Qemu convention of prefixing such constants with "TARGET_". This patch in that light brings do_socketcall() closer to its kernel counterpart, and in that way fixes the errors and yields more consisrtent Qemu code. There were also three missing cases (among 20) for strace support for socketcall(). The array that contains pointers for appropriate printing functions is updated with 3 elements, however pointers to functions are left NULL, and its implementation is left for future. Also, this patch fixes failure of LTP test socketcall02, if executed on some Qemu emulated sywstems (uer mode). Signed-off-by: Aleksandar Markovic <aleksandar.markovic@imgtec.com> Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
This commit is contained in:
parent
da39db63e4
commit
ff71a4545c
3 changed files with 106 additions and 96 deletions
|
@ -1675,29 +1675,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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue