On Wed, Aug 31, 2016 at 4:04 PM, Benoit Canet <
[email protected]> wrote:

> Needed by libraries produced by the Go compiler.
>
> With this patch and the golang app the runtime
> init crash later because of a vdso issue.
>
> It can be examinated by insertion an abort()
> before osv send SIGSEGV to the program.
>
> (gdb) bt
>     at /usr/lib/golang/src/runtime/mheap.go:503
>     argc=<error reading variable: Cannot access memory at address
> 0xffffffffffffffcc>, argv=<optimized out>) at core/app.cc:338
> Backtrace stopped: previous frame inner to this frame (corrupt stack?)
> (gdb) frame 9
> 188             CALL    AX
> (gdb) lsit
> Undefined command: "lsit".  Try "help".
> (gdb) list
> 183             RET
> 184     fallback:
> 185             LEAQ    0(SP), DI
> 186             MOVQ    $0, SI
> 187             MOVQ    runtime·__vdso_gettimeofday_sym(SB), AX
> 188             CALL    AX
> 189             MOVQ    0(SP), AX       // sec
> 190             MOVL    8(SP), DX       // usec
> 191             IMULQ   $1000, DX
> 192             // sec is in AX, nsec in DX
> (gdb) p $ax
> $1 = 0
> (gdb)
>
> Signed-off-by: Pekka Enberg <[email protected]>
> Signed-off-by: Benoît Canet <[email protected]>
> ---
>  Makefile          |  1 +
>  arch/x64/msr.hh   |  1 +
>  arch/x64/prctl.cc | 39 +++++++++++++++++++++++++++++++++++++++
>  linux.cc          |  3 +++
>  4 files changed, 44 insertions(+)
>  create mode 100644 arch/x64/prctl.cc
>
> diff --git a/Makefile b/Makefile
> index e294a03..4518da8 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -882,6 +882,7 @@ objects += arch/x64/ioapic.o
>  objects += arch/x64/apic.o
>  objects += arch/x64/apic-clock.o
>  objects += arch/x64/entry-xen.o
> +objects += arch/x64/prctl.o
>  objects += arch/x64/xen.o
>  objects += arch/x64/xen_intr.o
>  objects += core/sampler.o
> diff --git a/arch/x64/msr.hh b/arch/x64/msr.hh
> index d77c75c..9aa8314 100644
> --- a/arch/x64/msr.hh
> +++ b/arch/x64/msr.hh
> @@ -62,6 +62,7 @@ enum class msr : uint32_t {
>      IA32_LSTAR = 0xc0000082,
>      IA32_FMASK = 0xc0000084,
>      IA32_FS_BASE = 0xc0000100,
> +    IA32_GS_BASE = 0xc0000101,
>
>      KVM_WALL_CLOCK = 0x11,
>      KVM_SYSTEM_TIME = 0x12,
> diff --git a/arch/x64/prctl.cc b/arch/x64/prctl.cc
> new file mode 100644
> index 0000000..73ba7c7
> --- /dev/null
> +++ b/arch/x64/prctl.cc
> @@ -0,0 +1,39 @@
> +/*
> + * Copyright (C) 2014 Cloudius Systems, Ltd.
> + *
> + * This work is open source software, licensed under the terms of the
> + * BSD license as described in the LICENSE file in the top-level
> directory.
> + */
> +
> +#include "arch.hh"
> +#include "msr.hh"
> +#include "libc/libc.hh"
> +
> +#include <assert.h>
> +#include <stdio.h>
> +
> +enum {
> +    ARCH_SET_GS = 0x1001,
> +    ARCH_SET_FS = 0x1002,
> +    ARCH_GET_FS = 0x1003,
> +    ARCH_GET_GS = 0x1004,
> +};
> +
> +long arch_prctl(int code, unsigned long addr)
> +{
> +    switch (code) {
> +    case ARCH_SET_GS:
> +        processor::wrmsr(msr::IA32_GS_BASE, addr);
> +        asm volatile ("movq %0, %%gs" :: "r"(addr));
>

By the way, I think these "movq" things are wrong - I don't know what they
are supposed to be doing?



> +        break;
> +    case ARCH_SET_FS:
> +        processor::wrmsr(msr::IA32_FS_BASE, addr);
> +        asm volatile ("movq %0, %%fs" :: "r"(addr));
> +        break;
> +    case ARCH_GET_FS:
> +        return processor::rdmsr(msr::IA32_FS_BASE);
> +    case ARCH_GET_GS:
> +        return processor::rdmsr(msr::IA32_GS_BASE);
> +    }
> +    return libc_error(EINVAL);
> +}
> diff --git a/linux.cc b/linux.cc
> index e78bb0c..03be002 100644
> --- a/linux.cc
> +++ b/linux.cc
> @@ -297,6 +297,8 @@ int rt_sigprocmask(int how, sigset_t * nset, sigset_t
> * oset, size_t sigsetsize)
>      return sigprocmask(how, nset, oset);
>  }
>
> +extern long arch_prctl(int code, unsigned long addr);
> +
>  long syscall(long number, ...)
>  {
>      switch (number) {
> @@ -319,6 +321,7 @@ long syscall(long number, ...)
>      SYSCALL2(munmap, void *, size_t);
>      SYSCALL4(rt_sigaction, int, const struct k_sigaction *, struct
> k_sigaction *, size_t);
>      SYSCALL4(rt_sigprocmask, int, sigset_t *, sigset_t *, size_t);
> +    SYSCALL2(arch_prctl, int, unsigned long);
>      }
>
>      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