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