1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Based on arch/arm/mm/extable.c 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun #include <linux/extable.h> 7*4882a593Smuzhiyun #include <linux/uaccess.h> 8*4882a593Smuzhiyun fixup_exception(struct pt_regs * regs)9*4882a593Smuzhiyunint fixup_exception(struct pt_regs *regs) 10*4882a593Smuzhiyun { 11*4882a593Smuzhiyun const struct exception_table_entry *fixup; 12*4882a593Smuzhiyun unsigned long addr; 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun addr = instruction_pointer(regs); 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun /* Search the BPF tables first, these are formatted differently */ 17*4882a593Smuzhiyun fixup = search_bpf_extables(addr); 18*4882a593Smuzhiyun if (fixup) 19*4882a593Smuzhiyun return arm64_bpf_fixup_exception(fixup, regs); 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun fixup = search_exception_tables(addr); 22*4882a593Smuzhiyun if (!fixup) 23*4882a593Smuzhiyun return 0; 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun regs->pc = (unsigned long)&fixup->fixup + fixup->fixup; 26*4882a593Smuzhiyun return 1; 27*4882a593Smuzhiyun } 28