2 * This file contains sequences of code that will be copied to a
3 * fixed location, defined in <asm/atomic_seq.h>. The interrupt
4 * handlers ensure that these sequences appear to be atomic when
5 * executed from userspace.
6 * These are aligned to 16 bytes, so that we have some space to replace
7 * these sequences with something else (e.g. kernel traps if we ever do
10 #include <linux/linkage.h>
11 #include <linux/unistd.h>
12 #include <asm/entry.h>
15 ENTRY(_fixed_code_start)
18 ENTRY(_sigreturn_stub)
19 P0 = __NR_rt_sigreturn;
21 /* Speculative execution paranoia. */
23 ENDPROC (_sigreturn_stub)
28 * Inputs: P0: memory address to use
30 * Output: R0: old contents of the memory address, zero extended.
36 ENDPROC (_atomic_xchg32)
40 * Compare and swap, 32 bit.
41 * Inputs: P0: memory address to use
43 * R2: new value to store
44 * The new value is stored if the contents of the memory
45 * address is equal to the compare value.
46 * Output: R0: old contents of the memory address.
55 ENDPROC (_atomic_cas32)
60 * Inputs: P0: memory address to use
62 * Outputs: R0: new contents of the memory address.
63 * R1: previous contents of the memory address.
70 ENDPROC (_atomic_add32)
75 * Inputs: P0: memory address to use
76 * R0: value to subtract
77 * Outputs: R0: new contents of the memory address.
78 * R1: previous contents of the memory address.
85 ENDPROC (_atomic_sub32)
90 * Inputs: P0: memory address to use
92 * Outputs: R0: new contents of the memory address.
93 * R1: previous contents of the memory address.
100 ENDPROC (_atomic_ior32)
104 <<<<<<< HEAD:arch/blackfin/kernel/fixed_code.S
105 * Atomic ior, 32 bit.
107 * Atomic and, 32 bit.
108 >>>>>>> 264e3e889d86e552b4191d69bb60f4f3b383135a:arch/blackfin/kernel/fixed_code.S
109 * Inputs: P0: memory address to use
110 <<<<<<< HEAD:arch/blackfin/kernel/fixed_code.S
114 >>>>>>> 264e3e889d86e552b4191d69bb60f4f3b383135a:arch/blackfin/kernel/fixed_code.S
115 * Outputs: R0: new contents of the memory address.
116 * R1: previous contents of the memory address.
123 <<<<<<< HEAD:arch/blackfin/kernel/fixed_code.S
124 ENDPROC (_atomic_ior32)
126 ENDPROC (_atomic_and32)
127 >>>>>>> 264e3e889d86e552b4191d69bb60f4f3b383135a:arch/blackfin/kernel/fixed_code.S
131 <<<<<<< HEAD:arch/blackfin/kernel/fixed_code.S
132 * Atomic ior, 32 bit.
134 * Atomic xor, 32 bit.
135 >>>>>>> 264e3e889d86e552b4191d69bb60f4f3b383135a:arch/blackfin/kernel/fixed_code.S
136 * Inputs: P0: memory address to use
137 <<<<<<< HEAD:arch/blackfin/kernel/fixed_code.S
141 >>>>>>> 264e3e889d86e552b4191d69bb60f4f3b383135a:arch/blackfin/kernel/fixed_code.S
142 * Outputs: R0: new contents of the memory address.
143 * R1: previous contents of the memory address.
150 <<<<<<< HEAD:arch/blackfin/kernel/fixed_code.S
151 ENDPROC (_atomic_ior32)
153 ENDPROC (_atomic_xor32)
154 >>>>>>> 264e3e889d86e552b4191d69bb60f4f3b383135a:arch/blackfin/kernel/fixed_code.S
158 * safe_user_instruction
159 * Four NOPS are enough to allow the pipeline to speculativily load
160 * execute anything it wants. After that, things have gone bad, and
161 * we are stuck - so panic. Since we might be in user space, we can't
162 * call panic, so just cause a unhandled exception, this should cause
163 * a dump of the trace buffer so we can tell were we are, and a reboot
165 ENTRY(_safe_user_instruction)
168 ENDPROC(_safe_user_instruction)
170 ENTRY(_fixed_code_end)