x86, ptrace: change BTS GET ptrace interface
authorMarkus Metzger <markus.t.metzger@intel.com>
Wed, 30 Jan 2008 12:31:20 +0000 (13:31 +0100)
committerIngo Molnar <mingo@elte.hu>
Wed, 30 Jan 2008 12:31:20 +0000 (13:31 +0100)
Change the ptrace interface to mimick an array from newst to oldest.

Signed-off-by: Markus Metzger <markus.t.metzger@intel.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
arch/x86/kernel/ptrace.c
include/asm-x86/ptrace-abi.h

index ec86abaab530fb45e0a5ef15ca65c9fd16836442..3e78c124e2d21d0486729dc1ebdd5777340ea89b 100644 (file)
@@ -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:
index 6fadc5214e1430e6ce7fe3d14c256a440f989d57..b473ad45e9ca072f25bcd40f0753301ce8a923f3 100644 (file)
    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 */