diff options
| -rw-r--r-- | arch/parisc/kernel/ptrace.c | 8 | ||||
| -rw-r--r-- | arch/parisc/kernel/signal.c | 20 | ||||
| -rw-r--r-- | include/asm-parisc/compat.h | 11 |
3 files changed, 25 insertions, 14 deletions
diff --git a/arch/parisc/kernel/ptrace.c b/arch/parisc/kernel/ptrace.c index 413292f1a4a3..3f28de974556 100644 --- a/arch/parisc/kernel/ptrace.c +++ b/arch/parisc/kernel/ptrace.c | |||
| @@ -91,7 +91,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
| 91 | int copied; | 91 | int copied; |
| 92 | 92 | ||
| 93 | #ifdef __LP64__ | 93 | #ifdef __LP64__ |
| 94 | if (personality(child->personality) == PER_LINUX32) { | 94 | if (__is_compat_task(child)) { |
| 95 | unsigned int tmp; | 95 | unsigned int tmp; |
| 96 | 96 | ||
| 97 | addr &= 0xffffffffL; | 97 | addr &= 0xffffffffL; |
| @@ -123,7 +123,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
| 123 | case PTRACE_POKEDATA: | 123 | case PTRACE_POKEDATA: |
| 124 | ret = 0; | 124 | ret = 0; |
| 125 | #ifdef __LP64__ | 125 | #ifdef __LP64__ |
| 126 | if (personality(child->personality) == PER_LINUX32) { | 126 | if (__is_compat_task(child)) { |
| 127 | unsigned int tmp = (unsigned int)data; | 127 | unsigned int tmp = (unsigned int)data; |
| 128 | DBG("sys_ptrace(POKE%s, %d, %lx, %lx)\n", | 128 | DBG("sys_ptrace(POKE%s, %d, %lx, %lx)\n", |
| 129 | request == PTRACE_POKETEXT ? "TEXT" : "DATA", | 129 | request == PTRACE_POKETEXT ? "TEXT" : "DATA", |
| @@ -146,7 +146,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
| 146 | case PTRACE_PEEKUSR: { | 146 | case PTRACE_PEEKUSR: { |
| 147 | ret = -EIO; | 147 | ret = -EIO; |
| 148 | #ifdef __LP64__ | 148 | #ifdef __LP64__ |
| 149 | if (personality(child->personality) == PER_LINUX32) { | 149 | if (__is_compat_task(child)) { |
| 150 | unsigned int tmp; | 150 | unsigned int tmp; |
| 151 | 151 | ||
| 152 | if (addr & (sizeof(int)-1)) | 152 | if (addr & (sizeof(int)-1)) |
| @@ -205,7 +205,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
| 205 | goto out_tsk; | 205 | goto out_tsk; |
| 206 | } | 206 | } |
| 207 | #ifdef __LP64__ | 207 | #ifdef __LP64__ |
| 208 | if (personality(child->personality) == PER_LINUX32) { | 208 | if (__is_compat_task(child)) { |
| 209 | if (addr & (sizeof(int)-1)) | 209 | if (addr & (sizeof(int)-1)) |
| 210 | goto out_tsk; | 210 | goto out_tsk; |
| 211 | if ((addr = translate_usr_offset(addr)) < 0) | 211 | if ((addr = translate_usr_offset(addr)) < 0) |
diff --git a/arch/parisc/kernel/signal.c b/arch/parisc/kernel/signal.c index cc38edfd90c5..bb83880c5ee3 100644 --- a/arch/parisc/kernel/signal.c +++ b/arch/parisc/kernel/signal.c | |||
| @@ -76,7 +76,7 @@ sys_rt_sigsuspend(sigset_t __user *unewset, size_t sigsetsize, struct pt_regs *r | |||
| 76 | #ifdef __LP64__ | 76 | #ifdef __LP64__ |
| 77 | compat_sigset_t newset32; | 77 | compat_sigset_t newset32; |
| 78 | 78 | ||
| 79 | if(personality(current->personality) == PER_LINUX32){ | 79 | if (is_compat_task()) { |
| 80 | /* XXX: Don't preclude handling different sized sigset_t's. */ | 80 | /* XXX: Don't preclude handling different sized sigset_t's. */ |
| 81 | if (sigsetsize != sizeof(compat_sigset_t)) | 81 | if (sigsetsize != sizeof(compat_sigset_t)) |
| 82 | return -EINVAL; | 82 | return -EINVAL; |
| @@ -153,7 +153,7 @@ sys_rt_sigreturn(struct pt_regs *regs, int in_syscall) | |||
| 153 | compat_sigset_t compat_set; | 153 | compat_sigset_t compat_set; |
| 154 | struct compat_rt_sigframe __user * compat_frame; | 154 | struct compat_rt_sigframe __user * compat_frame; |
| 155 | 155 | ||
| 156 | if(personality(current->personality) == PER_LINUX32) | 156 | if (is_compat_task()) |
| 157 | sigframe_size = PARISC_RT_SIGFRAME_SIZE32; | 157 | sigframe_size = PARISC_RT_SIGFRAME_SIZE32; |
| 158 | #endif | 158 | #endif |
| 159 | 159 | ||
| @@ -166,7 +166,7 @@ sys_rt_sigreturn(struct pt_regs *regs, int in_syscall) | |||
| 166 | #ifdef __LP64__ | 166 | #ifdef __LP64__ |
| 167 | compat_frame = (struct compat_rt_sigframe __user *)frame; | 167 | compat_frame = (struct compat_rt_sigframe __user *)frame; |
| 168 | 168 | ||
| 169 | if(personality(current->personality) == PER_LINUX32){ | 169 | if (is_compat_task()) { |
| 170 | DBG(2,"sys_rt_sigreturn: ELF32 process.\n"); | 170 | DBG(2,"sys_rt_sigreturn: ELF32 process.\n"); |
| 171 | if (__copy_from_user(&compat_set, &compat_frame->uc.uc_sigmask, sizeof(compat_set))) | 171 | if (__copy_from_user(&compat_set, &compat_frame->uc.uc_sigmask, sizeof(compat_set))) |
| 172 | goto give_sigsegv; | 172 | goto give_sigsegv; |
| @@ -186,7 +186,7 @@ sys_rt_sigreturn(struct pt_regs *regs, int in_syscall) | |||
| 186 | 186 | ||
| 187 | /* Good thing we saved the old gr[30], eh? */ | 187 | /* Good thing we saved the old gr[30], eh? */ |
| 188 | #ifdef __LP64__ | 188 | #ifdef __LP64__ |
| 189 | if(personality(current->personality) == PER_LINUX32){ | 189 | if (is_compat_task()) { |
| 190 | DBG(1,"sys_rt_sigreturn: compat_frame->uc.uc_mcontext 0x%p\n", | 190 | DBG(1,"sys_rt_sigreturn: compat_frame->uc.uc_mcontext 0x%p\n", |
| 191 | &compat_frame->uc.uc_mcontext); | 191 | &compat_frame->uc.uc_mcontext); |
| 192 | // FIXME: Load upper half from register file | 192 | // FIXME: Load upper half from register file |
| @@ -315,7 +315,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 315 | 315 | ||
| 316 | compat_frame = (struct compat_rt_sigframe __user *)frame; | 316 | compat_frame = (struct compat_rt_sigframe __user *)frame; |
| 317 | 317 | ||
| 318 | if(personality(current->personality) == PER_LINUX32) { | 318 | if (is_compat_task()) { |
| 319 | DBG(1,"setup_rt_frame: frame->info = 0x%p\n", &compat_frame->info); | 319 | DBG(1,"setup_rt_frame: frame->info = 0x%p\n", &compat_frame->info); |
| 320 | err |= copy_siginfo_to_user32(&compat_frame->info, info); | 320 | err |= copy_siginfo_to_user32(&compat_frame->info, info); |
| 321 | DBG(1,"SETUP_RT_FRAME: 1\n"); | 321 | DBG(1,"SETUP_RT_FRAME: 1\n"); |
| @@ -392,7 +392,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 392 | haddr = A(ka->sa.sa_handler); | 392 | haddr = A(ka->sa.sa_handler); |
| 393 | /* The sa_handler may be a pointer to a function descriptor */ | 393 | /* The sa_handler may be a pointer to a function descriptor */ |
| 394 | #ifdef __LP64__ | 394 | #ifdef __LP64__ |
| 395 | if(personality(current->personality) == PER_LINUX32) { | 395 | if (is_compat_task()) { |
| 396 | #endif | 396 | #endif |
| 397 | if (haddr & PA_PLABEL_FDESC) { | 397 | if (haddr & PA_PLABEL_FDESC) { |
| 398 | Elf32_Fdesc fdesc; | 398 | Elf32_Fdesc fdesc; |
| @@ -427,19 +427,19 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 427 | */ | 427 | */ |
| 428 | sigframe_size = PARISC_RT_SIGFRAME_SIZE; | 428 | sigframe_size = PARISC_RT_SIGFRAME_SIZE; |
| 429 | #ifdef __LP64__ | 429 | #ifdef __LP64__ |
| 430 | if(personality(current->personality) == PER_LINUX32) | 430 | if (is_compat_task()) |
| 431 | sigframe_size = PARISC_RT_SIGFRAME_SIZE32; | 431 | sigframe_size = PARISC_RT_SIGFRAME_SIZE32; |
| 432 | #endif | 432 | #endif |
| 433 | if (in_syscall) { | 433 | if (in_syscall) { |
| 434 | regs->gr[31] = haddr; | 434 | regs->gr[31] = haddr; |
| 435 | #ifdef __LP64__ | 435 | #ifdef __LP64__ |
| 436 | if(personality(current->personality) == PER_LINUX) | 436 | if (personality(current->personality) == PER_LINUX) |
| 437 | sigframe_size |= 1; | 437 | sigframe_size |= 1; |
| 438 | #endif | 438 | #endif |
| 439 | } else { | 439 | } else { |
| 440 | unsigned long psw = USER_PSW; | 440 | unsigned long psw = USER_PSW; |
| 441 | #ifdef __LP64__ | 441 | #ifdef __LP64__ |
| 442 | if(personality(current->personality) == PER_LINUX) | 442 | if (personality(current->personality) == PER_LINUX) |
| 443 | psw |= PSW_W; | 443 | psw |= PSW_W; |
| 444 | #endif | 444 | #endif |
| 445 | 445 | ||
| @@ -464,7 +464,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 464 | regs->gr[26] = sig; /* signal number */ | 464 | regs->gr[26] = sig; /* signal number */ |
| 465 | 465 | ||
| 466 | #ifdef __LP64__ | 466 | #ifdef __LP64__ |
| 467 | if(personality(current->personality) == PER_LINUX32){ | 467 | if (is_compat_task()) { |
| 468 | regs->gr[25] = A(&compat_frame->info); /* siginfo pointer */ | 468 | regs->gr[25] = A(&compat_frame->info); /* siginfo pointer */ |
| 469 | regs->gr[24] = A(&compat_frame->uc); /* ucontext pointer */ | 469 | regs->gr[24] = A(&compat_frame->uc); /* ucontext pointer */ |
| 470 | } else | 470 | } else |
diff --git a/include/asm-parisc/compat.h b/include/asm-parisc/compat.h index 289624d8b2d4..71b4eeea205a 100644 --- a/include/asm-parisc/compat.h +++ b/include/asm-parisc/compat.h | |||
| @@ -5,6 +5,7 @@ | |||
| 5 | */ | 5 | */ |
| 6 | #include <linux/types.h> | 6 | #include <linux/types.h> |
| 7 | #include <linux/sched.h> | 7 | #include <linux/sched.h> |
| 8 | #include <linux/personality.h> | ||
| 8 | 9 | ||
| 9 | #define COMPAT_USER_HZ 100 | 10 | #define COMPAT_USER_HZ 100 |
| 10 | 11 | ||
| @@ -149,4 +150,14 @@ static __inline__ void __user *compat_alloc_user_space(long len) | |||
| 149 | return (void __user *)regs->gr[30]; | 150 | return (void __user *)regs->gr[30]; |
| 150 | } | 151 | } |
| 151 | 152 | ||
| 153 | static inline int __is_compat_task(struct task_struct *t) | ||
| 154 | { | ||
| 155 | return personality(t->personality) == PER_LINUX32; | ||
| 156 | } | ||
| 157 | |||
| 158 | static inline int is_compat_task(void) | ||
| 159 | { | ||
| 160 | return __is_compat_task(current); | ||
| 161 | } | ||
| 162 | |||
| 152 | #endif /* _ASM_PARISC_COMPAT_H */ | 163 | #endif /* _ASM_PARISC_COMPAT_H */ |
