1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- /* SPDX-License-Identifier: GPL-2.0 */
- #ifndef _ARCH_POWERPC_EXTABLE_H
- #define _ARCH_POWERPC_EXTABLE_H
- /*
- * The exception table consists of pairs of relative addresses: the first is
- * the address of an instruction that is allowed to fault, and the second is
- * the address at which the program should continue. No registers are
- * modified, so it is entirely up to the continuation code to figure out what
- * to do.
- *
- * All the routines below use bits of fixup code that are out of line with the
- * main instruction path. This means when everything is well, we don't even
- * have to jump over them. Further, they do not intrude on our cache or tlb
- * entries.
- */
- #define ARCH_HAS_RELATIVE_EXTABLE
- #ifndef __ASSEMBLY__
- struct exception_table_entry {
- int insn;
- int fixup;
- };
- static inline unsigned long extable_fixup(const struct exception_table_entry *x)
- {
- return (unsigned long)&x->fixup + x->fixup;
- }
- #endif
- /*
- * Helper macro for exception table entries
- */
- #define EX_TABLE(_fault, _target) \
- stringify_in_c(.section __ex_table,"a";)\
- stringify_in_c(.balign 4;) \
- stringify_in_c(.long (_fault) - . ;) \
- stringify_in_c(.long (_target) - . ;) \
- stringify_in_c(.previous)
- #endif
|