nfsd4: move check_stateid_generation check
[safe/jmp/linux-2.6] / include / asm-frv / pgtable.h
index 8446663..e16fdb1 100644 (file)
@@ -16,7 +16,6 @@
 #ifndef _ASM_PGTABLE_H
 #define _ASM_PGTABLE_H
 
-#include <linux/config.h>
 #include <asm/mem-layout.h>
 #include <asm/setup.h>
 #include <asm/processor.h>
@@ -26,7 +25,7 @@
 #include <linux/slab.h>
 #include <linux/list.h>
 #include <linux/spinlock.h>
-struct mm_struct;
+#include <linux/sched.h>
 struct vm_area_struct;
 #endif
 
@@ -71,7 +70,11 @@ static inline int pte_file(pte_t pte) { return 0; }
 
 #define swapper_pg_dir         ((pgd_t *) NULL)
 
-#define pgtable_cache_init()   do {} while(0)
+#define pgtable_cache_init()           do {} while (0)
+#define arch_enter_lazy_mmu_mode()     do {} while (0)
+#define arch_leave_lazy_mmu_mode()     do {} while (0)
+#define arch_enter_lazy_cpu_mode()     do {} while (0)
+#define arch_leave_lazy_cpu_mode()     do {} while (0)
 
 #else /* !CONFIG_MMU */
 /*****************************************************************************/
@@ -90,7 +93,7 @@ extern unsigned long empty_zero_page;
 
 /*
  * we use 2-level page tables, folding the PMD (mid-level table) into the PGE (top-level entry)
- * [see Documentation/fujitsu/frv/mmu-layout.txt]
+ * [see Documentation/frv/mmu-layout.txt]
  *
  * Page Directory:
  *  - Size: 16KB
@@ -177,8 +180,6 @@ do {                                                        \
 } while(0)
 #define set_pte_at(mm,addr,ptep,pteval) set_pte(ptep,pteval)
 
-#define set_pte_atomic(pteptr, pteval)         set_pte((pteptr), (pteval))
-
 /*
  * pgd_offset() returns a (pgd_t *)
  * pgd_index() is used get the offset into the pgd page's array of pgd_t's;
@@ -218,14 +219,14 @@ static inline pud_t *pud_offset(pgd_t *pgd, unsigned long address)
 }
 
 #define pgd_page(pgd)                          (pud_page((pud_t){ pgd }))
-#define pgd_page_kernel(pgd)                   (pud_page_kernel((pud_t){ pgd }))
+#define pgd_page_vaddr(pgd)                    (pud_page_vaddr((pud_t){ pgd }))
 
 /*
  * allocating and freeing a pud is trivial: the 1-entry pud is
  * inside the pgd, so has no extra memory associated with it.
  */
 #define pud_alloc_one(mm, address)             NULL
-#define pud_free(x)                            do { } while (0)
+#define pud_free(mm, x)                                do { } while (0)
 #define __pud_free_tlb(tlb, x)                 do { } while (0)
 
 /*
@@ -247,7 +248,7 @@ static inline void pud_clear(pud_t *pud)    { }
 #define set_pud(pudptr, pudval)                        set_pmd((pmd_t *)(pudptr), (pmd_t) { pudval })
 
 #define pud_page(pud)                          (pmd_page((pmd_t){ pud }))
-#define pud_page_kernel(pud)                   (pmd_page_kernel((pmd_t){ pud }))
+#define pud_page_vaddr(pud)                    (pmd_page_vaddr((pmd_t){ pud }))
 
 /*
  * (pmds are folded into pgds so this doesn't get actually called,
@@ -363,7 +364,7 @@ static inline pmd_t *pmd_offset(pud_t *dir, unsigned long address)
 #define        pmd_bad(x)      (pmd_val(x) & xAMPRx_SS)
 #define pmd_clear(xp)  do { __set_pmd(xp, 0); } while(0)
 
-#define pmd_page_kernel(pmd) \
+#define pmd_page_vaddr(pmd) \
        ((unsigned long) __va(pmd_val(pmd) & PAGE_MASK))
 
 #ifndef CONFIG_DISCONTIGMEM
@@ -376,29 +377,18 @@ static inline pmd_t *pmd_offset(pud_t *dir, unsigned long address)
  * The following only work if pte_present() is true.
  * Undefined behaviour if not..
  */
-static inline int pte_read(pte_t pte)          { return !((pte).pte & _PAGE_SUPER); }
-static inline int pte_exec(pte_t pte)          { return !((pte).pte & _PAGE_SUPER); }
 static inline int pte_dirty(pte_t pte)         { return (pte).pte & _PAGE_DIRTY; }
 static inline int pte_young(pte_t pte)         { return (pte).pte & _PAGE_ACCESSED; }
 static inline int pte_write(pte_t pte)         { return !((pte).pte & _PAGE_WP); }
+static inline int pte_special(pte_t pte)       { return 0; }
 
