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 6c6b7ea58af..0af89b2f16b 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 aaa3085251f..d93966f7ac8 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 8fe7209355a..19911e3187b 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 b4ed1b3f807..5c004084d17 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 6a60d1ee533..68655f4cbce 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 957ae9eb356..0e46fb19a84 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 |
