extable.h 1.2 KB

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