linux/arch/mips/mm/pgtable-64.c
<<
>>
Prefs
   1/*
   2 * This file is subject to the terms and conditions of the GNU General Public
   3 * License.  See the file "COPYING" in the main directory of this archive
   4 * for more details.
   5 *
   6 * Copyright (C) 1999, 2000 by Silicon Graphics
   7 * Copyright (C) 2003 by Ralf Baechle
   8 */
   9#include <linux/export.h>
  10#include <linux/init.h>
  11#include <linux/mm.h>
  12#include <asm/fixmap.h>
  13#include <asm/pgalloc.h>
  14#include <asm/tlbflush.h>
  15
  16void pgd_init(unsigned long page)
  17{
  18        unsigned long *p, *end;
  19        unsigned long entry;
  20
  21#if !defined(__PAGETABLE_PUD_FOLDED)
  22        entry = (unsigned long)invalid_pud_table;
  23#elif !defined(__PAGETABLE_PMD_FOLDED)
  24        entry = (unsigned long)invalid_pmd_table;
  25#else
  26        entry = (unsigned long)invalid_pte_table;
  27#endif
  28
  29        p = (unsigned long *) page;
  30        end = p + PTRS_PER_PGD;
  31
  32        do {
  33                p[0] = entry;
  34                p[1] = entry;
  35                p[2] = entry;
  36                p[3] = entry;
  37                p[4] = entry;
  38                p += 8;
  39                p[-3] = entry;
  40                p[-2] = entry;
  41                p[-1] = entry;
  42        } while (p != end);
  43}
  44
  45#ifndef __PAGETABLE_PMD_FOLDED
  46void pmd_init(unsigned long addr, unsigned long pagetable)
  47{
  48        unsigned long *p, *end;
  49
  50        p = (unsigned long *) addr;
  51        end = p + PTRS_PER_PMD;
  52
  53        do {
  54                p[0] = pagetable;
  55                p[1] = pagetable;
  56                p[2] = pagetable;
  57                p[3] = pagetable;
  58                p[4] = pagetable;
  59                p += 8;
  60                p[-3] = pagetable;
  61                p[-2] = pagetable;
  62                p[-1] = pagetable;
  63        } while (p != end);
  64}
  65EXPORT_SYMBOL_GPL(pmd_init);
  66#endif
  67
  68#ifndef __PAGETABLE_PUD_FOLDED
  69void pud_init(unsigned long addr, unsigned long pagetable)
  70{
  71        unsigned long *p, *end;
  72
  73        p = (unsigned long *)addr;
  74        end = p + PTRS_PER_PUD;
  75
  76        do {
  77                p[0] = pagetable;
  78                p[1] = pagetable;
  79                p[2] = pagetable;
  80                p[3] = pagetable;
  81                p[4] = pagetable;
  82                p += 8;
  83                p[-3] = pagetable;
  84                p[-2] = pagetable;
  85                p[-1] = pagetable;
  86        } while (p != end);
  87}
  88#endif
  89
  90pmd_t mk_pmd(struct page *page, pgprot_t prot)
  91{
  92        pmd_t pmd;
  93
  94        pmd_val(pmd) = (page_to_pfn(page) << _PFN_SHIFT) | pgprot_val(prot);
  95
  96        return pmd;
  97}
  98
  99void set_pmd_at(struct mm_struct *mm, unsigned long addr,
 100                pmd_t *pmdp, pmd_t pmd)
 101{
 102        *pmdp = pmd;
 103        flush_tlb_all();
 104}
 105
 106void __init pagetable_init(void)
 107{
 108        unsigned long vaddr;
 109        pgd_t *pgd_base;
 110
 111        /* Initialize the entire pgd.  */
 112        pgd_init((unsigned long)swapper_pg_dir);
 113#ifndef __PAGETABLE_PUD_FOLDED
 114        pud_init((unsigned long)invalid_pud_table, (unsigned long)invalid_pmd_table);
 115#endif
 116#ifndef __PAGETABLE_PMD_FOLDED
 117        pmd_init((unsigned long)invalid_pmd_table, (unsigned long)invalid_pte_table);
 118#endif
 119        pgd_base = swapper_pg_dir;
 120        /*
 121         * Fixed mappings:
 122         */
 123        vaddr = __fix_to_virt(__end_of_fixed_addresses - 1) & PMD_MASK;
 124        fixrange_init(vaddr, vaddr + FIXADDR_SIZE, pgd_base);
 125}
 126