Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=e4811f2568c55e595a7bf15a3b9aba863b31fb94
Commit:     e4811f2568c55e595a7bf15a3b9aba863b31fb94
Parent:     3c68904fee1459b6d51040864e15d19098eedef7
Author:     Markus Metzger <[EMAIL PROTECTED]>
AuthorDate: Wed Jan 30 13:31:20 2008 +0100
Committer:  Ingo Molnar <[EMAIL PROTECTED]>
CommitDate: Wed Jan 30 13:31:20 2008 +0100

    x86, ptrace: change BTS GET ptrace interface
    
    Change the ptrace interface to mimick an array from newst to oldest.
    
    Signed-off-by: Markus Metzger <[EMAIL PROTECTED]>
    Signed-off-by: Ingo Molnar <[EMAIL PROTECTED]>
    Signed-off-by: Thomas Gleixner <[EMAIL PROTECTED]>
---
 arch/x86/kernel/ptrace.c     |   30 ++++++++++++++++--------------
 include/asm-x86/ptrace-abi.h |   17 ++++++-----------
 2 files changed, 22 insertions(+), 25 deletions(-)

diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c
index ec86aba..3e78c12 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 6fadc52..b473ad4 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 */
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to