Commit 46fee16f authored by Heiko Carstens's avatar Heiko Carstens Committed by Vasily Gorbik
Browse files

s390/extable: add and use fixup_exception helper function



Add and use fixup_exception helper function in order to remove the
duplicated exception handler fixup code at several places.

Reviewed-by: default avatarAlexander Gordeev <agordeev@linux.ibm.com>
Signed-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
Signed-off-by: default avatarVasily Gorbik <gor@linux.ibm.com>
parent cfa45c5e
Loading
Loading
Loading
Loading
+2 −11
Original line number Diff line number Diff line
@@ -49,17 +49,6 @@ ex_fixup_handler(const struct exception_table_entry *x)
	return (ex_handler_t)((unsigned long)&x->handler + x->handler);
}

static inline bool ex_handle(const struct exception_table_entry *x,
			     struct pt_regs *regs)
{
	ex_handler_t handler = ex_fixup_handler(x);

	if (unlikely(handler))
		return handler(x, regs);
	regs->psw.addr = extable_fixup(x);
	return true;
}

#define ARCH_HAS_RELATIVE_EXTABLE

static inline void swap_ex_entry_fixup(struct exception_table_entry *a,
@@ -78,4 +67,6 @@ static inline void swap_ex_entry_fixup(struct exception_table_entry *a,
}
#define swap_ex_entry_fixup swap_ex_entry_fixup

bool fixup_exception(struct pt_regs *regs);

#endif
+1 −5
Original line number Diff line number Diff line
@@ -151,12 +151,8 @@ static __init void setup_topology(void)

static void early_pgm_check_handler(struct pt_regs *regs)
{
	const struct exception_table_entry *fixup;

	fixup = s390_search_extables(regs->psw.addr);
	if (!fixup)
	if (!fixup_exception(regs))
		disabled_wait();
	regs->psw.addr = extable_fixup(fixup);
}

static noinline __init void setup_lowcore_early(void)
+1 −4
Original line number Diff line number Diff line
@@ -465,7 +465,6 @@ static int kprobe_trap_handler(struct pt_regs *regs, int trapnr)
{
	struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
	struct kprobe *p = kprobe_running();
	const struct exception_table_entry *entry;

	switch(kcb->kprobe_status) {
	case KPROBE_HIT_SS:
@@ -487,10 +486,8 @@ static int kprobe_trap_handler(struct pt_regs *regs, int trapnr)
		 * In case the user-specified fault handler returned
		 * zero, try to fix up.
		 */
		entry = s390_search_extables(regs->psw.addr);
		if (entry && ex_handle(entry, regs))
		if (fixup_exception(regs))
			return 1;

		/*
		 * fixup_exception() could not handle it,
		 * Let do_page_fault() fix it.
+2 −8
Original line number Diff line number Diff line
@@ -54,9 +54,7 @@ void do_report_trap(struct pt_regs *regs, int si_signo, int si_code, char *str)
		force_sig_fault(si_signo, si_code, get_trap_ip(regs));
		report_user_fault(regs, si_signo, 0);
        } else {
                const struct exception_table_entry *fixup;
		fixup = s390_search_extables(regs->psw.addr);
		if (!fixup || !ex_handle(fixup, regs))
		if (!fixup_exception(regs))
			die(regs, str);
        }
}
@@ -245,16 +243,12 @@ static void space_switch_exception(struct pt_regs *regs)

static void monitor_event_exception(struct pt_regs *regs)
{
	const struct exception_table_entry *fixup;

	if (user_mode(regs))
		return;

	switch (report_bug(regs->psw.addr - (regs->int_code >> 16), regs)) {
	case BUG_TRAP_TYPE_NONE:
		fixup = s390_search_extables(regs->psw.addr);
		if (fixup)
			ex_handle(fixup, regs);
		fixup_exception(regs);
		break;
	case BUG_TRAP_TYPE_WARN:
		break;
+15 −0
Original line number Diff line number Diff line
@@ -14,3 +14,18 @@ const struct exception_table_entry *s390_search_extables(unsigned long addr)
	num = __stop_amode31_ex_table - __start_amode31_ex_table;
	return search_extable(__start_amode31_ex_table, num, addr);
}

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;
}
Loading