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 */