summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/kernel/ptrace.c30
-rw-r--r--include/asm-x86/ptrace-abi.h17
2 files changed, 22 insertions, 25 deletions
diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c
index ec86abaab530..3e78c124e2d2 100644
--- a/arch/x86/kernel/ptrace.c
+++ b/arch/x86/kernel/ptrace.c
@@ -479,26 +479,33 @@ static int ptrace_bts_get_buffer_size(struct task_struct *child)
return ds_get_bts_size((void *)child->thread.ds_area_msr);
}
-static int ptrace_bts_get_index(struct task_struct *child)
-{
- if (!child->thread.ds_area_msr)
- return -ENXIO;
-
- return ds_get_bts_index((void *)child->thread.ds_area_msr);
-}
-
static int ptrace_bts_read_record(struct task_struct *child,
long index,
struct bts_struct __user *out)
{
struct bts_struct ret;
int retval;
+ int bts_size;
+ int bts_index;
if (!child->thread.ds_area_msr)
return -ENXIO;
+ if (index < 0)
+ return -EINVAL;
+
+ bts_size = ds_get_bts_size((void *)child->thread.ds_area_msr);
+ if (bts_size <= index)
+ return -EINVAL;
+
+ /* translate the ptrace bts index into the ds bts index */
+ bts_index = ds_get_bts_index((void *)child->thread.ds_area_msr);
+ bts_index -= (index + 1);
+ if (bts_index < 0)
+ bts_index += bts_size;
+
retval = ds_read_bts((void *)child->thread.ds_area_msr,
- index, &ret);
+ bts_index, &ret);
if (retval)
return retval;
@@ -813,10 +820,6 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
ret = ptrace_bts_get_buffer_size(child);
break;
- case PTRACE_BTS_GET_INDEX:
- ret = ptrace_bts_get_index(child);
- break;
-
case PTRACE_BTS_READ_RECORD:
ret = ptrace_bts_read_record
(child, data,
@@ -1017,7 +1020,6 @@ asmlinkage long sys32_ptrace(long request, u32 pid, u32 addr, u32 data)
case PTRACE_BTS_MAX_BUFFER_SIZE:
case PTRACE_BTS_ALLOCATE_BUFFER:
case PTRACE_BTS_GET_BUFFER_SIZE:
- case PTRACE_BTS_GET_INDEX:
case PTRACE_BTS_READ_RECORD:
case PTRACE_BTS_CONFIG:
case PTRACE_BTS_STATUS:
diff --git a/include/asm-x86/ptrace-abi.h b/include/asm-x86/ptrace-abi.h
index 6fadc5214e14..b473ad45e9ca 100644
--- a/include/asm-x86/ptrace-abi.h
+++ b/include/asm-x86/ptrace-abi.h
@@ -99,32 +99,27 @@
ENXIO........no buffer allocated */
#define PTRACE_BTS_GET_BUFFER_SIZE 42
-/* Return the index of the next bts record to be written,
- if successful; -1, otherwise.
- EOPNOTSUPP...processor does not support bts tracing
- ENXIO........no buffer allocated
- After the first warp-around, this is the start of the circular bts buffer. */
-#define PTRACE_BTS_GET_INDEX 43
-
-/* Read the DATA'th bts record into a ptrace_bts_record buffer provided in ADDR.
+/* Read the DATA'th bts record into a ptrace_bts_record buffer
+ provided in ADDR.
+ Records are ordered from newest to oldest.
Return 0, if successful; -1, otherwise
EOPNOTSUPP...processor does not support bts tracing
ENXIO........no buffer allocated
EINVAL.......invalid index */
-#define PTRACE_BTS_READ_RECORD 44
+#define PTRACE_BTS_READ_RECORD 43
/* Configure last branch trace; the configuration is given as a bit-mask of
PTRACE_BTS_O_* options in DATA; parameter ADDR is ignored.
Return 0, if successful; -1, otherwise
EOPNOTSUPP...processor does not support bts tracing
ENXIO........no buffer allocated */
-#define PTRACE_BTS_CONFIG 45
+#define PTRACE_BTS_CONFIG 44
/* Return the configuration as bit-mask of PTRACE_BTS_O_* options
if successful; -1, otherwise.
EOPNOTSUPP...processor does not support bts tracing
ENXIO........no buffer allocated */
-#define PTRACE_BTS_STATUS 46
+#define PTRACE_BTS_STATUS 45
/* Trace configuration options */
/* Collect last branch trace */
OpenPOWER on IntegriCloud