linux/include/asm-um/pgtable-2level.h
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
   3 * Copyright 2003 PathScale, Inc.
   4 * Derived from include/asm-i386/pgtable.h
   5 * Licensed under the GPL
   6 */
   7
   8#ifndef __UM_PGTABLE_2LEVEL_H
   9#define __UM_PGTABLE_2LEVEL_H
  10
  11#include <asm-generic/pgtable-nopmd.h>
  12
  13/* PGDIR_SHIFT determines what a third-level page table entry can map */
  14
  15#define PGDIR_SHIFT     22
  16#define PGDIR_SIZE      (1UL << PGDIR_SHIFT)
  17#define PGDIR_MASK      (~(PGDIR_SIZE-1))
  18
  19/*
  20 * entries per page directory level: the i386 is two-level, so
  21 * we don't really have any PMD directory physically.
  22 */
  23#define PTRS_PER_PTE    1024
  24#define PTRS_PER_PMD    1
  25#define USER_PTRS_PER_PGD ((TASK_SIZE + (PGDIR_SIZE - 1)) / PGDIR_SIZE)
  26#define PTRS_PER_PGD    1024
  27#define FIRST_USER_PGD_NR       0
  28
  29#define pte_ERROR(e) \
  30        printk("%s:%d: bad pte %p(%08lx).\n", __FILE__, __LINE__, &(e), \
  31               pte_val(e))
  32#define pgd_ERROR(e) \
  33        printk("%s:%d: bad pgd %p(%08lx).\n", __FILE__, __LINE__, &(e), \
  34               pgd_val(e))
  35
  36static inline int pgd_newpage(pgd_t pgd)        { return 0; }
  37static inline void pgd_mkuptodate(pgd_t pgd)    { }
  38
  39#define pte_present(x)  (pte_val(x) & (_PAGE_PRESENT | _PAGE_PROTNONE))
  40
  41static inline pte_t pte_mknewprot(pte_t pte)
  42{
  43        pte_val(pte) |= _PAGE_NEWPROT;
  44        return(pte);
  45}
  46
  47static inline pte_t pte_mknewpage(pte_t pte)
  48{
  49        pte_val(pte) |= _PAGE_NEWPAGE;
  50        return(pte);
  51}
  52
  53static inline void set_pte(pte_t *pteptr, pte_t pteval)
  54{
  55        /* If it's a swap entry, it needs to be marked _PAGE_NEWPAGE so
  56         * fix_range knows to unmap it.  _PAGE_NEWPROT is specific to
  57         * mapped pages.
  58         */
  59        *pteptr = pte_mknewpage(pteval);
  60        if(pte_present(*pteptr)) *pteptr = pte_mknewprot(*pteptr);
  61}
  62
  63#define set_pmd(pmdptr, pmdval) (*(pmdptr) = (pmdval))
  64
  65#define pte_page(x) pfn_to_page(pte_pfn(x))
  66#define pte_none(x) !(pte_val(x) & ~_PAGE_NEWPAGE)
  67#define pte_pfn(x) phys_to_pfn(pte_val(x))
  68#define pfn_pte(pfn, prot) __pte(pfn_to_phys(pfn) | pgprot_val(prot))
  69#define pfn_pmd(pfn, prot) __pmd(pfn_to_phys(pfn) | pgprot_val(prot))
  70
  71#define pmd_page_kernel(pmd) \
  72        ((unsigned long) __va(pmd_val(pmd) & PAGE_MASK))
  73
  74/*
  75 * Bits 0 through 3 are taken
  76 */
  77#define PTE_FILE_MAX_BITS       28
  78
  79#define pte_to_pgoff(pte) (pte_val(pte) >> 4)
  80
  81#define pgoff_to_pte(off) ((pte_t) { ((off) << 4) + _PAGE_FILE })
  82
  83#endif
  84
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.