new helper: signal_pt_regs()
Always equal to task_pt_regs(current); defined only when we are in signal delivery. It may be different from current_pt_regs() - e.g. architectures like m68k may have pt_regs location on exception different from that on a syscall and signals (just as ptrace handling) may happen on exceptions as well as on syscalls. When they are equal, it's often better to have signal_pt_regs defined (in asm/ptrace.h) as current_pt_regs - that tends to be optimized better than default would be. However, optimisation is the only reason why we might want an arch-specific definition; if current_pt_regs() and task_pt_regs(current) have different values, the latter one is right. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Родитель
4f4202fe5a
Коммит
22062a9630
|
@ -78,6 +78,7 @@ struct switch_stack {
|
|||
|
||||
#define current_pt_regs() \
|
||||
((struct pt_regs *) ((char *)current_thread_info() + 2*PAGE_SIZE) - 1)
|
||||
#define signal_pt_regs current_pt_regs
|
||||
|
||||
#define force_successful_syscall_return() (current_pt_regs()->r0 = 0)
|
||||
|
||||
|
|
|
@ -62,6 +62,7 @@ struct pt_regs {
|
|||
#define profile_pc(regs) instruction_pointer(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)
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* _H8300_PTRACE_H */
|
||||
|
|
|
@ -333,6 +333,15 @@ static inline void user_single_step_siginfo(struct task_struct *tsk,
|
|||
#define ptrace_signal_deliver(regs, cookie) do { } while (0)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* unlike current_pt_regs(), this one is equal to task_pt_regs(current)
|
||||
* on *all* architectures; the only reason to have a per-arch definition
|
||||
* is optimisation.
|
||||
*/
|
||||
#ifndef signal_pt_regs
|
||||
#define signal_pt_regs() task_pt_regs(current)
|
||||
#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);
|
||||
|
|
Загрузка…
Ссылка в новой задаче