diff options
author | Chen Liqin <liqin.chen@sunplusct.com> | 2009-06-19 01:53:49 -0400 |
---|---|---|
committer | Arnd Bergmann <arnd@arndb.de> | 2009-06-19 05:40:13 -0400 |
commit | 0402c91af944c61bf788370f03326959a35cb8be (patch) | |
tree | 1f522cec2d62050e7fcaed676005b7d43922276e /arch/score/kernel | |
parent | 6bcf67374137f433e85aa42a18fde9f0e8562901 (diff) |
score: update files according to review comments
modified: arch/score/include/asm/cacheflush.h
modified: arch/score/include/asm/delay.h
modified: arch/score/include/asm/errno.h
modified: arch/score/include/asm/pgtable-bits.h
modified: arch/score/include/asm/pgtable.h
modified: arch/score/include/asm/ptrace.h
modified: arch/score/include/asm/unistd.h
modified: arch/score/kernel/entry.S
modified: arch/score/kernel/process.c
modified: arch/score/kernel/ptrace.c
modified: arch/score/kernel/signal.c
modified: arch/score/kernel/sys_score.c
modified: arch/score/kernel/traps.c
modified: arch/score/mm/cache.c
Signed-off-by: Chen Liqin <liqin.chen@sunplusct.com>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Diffstat (limited to 'arch/score/kernel')
-rw-r--r-- | arch/score/kernel/entry.S | 6 | ||||
-rw-r--r-- | arch/score/kernel/process.c | 2 | ||||
-rw-r--r-- | arch/score/kernel/ptrace.c | 144 | ||||
-rw-r--r-- | arch/score/kernel/signal.c | 6 | ||||
-rw-r--r-- | arch/score/kernel/sys_score.c | 7 | ||||
-rw-r--r-- | arch/score/kernel/traps.c | 2 |
6 files changed, 50 insertions, 117 deletions
diff --git a/arch/score/kernel/entry.S b/arch/score/kernel/entry.S index 6c6b7ea58afa..0af89b2f16b0 100644 --- a/arch/score/kernel/entry.S +++ b/arch/score/kernel/entry.S | |||
@@ -23,7 +23,7 @@ | |||
23 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | 23 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
24 | */ | 24 | */ |
25 | 25 | ||
26 | #include <linux/errno.h> | 26 | #include <linux/err.h> |
27 | #include <linux/init.h> | 27 | #include <linux/init.h> |
28 | #include <linux/linkage.h> | 28 | #include <linux/linkage.h> |
29 | 29 | ||
@@ -434,7 +434,7 @@ stack_done: | |||
434 | sw r8, [r0, PT_R7] | 434 | sw r8, [r0, PT_R7] |
435 | b 2f | 435 | b 2f |
436 | 1: | 436 | 1: |
437 | cmpi.c r4, -EMAXERRNO-1 # -EMAXERRNO - 1=-1134 | 437 | cmpi.c r4, -MAX_ERRNO - 1 |
438 | ble 2f | 438 | ble 2f |
439 | ldi r8, 0x1; | 439 | ldi r8, 0x1; |
440 | sw r8, [r0, PT_R7] | 440 | sw r8, [r0, PT_R7] |
@@ -466,7 +466,7 @@ syscall_trace_entry: | |||
466 | lw r7, [r0, PT_R7] | 466 | lw r7, [r0, PT_R7] |
467 | brl r8 | 467 | brl r8 |
468 | 468 | ||
469 | li r8, -EMAXERRNO - 1 # error? | 469 | li r8, -MAX_ERRNO - 1 |
470 | sw r8, [r0, PT_R7] # set error flag | 470 | sw r8, [r0, PT_R7] # set error flag |
471 | 471 | ||
472 | neg r4, r4 # error | 472 | neg r4, r4 # error |
diff --git a/arch/score/kernel/process.c b/arch/score/kernel/process.c index aaa3085251fa..d93966f7ac83 100644 --- a/arch/score/kernel/process.c +++ b/arch/score/kernel/process.c | |||
@@ -56,7 +56,7 @@ void __noreturn cpu_idle(void) | |||
56 | } | 56 | } |
57 | } | 57 | } |
58 | 58 | ||
59 | asmlinkage void ret_from_fork(void); | 59 | void ret_from_fork(void); |
60 | 60 | ||
61 | void start_thread(struct pt_regs *regs, unsigned long pc, unsigned long sp) | 61 | void start_thread(struct pt_regs *regs, unsigned long pc, unsigned long sp) |
62 | { | 62 | { |
diff --git a/arch/score/kernel/ptrace.c b/arch/score/kernel/ptrace.c index 8fe7209355aa..19911e3187be 100644 --- a/arch/score/kernel/ptrace.c +++ b/arch/score/kernel/ptrace.c | |||
@@ -80,7 +80,35 @@ write_tsk_long(struct task_struct *child, | |||
80 | return copied != sizeof(val) ? -EIO : 0; | 80 | return copied != sizeof(val) ? -EIO : 0; |
81 | } | 81 | } |
82 | 82 | ||
83 | void set_single_step(struct task_struct *child) | 83 | /* |
84 | * Get all user integer registers. | ||
85 | */ | ||
86 | static int ptrace_getregs(struct task_struct *tsk, void __user *uregs) | ||
87 | { | ||
88 | struct pt_regs *regs = task_pt_regs(tsk); | ||
89 | |||
90 | return copy_to_user(uregs, regs, sizeof(struct pt_regs)) ? -EFAULT : 0; | ||
91 | } | ||
92 | |||
93 | /* | ||
94 | * Set all user integer registers. | ||
95 | */ | ||
96 | static int ptrace_setregs(struct task_struct *tsk, void __user *uregs) | ||
97 | { | ||
98 | struct pt_regs newregs; | ||
99 | int ret; | ||
100 | |||
101 | ret = -EFAULT; | ||
102 | if (copy_from_user(&newregs, uregs, sizeof(struct pt_regs)) == 0) { | ||
103 | struct pt_regs *regs = task_pt_regs(tsk); | ||
104 | *regs = newregs; | ||
105 | ret = 0; | ||
106 | } | ||
107 | |||
108 | return ret; | ||
109 | } | ||
110 | |||
111 | void user_enable_single_step(struct task_struct *child) | ||
84 | { | 112 | { |
85 | /* far_epc is the target of branch */ | 113 | /* far_epc is the target of branch */ |
86 | unsigned int epc, far_epc = 0; | 114 | unsigned int epc, far_epc = 0; |
@@ -201,7 +229,7 @@ void set_single_step(struct task_struct *child) | |||
201 | } | 229 | } |
202 | } | 230 | } |
203 | 231 | ||
204 | void clear_single_step(struct task_struct *child) | 232 | void user_disable_single_step(struct task_struct *child) |
205 | { | 233 | { |
206 | if (child->thread.insn1_type == 0) | 234 | if (child->thread.insn1_type == 0) |
207 | write_tsk_short(child, child->thread.addr1, | 235 | write_tsk_short(child, child->thread.addr1, |
@@ -230,54 +258,17 @@ void clear_single_step(struct task_struct *child) | |||
230 | child->thread.ss_nextcnt = 0; | 258 | child->thread.ss_nextcnt = 0; |
231 | } | 259 | } |
232 | 260 | ||
233 | 261 | void ptrace_disable(struct task_struct *child) | |
234 | void ptrace_disable(struct task_struct *child) {} | 262 | { |
263 | user_disable_single_step(child); | ||
264 | } | ||
235 | 265 | ||
236 | long | 266 | long |
237 | arch_ptrace(struct task_struct *child, long request, long addr, long data) | 267 | arch_ptrace(struct task_struct *child, long request, long addr, long data) |
238 | { | 268 | { |
239 | int ret; | 269 | int ret; |
240 | 270 | ||
241 | if (request == PTRACE_TRACEME) { | ||
242 | /* are we already being traced? */ | ||
243 | if (current->ptrace & PT_PTRACED) | ||
244 | return -EPERM; | ||
245 | |||
246 | /* set the ptrace bit in the process flags. */ | ||
247 | current->ptrace |= PT_PTRACED; | ||
248 | return 0; | ||
249 | } | ||
250 | |||
251 | ret = -ESRCH; | ||
252 | if (!child) | ||
253 | return ret; | ||
254 | |||
255 | ret = -EPERM; | ||
256 | |||
257 | if (request == PTRACE_ATTACH) { | ||
258 | ret = ptrace_attach(child); | ||
259 | return ret; | ||
260 | } | ||
261 | |||
262 | ret = ptrace_check_attach(child, request == PTRACE_KILL); | ||
263 | if (ret < 0) | ||
264 | return ret; | ||
265 | |||
266 | switch (request) { | 271 | switch (request) { |
267 | case PTRACE_PEEKTEXT: /* read word at location addr. */ | ||
268 | case PTRACE_PEEKDATA: { | ||
269 | unsigned long tmp; | ||
270 | int copied; | ||
271 | |||
272 | copied = access_process_vm(child, addr, &tmp, sizeof(tmp), 0); | ||
273 | ret = -EIO; | ||
274 | if (copied != sizeof(tmp)) | ||
275 | break; | ||
276 | |||
277 | ret = put_user(tmp, (unsigned long *) data); | ||
278 | return ret; | ||
279 | } | ||
280 | |||
281 | /* Read the word at location addr in the USER area. */ | 272 | /* Read the word at location addr in the USER area. */ |
282 | case PTRACE_PEEKUSR: { | 273 | case PTRACE_PEEKUSR: { |
283 | struct pt_regs *regs; | 274 | struct pt_regs *regs; |
@@ -329,15 +320,6 @@ arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
329 | return ret; | 320 | return ret; |
330 | } | 321 | } |
331 | 322 | ||
332 | case PTRACE_POKETEXT: /* write the word at location addr. */ | ||
333 | case PTRACE_POKEDATA: | ||
334 | ret = 0; | ||
335 | if (access_process_vm(child, addr, &data, sizeof(data), 1) | ||
336 | == sizeof(data)) | ||
337 | break; | ||
338 | ret = -EIO; | ||
339 | return ret; | ||
340 | |||
341 | case PTRACE_POKEUSR: { | 323 | case PTRACE_POKEUSR: { |
342 | struct pt_regs *regs; | 324 | struct pt_regs *regs; |
343 | ret = 0; | 325 | ret = 0; |
@@ -372,64 +354,16 @@ arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
372 | break; | 354 | break; |
373 | } | 355 | } |
374 | 356 | ||
375 | case PTRACE_SYSCALL: /* continue and stop at next | 357 | case PTRACE_GETREGS: |
376 | (return from) syscall. */ | 358 | ret = ptrace_getregs(child, (void __user *)data); |
377 | case PTRACE_CONT: { /* restart after signal. */ | ||
378 | ret = -EIO; | ||
379 | if (!valid_signal(data)) | ||
380 | break; | ||
381 | if (request == PTRACE_SYSCALL) | ||
382 | set_tsk_thread_flag(child, TIF_SYSCALL_TRACE); | ||
383 | else | ||
384 | clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE); | ||
385 | |||
386 | child->exit_code = data; | ||
387 | wake_up_process(child); | ||
388 | ret = 0; | ||
389 | break; | ||
390 | } | ||
391 | |||
392 | /* | ||
393 | * make the child exit. Best I can do is send it a sigkill. | ||
394 | * perhaps it should be put in the status that it wants to | ||
395 | * exit. | ||
396 | */ | ||
397 | case PTRACE_KILL: | ||
398 | ret = 0; | ||
399 | if (child->state == EXIT_ZOMBIE) /* already dead. */ | ||
400 | break; | ||
401 | child->exit_code = SIGKILL; | ||
402 | clear_single_step(child); | ||
403 | wake_up_process(child); | ||
404 | break; | 359 | break; |
405 | 360 | ||
406 | case PTRACE_SINGLESTEP: { /* set the trap flag. */ | 361 | case PTRACE_SETREGS: |
407 | ret = -EIO; | 362 | ret = ptrace_setregs(child, (void __user *)data); |
408 | if ((unsigned long) data > _NSIG) | ||
409 | break; | ||
410 | clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE); | ||
411 | set_single_step(child); | ||
412 | child->exit_code = data; | ||
413 | /* give it a chance to run. */ | ||
414 | wake_up_process(child); | ||
415 | ret = 0; | ||
416 | break; | ||
417 | } | ||
418 | |||
419 | case PTRACE_DETACH: /* detach a process that was attached. */ | ||
420 | ret = ptrace_detach(child, data); | ||
421 | break; | ||
422 | |||
423 | case PTRACE_SETOPTIONS: | ||
424 | if (data & PTRACE_O_TRACESYSGOOD) | ||
425 | child->ptrace |= PT_TRACESYSGOOD; | ||
426 | else | ||
427 | child->ptrace &= ~PT_TRACESYSGOOD; | ||
428 | ret = 0; | ||
429 | break; | 363 | break; |
430 | 364 | ||
431 | default: | 365 | default: |
432 | ret = -EIO; | 366 | ret = ptrace_request(child, request, addr, data); |
433 | break; | 367 | break; |
434 | } | 368 | } |
435 | 369 | ||
diff --git a/arch/score/kernel/signal.c b/arch/score/kernel/signal.c index b4ed1b3f8072..5c004084d17d 100644 --- a/arch/score/kernel/signal.c +++ b/arch/score/kernel/signal.c | |||
@@ -132,7 +132,7 @@ void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, | |||
132 | return (void *)((sp - frame_size) & ~7); | 132 | return (void *)((sp - frame_size) & ~7); |
133 | } | 133 | } |
134 | 134 | ||
135 | asmlinkage int score_sigaltstack(struct pt_regs *regs) | 135 | int score_sigaltstack(struct pt_regs *regs) |
136 | { | 136 | { |
137 | const stack_t *uss = (const stack_t *) regs->regs[4]; | 137 | const stack_t *uss = (const stack_t *) regs->regs[4]; |
138 | stack_t *uoss = (stack_t *) regs->regs[5]; | 138 | stack_t *uoss = (stack_t *) regs->regs[5]; |
@@ -141,7 +141,7 @@ asmlinkage int score_sigaltstack(struct pt_regs *regs) | |||
141 | return do_sigaltstack(uss, uoss, usp); | 141 | return do_sigaltstack(uss, uoss, usp); |
142 | } | 142 | } |
143 | 143 | ||
144 | asmlinkage void score_rt_sigreturn(struct pt_regs *regs) | 144 | void score_rt_sigreturn(struct pt_regs *regs) |
145 | { | 145 | { |
146 | struct rt_sigframe __user *frame; | 146 | struct rt_sigframe __user *frame; |
147 | sigset_t set; | 147 | sigset_t set; |
@@ -276,7 +276,7 @@ int handle_signal(unsigned long sig, siginfo_t *info, | |||
276 | return ret; | 276 | return ret; |
277 | } | 277 | } |
278 | 278 | ||
279 | asmlinkage void do_signal(struct pt_regs *regs) | 279 | void do_signal(struct pt_regs *regs) |
280 | { | 280 | { |
281 | struct k_sigaction ka; | 281 | struct k_sigaction ka; |
282 | sigset_t *oldset; | 282 | sigset_t *oldset; |
diff --git a/arch/score/kernel/sys_score.c b/arch/score/kernel/sys_score.c index 6a60d1ee5330..68655f4cbce9 100644 --- a/arch/score/kernel/sys_score.c +++ b/arch/score/kernel/sys_score.c | |||
@@ -64,8 +64,7 @@ sys_mmap2(unsigned long addr, unsigned long len, unsigned long prot, | |||
64 | * Clone a task - this clones the calling program thread. | 64 | * Clone a task - this clones the calling program thread. |
65 | * This is called indirectly via a small wrapper | 65 | * This is called indirectly via a small wrapper |
66 | */ | 66 | */ |
67 | asmlinkage int | 67 | int score_clone(struct pt_regs *regs) |
68 | score_clone(struct pt_regs *regs) | ||
69 | { | 68 | { |
70 | unsigned long clone_flags; | 69 | unsigned long clone_flags; |
71 | unsigned long newsp; | 70 | unsigned long newsp; |
@@ -93,7 +92,7 @@ score_clone(struct pt_regs *regs) | |||
93 | * sys_execve() executes a new program. | 92 | * sys_execve() executes a new program. |
94 | * This is called indirectly via a small wrapper | 93 | * This is called indirectly via a small wrapper |
95 | */ | 94 | */ |
96 | asmlinkage int score_execve(struct pt_regs *regs) | 95 | int score_execve(struct pt_regs *regs) |
97 | { | 96 | { |
98 | int error; | 97 | int error; |
99 | char *filename; | 98 | char *filename; |
@@ -114,7 +113,7 @@ asmlinkage int score_execve(struct pt_regs *regs) | |||
114 | * If we ever come here the user sp is bad. Zap the process right away. | 113 | * If we ever come here the user sp is bad. Zap the process right away. |
115 | * Due to the bad stack signaling wouldn't work. | 114 | * Due to the bad stack signaling wouldn't work. |
116 | */ | 115 | */ |
117 | asmlinkage void bad_stack(void) | 116 | void bad_stack(void) |
118 | { | 117 | { |
119 | do_exit(SIGSEGV); | 118 | do_exit(SIGSEGV); |
120 | } | 119 | } |
diff --git a/arch/score/kernel/traps.c b/arch/score/kernel/traps.c index 957ae9eb3567..0e46fb19a848 100644 --- a/arch/score/kernel/traps.c +++ b/arch/score/kernel/traps.c | |||
@@ -252,7 +252,7 @@ asmlinkage void do_ri(struct pt_regs *regs) | |||
252 | if (current->thread.single_step == 1) { | 252 | if (current->thread.single_step == 1) { |
253 | if ((epc == current->thread.addr1) || | 253 | if ((epc == current->thread.addr1) || |
254 | (epc == current->thread.addr2)) { | 254 | (epc == current->thread.addr2)) { |
255 | clear_single_step(current); | 255 | user_disable_single_step(current); |
256 | force_sig(SIGTRAP, current); | 256 | force_sig(SIGTRAP, current); |
257 | return; | 257 | return; |
258 | } else | 258 | } else |