18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Based on arch/arm/mm/extable.c 48c2ecf20Sopenharmony_ci */ 58c2ecf20Sopenharmony_ci 68c2ecf20Sopenharmony_ci#include <linux/extable.h> 78c2ecf20Sopenharmony_ci#include <linux/uaccess.h> 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ciint fixup_exception(struct pt_regs *regs) 108c2ecf20Sopenharmony_ci{ 118c2ecf20Sopenharmony_ci const struct exception_table_entry *fixup; 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci fixup = search_exception_tables(instruction_pointer(regs)); 148c2ecf20Sopenharmony_ci if (!fixup) 158c2ecf20Sopenharmony_ci return 0; 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci if (in_bpf_jit(regs)) 188c2ecf20Sopenharmony_ci return arm64_bpf_fixup_exception(fixup, regs); 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci regs->pc = (unsigned long)&fixup->fixup + fixup->fixup; 218c2ecf20Sopenharmony_ci return 1; 228c2ecf20Sopenharmony_ci} 23