Revision 3b6edd16 linux-user/syscall.c

b/linux-user/syscall.c
66 66
#ifdef CONFIG_EVENTFD
67 67
#include <sys/eventfd.h>
68 68
#endif
69
#ifdef CONFIG_EPOLL
70
#include <sys/epoll.h>
71
#endif
69 72

  
70 73
#define termios host_termios
71 74
#define winsize host_winsize
......
7612 7615
        break;
7613 7616
#endif
7614 7617
#endif
7618
#if defined(CONFIG_EPOLL)
7619
#if defined(TARGET_NR_epoll_create)
7620
    case TARGET_NR_epoll_create:
7621
        ret = get_errno(epoll_create(arg1));
7622
        break;
7623
#endif
7624
#if defined(TARGET_NR_epoll_create1) && defined(CONFIG_EPOLL_CREATE1)
7625
    case TARGET_NR_epoll_create1:
7626
        ret = get_errno(epoll_create1(arg1));
7627
        break;
7628
#endif
7629
#if defined(TARGET_NR_epoll_ctl)
7630
    case TARGET_NR_epoll_ctl:
7631
    {
7632
        struct epoll_event ep;
7633
        struct epoll_event *epp = 0;
7634
        if (arg4) {
7635
            struct target_epoll_event *target_ep;
7636
            if (!lock_user_struct(VERIFY_READ, target_ep, arg4, 1)) {
7637
                goto efault;
7638
            }
7639
            ep.events = tswap32(target_ep->events);
7640
            /* The epoll_data_t union is just opaque data to the kernel,
7641
             * so we transfer all 64 bits across and need not worry what
7642
             * actual data type it is.
7643
             */
7644
            ep.data.u64 = tswap64(target_ep->data.u64);
7645
            unlock_user_struct(target_ep, arg4, 0);
7646
            epp = &ep;
7647
        }
7648
        ret = get_errno(epoll_ctl(arg1, arg2, arg3, epp));
7649
        break;
7650
    }
7651
#endif
7652

  
7653
#if defined(TARGET_NR_epoll_pwait) && defined(CONFIG_EPOLL_PWAIT)
7654
#define IMPLEMENT_EPOLL_PWAIT
7655
#endif
7656
#if defined(TARGET_NR_epoll_wait) || defined(IMPLEMENT_EPOLL_PWAIT)
7657
#if defined(TARGET_NR_epoll_wait)
7658
    case TARGET_NR_epoll_wait:
7659
#endif
7660
#if defined(IMPLEMENT_EPOLL_PWAIT)
7661
    case TARGET_NR_epoll_pwait:
7662
#endif
7663
    {
7664
        struct target_epoll_event *target_ep;
7665
        struct epoll_event *ep;
7666
        int epfd = arg1;
7667
        int maxevents = arg3;
7668
        int timeout = arg4;
7669

  
7670
        target_ep = lock_user(VERIFY_WRITE, arg2,
7671
                              maxevents * sizeof(struct target_epoll_event), 1);
7672
        if (!target_ep) {
7673
            goto efault;
7674
        }
7675

  
7676
        ep = alloca(maxevents * sizeof(struct epoll_event));
7677

  
7678
        switch (num) {
7679
#if defined(IMPLEMENT_EPOLL_PWAIT)
7680
        case TARGET_NR_epoll_pwait:
7681
        {
7682
            target_sigset_t *target_set;
7683
            sigset_t _set, *set = &_set;
7684

  
7685
            if (arg5) {
7686
                target_set = lock_user(VERIFY_READ, arg5,
7687
                                       sizeof(target_sigset_t), 1);
7688
                if (!target_set) {
7689
                    unlock_user(target_ep, arg2, 0);
7690
                    goto efault;
7691
                }
7692
                target_to_host_sigset(set, target_set);
7693
                unlock_user(target_set, arg5, 0);
7694
            } else {
7695
                set = NULL;
7696
            }
7697

  
7698
            ret = get_errno(epoll_pwait(epfd, ep, maxevents, timeout, set));
7699
            break;
7700
        }
7701
#endif
7702
#if defined(TARGET_NR_epoll_wait)
7703
        case TARGET_NR_epoll_wait:
7704
            ret = get_errno(epoll_wait(epfd, ep, maxevents, timeout));
7705
            break;
7706
#endif
7707
        default:
7708
            ret = -TARGET_ENOSYS;
7709
        }
7710
        if (!is_error(ret)) {
7711
            int i;
7712
            for (i = 0; i < ret; i++) {
7713
                target_ep[i].events = tswap32(ep[i].events);
7714
                target_ep[i].data.u64 = tswap64(ep[i].data.u64);
7715
            }
7716
        }
7717
        unlock_user(target_ep, arg2, ret * sizeof(struct target_epoll_event));
7718
        break;
7719
    }
7720
#endif
7721
#endif
7615 7722
    default:
7616 7723
    unimplemented:
7617 7724
        gemu_log("qemu: Unsupported syscall: %d\n", num);

Also available in: Unified diff