Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=2615639758c0a9e0f0e14267c9cd2b83801eb8cf
Commit:     2615639758c0a9e0f0e14267c9cd2b83801eb8cf
Parent:     8a26ac7043b0cb3b446ad9f9a3ec0992d0fea1f7
Author:     Jie Zhang <[EMAIL PROTECTED]>
AuthorDate: Sun Aug 5 16:25:23 2007 +0800
Committer:  Bryan Wu <[EMAIL PROTECTED]>
CommitDate: Sun Aug 5 16:25:23 2007 +0800

    Blackfin arch: Allow ptrace access the fixed code.
    
    Signed-off-by: Jie Zhang <[EMAIL PROTECTED]>
    Signed-off-by: Bryan Wu <[EMAIL PROTECTED]>
---
 arch/blackfin/kernel/ptrace.c |   24 ++++++++++++++++++------
 1 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/arch/blackfin/kernel/ptrace.c b/arch/blackfin/kernel/ptrace.c
index ed800c7..64ce5fe 100644
--- a/arch/blackfin/kernel/ptrace.c
+++ b/arch/blackfin/kernel/ptrace.c
@@ -44,6 +44,7 @@
 #include <asm/processor.h>
 #include <asm/asm-offsets.h>
 #include <asm/dma.h>
+#include <asm/fixed_code.h>
 
 #define MAX_SHARED_LIBS 3
 #define TEXT_OFFSET 0
@@ -169,6 +170,9 @@ static inline int is_user_addr_valid(struct task_struct 
*child,
                    && start + len <= (unsigned long)sraml->addr + 
sraml->length)
                        return 0;
 
+       if (start >= FIXED_CODE_START && start + len <= FIXED_CODE_END)
+               return 0;
+
        return -EIO;
 }
 
@@ -215,9 +219,13 @@ long arch_ptrace(struct task_struct *child, long request, 
long addr, long data)
                                copied = sizeof(tmp);
                        } else
 #endif
-                       copied =
-                           access_process_vm(child, addr + add, &tmp,
-                                             sizeof(tmp), 0);
+                       if (addr + add >= FIXED_CODE_START
+                           && addr + add + sizeof(tmp) <= FIXED_CODE_END) {
+                               memcpy(&tmp, (const void *)(addr + add), 
sizeof(tmp));
+                               copied = sizeof(tmp);
+                       } else
+                               copied = access_process_vm(child, addr + add, 
&tmp,
+                                                          sizeof(tmp), 0);
                        pr_debug("ptrace: copied size %d [0x%08lx]\n", copied, 
tmp);
                        if (copied != sizeof(tmp))
                                break;
@@ -281,9 +289,13 @@ long arch_ptrace(struct task_struct *child, long request, 
long addr, long data)
                                copied = sizeof(data);
                        } else
 #endif
-                       copied =
-                           access_process_vm(child, addr + add, &data,
-                                             sizeof(data), 1);
+                       if (addr + add >= FIXED_CODE_START
+                           && addr + add + sizeof(data) <= FIXED_CODE_END) {
+                               memcpy((void *)(addr + add), &data, 
sizeof(data));
+                               copied = sizeof(data);
+                       } else
+                               copied = access_process_vm(child, addr + add, 
&data,
+                                                          sizeof(data), 1);
                        pr_debug("ptrace: copied size %d\n", copied);
                        if (copied != sizeof(data))
                                break;
-
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