linux/arch/mips/include/asm/pgalloc.h
<<
>>
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) 1994 - 2001, 2003 by Ralf Baechle
   7 * Copyright (C) 1999, 2000, 2001 Silicon Graphics, Inc.
   8 */
   9#ifndef _ASM_PGALLOC_H
  10#define _ASM_PGALLOC_H
  11
  12#include <linux/highmem.h>
  13#include <linux/mm.h>
  14#include <linux/sched.h>
  15
  16#include <asm-generic/pgalloc.h>        /* for pte_{alloc,free}_one */
  17
  18static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd,
  19        pte_t *pte)
  20{
  21        set_pmd(pmd, __pmd((unsigned long)pte));
  22}
  23
  24static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd,
  25        pgtable_t pte)
  26{
  27        set_pmd(pmd, __pmd((unsigned long)page_address(pte)));
  28}
  29#define pmd_pgtable(pmd) pmd_page(pmd)
  30
  31/*
  32 * Initialize a new pmd table with invalid pointers.
  33 */
  34extern void pmd_init(unsigned long page, unsigned long pagetable);
  35
  36#ifndef __PAGETABLE_PMD_FOLDED
  37
  38static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd)
  39{
  40        set_pud(pud, __pud((unsigned long)pmd));
  41}
  42#endif
  43
  44/*
  45 * Initialize a new pgd / pmd table with invalid pointers.
  46 */
  47extern void pgd_init(unsigned long page);
  48extern pgd_t *pgd_alloc(struct mm_struct *mm);
  49
  50static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
  51{
  52        free_pages((unsigned long)pgd, PGD_ORDER);
  53}
  54
  55#define __pte_free_tlb(tlb,pte,address)                 \
  56do {                                                    \
  57        pgtable_pte_page_dtor(pte);                     \
  58        tlb_remove_page((tlb), pte);                    \
  59} while (0)
  60
  61#ifndef __PAGETABLE_PMD_FOLDED
  62
  63static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address)
  64{
  65        pmd_t *pmd;
  66
  67        pmd = (pmd_t *) __get_free_pages(GFP_KERNEL, PMD_ORDER);
  68        if (pmd)
  69                pmd_init((unsigned long)pmd, (unsigned long)invalid_pte_table);
  70        return pmd;
  71}
  72
  73static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd)
  74{
  75        free_pages((unsigned long)pmd, PMD_ORDER);
  76}
  77
  78#define __pmd_free_tlb(tlb, x, addr)    pmd_free((tlb)->mm, x)
  79
  80#endif
  81
  82#ifndef __PAGETABLE_PUD_FOLDED
  83
  84static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long address)
  85{
  86        pud_t *pud;
  87
  88        pud = (pud_t *) __get_free_pages(GFP_KERNEL, PUD_ORDER);
  89        if (pud)
  90                pud_init((unsigned long)pud, (unsigned long)invalid_pmd_table);
  91        return pud;
  92}
  93
  94static inline void pud_free(struct mm_struct *mm, pud_t *pud)
  95{
  96        free_pages((unsigned long)pud, PUD_ORDER);
  97}
  98
  99static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgd, pud_t *pud)
 100{
 101        set_pgd(pgd, __pgd((unsigned long)pud));
 102}
 103
 104#define __pud_free_tlb(tlb, x, addr)    pud_free((tlb)->mm, x)
 105
 106#endif /* __PAGETABLE_PUD_FOLDED */
 107
 108extern void pagetable_init(void);
 109
 110#endif /* _ASM_PGALLOC_H */
 111