On Mon, Jan 15, 2018 at 7:55 AM, Waldemar Kozaczuk <[email protected]>
wrote:

> This patch adds number of syscalls to that are needed to make Golang
> apps run on OSv.
>

Is this based on Benoit's earlier patches or your new additions? If it's
based on Benoit's patch please mention him in the commit message as well.


> Signed-off-by: Waldemar Kozaczuk <[email protected]>
> ---
>  linux.cc | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 54 insertions(+)
>
> diff --git a/linux.cc b/linux.cc
> index d8ed544..cfb0a0e 100644
> --- a/linux.cc
> +++ b/linux.cc
>
@@ -13,6 +13,7 @@
>  #include <osv/mutex.h>
>  #include <osv/waitqueue.hh>
>  #include <osv/stubbing.hh>
> +#include <memory>
>
>  #include <syscall.h>
>  #include <stdarg.h>
> @@ -28,6 +29,13 @@
>  #include <signal.h>
>  #include <sys/select.h>
>  #include <sys/mman.h>
> +#include <sys/types.h>
> +#include <sys/socket.h>
> +#include <sys/stat.h>
> +#include <fcntl.h>
> +#include <sys/ioctl.h>
> +#include <sys/file.h>
> +#include <sys/unistd.h>
>
>  #include <unordered_map>
>
> @@ -309,6 +317,28 @@ static int sys_exit(int ret)
>      return 0;
>  }
>
> +#define __NR_sys_ioctl __NR_ioctl
> +
> +static int sys_ioctl(unsigned int fd, unsigned int command, unsigned long
> arg)
> +{
> +    return ioctl(fd, command, arg);
> +}
>

Why did you need this new "sys_ioctl" function? Why couldn't you just use
the "ioctl" function?
doesn't this work?

     SYSCALL3(ioctl, int, unsigned long, void*);


+
> +static int pselect6(int nfds, fd_set *readfds, fd_set *writefds,
> +                   fd_set *exceptfds, const struct timespec *timeout_ts,
> +                   void *sig)
> +{
> +    const sigset_t *sigmask = NULL;
> +    if(sig) {
> +        debug_always("pselect6(): unimplemented with not-null sigmask\n");
> +        errno = ENOSYS;
> +        return -1;
> +    }
>

Why didn't you just  take a sigset_t *sig and pass it on to pselect()? Why
was it important to check that sig==0?

+
> +    return pselect(nfds, readfds, writefds, exceptfds, timeout_ts,
> sigmask);
>

I think there is a subtle bug here, unfortunately.
pselect() to conform with Posix, does *not* change timeout_ts to show how
much time is left unslept.
However, according to the pselect() manual page, the pselect6() *does* need
to modify the timeout parameter.
So you cannot implement pselect6() using pselect()... Rather, you'll need
to copy the fairly simple definition of pselect() (see core/select.cc) to
pselect6() and define that to set the timeout after the sleep. It should be
easy, I think, because select() which is called in the implementation does
modify the timeout - in OSv like in Linux.



> +}
> +
> +
>  long syscall(long number, ...)
>  {
>      // Save FPU state and restore it at the end of this function
> @@ -331,6 +361,7 @@ long syscall(long number, ...)
>      SYSCALL4(epoll_ctl, int, int, int, struct epoll_event *);
>      SYSCALL4(epoll_wait, int, struct epoll_event *, int, int);
>      SYSCALL4(accept4, int, struct sockaddr *, socklen_t *, int);
> +    SYSCALL3(connect, int, struct sockaddr *, socklen_t);
>      SYSCALL5(get_mempolicy, int *, unsigned long *, unsigned long, void
> *, int);
>      SYSCALL3(sched_getaffinity_syscall, pid_t, unsigned, unsigned long
> *);
>      SYSCALL6(long_mmap, void *, size_t, int, int, int, off_t);
> @@ -343,7 +374,30 @@ long syscall(long number, ...)
>      SYSCALL3(madvise, void *, size_t, int);
>      SYSCALL0(sched_yield);
>      SYSCALL3(mincore, void *, size_t, unsigned char *);
> +    SYSCALL4(openat, int, const char *, int, mode_t);
> +    SYSCALL3(socket, int, int, int);
> +    SYSCALL5(setsockopt, int, int, int, char *, int);
> +    SYSCALL5(getsockopt, int, int, int, char *, unsigned int *);
> +    SYSCALL3(getpeername, int, struct sockaddr *, unsigned int *);
> +    SYSCALL3(bind, int, struct sockaddr *, int);
> +    SYSCALL2(listen, int, int);
> +    SYSCALL3(sys_ioctl, unsigned int, unsigned int, unsigned long);
> +    SYSCALL2(stat, const char *, struct stat *);
> +    SYSCALL2(fstat, int, struct stat *);
> +    SYSCALL3(getsockname, int, struct sockaddr *, socklen_t *);
> +    SYSCALL6(sendto, int, const void *, size_t, int, const struct
> sockaddr *, socklen_t);
> +    SYSCALL3(sendmsg, int, const struct msghdr *, int);
> +    SYSCALL6(recvfrom, int, void *, size_t, int, struct sockaddr *,
> socklen_t *);
> +    SYSCALL3(recvmsg, int, struct msghdr *, int);
>      SYSCALL3(dup3, int, int, int);
> +    SYSCALL2(flock, int, int);
> +    SYSCALL4(pwrite64, int, const void *, size_t, off_t);
> +    SYSCALL1(fdatasync, int);
> +    SYSCALL6(pselect6, int, fd_set *, fd_set *, fd_set *, const struct
> timespec *, void *);
> +    SYSCALL3(fcntl, int, int, int);
> +    SYSCALL4(pread64, int, void *, size_t, off_t);
> +    SYSCALL2(ftruncate, int, off_t);
> +    SYSCALL1(fsync, int);
>      }
>
>      debug_always("syscall(): unimplemented system call %d\n", number);
> --
> 2.7.4
>
> --
> You received this message because you are subscribed to the Google Groups
> "OSv Development" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups "OSv 
Development" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to