diff options
author | Chris Metcalf <cmetcalf@tilera.com> | 2010-10-14 14:34:33 -0400 |
---|---|---|
committer | Chris Metcalf <cmetcalf@tilera.com> | 2010-10-14 14:34:33 -0400 |
commit | d929b6aeaacbe78cbfef4a80e3eed1bf0464d984 (patch) | |
tree | 5f121a845d616a3926768c2fa1b25c4ae417d9c2 /arch/tile/kernel | |
parent | ce0ecc8abfa9904e27a5f3ac4dd83398b134278d (diff) |
arch/tile: Use <asm-generic/syscalls.h>
With this change we now include <asm-generic/syscalls.h> into the "tile"
version of the header. To take full advantage of the prototypes there,
we also change our naming convention for "struct pt_regs *" syscalls so
that, e.g., _sys_execve() is the "true" syscall entry, which sets the
appropriate register to point to the pt_regs before calling sys_execve().
While doing this I realized I no longer needed the fork and vfork
entry point stubs, since those functions aren't in the generic
syscall ABI, so I removed them as well.
Signed-off-by: Chris Metcalf <cmetcalf@tilera.com>
Diffstat (limited to 'arch/tile/kernel')
-rw-r--r-- | arch/tile/kernel/compat.c | 6 | ||||
-rw-r--r-- | arch/tile/kernel/compat_signal.c | 10 | ||||
-rw-r--r-- | arch/tile/kernel/intvec_32.S | 23 | ||||
-rw-r--r-- | arch/tile/kernel/process.c | 31 | ||||
-rw-r--r-- | arch/tile/kernel/signal.c | 6 | ||||
-rw-r--r-- | arch/tile/kernel/sys.c | 9 |
6 files changed, 43 insertions, 42 deletions
diff --git a/arch/tile/kernel/compat.c b/arch/tile/kernel/compat.c index b1e06d041555..5f24e54bf3c5 100644 --- a/arch/tile/kernel/compat.c +++ b/arch/tile/kernel/compat.c | |||
@@ -157,6 +157,12 @@ long tile_compat_sys_msgrcv(int msqid, | |||
157 | /* Pass full 64-bit values through ptrace. */ | 157 | /* Pass full 64-bit values through ptrace. */ |
158 | #define compat_sys_ptrace tile_compat_sys_ptrace | 158 | #define compat_sys_ptrace tile_compat_sys_ptrace |
159 | 159 | ||
160 | /* Call the trampolines to manage pt_regs where necessary. */ | ||
161 | #define compat_sys_execve _compat_sys_execve | ||
162 | #define compat_sys_sigaltstack _compat_sys_sigaltstack | ||
163 | #define compat_sys_rt_sigreturn _compat_sys_rt_sigreturn | ||
164 | #define sys_clone _sys_clone | ||
165 | |||
160 | /* | 166 | /* |
161 | * Note that we can't include <linux/unistd.h> here since the header | 167 | * Note that we can't include <linux/unistd.h> here since the header |
162 | * guard will defeat us; <asm/unistd.h> checks for __SYSCALL as well. | 168 | * guard will defeat us; <asm/unistd.h> checks for __SYSCALL as well. |
diff --git a/arch/tile/kernel/compat_signal.c b/arch/tile/kernel/compat_signal.c index 9c710db43f13..fb64b99959d4 100644 --- a/arch/tile/kernel/compat_signal.c +++ b/arch/tile/kernel/compat_signal.c | |||
@@ -256,9 +256,9 @@ int copy_siginfo_from_user32(siginfo_t *to, struct compat_siginfo __user *from) | |||
256 | return err; | 256 | return err; |
257 | } | 257 | } |
258 | 258 | ||
259 | long _compat_sys_sigaltstack(const struct compat_sigaltstack __user *uss_ptr, | 259 | long compat_sys_sigaltstack(const struct compat_sigaltstack __user *uss_ptr, |
260 | struct compat_sigaltstack __user *uoss_ptr, | 260 | struct compat_sigaltstack __user *uoss_ptr, |
261 | struct pt_regs *regs) | 261 | struct pt_regs *regs) |
262 | { | 262 | { |
263 | stack_t uss, uoss; | 263 | stack_t uss, uoss; |
264 | int ret; | 264 | int ret; |
@@ -291,7 +291,7 @@ long _compat_sys_sigaltstack(const struct compat_sigaltstack __user *uss_ptr, | |||
291 | return ret; | 291 | return ret; |
292 | } | 292 | } |
293 | 293 | ||
294 | long _compat_sys_rt_sigreturn(struct pt_regs *regs) | 294 | long compat_sys_rt_sigreturn(struct pt_regs *regs) |
295 | { | 295 | { |
296 | struct compat_rt_sigframe __user *frame = | 296 | struct compat_rt_sigframe __user *frame = |
297 | (struct compat_rt_sigframe __user *) compat_ptr(regs->sp); | 297 | (struct compat_rt_sigframe __user *) compat_ptr(regs->sp); |
@@ -312,7 +312,7 @@ long _compat_sys_rt_sigreturn(struct pt_regs *regs) | |||
312 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &r0)) | 312 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &r0)) |
313 | goto badframe; | 313 | goto badframe; |
314 | 314 | ||
315 | if (_compat_sys_sigaltstack(&frame->uc.uc_stack, NULL, regs) != 0) | 315 | if (compat_sys_sigaltstack(&frame->uc.uc_stack, NULL, regs) != 0) |
316 | goto badframe; | 316 | goto badframe; |
317 | 317 | ||
318 | return r0; | 318 | return r0; |
diff --git a/arch/tile/kernel/intvec_32.S b/arch/tile/kernel/intvec_32.S index 8f58bdff20d7..7c7e9ac2580d 100644 --- a/arch/tile/kernel/intvec_32.S +++ b/arch/tile/kernel/intvec_32.S | |||
@@ -1524,28 +1524,23 @@ STD_ENTRY_LOCAL(bad_intr) | |||
1524 | 1524 | ||
1525 | /* Put address of pt_regs in reg and jump. */ | 1525 | /* Put address of pt_regs in reg and jump. */ |
1526 | #define PTREGS_SYSCALL(x, reg) \ | 1526 | #define PTREGS_SYSCALL(x, reg) \ |
1527 | STD_ENTRY(x); \ | 1527 | STD_ENTRY(_##x); \ |
1528 | { \ | 1528 | { \ |
1529 | PTREGS_PTR(reg, PTREGS_OFFSET_BASE); \ | 1529 | PTREGS_PTR(reg, PTREGS_OFFSET_BASE); \ |
1530 | j _##x \ | 1530 | j x \ |
1531 | }; \ | 1531 | }; \ |
1532 | STD_ENDPROC(x) | 1532 | STD_ENDPROC(_##x) |
1533 | 1533 | ||
1534 | PTREGS_SYSCALL(sys_execve, r3) | 1534 | PTREGS_SYSCALL(sys_execve, r3) |
1535 | PTREGS_SYSCALL(sys_sigaltstack, r2) | 1535 | PTREGS_SYSCALL(sys_sigaltstack, r2) |
1536 | PTREGS_SYSCALL(sys_rt_sigreturn, r0) | 1536 | PTREGS_SYSCALL(sys_rt_sigreturn, r0) |
1537 | PTREGS_SYSCALL(sys_cmpxchg_badaddr, r1) | ||
1537 | 1538 | ||
1538 | /* Save additional callee-saves to pt_regs, put address in reg and jump. */ | 1539 | /* Save additional callee-saves to pt_regs, put address in r4 and jump. */ |
1539 | #define PTREGS_SYSCALL_ALL_REGS(x, reg) \ | 1540 | STD_ENTRY(_sys_clone) |
1540 | STD_ENTRY(x); \ | 1541 | push_extra_callee_saves r4 |
1541 | push_extra_callee_saves reg; \ | 1542 | j sys_clone |
1542 | j _##x; \ | 1543 | STD_ENDPROC(_sys_clone) |
1543 | STD_ENDPROC(x) | ||
1544 | |||
1545 | PTREGS_SYSCALL_ALL_REGS(sys_fork, r0) | ||
1546 | PTREGS_SYSCALL_ALL_REGS(sys_vfork, r0) | ||
1547 | PTREGS_SYSCALL_ALL_REGS(sys_clone, r4) | ||
1548 | PTREGS_SYSCALL_ALL_REGS(sys_cmpxchg_badaddr, r1) | ||
1549 | 1544 | ||
1550 | /* | 1545 | /* |
1551 | * This entrypoint is taken for the cmpxchg and atomic_update fast | 1546 | * This entrypoint is taken for the cmpxchg and atomic_update fast |
diff --git a/arch/tile/kernel/process.c b/arch/tile/kernel/process.c index 84c29111756c..42ff73d5f637 100644 --- a/arch/tile/kernel/process.c +++ b/arch/tile/kernel/process.c | |||
@@ -528,14 +528,9 @@ struct task_struct *__sched _switch_to(struct task_struct *prev, | |||
528 | return __switch_to(prev, next, next_current_ksp0(next)); | 528 | return __switch_to(prev, next, next_current_ksp0(next)); |
529 | } | 529 | } |
530 | 530 | ||
531 | long _sys_fork(struct pt_regs *regs) | 531 | SYSCALL_DEFINE5(clone, unsigned long, clone_flags, unsigned long, newsp, |
532 | { | 532 | void __user *, parent_tidptr, void __user *, child_tidptr, |
533 | return do_fork(SIGCHLD, regs->sp, regs, 0, NULL, NULL); | 533 | struct pt_regs *, regs) |
534 | } | ||
535 | |||
536 | long _sys_clone(unsigned long clone_flags, unsigned long newsp, | ||
537 | void __user *parent_tidptr, void __user *child_tidptr, | ||
538 | struct pt_regs *regs) | ||
539 | { | 534 | { |
540 | if (!newsp) | 535 | if (!newsp) |
541 | newsp = regs->sp; | 536 | newsp = regs->sp; |
@@ -543,18 +538,13 @@ long _sys_clone(unsigned long clone_flags, unsigned long newsp, | |||
543 | parent_tidptr, child_tidptr); | 538 | parent_tidptr, child_tidptr); |
544 | } | 539 | } |
545 | 540 | ||
546 | long _sys_vfork(struct pt_regs *regs) | ||
547 | { | ||
548 | return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->sp, | ||
549 | regs, 0, NULL, NULL); | ||
550 | } | ||
551 | |||
552 | /* | 541 | /* |
553 | * sys_execve() executes a new program. | 542 | * sys_execve() executes a new program. |
554 | */ | 543 | */ |
555 | long _sys_execve(const char __user *path, | 544 | SYSCALL_DEFINE4(execve, const char __user *, path, |
556 | const char __user *const __user *argv, | 545 | const char __user *const __user *, argv, |
557 | const char __user *const __user *envp, struct pt_regs *regs) | 546 | const char __user *const __user *, envp, |
547 | struct pt_regs *, regs) | ||
558 | { | 548 | { |
559 | long error; | 549 | long error; |
560 | char *filename; | 550 | char *filename; |
@@ -570,9 +560,10 @@ out: | |||
570 | } | 560 | } |
571 | 561 | ||
572 | #ifdef CONFIG_COMPAT | 562 | #ifdef CONFIG_COMPAT |
573 | long _compat_sys_execve(const char __user *path, | 563 | long compat_sys_execve(const char __user *path, |
574 | const compat_uptr_t __user *argv, | 564 | const compat_uptr_t __user *argv, |
575 | const compat_uptr_t __user *envp, struct pt_regs *regs) | 565 | const compat_uptr_t __user *envp, |
566 | struct pt_regs *regs) | ||
576 | { | 567 | { |
577 | long error; | 568 | long error; |
578 | char *filename; | 569 | char *filename; |
diff --git a/arch/tile/kernel/signal.c b/arch/tile/kernel/signal.c index ce183aa1492c..fb28e85ae3ae 100644 --- a/arch/tile/kernel/signal.c +++ b/arch/tile/kernel/signal.c | |||
@@ -41,8 +41,8 @@ | |||
41 | #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) | 41 | #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) |
42 | 42 | ||
43 | 43 | ||
44 | long _sys_sigaltstack(const stack_t __user *uss, | 44 | SYSCALL_DEFINE3(sigaltstack, const stack_t __user *, uss, |
45 | stack_t __user *uoss, struct pt_regs *regs) | 45 | stack_t __user *, uoss, struct pt_regs *, regs) |
46 | { | 46 | { |
47 | return do_sigaltstack(uss, uoss, regs->sp); | 47 | return do_sigaltstack(uss, uoss, regs->sp); |
48 | } | 48 | } |
@@ -78,7 +78,7 @@ int restore_sigcontext(struct pt_regs *regs, | |||
78 | } | 78 | } |
79 | 79 | ||
80 | /* sigreturn() returns long since it restores r0 in the interrupted code. */ | 80 | /* sigreturn() returns long since it restores r0 in the interrupted code. */ |
81 | long _sys_rt_sigreturn(struct pt_regs *regs) | 81 | SYSCALL_DEFINE1(rt_sigreturn, struct pt_regs *, regs) |
82 | { | 82 | { |
83 | struct rt_sigframe __user *frame = | 83 | struct rt_sigframe __user *frame = |
84 | (struct rt_sigframe __user *)(regs->sp); | 84 | (struct rt_sigframe __user *)(regs->sp); |
diff --git a/arch/tile/kernel/sys.c b/arch/tile/kernel/sys.c index f0f87eab8c39..7e764669a022 100644 --- a/arch/tile/kernel/sys.c +++ b/arch/tile/kernel/sys.c | |||
@@ -110,6 +110,15 @@ SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len, | |||
110 | #define sys_sync_file_range sys_sync_file_range2 | 110 | #define sys_sync_file_range sys_sync_file_range2 |
111 | #endif | 111 | #endif |
112 | 112 | ||
113 | /* Call the trampolines to manage pt_regs where necessary. */ | ||
114 | #define sys_execve _sys_execve | ||
115 | #define sys_sigaltstack _sys_sigaltstack | ||
116 | #define sys_rt_sigreturn _sys_rt_sigreturn | ||
117 | #define sys_clone _sys_clone | ||
118 | #ifndef __tilegx__ | ||
119 | #define sys_cmpxchg_badaddr _sys_cmpxchg_badaddr | ||
120 | #endif | ||
121 | |||
113 | /* | 122 | /* |
114 | * Note that we can't include <linux/unistd.h> here since the header | 123 | * Note that we can't include <linux/unistd.h> here since the header |
115 | * guard will defeat us; <asm/unistd.h> checks for __SYSCALL as well. | 124 | * guard will defeat us; <asm/unistd.h> checks for __SYSCALL as well. |