Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2ca2ebfd authored by David Daney's avatar David Daney Committed by Ralf Baechle
Browse files

MIPS: Don't corrupt page tables on vmalloc fault.



The code after the vmalloc_fault: label in do_page_fault() modifies
user page tables, this is not correct for 64-bit kernels.

For 64-bit kernels we should go straight to the no_context handler
skipping vmalloc_fault.

Signed-off-by: default avatarDavid Daney <ddaney@caviumnetworks.com>
Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent e0cc87f5
Loading
Loading
Loading
Loading
+10 −2
Original line number Original line Diff line number Diff line
@@ -58,11 +58,17 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long write,
	 * only copy the information from the master page table,
	 * only copy the information from the master page table,
	 * nothing more.
	 * nothing more.
	 */
	 */
#ifdef CONFIG_64BIT
# define VMALLOC_FAULT_TARGET no_context
#else
# define VMALLOC_FAULT_TARGET vmalloc_fault
#endif

	if (unlikely(address >= VMALLOC_START && address <= VMALLOC_END))
	if (unlikely(address >= VMALLOC_START && address <= VMALLOC_END))
		goto vmalloc_fault;
		goto VMALLOC_FAULT_TARGET;
#ifdef MODULE_START
#ifdef MODULE_START
	if (unlikely(address >= MODULE_START && address < MODULE_END))
	if (unlikely(address >= MODULE_START && address < MODULE_END))
		goto vmalloc_fault;
		goto VMALLOC_FAULT_TARGET;
#endif
#endif


	/*
	/*
@@ -203,6 +209,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long write,
	force_sig_info(SIGBUS, &info, tsk);
	force_sig_info(SIGBUS, &info, tsk);


	return;
	return;
#ifndef CONFIG_64BIT
vmalloc_fault:
vmalloc_fault:
	{
	{
		/*
		/*
@@ -241,4 +248,5 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long write,
			goto no_context;
			goto no_context;
		return;
		return;
	}
	}
#endif
}
}