mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-26 21:54:11 +08:00
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: Nicholas Piggin <npiggin@gmail.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20210316104206.407354-10-npiggin@gmail.com
This commit is contained in:
parent
d738ee8d56
commit
c45ba4f44f
@ -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);
|
||||
|
@ -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 */
|
||||
|
@ -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
|
||||
|
@ -539,36 +539,25 @@ retry:
|
||||
}
|
||||
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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user