Commit c45ba4f4 authored by Nicholas Piggin's avatar Nicholas Piggin Committed by Michael Ellerman
Browse files

powerpc: clean up do_page_fault



search_exception_tables + __bad_page_fault can be substituted with
bad_page_fault, do_page_fault no longer needs to return a value
to asm for any sub-architecture, and __bad_page_fault can be static.

Signed-off-by: default avatarNicholas Piggin <npiggin@gmail.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20210316104206.407354-10-npiggin@gmail.com
parent d738ee8d
Loading
Loading
Loading
Loading
+1 −4
Original line number Diff line number Diff line
@@ -111,11 +111,8 @@
#ifndef __ASSEMBLY__

struct pt_regs;
long do_page_fault(struct pt_regs *);
long hash__do_page_fault(struct pt_regs *);
void hash__do_page_fault(struct pt_regs *);
void bad_page_fault(struct pt_regs *, int);
void __bad_page_fault(struct pt_regs *regs, int sig);
void do_bad_page_fault_segv(struct pt_regs *regs);
extern void _exception(int, struct pt_regs *, int, unsigned long);
extern void _exception_pkey(struct pt_regs *, unsigned long, int);
extern void die(const char *, struct pt_regs *, long);
+1 −1
Original line number Diff line number Diff line
@@ -444,7 +444,7 @@ DECLARE_INTERRUPT_HANDLER(do_bad_slb_fault);
DECLARE_INTERRUPT_HANDLER_RAW(do_hash_fault);

/* fault.c */
DECLARE_INTERRUPT_HANDLER_RET(do_page_fault);
DECLARE_INTERRUPT_HANDLER(do_page_fault);
DECLARE_INTERRUPT_HANDLER(do_bad_page_fault_segv);

/* process.c */
+7 −9
Original line number Diff line number Diff line
@@ -1583,10 +1583,11 @@ DEFINE_INTERRUPT_HANDLER_RET(__do_hash_fault)
DEFINE_INTERRUPT_HANDLER_RAW(do_hash_fault)
{
	unsigned long dsisr = regs->dsisr;
	long err;

	if (unlikely(dsisr & (DSISR_BAD_FAULT_64S | DSISR_KEYFAULT)))
		goto page_fault;
	if (unlikely(dsisr & (DSISR_BAD_FAULT_64S | DSISR_KEYFAULT))) {
		hash__do_page_fault(regs);
		return 0;
	}

	/*
	 * If we are in an "NMI" (e.g., an interrupt when soft-disabled), then
@@ -1606,13 +1607,10 @@ DEFINE_INTERRUPT_HANDLER_RAW(do_hash_fault)
		return 0;
	}

	err = __do_hash_fault(regs);
	if (err) {
page_fault:
		err = hash__do_page_fault(regs);
	}
	if (__do_hash_fault(regs))
		hash__do_page_fault(regs);

	return err;
	return 0;
}

#ifdef CONFIG_PPC_MM_SLICES
+8 −19
Original line number Diff line number Diff line
@@ -539,36 +539,25 @@ static int ___do_page_fault(struct pt_regs *regs, unsigned long address,
}
NOKPROBE_SYMBOL(___do_page_fault);

static long __do_page_fault(struct pt_regs *regs)
static __always_inline void __do_page_fault(struct pt_regs *regs)
{
	const struct exception_table_entry *entry;
	long err;

	err = ___do_page_fault(regs, regs->dar, regs->dsisr);
	if (likely(!err))
		return err;

	entry = search_exception_tables(regs->nip);
	if (likely(entry)) {
		instruction_pointer_set(regs, extable_fixup(entry));
		return 0;
	} else {
		__bad_page_fault(regs, err);
		return 0;
	}
	if (unlikely(err))
		bad_page_fault(regs, err);
}
NOKPROBE_SYMBOL(__do_page_fault);

DEFINE_INTERRUPT_HANDLER_RET(do_page_fault)
DEFINE_INTERRUPT_HANDLER(do_page_fault)
{
	return __do_page_fault(regs);
	__do_page_fault(regs);
}

#ifdef CONFIG_PPC_BOOK3S_64
/* Same as do_page_fault but interrupt entry has already run in do_hash_fault */
long hash__do_page_fault(struct pt_regs *regs)
void hash__do_page_fault(struct pt_regs *regs)
{
	return __do_page_fault(regs);
	__do_page_fault(regs);
}
NOKPROBE_SYMBOL(hash__do_page_fault);
#endif
@@ -578,7 +567,7 @@ NOKPROBE_SYMBOL(hash__do_page_fault);
 * It is called from the DSI and ISI handlers in head.S and from some
 * of the procedures in traps.c.
 */
void __bad_page_fault(struct pt_regs *regs, int sig)
static void __bad_page_fault(struct pt_regs *regs, int sig)
{
	int is_write = page_fault_is_write(regs->dsisr);