diff options
author | Richard Weinberger <richard@nod.at> | 2014-03-02 08:46:11 -0500 |
---|---|---|
committer | Richard Weinberger <richard@sigma-star.at> | 2014-08-06 07:03:09 -0400 |
commit | 129b69df9c9074750245fca8aa92df5cc1a86ef4 (patch) | |
tree | 10c9f8b350d6946a1a38dfade27f42930e1af358 /arch/powerpc/kernel/signal.c | |
parent | e4dc894b61776733629b24507031dd46f5ba5efc (diff) |
powerpc: Use get_signal() signal_setup_done()
Use the more generic functions get_signal() signal_setup_done()
for signal delivery.
This inverts also the return codes of setup_*frame() to follow the
kernel convention.
Signed-off-by: Richard Weinberger <richard@nod.at>
Diffstat (limited to 'arch/powerpc/kernel/signal.c')
-rw-r--r-- | arch/powerpc/kernel/signal.c | 31 |
1 files changed, 11 insertions, 20 deletions
diff --git a/arch/powerpc/kernel/signal.c b/arch/powerpc/kernel/signal.c index 1c794cef2883..aa9b048c4766 100644 --- a/arch/powerpc/kernel/signal.c +++ b/arch/powerpc/kernel/signal.c | |||
@@ -105,25 +105,23 @@ static void check_syscall_restart(struct pt_regs *regs, struct k_sigaction *ka, | |||
105 | } | 105 | } |
106 | } | 106 | } |
107 | 107 | ||
108 | static int do_signal(struct pt_regs *regs) | 108 | static void do_signal(struct pt_regs *regs) |
109 | { | 109 | { |
110 | sigset_t *oldset = sigmask_to_save(); | 110 | sigset_t *oldset = sigmask_to_save(); |
111 | siginfo_t info; | 111 | struct ksignal ksig; |
112 | int signr; | ||
113 | struct k_sigaction ka; | ||
114 | int ret; | 112 | int ret; |
115 | int is32 = is_32bit_task(); | 113 | int is32 = is_32bit_task(); |
116 | 114 | ||
117 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | 115 | get_signal(&ksig); |
118 | 116 | ||
119 | /* Is there any syscall restart business here ? */ | 117 | /* Is there any syscall restart business here ? */ |
120 | check_syscall_restart(regs, &ka, signr > 0); | 118 | check_syscall_restart(regs, &ksig.ka, ksig.sig > 0); |
121 | 119 | ||
122 | if (signr <= 0) { | 120 | if (ksig.sig <= 0) { |
123 | /* No signal to deliver -- put the saved sigmask back */ | 121 | /* No signal to deliver -- put the saved sigmask back */ |
124 | restore_saved_sigmask(); | 122 | restore_saved_sigmask(); |
125 | regs->trap = 0; | 123 | regs->trap = 0; |
126 | return 0; /* no signals delivered */ | 124 | return; /* no signals delivered */ |
127 | } | 125 | } |
128 | 126 | ||
129 | #ifndef CONFIG_PPC_ADV_DEBUG_REGS | 127 | #ifndef CONFIG_PPC_ADV_DEBUG_REGS |
@@ -140,23 +138,16 @@ static int do_signal(struct pt_regs *regs) | |||
140 | thread_change_pc(current, regs); | 138 | thread_change_pc(current, regs); |
141 | 139 | ||
142 | if (is32) { | 140 | if (is32) { |
143 | if (ka.sa.sa_flags & SA_SIGINFO) | 141 | if (ksig.ka.sa.sa_flags & SA_SIGINFO) |
144 | ret = handle_rt_signal32(signr, &ka, &info, oldset, | 142 | ret = handle_rt_signal32(&ksig, oldset, regs); |
145 | regs); | ||
146 | else | 143 | else |
147 | ret = handle_signal32(signr, &ka, &info, oldset, | 144 | ret = handle_signal32(&ksig, oldset, regs); |
148 | regs); | ||
149 | } else { | 145 | } else { |
150 | ret = handle_rt_signal64(signr, &ka, &info, oldset, regs); | 146 | ret = handle_rt_signal64(&ksig, oldset, regs); |
151 | } | 147 | } |
152 | 148 | ||
153 | regs->trap = 0; | 149 | regs->trap = 0; |
154 | if (ret) { | 150 | signal_setup_done(ret, &ksig, test_thread_flag(TIF_SINGLESTEP)); |
155 | signal_delivered(signr, &info, &ka, regs, | ||
156 | test_thread_flag(TIF_SINGLESTEP)); | ||
157 | } | ||
158 | |||
159 | return ret; | ||
160 | } | 151 | } |
161 | 152 | ||
162 | void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags) | 153 | void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags) |