2019-05-23 09:14:57 +00:00
|
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
2017-07-11 01:03:49 +00:00
|
|
|
/*
|
|
|
|
* Copyright (C) 2009 Sunplus Core Technology Co., Ltd.
|
|
|
|
* Lennox Wu <lennox.wu@sunplusct.com>
|
|
|
|
* Chen Liqin <liqin.chen@sunplusct.com>
|
|
|
|
* Copyright (C) 2013 Regents of the University of California
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
#include <linux/extable.h>
|
|
|
|
#include <linux/module.h>
|
|
|
|
#include <linux/uaccess.h>
|
|
|
|
|
2021-11-03 11:54:53 +00:00
|
|
|
#if defined(CONFIG_BPF_JIT) && defined(CONFIG_ARCH_RV64I)
|
2021-10-27 11:18:22 +00:00
|
|
|
int rv_bpf_fixup_exception(const struct exception_table_entry *ex, struct pt_regs *regs);
|
|
|
|
#endif
|
|
|
|
|
2017-07-11 01:03:49 +00:00
|
|
|
int fixup_exception(struct pt_regs *regs)
|
|
|
|
{
|
|
|
|
const struct exception_table_entry *fixup;
|
|
|
|
|
2019-10-28 12:10:32 +00:00
|
|
|
fixup = search_exception_tables(regs->epc);
|
2021-10-27 11:18:22 +00:00
|
|
|
if (!fixup)
|
|
|
|
return 0;
|
|
|
|
|
2021-11-03 11:54:53 +00:00
|
|
|
#if defined(CONFIG_BPF_JIT) && defined(CONFIG_ARCH_RV64I)
|
2021-10-27 11:18:22 +00:00
|
|
|
if (regs->epc >= BPF_JIT_REGION_START && regs->epc < BPF_JIT_REGION_END)
|
|
|
|
return rv_bpf_fixup_exception(fixup, regs);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
regs->epc = fixup->fixup;
|
|
|
|
return 1;
|
2017-07-11 01:03:49 +00:00
|
|
|
}
|