sh64: Utilize thread fault code encoding.
authorPaul Mundt <lethal@linux-sh.org>
Mon, 14 May 2012 06:07:52 +0000 (15:07 +0900)
committerPaul Mundt <lethal@linux-sh.org>
Mon, 14 May 2012 06:07:52 +0000 (15:07 +0900)
This plugs in fault code encoding for the sh64 page fault, too.

Signed-off-by: Paul Mundt <lethal@linux-sh.org>
arch/sh/kernel/cpu/sh5/entry.S
arch/sh/mm/tlbflush_64.c

index 6b80295dd7a4bd5a612faf9001467c5be95c150d..de60dc8d737dd71645207fbfbadf749ac13569ea 100644 (file)
@@ -1079,9 +1079,8 @@ restore_all:
  *
  * Kernel TLB fault handlers will get a slightly different interface.
  * (r2)   struct pt_regs *, original register's frame pointer
- * (r3)   writeaccess, whether it's a store fault as opposed to load fault
- * (r4)   execaccess, whether it's a ITLB fault as opposed to DTLB fault
- * (r5)   Effective Address of fault
+ * (r3)   page fault error code (see asm/thread_info.h)
+ * (r4)   Effective Address of fault
  * (LINK) return address
  * (SP)   = r2
  *
@@ -1092,26 +1091,25 @@ restore_all:
 tlb_miss_load:
        or      SP, ZERO, r2
        or      ZERO, ZERO, r3          /* Read */
-       or      ZERO, ZERO, r4          /* Data */
-       getcon  TEA, r5
+       getcon  TEA, r4
        pta     call_do_page_fault, tr0
        beq     ZERO, ZERO, tr0
 
 tlb_miss_store:
        or      SP, ZERO, r2
-       movi    1, r3                   /* Write */
-       or      ZERO, ZERO, r4          /* Data */
-       getcon  TEA, r5
+       movi    FAULT_CODE_WRITE, r3            /* Write */
+       getcon  TEA, r4
        pta     call_do_page_fault, tr0
        beq     ZERO, ZERO, tr0
 
 itlb_miss_or_IRQ:
        pta     its_IRQ, tr0
        beqi/u  r4, EVENT_INTERRUPT, tr0
+
+       /* ITLB miss */
        or      SP, ZERO, r2
-       or      ZERO, ZERO, r3          /* Read */
-       movi    1, r4                   /* Text */
-       getcon  TEA, r5
+       movi    FAULT_CODE_ITLB, r3
+       getcon  TEA, r4
        /* Fall through */
 
 call_do_page_fault:
index be01f92f8c89b90063dd02b749498a9bba6fdbda..99c5833036be229132cefaaf966be8f6629c66d5 100644 (file)
@@ -61,15 +61,17 @@ static pte_t *lookup_pte(struct mm_struct *mm, unsigned long address)
  * and the problem, and then passes it off to one of the appropriate
  * routines.
  */
-asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long writeaccess,
-                             unsigned long textaccess, unsigned long address)
+asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long error_code,
+                             unsigned long address)
 {
        struct task_struct *tsk;
        struct mm_struct *mm;
        struct vm_area_struct * vma;
        const struct exception_table_entry *fixup;
+       int write = error_code & FAULT_CODE_WRITE;
+       int textaccess = error_code & FAULT_CODE_ITLB;
        unsigned int flags = (FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE |
-                             (writeaccess ? FAULT_FLAG_WRITE : 0));
+                             (write ? FAULT_FLAG_WRITE : 0));
        pte_t *pte;
        int fault;
 
@@ -122,7 +124,7 @@ good_area:
                if (!(vma->vm_flags & VM_EXEC))
                        goto bad_area;
        } else {
-               if (writeaccess) {
+               if (write) {
                        if (!(vma->vm_flags & VM_WRITE))
                                goto bad_area;
                } else {
@@ -239,7 +241,7 @@ no_context:
                printk(KERN_ALERT "Unable to handle kernel paging request");
        printk(" at virtual address %08lx\n", address);
        printk(KERN_ALERT "pc = %08Lx%08Lx\n", regs->pc >> 32, regs->pc & 0xffffffff);
-       die("Oops", regs, writeaccess);
+       die("Oops", regs, error_code);
        do_exit(SIGKILL);
 
 /*