Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1ca97bb5 authored by Al Viro's avatar Al Viro
Browse files

new helper: current_user_stack_pointer()



	Cross-architecture equivalent of rdusp(); default is
user_stack_pointer(current_pt_regs()) - that works for almost all
platforms that have usp saved in pt_regs.  The only exception from
that is ia64 - we want memory stack, not the backing store for
register one.

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 5208ba24
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -72,6 +72,7 @@ struct switch_stack {
#define user_mode(regs) (((regs)->ps & 8) != 0)
#define instruction_pointer(regs) ((regs)->pc)
#define profile_pc(regs) instruction_pointer(regs)
#define current_user_stack_pointer() rdusp()

#define task_pt_regs(task) \
  ((struct pt_regs *) (task_stack_page(task) + 2*PAGE_SIZE) - 1)
+1 −0
Original line number Diff line number Diff line
@@ -106,6 +106,7 @@ struct pt_regs {
#define arch_has_single_step()	(1)
/* common code demands this function */
#define ptrace_disable(child) user_disable_single_step(child)
#define current_user_stack_pointer() rdusp()

extern int is_user_addr_valid(struct task_struct *child,
			      unsigned long start, unsigned long len);
+1 −0
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@
#define PTRACE_SETREGS            13

#define profile_pc(regs) instruction_pointer(regs)
#define current_user_stack_pointer() rdusp()

#endif /* __KERNEL__ */

+1 −0
Original line number Diff line number Diff line
@@ -63,6 +63,7 @@ struct pt_regs {
#define current_pt_regs() ((struct pt_regs *) \
	(THREAD_SIZE + (unsigned long)current_thread_info()) - 1)
#define signal_pt_regs() ((struct pt_regs *)current->thread.esp0)
#define current_user_stack_pointer() rdusp()
#endif /* __KERNEL__ */
#endif /* __ASSEMBLY__ */
#endif /* _H8300_PTRACE_H */
+5 −0
Original line number Diff line number Diff line
@@ -78,6 +78,11 @@ static inline long regs_return_value(struct pt_regs *regs)
	unsigned long __ip = instruction_pointer(regs);			\
	(__ip & ~3UL) + ((__ip & 3UL) << 2);				\
})
/*
 * Why not default?  Because user_stack_pointer() on ia64 gives register
 * stack backing store instead...
 */
#define current_user_stack_pointer() (current_pt_regs()->r12)

  /* given a pointer to a task_struct, return the user's pt_regs */
# define task_pt_regs(t)		(((struct pt_regs *) ((char *) (t) + IA64_STK_OFFSET)) - 1)
Loading