summaryrefslogtreecommitdiffstats
path: root/arch/s390/mm
diff options
context:
space:
mode:
authorHeiko Carstens <hca@linux.ibm.com>2022-02-28 14:52:42 +0100
committerVasily Gorbik <gor@linux.ibm.com>2022-03-08 00:33:00 +0100
commit3d66718cd62d45f3210f047248eab9e76d227e47 (patch)
tree5f2aa9740d8a8dae078cade30935e59b94fb6497 /arch/s390/mm
parents390/extable: add and use fixup_exception helper function (diff)
downloadlinux-3d66718cd62d45f3210f047248eab9e76d227e47.tar.xz
linux-3d66718cd62d45f3210f047248eab9e76d227e47.zip
s390/extable: convert to relative table with data
Follow arm64, riscv, and x86 and change extable layout to common "relative table with data". This allows to get rid of s390 specific code in sorttable.c. The main difference to before is that extable entries do not contain a relative function pointer anymore. Instead data and type fields are added. The type field is used to indicate which exception handler needs to be called, while the data field is currently unused. Acked-by: Alexander Gordeev <agordeev@linux.ibm.com> Signed-off-by: Heiko Carstens <hca@linux.ibm.com> Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
Diffstat (limited to 'arch/s390/mm')
-rw-r--r--arch/s390/mm/extable.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/arch/s390/mm/extable.c b/arch/s390/mm/extable.c
index d6ca75570dcf..ac6b736ac883 100644
--- a/arch/s390/mm/extable.c
+++ b/arch/s390/mm/extable.c
@@ -1,6 +1,8 @@
// SPDX-License-Identifier: GPL-2.0
#include <linux/extable.h>
+#include <linux/panic.h>
+#include <asm/asm-extable.h>
#include <asm/extable.h>
const struct exception_table_entry *s390_search_extables(unsigned long addr)
@@ -15,17 +17,24 @@ const struct exception_table_entry *s390_search_extables(unsigned long addr)
return search_extable(__start_amode31_ex_table, num, addr);
}
+static bool ex_handler_fixup(const struct exception_table_entry *ex, struct pt_regs *regs)
+{
+ regs->psw.addr = extable_fixup(ex);
+ return true;
+}
+
bool fixup_exception(struct pt_regs *regs)
{
const struct exception_table_entry *ex;
- ex_handler_t handler;
ex = s390_search_extables(instruction_pointer(regs));
if (!ex)
return false;
- handler = ex_fixup_handler(ex);
- if (unlikely(handler))
- return handler(ex, regs);
- regs->psw.addr = extable_fixup(ex);
- return true;
+ switch (ex->type) {
+ case EX_TYPE_FIXUP:
+ return ex_handler_fixup(ex, regs);
+ case EX_TYPE_BPF:
+ return ex_handler_bpf(ex, regs);
+ }
+ panic("invalid exception table entry");
}