arch: remove score port
[sfrench/cifs-2.6.git] / arch / score / mm / fault.c
diff --git a/arch/score/mm/fault.c b/arch/score/mm/fault.c
deleted file mode 100644 (file)
index b85fad4..0000000
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- * arch/score/mm/fault.c
- *
- * Score Processor version.
- *
- * Copyright (C) 2009 Sunplus Core Technology Co., Ltd.
- *  Lennox Wu <lennox.wu@sunplusct.com>
- *  Chen Liqin <liqin.chen@sunplusct.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, see the file COPYING, or write
- * to the Free Software Foundation, Inc.,
- * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- */
-
-#include <linux/errno.h>
-#include <linux/interrupt.h>
-#include <linux/kernel.h>
-#include <linux/mm.h>
-#include <linux/mman.h>
-#include <linux/extable.h>
-#include <linux/signal.h>
-#include <linux/sched.h>
-#include <linux/string.h>
-#include <linux/types.h>
-#include <linux/ptrace.h>
-#include <linux/uaccess.h>
-
-/*
- * This routine handles page faults.  It determines the 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 write,
-                               unsigned long address)
-{
-       struct vm_area_struct *vma = NULL;
-       struct task_struct *tsk = current;
-       struct mm_struct *mm = tsk->mm;
-       const int field = sizeof(unsigned long) * 2;
-       unsigned long flags = 0;
-       siginfo_t info;
-       int fault;
-
-       info.si_code = SEGV_MAPERR;
-
-       /*
-       * We fault-in kernel-space virtual memory on-demand. The
-       * 'reference' page table is init_mm.pgd.
-       *
-       * NOTE! We MUST NOT take any locks for this case. We may
-       * be in an interrupt or a critical region, and should
-       * only copy the information from the master page table,
-       * nothing more.
-       */
-       if (unlikely(address >= VMALLOC_START && address <= VMALLOC_END))
-               goto vmalloc_fault;
-#ifdef MODULE_START
-       if (unlikely(address >= MODULE_START && address < MODULE_END))
-               goto vmalloc_fault;
-#endif
-
-       /*
-       * If we're in an interrupt or have no user
-       * context, we must not take the fault..
-       */
-       if (pagefault_disabled() || !mm)
-               goto bad_area_nosemaphore;
-
-       if (user_mode(regs))
-               flags |= FAULT_FLAG_USER;
-
-       down_read(&mm->mmap_sem);
-       vma = find_vma(mm, address);
-       if (!vma)
-               goto bad_area;
-       if (vma->vm_start <= address)
-               goto good_area;
-       if (!(vma->vm_flags & VM_GROWSDOWN))
-               goto bad_area;
-       if (expand_stack(vma, address))
-               goto bad_area;
-       /*
-       * Ok, we have a good vm_area for this memory access, so
-       * we can handle it..
-        */
-good_area:
-       info.si_code = SEGV_ACCERR;
-
-       if (write) {
-               if (!(vma->vm_flags & VM_WRITE))
-                       goto bad_area;
-               flags |= FAULT_FLAG_WRITE;
-       } else {
-               if (!(vma->vm_flags & (VM_READ | VM_WRITE | VM_EXEC)))
-                       goto bad_area;
-       }
-
-       /*
-       * If for any reason at all we couldn't handle the fault,
-       * make sure we exit gracefully rather than endlessly redo
-       * the fault.
-       */
-       fault = handle_mm_fault(vma, address, flags);
-       if (unlikely(fault & VM_FAULT_ERROR)) {
-               if (fault & VM_FAULT_OOM)
-                       goto out_of_memory;
-               else if (fault & VM_FAULT_SIGSEGV)
-                       goto bad_area;
-               else if (fault & VM_FAULT_SIGBUS)
-                       goto do_sigbus;
-               BUG();
-       }
-       if (fault & VM_FAULT_MAJOR)
-               tsk->maj_flt++;
-       else
-               tsk->min_flt++;
-
-       up_read(&mm->mmap_sem);
-       return;
-
-       /*
-       * Something tried to access memory that isn't in our memory map..
-       * Fix it, but check if it's kernel or user first..
-        */
-bad_area:
-       up_read(&mm->mmap_sem);
-
-bad_area_nosemaphore:
-       /* User mode accesses just cause a SIGSEGV */
-       if (user_mode(regs)) {
-               tsk->thread.cp0_badvaddr = address;
-               tsk->thread.error_code = write;
-               info.si_signo = SIGSEGV;
-               info.si_errno = 0;
-               /* info.si_code has been set above */
-               info.si_addr = (void __user *) address;
-               force_sig_info(SIGSEGV, &info, tsk);
-               return;
-       }
-
-no_context:
-       /* Are we prepared to handle this kernel fault? */
-       if (fixup_exception(regs)) {
-               current->thread.cp0_baduaddr = address;
-               return;
-       }
-
-       /*
-       * Oops. The kernel tried to access some bad page. We'll have to
-       * terminate things with extreme prejudice.
-       */
-       bust_spinlocks(1);
-
-       printk(KERN_ALERT "CPU %d Unable to handle kernel paging request at "
-                       "virtual address %0*lx, epc == %0*lx, ra == %0*lx\n",
-                       0, field, address, field, regs->cp0_epc,
-                       field, regs->regs[3]);
-       die("Oops", regs);
-
-       /*
-       * We ran out of memory, or some other thing happened to us that made
-       * us unable to handle the page fault gracefully.
-       */
-out_of_memory:
-       up_read(&mm->mmap_sem);
-       if (!user_mode(regs))
-               goto no_context;
-       pagefault_out_of_memory();
-       return;
-
-do_sigbus:
-       up_read(&mm->mmap_sem);
-       /* Kernel mode? Handle exceptions or die */
-       if (!user_mode(regs))
-               goto no_context;
-       else
-       /*
-       * Send a sigbus, regardless of whether we were in kernel
-       * or user mode.
-       */
-       tsk->thread.cp0_badvaddr = address;
-       info.si_signo = SIGBUS;
-       info.si_errno = 0;
-       info.si_code = BUS_ADRERR;
-       info.si_addr = (void __user *) address;
-       force_sig_info(SIGBUS, &info, tsk);
-       return;
-vmalloc_fault:
-       {
-               /*
-               * Synchronize this task's top level page-table
-               * with the 'reference' page table.
-               *
-               * Do _not_ use "tsk" here. We might be inside
-               * an interrupt in the middle of a task switch..
-               */
-               int offset = __pgd_offset(address);
-               pgd_t *pgd, *pgd_k;
-               pud_t *pud, *pud_k;
-               pmd_t *pmd, *pmd_k;
-               pte_t *pte_k;
-
-               pgd = (pgd_t *) pgd_current + offset;
-               pgd_k = init_mm.pgd + offset;
-
-               if (!pgd_present(*pgd_k))
-                       goto no_context;
-               set_pgd(pgd, *pgd_k);
-
-               pud = pud_offset(pgd, address);
-               pud_k = pud_offset(pgd_k, address);
-               if (!pud_present(*pud_k))
-                       goto no_context;
-
-               pmd = pmd_offset(pud, address);
-               pmd_k = pmd_offset(pud_k, address);
-               if (!pmd_present(*pmd_k))
-                       goto no_context;
-               set_pmd(pmd, *pmd_k);
-
-               pte_k = pte_offset_kernel(pmd_k, address);
-               if (!pte_present(*pte_k))
-                       goto no_context;
-               return;
-       }
-}