diff options
author | Jie Zhang <jie.zhang@analog.com> | 2007-08-05 04:25:23 -0400 |
---|---|---|
committer | Bryan Wu <bryan.wu@analog.com> | 2007-08-05 04:25:23 -0400 |
commit | 2615639758c0a9e0f0e14267c9cd2b83801eb8cf (patch) | |
tree | ded6c542741071e93024e67fd8d0fb41db05334d /arch | |
parent | 8a26ac7043b0cb3b446ad9f9a3ec0992d0fea1f7 (diff) |
Blackfin arch: Allow ptrace access the fixed code.
Signed-off-by: Jie Zhang <jie.zhang@analog.com>
Signed-off-by: Bryan Wu <bryan.wu@analog.com>
Diffstat (limited to 'arch')
-rw-r--r-- | 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 ed800c7456dd..64ce5fea8609 100644 --- a/arch/blackfin/kernel/ptrace.c +++ b/arch/blackfin/kernel/ptrace.c | |||
@@ -44,6 +44,7 @@ | |||
44 | #include <asm/processor.h> | 44 | #include <asm/processor.h> |
45 | #include <asm/asm-offsets.h> | 45 | #include <asm/asm-offsets.h> |
46 | #include <asm/dma.h> | 46 | #include <asm/dma.h> |
47 | #include <asm/fixed_code.h> | ||
47 | 48 | ||
48 | #define MAX_SHARED_LIBS 3 | 49 | #define MAX_SHARED_LIBS 3 |
49 | #define TEXT_OFFSET 0 | 50 | #define TEXT_OFFSET 0 |
@@ -169,6 +170,9 @@ static inline int is_user_addr_valid(struct task_struct *child, | |||
169 | && start + len <= (unsigned long)sraml->addr + sraml->length) | 170 | && start + len <= (unsigned long)sraml->addr + sraml->length) |
170 | return 0; | 171 | return 0; |
171 | 172 | ||
173 | if (start >= FIXED_CODE_START && start + len <= FIXED_CODE_END) | ||
174 | return 0; | ||
175 | |||
172 | return -EIO; | 176 | return -EIO; |
173 | } | 177 | } |
174 | 178 | ||
@@ -215,9 +219,13 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
215 | copied = sizeof(tmp); | 219 | copied = sizeof(tmp); |
216 | } else | 220 | } else |
217 | #endif | 221 | #endif |
218 | copied = | 222 | if (addr + add >= FIXED_CODE_START |
219 | access_process_vm(child, addr + add, &tmp, | 223 | && addr + add + sizeof(tmp) <= FIXED_CODE_END) { |
220 | sizeof(tmp), 0); | 224 | memcpy(&tmp, (const void *)(addr + add), sizeof(tmp)); |
225 | copied = sizeof(tmp); | ||
226 | } else | ||
227 | copied = access_process_vm(child, addr + add, &tmp, | ||
228 | sizeof(tmp), 0); | ||
221 | pr_debug("ptrace: copied size %d [0x%08lx]\n", copied, tmp); | 229 | pr_debug("ptrace: copied size %d [0x%08lx]\n", copied, tmp); |
222 | if (copied != sizeof(tmp)) | 230 | if (copied != sizeof(tmp)) |
223 | break; | 231 | break; |
@@ -281,9 +289,13 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
281 | copied = sizeof(data); | 289 | copied = sizeof(data); |
282 | } else | 290 | } else |
283 | #endif | 291 | #endif |
284 | copied = | 292 | if (addr + add >= FIXED_CODE_START |
285 | access_process_vm(child, addr + add, &data, | 293 | && addr + add + sizeof(data) <= FIXED_CODE_END) { |
286 | sizeof(data), 1); | 294 | memcpy((void *)(addr + add), &data, sizeof(data)); |
295 | copied = sizeof(data); | ||
296 | } else | ||
297 | copied = access_process_vm(child, addr + add, &data, | ||
298 | sizeof(data), 1); | ||
287 | pr_debug("ptrace: copied size %d\n", copied); | 299 | pr_debug("ptrace: copied size %d\n", copied); |
288 | if (copied != sizeof(data)) | 300 | if (copied != sizeof(data)) |
289 | break; | 301 | break; |