Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
[linux/fpc-iii.git] / arch / arm / kernel / sigreturn_codes.S
blob3c5d0f2170fd7ee309260c2d2c0a6108a24e54f8
1 /*
2  * sigreturn_codes.S - code sinpets for sigreturn syscalls
3  *
4  * Created by:  Victor Kamensky, 2013-08-13
5  * Copyright:   (C) 2013  Linaro Limited
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License version 2 as
9  * published by the Free Software Foundation.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  */
17 #include <asm/unistd.h>
20  * For ARM syscalls, we encode the syscall number into the instruction.
21  * With EABI, the syscall number has to be loaded into r7. As result
22  * ARM syscall sequence snippet will have move and svc in .arm encoding
23  *
24  * For Thumb syscalls, we pass the syscall number via r7.  We therefore
25  * need two 16-bit instructions in .thumb encoding
26  *
27  * Please note sigreturn_codes code are not executed in place. Instead
28  * they just copied by kernel into appropriate places. Code inside of
29  * arch/arm/kernel/signal.c is very sensitive to layout of these code
30  * snippets.
31  */
33 #if __LINUX_ARM_ARCH__ <= 4
34         /*
35          * Note we manually set minimally required arch that supports
36          * required thumb opcodes for early arch versions. It is OK
37          * for this file to be used in combination with other
38          * lower arch variants, since these code snippets are only
39          * used as input data.
40          */
41         .arch armv4t
42 #endif
44         .section .rodata
45         .global sigreturn_codes
46         .type   sigreturn_codes, #object
48         .arm
50 sigreturn_codes:
52         /* ARM sigreturn syscall code snippet */
53         mov     r7, #(__NR_sigreturn - __NR_SYSCALL_BASE)
54         swi     #(__NR_sigreturn)|(__NR_OABI_SYSCALL_BASE)
56         /* Thumb sigreturn syscall code snippet */
57         .thumb
58         movs    r7, #(__NR_sigreturn - __NR_SYSCALL_BASE)
59         swi     #0
61         /* ARM sigreturn_rt syscall code snippet */
62         .arm
63         mov     r7, #(__NR_rt_sigreturn - __NR_SYSCALL_BASE)
64         swi     #(__NR_rt_sigreturn)|(__NR_OABI_SYSCALL_BASE)
66         /* Thumb sigreturn_rt syscall code snippet */
67         .thumb
68         movs    r7, #(__NR_rt_sigreturn - __NR_SYSCALL_BASE)
69         swi     #0
71         /*
72          * Note on addtional space: setup_return in signal.c
73          * algorithm uses two words copy regardless whether
74          * it is thumb case or not, so we need additional
75          * word after real last entry.
76          */
77         .arm
78         .space  4
80         .size   sigreturn_codes, . - sigreturn_codes