1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef __PARISC_EXTABLE_H
3 #define __PARISC_EXTABLE_H
5 #include <asm/ptrace.h>
6 #include <linux/compiler.h>
9 * The exception table consists of three addresses:
11 * - A relative address to the instruction that is allowed to fault.
12 * - A relative address at which the program should continue (fixup routine)
13 * - An asm statement which specifies which CPU register will
14 * receive -EFAULT when an exception happens if the lowest bit in
15 * the fixup address is set.
17 * Note: The register specified in the err_opcode instruction will be
18 * modified at runtime if a fault happens. Register %r0 will be ignored.
20 * Since relative addresses are used, 32bit values are sufficient even on
25 int fixup_exception(struct pt_regs
*regs
);
27 #define ARCH_HAS_RELATIVE_EXTABLE
28 struct exception_table_entry
{
29 int insn
; /* relative address of insn that is allowed to fault. */
30 int fixup
; /* relative address of fixup routine */
31 int err_opcode
; /* sample opcode with register which holds error code */
34 #define ASM_EXCEPTIONTABLE_ENTRY( fault_addr, except_addr, opcode )\
35 ".section __ex_table,\"aw\"\n" \
37 ".word (" #fault_addr " - .), (" #except_addr " - .)\n" \
42 * ASM_EXCEPTIONTABLE_ENTRY_EFAULT() creates a special exception table entry
43 * (with lowest bit set) for which the fault handler in fixup_exception() will
44 * load -EFAULT on fault into the register specified by the err_opcode instruction,
45 * and zeroes the target register in case of a read fault in get_user().
47 #define ASM_EXCEPTIONTABLE_VAR(__err_var) \
49 #define ASM_EXCEPTIONTABLE_ENTRY_EFAULT( fault_addr, except_addr, register )\
50 ASM_EXCEPTIONTABLE_ENTRY( fault_addr, except_addr + 1, "or %%r0,%%r0," register)
52 static inline void swap_ex_entry_fixup(struct exception_table_entry
*a
,
53 struct exception_table_entry
*b
,
54 struct exception_table_entry tmp
,
57 a
->fixup
= b
->fixup
+ delta
;
58 b
->fixup
= tmp
.fixup
- delta
;
59 a
->err_opcode
= b
->err_opcode
;
60 b
->err_opcode
= tmp
.err_opcode
;
62 #define swap_ex_entry_fixup swap_ex_entry_fixup