Skip to content

Commit

Permalink
sh64: Utilize thread fault code encoding.
Browse files Browse the repository at this point in the history
This plugs in fault code encoding for the sh64 page fault, too.

Signed-off-by: Paul Mundt <lethal@linux-sh.org>
  • Loading branch information
Paul Mundt committed May 14, 2012
1 parent 5a1dc78 commit 9a7b773
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 16 deletions.
20 changes: 9 additions & 11 deletions arch/sh/kernel/cpu/sh5/entry.S
Original file line number Diff line number Diff line change
Expand Up @@ -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
*
Expand All @@ -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:
Expand Down
12 changes: 7 additions & 5 deletions arch/sh/mm/tlbflush_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -122,7 +124,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long writeaccess,
if (!(vma->vm_flags & VM_EXEC))
goto bad_area;
} else {
if (writeaccess) {
if (write) {
if (!(vma->vm_flags & VM_WRITE))
goto bad_area;
} else {
Expand Down Expand Up @@ -239,7 +241,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long writeaccess,
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);

/*
Expand Down

0 comments on commit 9a7b773

Please sign in to comment.