termux-packages/x11-packages/qemu-system-x86_64/qemu-2.12.1_linux-user_sysc...

229 lines
6.6 KiB
Diff

diff -uNr qemu-2.12.1/linux-user/syscall.c qemu-2.12.1.mod/linux-user/syscall.c
--- qemu-2.12.1/linux-user/syscall.c 2018-08-03 00:48:53.000000000 +0300
+++ qemu-2.12.1.mod/linux-user/syscall.c 2018-09-17 16:27:46.997395814 +0300
@@ -42,7 +42,7 @@
#include <poll.h>
#include <sys/times.h>
#include <sys/shm.h>
-#include <sys/sem.h>
+#include <linux/sem.h>
#include <sys/statfs.h>
#include <utime.h>
#include <sys/sysinfo.h>
@@ -76,12 +76,16 @@
#endif
#define termios host_termios
+#define termios2 host_termios2
+#define ktermios host_ktermios
#define winsize host_winsize
#define termio host_termio
#define sgttyb host_sgttyb /* same as target */
#define tchars host_tchars /* same as target */
#define ltchars host_ltchars /* same as target */
+#undef __ASM_GENERIC_TERMBITS_H
+#include <asm/termbits.h>
#include <linux/termios.h>
#include <linux/unistd.h>
#include <linux/cdrom.h>
@@ -250,6 +254,64 @@
#define TARGET_NR__llseek TARGET_NR_llseek
#endif
+_syscall0(int, vhangup)
+#ifdef __NR_msgctl
+_syscall3(int, msgctl, int, msqid, int, cmd, struct msqid_ds *, buf)
+#else
+static int
+msgctl (int msqid, int cmd, struct msqid_ds *buf)
+{
+ return syscall (__NR_ipc, IPCOP_msgctl,
+ msqid, cmd | 0x100, 0, buf);
+}
+#endif
+#ifdef __NR_semget
+_syscall3(int, semget, key_t, key, int, nsems, int, semflg)
+#else
+static int
+semget (key_t key,
+ int nsems,
+ int semflg)
+{
+ return syscall (__NR_ipc, IPCOP_semget, key, nsems, semflg, NULL);
+}
+#endif
+_syscall1(int, adjtimex, struct timex *, buf)
+_syscall2(int, sethostname, const char *, name, size_t, len)
+_syscall2(int, setdomainname, const char *, name, size_t, len)
+#ifdef __NR_msgget
+_syscall2(int, msgget, key_t, key, int, msgflg)
+#else
+static int
+msgget (key_t key,
+ int msgflg)
+{
+ return syscall(__NR_ipc, 5, IPCOP_msgget, key, msgflg, 0, NULL);
+}
+#endif
+
+#ifdef _NSIG_WORDS
+static int sigorset(sigset_t *dest, const sigset_t *a, const sigset_t *b)
+{
+ int i;
+ if (!dest || !a || !b)
+ return -1;
+ for (i = 0; i < _NSIG_WORDS; i++)
+ dest->sig[i] = a->sig[i] | b->sig[i];
+ return 0;
+}
+#else
+static int sigorset(sigset_t *dest, const sigset_t *a, const sigset_t *b)
+{
+ int i;
+ if (!dest || !a || !b)
+ return -1;
+ *dest = *a | *b;
+ return 0;
+}
+#endif
+
+#if 0
#ifdef __NR_gettid
_syscall0(int, gettid)
#else
@@ -259,6 +321,7 @@
return -ENOSYS;
}
#endif
+#endif
#if defined(TARGET_NR_getdents) && defined(__NR_getdents)
_syscall3(int, sys_getdents, uint, fd, struct linux_dirent *, dirp, uint, count);
#endif
@@ -1028,6 +1091,9 @@
size_t, len, unsigned, prio, const struct timespec *, timeout)
safe_syscall5(int, mq_timedreceive, int, mqdes, char *, msg_ptr,
size_t, len, unsigned *, prio, const struct timespec *, timeout)
+_syscall1(int, mq_unlink, const char *, name)
+_syscall4(__kernel_mqd_t, mq_open, const char *, name, int, oflag, mode_t, mode,
+ struct mq_attr *, attr)
#endif
/* We do ioctl like this rather than via safe_syscall3 to preserve the
* "third argument might be integer or pointer or not present" behaviour of
@@ -1406,7 +1472,7 @@
}
#if defined(TARGET_NR_mq_open) && defined(__NR_mq_open)
-#include <mqueue.h>
+#include <linux/mqueue.h>
static inline abi_long copy_from_user_mq_attr(struct mq_attr *attr,
abi_ulong target_mq_attr_addr)
@@ -4290,6 +4356,8 @@
return 0;
}
+#define semid_ds __kernel_legacy_semid_ds
+
static inline abi_long target_to_host_semid_ds(struct semid_ds *host_sd,
abi_ulong target_addr)
{
@@ -4369,6 +4437,16 @@
abi_ulong __buf;
};
+#ifdef __NR_semctl
+_syscall4(int, semctl, int, semid, int, semnum, int, cmd, union semun, arg4)
+#else
+static int semctl(int semid, int semnum, int cmd, union semun arg4)
+{
+ return syscall(__NR_ipc, IPCOP_semctl, semid, semnum, cmd | 0x100,
+ arg4.__buf);
+}
+#endif
+
static inline abi_long target_to_host_semarray(int semid, unsigned short **host_array,
abi_ulong target_addr)
{
@@ -4499,7 +4577,7 @@
case GETPID:
case GETNCNT:
case GETZCNT:
- ret = get_errno(semctl(semid, semnum, cmd, NULL));
+ ret = get_errno(semctl(semid, semnum, cmd, (union semun) {.buf = NULL}));
break;
}
@@ -4581,7 +4659,7 @@
host_md->msg_stime = tswapal(target_md->msg_stime);
host_md->msg_rtime = tswapal(target_md->msg_rtime);
host_md->msg_ctime = tswapal(target_md->msg_ctime);
- host_md->__msg_cbytes = tswapal(target_md->__msg_cbytes);
+ host_md->msg_cbytes = tswapal(target_md->__msg_cbytes);
host_md->msg_qnum = tswapal(target_md->msg_qnum);
host_md->msg_qbytes = tswapal(target_md->msg_qbytes);
host_md->msg_lspid = tswapal(target_md->msg_lspid);
@@ -4602,7 +4680,7 @@
target_md->msg_stime = tswapal(host_md->msg_stime);
target_md->msg_rtime = tswapal(host_md->msg_rtime);
target_md->msg_ctime = tswapal(host_md->msg_ctime);
- target_md->__msg_cbytes = tswapal(host_md->__msg_cbytes);
+ target_md->__msg_cbytes = tswapal(host_md->msg_cbytes);
target_md->msg_qnum = tswapal(host_md->msg_qnum);
target_md->msg_qbytes = tswapal(host_md->msg_qbytes);
target_md->msg_lspid = tswapal(host_md->msg_lspid);
@@ -5673,6 +5751,9 @@
}
#endif
+#undef winsize
+#undef termio
+
static IOCTLEntry ioctl_entries[] = {
#define IOCTL(cmd, access, ...) \
{ TARGET_ ## cmd, cmd, #cmd, access, 0, { __VA_ARGS__ } },
@@ -7691,7 +7772,7 @@
/* create temporary file to map stat to */
tmpdir = getenv("TMPDIR");
if (!tmpdir)
- tmpdir = "/tmp";
+ tmpdir = "@TERMUX_PREFIX@/tmp";
snprintf(filename, sizeof(filename), "%s/qemu-open.XXXXXX", tmpdir);
fd = mkstemp(filename);
if (fd < 0) {
@@ -8310,7 +8391,7 @@
unlock_user(p, arg1, 0);
break;
#endif
-#ifdef TARGET_NR_stime /* not on alpha */
+#if 0 // def TARGET_NR_stime /* not on alpha */
case TARGET_NR_stime:
{
time_t host_time;
@@ -8381,7 +8462,7 @@
}
break;
#endif
-#if defined(TARGET_NR_futimesat)
+#if 0 && defined(TARGET_NR_futimesat)
case TARGET_NR_futimesat:
{
struct timeval *tvp, tv[2];
@@ -12125,7 +12206,7 @@
/* Not implemented for now... */
/* case TARGET_NR_mq_notify: */
/* break; */
-
+#if 0
case TARGET_NR_mq_getsetattr:
{
struct mq_attr posix_mq_attr_in, posix_mq_attr_out;
@@ -12143,6 +12224,7 @@
}
break;
#endif
+#endif
#ifdef CONFIG_SPLICE
#ifdef TARGET_NR_tee