Anybody has an idea if this patch is still relevant? None of the golang 
tests I have conducted exposed any issues possibly related to lack of 
arch_prctl SYSCALL.

On Wednesday, August 31, 2016 at 11:22:37 AM UTC-4, Nadav Har'El wrote:
>
>
> On Wed, Aug 31, 2016 at 4:04 PM, Benoit Canet <[email protected] 
> <javascript:>> 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] <javascript:>>
>> Signed-off-by: Benoît Canet <[email protected] <javascript:>>
>> ---
>>  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] <javascript:>.
>> 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