Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 18885
b: refs/heads/master
c: fcca538
h: refs/heads/master
i:
  18883: c5469b3
v: v3
  • Loading branch information
Nicolas Pitre authored and Russell King committed Jan 18, 2006
1 parent 5bf2432 commit c2d6d66
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 13 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 1230b4046b9da77ccb83ef2eaffc54dc4a96093a
refs/heads/master: fcca538b83f2984095f15f0f90f6c7686e3a32d4
29 changes: 18 additions & 11 deletions trunk/arch/arm/kernel/signal.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,16 +29,22 @@
#define SWI_SYS_SIGRETURN (0xef000000|(__NR_sigreturn))
#define SWI_SYS_RT_SIGRETURN (0xef000000|(__NR_rt_sigreturn))

/*
* With EABI, the syscall number has to be loaded into r7.
*/
#define MOV_R7_NR_SIGRETURN (0xe3a07000 | (__NR_sigreturn - __NR_SYSCALL_BASE))
#define MOV_R7_NR_RT_SIGRETURN (0xe3a07000 | (__NR_rt_sigreturn - __NR_SYSCALL_BASE))

/*
* For Thumb syscalls, we pass the syscall number via r7. We therefore
* need two 16-bit instructions.
*/
#define SWI_THUMB_SIGRETURN (0xdf00 << 16 | 0x2700 | (__NR_sigreturn - __NR_SYSCALL_BASE))
#define SWI_THUMB_RT_SIGRETURN (0xdf00 << 16 | 0x2700 | (__NR_rt_sigreturn - __NR_SYSCALL_BASE))

const unsigned long sigreturn_codes[4] = {
SWI_SYS_SIGRETURN, SWI_THUMB_SIGRETURN,
SWI_SYS_RT_SIGRETURN, SWI_THUMB_RT_SIGRETURN
const unsigned long sigreturn_codes[7] = {
MOV_R7_NR_SIGRETURN, SWI_SYS_SIGRETURN, SWI_THUMB_SIGRETURN,
MOV_R7_NR_RT_SIGRETURN, SWI_SYS_RT_SIGRETURN, SWI_THUMB_RT_SIGRETURN,
};

static int do_signal(sigset_t *oldset, struct pt_regs * regs, int syscall);
Expand Down Expand Up @@ -189,7 +195,7 @@ struct aux_sigframe {
struct sigframe {
struct sigcontext sc;
unsigned long extramask[_NSIG_WORDS-1];
unsigned long retcode;
unsigned long retcode[2];
struct aux_sigframe aux __attribute__((aligned(8)));
};

Expand All @@ -198,7 +204,7 @@ struct rt_sigframe {
void __user *puc;
struct siginfo info;
struct ucontext uc;
unsigned long retcode;
unsigned long retcode[2];
struct aux_sigframe aux __attribute__((aligned(8)));
};

Expand Down Expand Up @@ -436,12 +442,13 @@ setup_return(struct pt_regs *regs, struct k_sigaction *ka,
if (ka->sa.sa_flags & SA_RESTORER) {
retcode = (unsigned long)ka->sa.sa_restorer;
} else {
unsigned int idx = thumb;
unsigned int idx = thumb << 1;

if (ka->sa.sa_flags & SA_SIGINFO)
idx += 2;
idx += 3;

if (__put_user(sigreturn_codes[idx], rc))
if (__put_user(sigreturn_codes[idx], rc) ||
__put_user(sigreturn_codes[idx+1], rc+1))
return 1;

if (cpsr & MODE32_BIT) {
Expand All @@ -456,7 +463,7 @@ setup_return(struct pt_regs *regs, struct k_sigaction *ka,
* the return code written onto the stack.
*/
flush_icache_range((unsigned long)rc,
(unsigned long)(rc + 1));
(unsigned long)(rc + 2));

retcode = ((unsigned long)rc) + thumb;
}
Expand Down Expand Up @@ -488,7 +495,7 @@ setup_frame(int usig, struct k_sigaction *ka, sigset_t *set, struct pt_regs *reg
}

if (err == 0)
err = setup_return(regs, ka, &frame->retcode, frame, usig);
err = setup_return(regs, ka, frame->retcode, frame, usig);

return err;
}
Expand Down Expand Up @@ -522,7 +529,7 @@ setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info,
err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));

if (err == 0)
err = setup_return(regs, ka, &frame->retcode, frame, usig);
err = setup_return(regs, ka, frame->retcode, frame, usig);

if (err == 0) {
/*
Expand Down
2 changes: 1 addition & 1 deletion trunk/arch/arm/kernel/signal.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,4 @@
*/
#define KERN_SIGRETURN_CODE 0xffff0500

extern const unsigned long sigreturn_codes[4];
extern const unsigned long sigreturn_codes[7];

0 comments on commit c2d6d66

Please sign in to comment.