mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-07 10:24:01 -04:00
[PATCH] ppc64: Add ptrace data breakpoint support
Add hardware data breakpoint support. Signed-off-by: Anton Blanchard <anton@samba.org> Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
committed by
Paul Mackerras
parent
a94d308513
commit
fd9648dff6
@@ -56,6 +56,11 @@
|
||||
#define H_PP1 (1UL<<(63-62))
|
||||
#define H_PP2 (1UL<<(63-63))
|
||||
|
||||
/* DABRX flags */
|
||||
#define H_DABRX_HYPERVISOR (1UL<<(63-61))
|
||||
#define H_DABRX_KERNEL (1UL<<(63-62))
|
||||
#define H_DABRX_USER (1UL<<(63-63))
|
||||
|
||||
/* pSeries hypervisor opcodes */
|
||||
#define H_REMOVE 0x04
|
||||
#define H_ENTER 0x08
|
||||
@@ -101,6 +106,7 @@
|
||||
#define H_VIO_SIGNAL 0x104
|
||||
#define H_SEND_CRQ 0x108
|
||||
#define H_COPY_RDMA 0x110
|
||||
#define H_SET_XDABR 0x134
|
||||
#define H_STUFF_TCE 0x138
|
||||
#define H_PUT_TCE_INDIRECT 0x13C
|
||||
#define H_VTERM_PARTNER_INFO 0x150
|
||||
|
||||
@@ -107,5 +107,14 @@ static inline long plpar_put_term_char(unsigned long termno,
|
||||
lbuf[1]);
|
||||
}
|
||||
|
||||
static inline long plpar_set_xdabr(unsigned long address, unsigned long flags)
|
||||
{
|
||||
return plpar_hcall_norets(H_SET_XDABR, address, flags);
|
||||
}
|
||||
|
||||
static inline long plpar_set_dabr(unsigned long val)
|
||||
{
|
||||
return plpar_hcall_norets(H_SET_DABR, val);
|
||||
}
|
||||
|
||||
#endif /* _PPC64_PLPAR_WRAPPERS_H */
|
||||
|
||||
@@ -433,6 +433,7 @@ struct thread_struct {
|
||||
unsigned long start_tb; /* Start purr when proc switched in */
|
||||
unsigned long accum_tb; /* Total accumilated purr for process */
|
||||
unsigned long vdso_base; /* base of the vDSO library */
|
||||
unsigned long dabr; /* Data address breakpoint register */
|
||||
#ifdef CONFIG_ALTIVEC
|
||||
/* Complete AltiVec register set */
|
||||
vector128 vr[32] __attribute((aligned(16)));
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
#define _PPC64_PTRACE_COMMON_H
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
/*
|
||||
* Set of msr bits that gdb can change on behalf of a process.
|
||||
@@ -141,4 +142,23 @@ static inline int set_vrregs(struct task_struct *task,
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline int ptrace_set_debugreg(struct task_struct *task,
|
||||
unsigned long addr, unsigned long data)
|
||||
{
|
||||
/* We only support one DABR and no IABRS at the moment */
|
||||
if (addr > 0)
|
||||
return -EINVAL;
|
||||
|
||||
/* The bottom 3 bits are flags */
|
||||
if ((data & ~0x7UL) >= TASK_SIZE)
|
||||
return -EIO;
|
||||
|
||||
/* Ensure translation is on */
|
||||
if (data && !(data & DABR_TRANSLATION))
|
||||
return -EIO;
|
||||
|
||||
task->thread.dabr = data;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* _PPC64_PTRACE_COMMON_H */
|
||||
|
||||
@@ -101,6 +101,9 @@ static inline int debugger_dabr_match(struct pt_regs *regs) { return 0; }
|
||||
static inline int debugger_fault_handler(struct pt_regs *regs) { return 0; }
|
||||
#endif
|
||||
|
||||
extern int set_dabr(unsigned long dabr);
|
||||
extern void _exception(int signr, struct pt_regs *regs, int code,
|
||||
unsigned long addr);
|
||||
extern int fix_alignment(struct pt_regs *regs);
|
||||
extern void bad_page_fault(struct pt_regs *regs, unsigned long address,
|
||||
int sig);
|
||||
|
||||
Reference in New Issue
Block a user