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.
