Skip to content

Commit 3dc0ae5

Browse files
committed
!signal: adapt to new signal trampoline parameters.
`oldmask` storing is handled by kernel. Needed for correct sigsuspend implementation. WARN: breaking ABI change, signal trampoline parameters have changed. JIRA: RTOS-1059
1 parent 5f7aee8 commit 3dc0ae5

File tree

6 files changed

+23
-25
lines changed

6 files changed

+23
-25
lines changed

arch/aarch64/signal.S

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,10 @@
2020
.globl _signal_trampoline
2121
.type _signal_trampoline, %function
2222
_signal_trampoline:
23-
ldr x0, [sp] /* signal number */
23+
ldr x0, [sp], 8 /* signal number */
2424
bl _signal_handler
2525

26-
/* Old signal mask in x0 */
27-
ldp xzr, x1, [sp], #0x10 /* signal number (discarded), cpu_context_t * */
26+
ldp x0, x1, [sp], #0x10 /* oldmask, cpu_context_t * */
2827
ldp x2, x3, [sp], #0x10 /* pc, sp */
2928
ldr x4, [sp], #0x10 /* psr, skip padding at the end */
3029
bl sigreturn

arch/arm/signal.S

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,14 @@
2020
.globl _signal_trampoline
2121
.type _signal_trampoline, %function
2222
_signal_trampoline:
23-
/* Signal number, cpu_context * */
23+
/* Signal number, oldmask - keep stack aligned to 8 */
2424
pop {r0,r4}
2525
blx _signal_handler
2626

27-
/* Old signal mask in r0 */
28-
mov r1, r4
29-
pop {r2,r3} /* pc, sp */
30-
/* psr on stack */
27+
mov r0, r4 /* move oldmask to r0 */
28+
pop {r1,r2,r3,r4} /* cpu_context_t *, pc, psp, psr */
29+
30+
/* put psr back on stack, keep aligned to 8 (r5 as padding value) */
31+
push {r4,r5}
3132
bl sigreturn
3233
.size _signal_trampoline, .-_signal_trampoline

arch/ia32/signal.S

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@ _signal_trampoline:
2424
call _signal_handler
2525

2626
addl $4, %esp
27-
/* Put old mask on stack */
28-
push %eax
27+
/* oldmask is now on top of the stack */
2928
/* cpu context *, eip, esp on stack */
3029
call sigreturn
3130
.size _signal_trampoline, .-_signal_trampoline

arch/riscv64/signal.S

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@ _signal_trampoline:
2424
lw a0, (sp)
2525
call _signal_handler
2626

27-
/* Old signal mask in a0 */
28-
ld a1, 8(sp) /* cpu context * */
29-
ld a2, 16(sp) /* sepc */
30-
ld a3, 24(sp) /* sp */
31-
addi sp, sp, 32
27+
lw a0, 8(sp) /* old signal mask */
28+
ld a1, 16(sp) /* cpu context * */
29+
ld a2, 24(sp) /* sepc */
30+
ld a3, 32(sp) /* sp */
31+
addi sp, sp, 40
3232
call sigreturn
3333
.size _signal_trampoline, .-_signal_trampoline

arch/sparcv8leon/signal.S

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,11 @@ _signal_trampoline:
2929
call _signal_handler
3030
ld [%i0], %o0 /* signal number */
3131

32-
/* oldmask in %o0 */
33-
ld [%i0 + 0x04], %o1 /* cpu_context * */
34-
ldd [%i0 + 0x08], %o2 /* pc, npc */
32+
ld [%i0 + 0x04], %o0 /* old signal mask */
33+
ld [%i0 + 0x08], %o1 /* cpu_context * */
34+
ld [%i0 + 0x0c], %o2 /* pc */
35+
ld [%i0 + 0x10], %o3 /* npc */
36+
ld [%i0 + 0x14], %o4 /* sp */
3537
call sigreturn
36-
ldd [%i0 + 0x10], %o4 /* sp, psr */
38+
ld [%i0 + 0x18], %o5 /* psr */
3739
.size _signal_trampoline, .-_signal_trampoline

signal/signal.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -123,14 +123,13 @@ static int _signal_ismutable(int sig)
123123
}
124124

125125

126-
unsigned int _signal_handler(int phxsig)
126+
void _signal_handler(int phxsig)
127127
{
128128
int sig;
129-
unsigned int oldmask;
130129

131130
if ((phxsig < 0) || (phxsig >= NSIG)) {
132131
/* Don't know what to do, ignore it */
133-
return signalMask(0U, 0U);
132+
return;
134133
}
135134

136135
/* Received Phoenix signal, need to convert it to POSIX signal */
@@ -142,9 +141,7 @@ unsigned int _signal_handler(int phxsig)
142141
/* Invoke handler */
143142
(signal_common.sightab[sig])(sig);
144143

145-
/* Mask restored by sigreturn */
146-
147-
return oldmask;
144+
/* oldmask kept on stack and restored by sigreturn */
148145
}
149146

150147

0 commit comments

Comments
 (0)