|
@@ -4,10 +4,10 @@
|
|
|
* Low level bus fault handler
|
|
|
*
|
|
|
*
|
|
|
- * Copyright (C) 2000, 2001 Axis Communications AB
|
|
|
+ * Copyright (C) 2000-2007 Axis Communications AB
|
|
|
+ *
|
|
|
+ * Authors: Bjorn Wesen
|
|
|
*
|
|
|
- * Authors: Bjorn Wesen
|
|
|
- *
|
|
|
*/
|
|
|
|
|
|
#include <linux/mm.h>
|
|
@@ -60,7 +60,7 @@ handle_mmu_bus_fault(struct pt_regs *regs)
|
|
|
#ifdef DEBUG
|
|
|
page_id = IO_EXTRACT(R_MMU_CAUSE, page_id, cause);
|
|
|
acc = IO_EXTRACT(R_MMU_CAUSE, acc_excp, cause);
|
|
|
- inv = IO_EXTRACT(R_MMU_CAUSE, inv_excp, cause);
|
|
|
+ inv = IO_EXTRACT(R_MMU_CAUSE, inv_excp, cause);
|
|
|
index = IO_EXTRACT(R_TLB_SELECT, index, select);
|
|
|
#endif
|
|
|
miss = IO_EXTRACT(R_MMU_CAUSE, miss_excp, cause);
|
|
@@ -84,12 +84,13 @@ handle_mmu_bus_fault(struct pt_regs *regs)
|
|
|
local_irq_disable();
|
|
|
pmd = (pmd_t *)(pgd + pgd_index(address));
|
|
|
if (pmd_none(*pmd))
|
|
|
- return;
|
|
|
+ goto exit;
|
|
|
pte = *pte_offset_kernel(pmd, address);
|
|
|
if (!pte_present(pte))
|
|
|
- return;
|
|
|
+ goto exit;
|
|
|
*R_TLB_SELECT = select;
|
|
|
*R_TLB_HI = cause;
|
|
|
*R_TLB_LO = pte_val(pte);
|
|
|
+exit:
|
|
|
local_irq_restore(flags);
|
|
|
}
|