-static inline pte_t pte_rdprotect(pte_t pte)   { (pte).pte |= _PAGE_SUPER; return pte; }
-static inline pte_t pte_exprotect(pte_t pte)   { (pte).pte |= _PAGE_SUPER; return pte; }
 static inline pte_t pte_mkclean(pte_t pte)     { (pte).pte &= ~_PAGE_DIRTY; return pte; }
 static inline pte_t pte_mkold(pte_t pte)       { (pte).pte &= ~_PAGE_ACCESSED; return pte; }
 static inline pte_t pte_wrprotect(pte_t pte)   { (pte).pte |= _PAGE_WP; return pte; }
-static inline pte_t pte_mkread(pte_t pte)      { (pte).pte &= ~_PAGE_SUPER; return pte; }
-static inline pte_t pte_mkexec(pte_t pte)      { (pte).pte &= ~_PAGE_SUPER; return pte; }
 static inline pte_t pte_mkdirty(pte_t pte)     { (pte).pte |= _PAGE_DIRTY; return pte; }
 static inline pte_t pte_mkyoung(pte_t pte)     { (pte).pte |= _PAGE_ACCESSED; return pte; }
 static inline pte_t pte_mkwrite(pte_t pte)     { (pte).pte &= ~_PAGE_WP; return pte; }
-
-static inline int ptep_test_and_clear_dirty(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep)
-{
-       int i = test_and_clear_bit(_PAGE_BIT_DIRTY, ptep);
-       asm volatile("dcf %M0" :: "U"(*ptep));
-       return i;
-}
+static inline pte_t pte_mkspecial(pte_t pte)   { return pte; }
 
 static inline int ptep_test_and_clear_young(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep)
 {
@@ -421,6 +411,11 @@ static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr,
 }
 
 /*
+ * Macro to mark a page protection value as "uncacheable"
+ */
+#define pgprot_noncached(prot) (__pgprot(pgprot_val(prot) | _PAGE_NOCACHE))
+
+/*
  * Conversion functions: convert a page and protection to a page entry,
  * and a page entry and page directory to the page they refer to.
  */
@@ -454,7 +449,7 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
 #define pte_index(address) \
                (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
 #define pte_offset_kernel(dir, address) \
-       ((pte_t *) pmd_page_kernel(*(dir)) +  pte_index(address))
+       ((pte_t *) pmd_page_vaddr(*(dir)) +  pte_index(address))
 
 #if defined(CONFIG_HIGHPTE)
 #define pte_offset_map(dir, address) \
@@ -483,7 +478,7 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
 #define __swp_type(x)                  (((x).val >> 2) & 0x1f)
 #define __swp_offset(x)                        ((x).val >> 8)
 #define __swp_entry(type, offset)      ((swp_entry_t) { ((type) << 2) | ((offset) << 8) })
-#define __pte_to_swp_entry(pte)                ((swp_entry_t) { (pte).pte })
+#define __pte_to_swp_entry(_pte)       ((swp_entry_t) { (_pte).pte })
 #define __swp_entry_to_pte(x)          ((pte_t) { (x).val })
 
 static inline int pte_file(pte_t pte)
@@ -503,12 +498,7 @@ static inline int pte_file(pte_t pte)
 #define io_remap_pfn_range(vma, vaddr, pfn, size, prot)                \
                remap_pfn_range(vma, vaddr, pfn, size, prot)
 
-#define MK_IOSPACE_PFN(space, pfn)     (pfn)
-#define GET_IOSPACE(pfn)               0
-#define GET_PFN(pfn)                   (pfn)
-
 #define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG
-#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_DIRTY
 #define __HAVE_ARCH_PTEP_GET_AND_CLEAR
 #define __HAVE_ARCH_PTEP_SET_WRPROTECT
 #define __HAVE_ARCH_PTE_SAME
@@ -519,13 +509,22 @@ static inline int pte_file(pte_t pte)
  */
 static inline void update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t pte)
 {
+       struct mm_struct *mm;
        unsigned long ampr;
-       pgd_t *pge = pgd_offset(current->mm, address);
-       pud_t *pue = pud_offset(pge, address);
-       pmd_t *pme = pmd_offset(pue, address);
 
-       ampr = pme->ste[0] & 0xffffff00;
-       ampr |= xAMPRx_L | xAMPRx_SS_16Kb | xAMPRx_S | xAMPRx_C | xAMPRx_V;
+       mm = current->mm;
+       if (mm) {
+               pgd_t *pge = pgd_offset(mm, address);
+               pud_t *pue = pud_offset(pge, address);
+               pmd_t *pme = pmd_offset(pue, address);
+
+               ampr = pme->ste[0] & 0xffffff00;
+               ampr |= xAMPRx_L | xAMPRx_SS_16Kb | xAMPRx_S | xAMPRx_C |
+                       xAMPRx_V;
+       } else {
+               address = ULONG_MAX;
+               ampr = 0;
+       }
 
        asm volatile("movgs %0,scr0\n"
                     "movgs %0,scr1\n"