pgtable-3level.h 3.2 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13
/*
 * Copyright 2003 PathScale Inc
 * Derived from include/asm-i386/pgtable.h
 * Licensed under the GPL
 */

#ifndef __UM_PGTABLE_3LEVEL_H
#define __UM_PGTABLE_3LEVEL_H

#include <asm-generic/pgtable-nopud.h>

/* PGDIR_SHIFT determines what a third-level page table entry can map */

J
Jeff Dike 已提交
14
#ifdef CONFIG_64BIT
L
Linus Torvalds 已提交
15
#define PGDIR_SHIFT	30
J
Jeff Dike 已提交
16 17 18
#else
#define PGDIR_SHIFT	31
#endif
L
Linus Torvalds 已提交
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
#define PGDIR_SIZE	(1UL << PGDIR_SHIFT)
#define PGDIR_MASK	(~(PGDIR_SIZE-1))

/* PMD_SHIFT determines the size of the area a second-level page table can
 * map
 */

#define PMD_SHIFT	21
#define PMD_SIZE	(1UL << PMD_SHIFT)
#define PMD_MASK	(~(PMD_SIZE-1))

/*
 * entries per page directory level
 */

#define PTRS_PER_PTE 512
J
Jeff Dike 已提交
35
#ifdef CONFIG_64BIT
L
Linus Torvalds 已提交
36 37
#define PTRS_PER_PMD 512
#define PTRS_PER_PGD 512
J
Jeff Dike 已提交
38 39 40 41 42 43
#else
#define PTRS_PER_PMD 1024
#define PTRS_PER_PGD 1024
#endif

#define USER_PTRS_PER_PGD ((TASK_SIZE + (PGDIR_SIZE - 1)) / PGDIR_SIZE)
44
#define FIRST_USER_ADDRESS	0
L
Linus Torvalds 已提交
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

#define pte_ERROR(e) \
        printk("%s:%d: bad pte %p(%016lx).\n", __FILE__, __LINE__, &(e), \
	       pte_val(e))
#define pmd_ERROR(e) \
        printk("%s:%d: bad pmd %p(%016lx).\n", __FILE__, __LINE__, &(e), \
	       pmd_val(e))
#define pgd_ERROR(e) \
        printk("%s:%d: bad pgd %p(%016lx).\n", __FILE__, __LINE__, &(e), \
	       pgd_val(e))

#define pud_none(x)	(!(pud_val(x) & ~_PAGE_NEWPAGE))
#define	pud_bad(x)	((pud_val(x) & (~PAGE_MASK & ~_PAGE_USER)) != _KERNPG_TABLE)
#define pud_present(x)	(pud_val(x) & _PAGE_PRESENT)
#define pud_populate(mm, pud, pmd) \
	set_pud(pud, __pud(_PAGE_TABLE + __pa(pmd)))

J
Jeff Dike 已提交
62
#ifdef CONFIG_64BIT
L
Linus Torvalds 已提交
63
#define set_pud(pudptr, pudval) set_64bit((phys_t *) (pudptr), pud_val(pudval))
J
Jeff Dike 已提交
64 65 66 67
#else
#define set_pud(pudptr, pudval) (*(pudptr) = (pudval))
#endif

L
Linus Torvalds 已提交
68 69 70 71 72 73 74
static inline int pgd_newpage(pgd_t pgd)
{
	return(pgd_val(pgd) & _PAGE_NEWPAGE);
}

static inline void pgd_mkuptodate(pgd_t pgd) { pgd_val(pgd) &= ~_PAGE_NEWPAGE; }

J
Jeff Dike 已提交
75
#ifdef CONFIG_64BIT
L
Linus Torvalds 已提交
76
#define set_pmd(pmdptr, pmdval) set_64bit((phys_t *) (pmdptr), pmd_val(pmdval))
J
Jeff Dike 已提交
77 78 79
#else
#define set_pmd(pmdptr, pmdval) (*(pmdptr) = (pmdval))
#endif
L
Linus Torvalds 已提交
80

J
Jeff Dike 已提交
81 82
struct mm_struct;
extern pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address);
L
Linus Torvalds 已提交
83

J
Jeff Dike 已提交
84
static inline void pud_clear (pud_t *pud)
J
Jeff Dike 已提交
85
{
86
	set_pud(pud, __pud(_PAGE_NEWPAGE));
L
Linus Torvalds 已提交
87 88
}

89
#define pud_page(pud) phys_to_page(pud_val(pud) & PAGE_MASK)
J
Jeff Dike 已提交
90
#define pud_page_vaddr(pud) ((unsigned long) __va(pud_val(pud) & PAGE_MASK))
L
Linus Torvalds 已提交
91 92

/* Find an entry in the second-level page table.. */
93
#define pmd_offset(pud, address) ((pmd_t *) pud_page_vaddr(*(pud)) + \
L
Linus Torvalds 已提交
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
			pmd_index(address))

static inline unsigned long pte_pfn(pte_t pte)
{
	return phys_to_pfn(pte_val(pte));
}

static inline pte_t pfn_pte(pfn_t page_nr, pgprot_t pgprot)
{
	pte_t pte;
	phys_t phys = pfn_to_phys(page_nr);

	pte_set_val(pte, phys, pgprot);
	return pte;
}

static inline pmd_t pfn_pmd(pfn_t page_nr, pgprot_t pgprot)
{
	return __pmd((page_nr << PAGE_SHIFT) | pgprot_val(pgprot));
}

/*
 * Bits 0 through 3 are taken in the low part of the pte,
 * put the 32 bits of offset into the high part.
 */
#define PTE_FILE_MAX_BITS	32

121
#ifdef CONFIG_64BIT
L
Linus Torvalds 已提交
122 123 124

#define pte_to_pgoff(p) ((p).pte >> 32)

125
#define pgoff_to_pte(off) ((pte_t) { ((off) << 32) | _PAGE_FILE })
L
Linus Torvalds 已提交
126 127 128 129 130 131 132 133 134 135 136

#else

#define pte_to_pgoff(pte) ((pte).pte_high)

#define pgoff_to_pte(off) ((pte_t) { _PAGE_FILE, (off) })

#endif

#endif