mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-29 07:04:10 +08:00
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: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
5208ba24e7
commit
1ca97bb541
@ -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)
|
||||
|
@ -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);
|
||||
|
@ -10,6 +10,7 @@
|
||||
#define PTRACE_SETREGS 13
|
||||
|
||||
#define profile_pc(regs) instruction_pointer(regs)
|
||||
#define current_user_stack_pointer() rdusp()
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
|
@ -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 */
|
||||
|
@ -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)
|
||||
|
@ -15,6 +15,7 @@
|
||||
#define profile_pc(regs) instruction_pointer(regs)
|
||||
#define current_pt_regs() \
|
||||
(struct pt_regs *)((char *)current_thread_info() + THREAD_SIZE) - 1
|
||||
#define current_user_stack_pointer() rdusp()
|
||||
|
||||
#define arch_has_single_step() (1)
|
||||
|
||||
|
@ -342,6 +342,10 @@ static inline void user_single_step_siginfo(struct task_struct *tsk,
|
||||
#define signal_pt_regs() task_pt_regs(current)
|
||||
#endif
|
||||
|
||||
#ifndef current_user_stack_pointer
|
||||
#define current_user_stack_pointer() user_stack_pointer(current_pt_regs())
|
||||
#endif
|
||||
|
||||
extern int task_current_syscall(struct task_struct *target, long *callno,
|
||||
unsigned long args[6], unsigned int maxargs,
|
||||
unsigned long *sp, unsigned long *pc);
|
||||
|
Loading…
Reference in New Issue
Block a user