[PARISC] Add is_compat_task() helper
authorKyle McMartin <kyle@parisc-linux.org>
Fri, 16 Jun 2006 19:10:02 +0000 (19:10 +0000)
committerKyle McMartin <kyle@hera.kernel.org>
Tue, 27 Jun 2006 23:28:40 +0000 (23:28 +0000)
... And convert signal.c and ptrace.c to use it instead of open
coded equivalents.

Signed-off-by: Kyle McMartin <kyle@parisc-linux.org>
arch/parisc/kernel/ptrace.c
arch/parisc/kernel/signal.c
include/asm-parisc/compat.h

index 413292f1a4a36401fda3cc03129574b68e648f09..3f28de974556c838894ab5d12f40227d2c39c23e 100644 (file)
@@ -91,7 +91,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
                int copied;
 
 #ifdef __LP64__
-               if (personality(child->personality) == PER_LINUX32) {
+               if (__is_compat_task(child)) {
                        unsigned int tmp;
 
                        addr &= 0xffffffffL;
@@ -123,7 +123,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
        case PTRACE_POKEDATA:
                ret = 0;
 #ifdef __LP64__
-               if (personality(child->personality) == PER_LINUX32) {
+               if (__is_compat_task(child)) {
                        unsigned int tmp = (unsigned int)data;
                        DBG("sys_ptrace(POKE%s, %d, %lx, %lx)\n",
                                request == PTRACE_POKETEXT ? "TEXT" : "DATA",
@@ -146,7 +146,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
        case PTRACE_PEEKUSR: {
                ret = -EIO;
 #ifdef __LP64__
-               if (personality(child->personality) == PER_LINUX32) {
+               if (__is_compat_task(child)) {
                        unsigned int tmp;
 
                        if (addr & (sizeof(int)-1))
@@ -205,7 +205,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
                        goto out_tsk;
                }
 #ifdef __LP64__
-               if (personality(child->personality) == PER_LINUX32) {
+               if (__is_compat_task(child)) {
                        if (addr & (sizeof(int)-1))
                                goto out_tsk;
                        if ((addr = translate_usr_offset(addr)) < 0)
index cc38edfd90c5bcac048647d5dacb298254314c8b..bb83880c5ee3458bd9940b96e527bf9146cb96e9 100644 (file)
@@ -76,7 +76,7 @@ sys_rt_sigsuspend(sigset_t __user *unewset, size_t sigsetsize, struct pt_regs *r
 #ifdef __LP64__
        compat_sigset_t newset32;
 
-       if(personality(current->personality) == PER_LINUX32){
+       if (is_compat_task()) {
                /* XXX: Don't preclude handling different sized sigset_t's.  */
                if (sigsetsize != sizeof(compat_sigset_t))
                        return -EINVAL;
@@ -153,7 +153,7 @@ sys_rt_sigreturn(struct pt_regs *regs, int in_syscall)
        compat_sigset_t compat_set;
        struct compat_rt_sigframe __user * compat_frame;
        
-       if(personality(current->personality) == PER_LINUX32)
+       if (is_compat_task())
                sigframe_size = PARISC_RT_SIGFRAME_SIZE32;
 #endif
 
@@ -166,7 +166,7 @@ sys_rt_sigreturn(struct pt_regs *regs, int in_syscall)
 #ifdef __LP64__
        compat_frame = (struct compat_rt_sigframe __user *)frame;
        
-       if(personality(current->personality) == PER_LINUX32){
+       if (is_compat_task()) {
                DBG(2,"sys_rt_sigreturn: ELF32 process.\n");
                if (__copy_from_user(&compat_set, &compat_frame->uc.uc_sigmask, sizeof(compat_set)))
                        goto give_sigsegv;
@@ -186,7 +186,7 @@ sys_rt_sigreturn(struct pt_regs *regs, int in_syscall)
 
        /* Good thing we saved the old gr[30], eh? */
 #ifdef __LP64__
-       if(personality(current->personality) == PER_LINUX32){
+       if (is_compat_task()) {
                DBG(1,"sys_rt_sigreturn: compat_frame->uc.uc_mcontext 0x%p\n",
                                &compat_frame->uc.uc_mcontext);
 // FIXME: Load upper half from register file
@@ -315,7 +315,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
 
        compat_frame = (struct compat_rt_sigframe __user *)frame;
        
-       if(personality(current->personality) == PER_LINUX32) {
+       if (is_compat_task()) {
                DBG(1,"setup_rt_frame: frame->info = 0x%p\n", &compat_frame->info);
                err |= copy_siginfo_to_user32(&compat_frame->info, info);
                DBG(1,"SETUP_RT_FRAME: 1\n");
@@ -392,7 +392,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
        haddr = A(ka->sa.sa_handler);
        /* The sa_handler may be a pointer to a function descriptor */
 #ifdef __LP64__
-       if(personality(current->personality) == PER_LINUX32) {
+       if (is_compat_task()) {
 #endif
                if (haddr & PA_PLABEL_FDESC) {
                        Elf32_Fdesc fdesc;
@@ -427,19 +427,19 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
         */
        sigframe_size = PARISC_RT_SIGFRAME_SIZE;
 #ifdef __LP64__
-       if(personality(current->personality) == PER_LINUX32)
+       if (is_compat_task())
                sigframe_size = PARISC_RT_SIGFRAME_SIZE32;
 #endif
        if (in_syscall) {
                regs->gr[31] = haddr;
 #ifdef __LP64__
-               if(personality(current->personality) == PER_LINUX)
+               if (personality(current->personality) == PER_LINUX)
                        sigframe_size |= 1;
 #endif
        } else {
                unsigned long psw = USER_PSW;
 #ifdef __LP64__
-               if(personality(current->personality) == PER_LINUX)
+               if (personality(current->personality) == PER_LINUX)
                        psw |= PSW_W;
 #endif
 
@@ -464,7 +464,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
        regs->gr[26] = sig;               /* signal number */
        
 #ifdef __LP64__
-       if(personality(current->personality) == PER_LINUX32){
+       if (is_compat_task()) {
                regs->gr[25] = A(&compat_frame->info); /* siginfo pointer */
                regs->gr[24] = A(&compat_frame->uc);   /* ucontext pointer */
        } else
index 289624d8b2d4681cfaed6a729a5313e07b153930..71b4eeea205a1a85eda581179fd97b46eeee0e83 100644 (file)
@@ -5,6 +5,7 @@
  */
 #include <linux/types.h>
 #include <linux/sched.h>
+#include <linux/personality.h>
 
 #define COMPAT_USER_HZ 100
 
@@ -149,4 +150,14 @@ static __inline__ void __user *compat_alloc_user_space(long len)
        return (void __user *)regs->gr[30];
 }
 
+static inline int __is_compat_task(struct task_struct *t)
+{
+       return personality(t->personality) == PER_LINUX32;
+}
+
+static inline int is_compat_task(void)
+{
+       return __is_compat_task(current);
+}
+
 #endif /* _ASM_PARISC_COMPAT_H */