It seems I committed the first version of this patch. I don't know how the
second version differed. If it did, please send an incremental patch.


--
Nadav Har'El
[email protected]

On Mon, Aug 29, 2016 at 4:10 PM, Benoit Canet <
[email protected]> wrote:

> This is one of the first syscall used by go binaries.
> The kernel syscall have some custom layout that must
> be convert forth and back to and from libc. Do it.
>
> Signed-off-by: Benoît Canet <[email protected]>
> ---
>  linux.cc | 29 +++++++++++++++++++++++++++++
>  1 file changed, 29 insertions(+)
>
> diff --git a/linux.cc b/linux.cc
> index 843d131..08341f9 100644
> --- a/linux.cc
> +++ b/linux.cc
> @@ -17,6 +17,7 @@
>  #include <syscall.h>
>  #include <stdarg.h>
>  #include <errno.h>
> +#include <signal.h>
>  #include <time.h>
>  #include <sys/epoll.h>
>  #include <sys/eventfd.h>
> @@ -26,6 +27,8 @@
>
>  #include <unordered_map>
>
> +#include <musl/src/internal/ksigaction.h>
> +
>  extern "C" long gettid()
>  {
>      return sched::thread::current()->id();
> @@ -263,6 +266,31 @@ long long_mmap(void *addr, size_t length, int prot,
> int flags, int fd, off_t off
>          return fn(arg1, arg2, arg3, arg4, arg5, arg6);          \
>          } while (0)
>
> +int rt_sigaction(int sig, const struct k_sigaction * act, struct
> k_sigaction * oact, size_t sigsetsize)
> +{
> +    struct sigaction libc_act, libc_oact, *libc_act_p = nullptr;
> +    memset(&libc_act, 0, sizeof(libc_act));
> +    memset(&libc_oact, 0, sizeof(libc_act));
> +
> +    if (act) {
> +        libc_act.sa_handler = act->handler;
> +        libc_act.sa_flags = act->flags & ~SA_RESTORER;
> +        libc_act.sa_restorer = nullptr;
> +        memcpy(&libc_act.sa_mask, &act->mask, sizeof(libc_act.sa_mask));
> +        libc_act_p = &libc_act;
> +    }
> +
> +    int ret = sigaction(sig, libc_act_p, &libc_oact);
> +
> +    if (oact) {
> +        oact->handler = libc_oact.sa_handler;
> +        oact->flags = libc_oact.sa_flags;
> +        oact->restorer = nullptr;
> +        memcpy(oact->mask, &libc_oact.sa_mask, sizeof(oact->mask));
> +    }
> +
> +    return ret;
> +}
>
>  long syscall(long number, ...)
>  {
> @@ -284,6 +312,7 @@ long syscall(long number, ...)
>      SYSCALL3(sched_getaffinity_syscall, pid_t, unsigned, unsigned long
> *);
>      SYSCALL6(long_mmap, void *, size_t, int, int, int, off_t);
>      SYSCALL2(munmap, void *, size_t);
> +    SYSCALL4(rt_sigaction, int, const struct k_sigaction *, struct
> k_sigaction *, size_t);
>      }
>
>      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