Skip to content

Commit

Permalink
sparc: We need to implement arch_ptrace_stop().
Browse files Browse the repository at this point in the history
In order to always provide fully synchronized state to the debugger,
we might need to do a synchronize_user_stack().

A pair of hooks, arch_ptrace_stop_needed() and arch_ptrace_stop(),
exist to handle this kind of situation.  It was created for
the sake of IA64.

Use them, to flush the kernel side cached register windows
to the user stack, when necessary.

Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
David S. Miller committed Dec 17, 2008
1 parent 410d2c8 commit 878a553
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 0 deletions.
10 changes: 10 additions & 0 deletions arch/sparc/include/asm/ptrace_32.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,8 @@ struct sparc_stackf {

#ifdef __KERNEL__

#include <asm/system.h>

static inline bool pt_regs_is_syscall(struct pt_regs *regs)
{
return (regs->psr & PSR_SYSCALL);
Expand All @@ -72,6 +74,14 @@ static inline bool pt_regs_clear_syscall(struct pt_regs *regs)
return (regs->psr &= ~PSR_SYSCALL);
}

#define arch_ptrace_stop_needed(exit_code, info) \
({ flush_user_windows(); \
current_thread_info()->w_saved != 0; \
})

#define arch_ptrace_stop(exit_code, info) \
synchronize_user_stack()

#define user_mode(regs) (!((regs)->psr & PSR_PS))
#define instruction_pointer(regs) ((regs)->pc)
#define user_stack_pointer(regs) ((regs)->u_regs[UREG_FP])
Expand Down
9 changes: 9 additions & 0 deletions arch/sparc/include/asm/ptrace_64.h
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ struct sparc_trapf {
#ifdef __KERNEL__

#include <linux/threads.h>
#include <asm/system.h>

static inline int pt_regs_trap_type(struct pt_regs *regs)
{
Expand All @@ -130,6 +131,14 @@ static inline bool pt_regs_clear_syscall(struct pt_regs *regs)
return (regs->tstate &= ~TSTATE_SYSCALL);
}

#define arch_ptrace_stop_needed(exit_code, info) \
({ flush_user_windows(); \
get_thread_wsaved() != 0; \
})

#define arch_ptrace_stop(exit_code, info) \
synchronize_user_stack()

struct global_reg_snapshot {
unsigned long tstate;
unsigned long tpc;
Expand Down

0 comments on commit 878a553

Please sign in to comment.