static inline void _libc_vdso_platform_setup (void) { PREPARE_VERSION_KNOWN (linux26, LINUX_2_6); void *p = _dl_vdso_vsym ("__vdso_gettimeofday", &linux26); PTR_MANGLE (p); VDSO_SYMBOL (gettimeofday) = p; p = _dl_vdso_vsym ("__vdso_clock_gettime", &linux26); PTR_MANGLE (p); VDSO_SYMBOL (clock_gettime) = p; }
static inline void _libc_vdso_platform_setup (void) { PREPARE_VERSION (linux2639, "LINUX_2.6.39", 123718537); void *p = _dl_vdso_vsym ("__kernel_gettimeofday", &linux2639); PTR_MANGLE (p); VDSO_SYMBOL(gettimeofday) = p; p = _dl_vdso_vsym ("__kernel_clock_gettime", &linux2639); PTR_MANGLE (p); VDSO_SYMBOL(clock_gettime) = p; p = _dl_vdso_vsym ("__kernel_clock_getres", &linux2639); PTR_MANGLE (p); VDSO_SYMBOL(clock_getres) = p; }
static void setup_return(struct pt_regs *regs, struct k_sigaction *ka, void __user *frame, int usig) { __sigrestore_t sigtramp; regs->regs[0] = usig; regs->sp = (unsigned long)frame; regs->regs[29] = regs->sp + offsetof(struct rt_sigframe, fp); regs->pc = (unsigned long)ka->sa.sa_handler; if (ka->sa.sa_flags & SA_RESTORER) sigtramp = ka->sa.sa_restorer; #ifdef CONFIG_ARM64_ILP32 else if (is_ilp32_compat_task()) sigtramp = VDSO_SYMBOL(current->mm->context.vdso, sigtramp_ilp32); #endif else sigtramp = VDSO_SYMBOL(current->mm->context.vdso, sigtramp); regs->regs[30] = (unsigned long)sigtramp; }
static inline void _libc_vdso_platform_setup (void) { #ifdef __LP64__ PREPARE_VERSION (linux_version, "LINUX_2.6.39", 123718537); #else PREPARE_VERSION (linux_version, "LINUX_4.9", 61765625); #endif void *p = _dl_vdso_vsym ("__kernel_gettimeofday", &linux_version); PTR_MANGLE (p); VDSO_SYMBOL(gettimeofday) = p; p = _dl_vdso_vsym ("__kernel_clock_gettime", &linux_version); PTR_MANGLE (p); VDSO_SYMBOL(clock_gettime) = p; p = _dl_vdso_vsym ("__kernel_clock_getres", &linux_version); PTR_MANGLE (p); VDSO_SYMBOL(clock_getres) = p; }
static int setup_return(struct pt_regs *regs, struct ksignal *ksig, void __user * frame) { unsigned long handler = (unsigned long)ksig->ka.sa.sa_handler; unsigned long retcode; retcode = VDSO_SYMBOL(current->mm->context.vdso, rt_sigtramp); regs->uregs[0] = ksig->sig; regs->sp = (unsigned long)frame; regs->lp = retcode; regs->ipc = handler; return 0; }
static void setup_return(struct pt_regs *regs, struct k_sigaction *ka, void __user *frame, int usig) { __sigrestore_t sigtramp; regs->regs[0] = usig; regs->sp = (unsigned long)frame; regs->regs[29] = regs->sp + offsetof(struct rt_sigframe, fp); regs->pc = (unsigned long)ka->sa.sa_handler; if (ka->sa.sa_flags & SA_RESTORER) sigtramp = ka->sa.sa_restorer; else sigtramp = VDSO_SYMBOL(current->mm->context.vdso, sigtramp); regs->regs[30] = (unsigned long)sigtramp; }
static int setup_rt_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs) { struct rt_sigframe __user *frame; long err = 0; frame = get_sigframe(ksig, regs, sizeof(*frame)); if (!access_ok(frame, sizeof(*frame))) return -EFAULT; err |= copy_siginfo_to_user(&frame->info, &ksig->info); /* Create the ucontext. */ err |= __put_user(0, &frame->uc.uc_flags); err |= __put_user(NULL, &frame->uc.uc_link); err |= __save_altstack(&frame->uc.uc_stack, regs->sp); err |= setup_sigcontext(frame, regs); err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); if (err) return -EFAULT; /* Set up to return from userspace. */ regs->ra = (unsigned long)VDSO_SYMBOL( current->mm->context.vdso, rt_sigreturn); /* * Set up registers for signal handler. * Registers that we don't modify keep the value they had from * user-space at the time we took the signal. * We always pass siginfo and mcontext, regardless of SA_SIGINFO, * since some things rely on this (e.g. glibc's debug/segfault.c). */ regs->sepc = (unsigned long)ksig->ka.sa.sa_handler; regs->sp = (unsigned long)frame; regs->a0 = ksig->sig; /* a0: signal number */ regs->a1 = (unsigned long)(&frame->info); /* a1: siginfo pointer */ regs->a2 = (unsigned long)(&frame->uc); /* a2: ucontext pointer */ #if DEBUG_SIG pr_info("SIG deliver (%s:%d): sig=%d pc=%p ra=%p sp=%p\n", current->comm, task_pid_nr(current), ksig->sig, (void *)regs->sepc, (void *)regs->ra, frame); #endif return 0; }