diff options
author | Stuart Menefy <stuart.menefy@st.com> | 2006-11-20 21:16:57 -0500 |
---|---|---|
committer | Paul Mundt <lethal@linux-sh.org> | 2006-12-05 20:45:38 -0500 |
commit | f0bc814cfbc212683c882e58b3d1afec6b3e3aa3 (patch) | |
tree | 8ad669003716a3c22fb43e9c2066dcc5e5e0ad2d /arch/sh/kernel/process.c | |
parent | 53644087a607040a56d883df612b588814a56f11 (diff) |
sh: gcc4 support.
This fixes up the kernel for gcc4. The existing exception handlers
needed some wrapping for pt_regs access, acessing the registers
via a RELOC_HIDE() pointer.
The strcpy() issues popped up here too, so add -ffreestanding and
kill off the symbol export.
Signed-off-by: Stuart Menefy <stuart.menefy@st.com>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'arch/sh/kernel/process.c')
-rw-r--r-- | arch/sh/kernel/process.c | 32 |
1 files changed, 18 insertions, 14 deletions
diff --git a/arch/sh/kernel/process.c b/arch/sh/kernel/process.c index a52b13ac6b7f..f3e2631be144 100644 --- a/arch/sh/kernel/process.c +++ b/arch/sh/kernel/process.c | |||
@@ -385,10 +385,11 @@ struct task_struct *__switch_to(struct task_struct *prev, struct task_struct *ne | |||
385 | 385 | ||
386 | asmlinkage int sys_fork(unsigned long r4, unsigned long r5, | 386 | asmlinkage int sys_fork(unsigned long r4, unsigned long r5, |
387 | unsigned long r6, unsigned long r7, | 387 | unsigned long r6, unsigned long r7, |
388 | struct pt_regs regs) | 388 | struct pt_regs __regs) |
389 | { | 389 | { |
390 | struct pt_regs *regs = RELOC_HIDE(&__regs, 0); | ||
390 | #ifdef CONFIG_MMU | 391 | #ifdef CONFIG_MMU |
391 | return do_fork(SIGCHLD, regs.regs[15], ®s, 0, NULL, NULL); | 392 | return do_fork(SIGCHLD, regs->regs[15], regs, 0, NULL, NULL); |
392 | #else | 393 | #else |
393 | /* fork almost works, enough to trick you into looking elsewhere :-( */ | 394 | /* fork almost works, enough to trick you into looking elsewhere :-( */ |
394 | return -EINVAL; | 395 | return -EINVAL; |
@@ -398,11 +399,12 @@ asmlinkage int sys_fork(unsigned long r4, unsigned long r5, | |||
398 | asmlinkage int sys_clone(unsigned long clone_flags, unsigned long newsp, | 399 | asmlinkage int sys_clone(unsigned long clone_flags, unsigned long newsp, |
399 | unsigned long parent_tidptr, | 400 | unsigned long parent_tidptr, |
400 | unsigned long child_tidptr, | 401 | unsigned long child_tidptr, |
401 | struct pt_regs regs) | 402 | struct pt_regs __regs) |
402 | { | 403 | { |
404 | struct pt_regs *regs = RELOC_HIDE(&__regs, 0); | ||
403 | if (!newsp) | 405 | if (!newsp) |
404 | newsp = regs.regs[15]; | 406 | newsp = regs->regs[15]; |
405 | return do_fork(clone_flags, newsp, ®s, 0, | 407 | return do_fork(clone_flags, newsp, regs, 0, |
406 | (int __user *)parent_tidptr, (int __user *)child_tidptr); | 408 | (int __user *)parent_tidptr, (int __user *)child_tidptr); |
407 | } | 409 | } |
408 | 410 | ||
@@ -418,9 +420,10 @@ asmlinkage int sys_clone(unsigned long clone_flags, unsigned long newsp, | |||
418 | */ | 420 | */ |
419 | asmlinkage int sys_vfork(unsigned long r4, unsigned long r5, | 421 | asmlinkage int sys_vfork(unsigned long r4, unsigned long r5, |
420 | unsigned long r6, unsigned long r7, | 422 | unsigned long r6, unsigned long r7, |
421 | struct pt_regs regs) | 423 | struct pt_regs __regs) |
422 | { | 424 | { |
423 | return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs.regs[15], ®s, | 425 | struct pt_regs *regs = RELOC_HIDE(&__regs, 0); |
426 | return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->regs[15], regs, | ||
424 | 0, NULL, NULL); | 427 | 0, NULL, NULL); |
425 | } | 428 | } |
426 | 429 | ||
@@ -429,8 +432,9 @@ asmlinkage int sys_vfork(unsigned long r4, unsigned long r5, | |||
429 | */ | 432 | */ |
430 | asmlinkage int sys_execve(char *ufilename, char **uargv, | 433 | asmlinkage int sys_execve(char *ufilename, char **uargv, |
431 | char **uenvp, unsigned long r7, | 434 | char **uenvp, unsigned long r7, |
432 | struct pt_regs regs) | 435 | struct pt_regs __regs) |
433 | { | 436 | { |
437 | struct pt_regs *regs = RELOC_HIDE(&__regs, 0); | ||
434 | int error; | 438 | int error; |
435 | char *filename; | 439 | char *filename; |
436 | 440 | ||
@@ -442,7 +446,7 @@ asmlinkage int sys_execve(char *ufilename, char **uargv, | |||
442 | error = do_execve(filename, | 446 | error = do_execve(filename, |
443 | (char __user * __user *)uargv, | 447 | (char __user * __user *)uargv, |
444 | (char __user * __user *)uenvp, | 448 | (char __user * __user *)uenvp, |
445 | ®s); | 449 | regs); |
446 | if (error == 0) { | 450 | if (error == 0) { |
447 | task_lock(current); | 451 | task_lock(current); |
448 | current->ptrace &= ~PT_DTRACE; | 452 | current->ptrace &= ~PT_DTRACE; |
@@ -472,9 +476,7 @@ unsigned long get_wchan(struct task_struct *p) | |||
472 | return pc; | 476 | return pc; |
473 | } | 477 | } |
474 | 478 | ||
475 | asmlinkage void break_point_trap(unsigned long r4, unsigned long r5, | 479 | asmlinkage void break_point_trap(void) |
476 | unsigned long r6, unsigned long r7, | ||
477 | struct pt_regs regs) | ||
478 | { | 480 | { |
479 | /* Clear tracing. */ | 481 | /* Clear tracing. */ |
480 | #if defined(CONFIG_CPU_SH4A) | 482 | #if defined(CONFIG_CPU_SH4A) |
@@ -492,8 +494,10 @@ asmlinkage void break_point_trap(unsigned long r4, unsigned long r5, | |||
492 | 494 | ||
493 | asmlinkage void break_point_trap_software(unsigned long r4, unsigned long r5, | 495 | asmlinkage void break_point_trap_software(unsigned long r4, unsigned long r5, |
494 | unsigned long r6, unsigned long r7, | 496 | unsigned long r6, unsigned long r7, |
495 | struct pt_regs regs) | 497 | struct pt_regs __regs) |
496 | { | 498 | { |
497 | regs.pc -= 2; | 499 | struct pt_regs *regs = RELOC_HIDE(&__regs, 0); |
500 | |||
501 | regs->pc -= 2; | ||
498 | force_sig(SIGTRAP, current); | 502 | force_sig(SIGTRAP, current); |
499 | } | 503 | } |