Blackfin arch: Allow ptrace access the fixed code.
authorJie Zhang <jie.zhang@analog.com>
Sun, 5 Aug 2007 08:25:23 +0000 (16:25 +0800)
committerBryan Wu <bryan.wu@analog.com>
Sun, 5 Aug 2007 08:25:23 +0000 (16:25 +0800)
Signed-off-by: Jie Zhang <jie.zhang@analog.com>
Signed-off-by: Bryan Wu <bryan.wu@analog.com>
arch/blackfin/kernel/ptrace.c

index ed800c7..64ce5fe 100644 (file)
@@ -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;