xref: /linux/tools/testing/selftests/powerpc/primitives/asm/extable.h (revision c532de5a67a70f8533d495f8f2aaa9a0491c3ad0)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _ARCH_POWERPC_EXTABLE_H
3 #define _ARCH_POWERPC_EXTABLE_H
4 
5 /*
6  * The exception table consists of pairs of relative addresses: the first is
7  * the address of an instruction that is allowed to fault, and the second is
8  * the address at which the program should continue.  No registers are
9  * modified, so it is entirely up to the continuation code to figure out what
10  * to do.
11  *
12  * All the routines below use bits of fixup code that are out of line with the
13  * main instruction path.  This means when everything is well, we don't even
14  * have to jump over them.  Further, they do not intrude on our cache or tlb
15  * entries.
16  */
17 
18 #define ARCH_HAS_RELATIVE_EXTABLE
19 
20 #ifndef __ASSEMBLY__
21 
22 struct exception_table_entry {
23 	int insn;
24 	int fixup;
25 };
26 
27 static inline unsigned long extable_fixup(const struct exception_table_entry *x)
28 {
29 	return (unsigned long)&x->fixup + x->fixup;
30 }
31 
32 #endif
33 
34 /*
35  * Helper macro for exception table entries
36  */
37 #define EX_TABLE(_fault, _target)		\
38 	stringify_in_c(.section __ex_table,"a";)\
39 	stringify_in_c(.balign 4;)		\
40 	stringify_in_c(.long (_fault) - . ;)	\
41 	stringify_in_c(.long (_target) - . ;)	\
42 	stringify_in_c(.previous)
43 
44 #endif
45