static inline void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs, int framesize) { unsigned long sp; /* Default to using normal stack */ sp = regs->sp; /* * If we are on the alternate signal stack and would overflow it, don't. * Return an always-bogus address instead so we will die with SIGSEGV. */ if (on_sig_stack(sp) && !likely(on_sig_stack(sp - framesize))) return (void __user __force *)(-1UL); /* This is the X/Open sanctioned signal stack switching. */ sp = (sigsp(sp, ksig) - framesize); /* * nds32 mandates 8-byte alignment */ sp &= ~0x7UL; return (void __user *)sp; }
/* * Determine which stack to use.. */ static void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs, size_t frame_size, void __user **fpstate) { unsigned long sp; /* Default to using normal stack */ sp = regs->sp; /* This is the X/Open sanctioned signal stack switching. */ if (ksig->ka.sa.sa_flags & SA_ONSTACK) sp = sigsp(sp, ksig); /* This is the legacy signal stack switching. */ else if ((regs->ss & 0xffff) != __USER32_DS && !(ksig->ka.sa.sa_flags & SA_RESTORER) && ksig->ka.sa.sa_restorer) sp = (unsigned long) ksig->ka.sa.sa_restorer; if (used_math()) { unsigned long fx_aligned, math_size; sp = alloc_mathframe(sp, 1, &fx_aligned, &math_size); *fpstate = (struct _fpstate_ia32 __user *) sp; if (save_xstate_sig(*fpstate, (void __user *)fx_aligned, math_size) < 0) return (void __user *) -1L; } sp -= frame_size; /* Align the stack pointer according to the i386 ABI, * i.e. so that on function entry ((sp + 4) & 15) == 0. */ sp = ((sp - 12) & -16ul) - 4; return (void __user *) sp; }
/* * Determine which stack to use.. */ static inline void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs, size_t frame_size) { unsigned long sp = sigsp(regs->sp, ksig); return (void __user *)((sp - frame_size) & ~7UL); }
/* * Determine which stack to use.. */ static void __user *get_sigframe(struct ksignal *ksig, unsigned long sp) { sp = sigsp(sp, ksig); sp = (sp + 7) & ~7; /* 8byte align stack */ return (void __user *)sp; }
/* * Determine which stack to use.. */ static inline void __user * get_sigframe(struct ksignal *ksig, struct pt_regs *regs, size_t frame_size) { /* Default to using normal stack */ unsigned long sp = sigsp(regs->r1, ksig); return (void __user *)((sp - frame_size) & -8UL); }
/* * Determine which stack to use.. */ static inline void __user *get_sigframe(struct ksignal *ksig, size_t frame_size) { unsigned long sp = sigsp(__frame->sp, ksig); return (void __user *) ((sp - frame_size) & ~7UL); } /* end get_sigframe() */
static inline void __user * get_sigframe(struct ksignal *ksig, size_t frame_size) { unsigned long sp = sigsp(rdusp(), ksig); /* make sure the frame is dword-aligned */ sp &= ~3; return (void __user*)(sp - frame_size); }
static inline void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs, size_t frame_size) { unsigned long sp = regs->sp; /* redzone */ sp -= STACK_FRAME_OVERHEAD; sp = sigsp(sp, ksig); sp = align_sigframe(sp - frame_size); return (void __user *)sp; }
static inline void __user * get_sigframe(struct ksignal *ksig, struct pt_regs *regs, int framesize) { unsigned long sp = sigsp(regs->ARM_sp, ksig); void __user *frame; /* * ATPCS B01 mandates 8-byte alignment */ frame = (void __user *)((sp - framesize) & ~7); /* * Check that we can actually write to the signal frame. */ if (!access_ok(VERIFY_WRITE, frame, framesize)) frame = NULL; return frame; }
static struct rt_sigframe __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs) { unsigned long sp, sp_top; struct rt_sigframe __user *frame; sp = sp_top = sigsp(regs->sp, ksig); sp = (sp - sizeof(struct rt_sigframe)) & ~15; frame = (struct rt_sigframe __user *)sp; /* * Check that we can actually write to the signal frame. */ if (!access_ok(VERIFY_WRITE, frame, sp_top - sp)) frame = NULL; return frame; }
void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs, size_t frame_size) { unsigned long sp; /* Default to using normal stack */ sp = regs->regs[29]; /* * FPU emulator may have it's own trampoline active just * above the user stack, 16-bytes before the next lowest * 16 byte boundary. Try to avoid trashing it. */ sp -= 32; sp = sigsp(sp, ksig); return (void __user *)((sp - frame_size) & (ICACHE_REFILLS_WORKAROUND_WAR ? ~(cpu_icache_line_size()-1) : ALMASK)); }
static inline void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs, unsigned long framesize) { unsigned long sp = regs->u_regs[UREG_FP] + STACK_BIAS; /* * If we are on the alternate signal stack and would overflow it, don't. * Return an always-bogus address instead so we will die with SIGSEGV. */ if (on_sig_stack(sp) && !likely(on_sig_stack(sp - framesize))) return (void __user *) -1L; /* This is the X/Open sanctioned signal stack switching. */ sp = sigsp(sp, ksig) - framesize; /* Always align the stack frame. This handles two cases. First, * sigaltstack need not be mindful of platform specific stack * alignment. Second, if we took this signal because the stack * is not aligned properly, we'd like to take the signal cleanly * and report that. */ sp &= ~15UL; return (void __user *) sp; }
/* * Determine which stack to use.. */ static inline void __user * get_sigframe(struct ksignal *ksig, unsigned long sp, size_t frame_size) { return (void __user *)((sigsp(sp, ksig) - frame_size) & -8ul); }
static inline void __user * get_sigframe(struct ksignal *ksig, struct pt_regs *regs, size_t frame_size) { return (void __user *)((sigsp(rdusp(), ksig) - frame_size) & -8UL); }