diff -uNr qemu-5.1.0/linux-user/elfload.c qemu-5.1.0.mod/linux-user/elfload.c --- qemu-5.1.0/linux-user/elfload.c 2020-08-11 22:17:15.000000000 +0300 +++ qemu-5.1.0.mod/linux-user/elfload.c 2020-09-05 17:01:16.823064611 +0300 @@ -2331,7 +2331,7 @@ abi_ulong guest_hiaddr) { /* In order to use host shmat, we must be able to honor SHMLBA. */ - uintptr_t align = MAX(SHMLBA, qemu_host_page_size); + uintptr_t align = MAX(/* SHMLBA */ getpagesize(), qemu_host_page_size); if (have_guest_base) { pgb_have_guest_base(image_name, guest_loaddr, guest_hiaddr, align); diff -uNr qemu-5.1.0/linux-user/syscall.c qemu-5.1.0.mod/linux-user/syscall.c --- qemu-5.1.0/linux-user/syscall.c 2020-09-05 16:58:00.063849385 +0300 +++ qemu-5.1.0.mod/linux-user/syscall.c 2020-09-05 17:02:57.910949156 +0300 @@ -45,7 +45,7 @@ #include #include #include -#include +#include #include #include #include @@ -78,12 +78,17 @@ #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 + #include #include #include @@ -264,6 +269,59 @@ #define __NR__llseek __NR_lseek #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 + +_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 + /* Newer kernel ports have llseek() instead of _llseek() */ #if defined(TARGET_NR_llseek) && !defined(TARGET_NR__llseek) #define TARGET_NR__llseek TARGET_NR_llseek @@ -837,6 +895,9 @@ #ifdef TARGET_NR_mq_timedreceive 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 @@ -1328,7 +1389,7 @@ #endif #if defined(TARGET_NR_mq_open) && defined(__NR_mq_open) -#include +#include static inline abi_long copy_from_user_mq_attr(struct mq_attr *attr, abi_ulong target_mq_attr_addr) @@ -3632,6 +3693,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) { @@ -3711,6 +3774,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) { @@ -3841,7 +3914,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; } @@ -3961,7 +4034,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); @@ -3982,7 +4055,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); @@ -4348,7 +4421,7 @@ abi_ulong mmap_start; /* In order to use the host shmat, we need to honor host SHMLBA. */ - mmap_start = mmap_find_vma(0, shm_info.shm_segsz, MAX(SHMLBA, shmlba)); + mmap_start = mmap_find_vma(0, shm_info.shm_segsz, MAX(/* SHMLBA */ getpagesize(), shmlba)); if (mmap_start == -1) { errno = ENOMEM; @@ -5415,6 +5488,9 @@ #endif +#undef winsize +#undef termio + IOCTLEntry ioctl_entries[] = { #define IOCTL(cmd, access, ...) \ { TARGET_ ## cmd, cmd, #cmd, access, 0, { __VA_ARGS__ } }, @@ -8185,7 +8261,7 @@ unlock_user(p, arg1, 0); return ret; #endif -#ifdef TARGET_NR_stime /* not on alpha */ +#if 0 //def TARGET_NR_stime /* not on alpha */ case TARGET_NR_stime: { struct timespec ts; @@ -8249,7 +8325,7 @@ } return ret; #endif -#if defined(TARGET_NR_futimesat) +#if 0 && defined(TARGET_NR_futimesat) case TARGET_NR_futimesat: { struct timeval *tvp, tv[2]; @@ -12008,7 +12084,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; @@ -12026,6 +12102,7 @@ } return ret; #endif +#endif #ifdef CONFIG_SPLICE #ifdef TARGET_NR_tee