pgtable.h

来自「Linux Kernel 2.6.9 for OMAP1710」· C头文件 代码 · 共 448 行 · 第 1/2 页

H
448
字号
#ifndef _X86_64_PGTABLE_H#define _X86_64_PGTABLE_H/* * This file contains the functions and defines necessary to modify and use * the x86-64 page table tree. *  * x86-64 has a 4 level table setup. Generic linux MM only supports * three levels. The fourth level is currently a single static page that * is shared by everybody and just contains a pointer to the current * three level page setup on the beginning and some kernel mappings at  * the end. For more details see Documentation/x86_64/mm.txt */#include <asm/processor.h>#include <asm/fixmap.h>#include <asm/bitops.h>#include <linux/threads.h>#include <asm/pda.h>extern pgd_t level3_kernel_pgt[512];extern pgd_t level3_physmem_pgt[512];extern pgd_t level3_ident_pgt[512];extern pmd_t level2_kernel_pgt[512];extern pml4_t init_level4_pgt[];extern pgd_t boot_vmalloc_pgt[];extern unsigned long __supported_pte_mask;#define swapper_pg_dir NULLextern void paging_init(void);extern void clear_kernel_mapping(unsigned long addr, unsigned long size);extern unsigned long pgkern_mask;/* * ZERO_PAGE is a global shared page that is always zero: used * for zero-mapped memory areas etc.. */extern unsigned long empty_zero_page[PAGE_SIZE/sizeof(unsigned long)];#define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))#define PML4_SHIFT	39#define PTRS_PER_PML4	512/* * PGDIR_SHIFT determines what a top-level page table entry can map */#define PGDIR_SHIFT	30#define PTRS_PER_PGD	512/* * PMD_SHIFT determines the size of the area a middle-level * page table can map */#define PMD_SHIFT	21#define PTRS_PER_PMD	512/* * entries per page directory level */#define PTRS_PER_PTE	512#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 pml4_none(x)	(!pml4_val(x))#define pgd_none(x)	(!pgd_val(x))extern inline int pgd_present(pgd_t pgd)	{ return !pgd_none(pgd); }static inline void set_pte(pte_t *dst, pte_t val){	pte_val(*dst) = pte_val(val);} static inline void set_pmd(pmd_t *dst, pmd_t val){        pmd_val(*dst) = pmd_val(val); } static inline void set_pgd(pgd_t *dst, pgd_t val){	pgd_val(*dst) = pgd_val(val); } extern inline void pgd_clear (pgd_t * pgd){	set_pgd(pgd, __pgd(0));}static inline void set_pml4(pml4_t *dst, pml4_t val){	pml4_val(*dst) = pml4_val(val); }#define pgd_page(pgd) \((unsigned long) __va(pgd_val(pgd) & PHYSICAL_PAGE_MASK))#define ptep_get_and_clear(xp)	__pte(xchg(&(xp)->pte, 0))#define pte_same(a, b)		((a).pte == (b).pte)#define PML4_SIZE	(1UL << PML4_SHIFT)#define PML4_MASK       (~(PML4_SIZE-1))#define PMD_SIZE	(1UL << PMD_SHIFT)#define PMD_MASK	(~(PMD_SIZE-1))#define PGDIR_SIZE	(1UL << PGDIR_SHIFT)#define PGDIR_MASK	(~(PGDIR_SIZE-1))#define USER_PTRS_PER_PGD	(TASK_SIZE/PGDIR_SIZE)#define FIRST_USER_PGD_NR	0#define USER_PGD_PTRS (PAGE_OFFSET >> PGDIR_SHIFT)#define KERNEL_PGD_PTRS (PTRS_PER_PGD-USER_PGD_PTRS)#define TWOLEVEL_PGDIR_SHIFT	20#define BOOT_USER_L4_PTRS 1#define BOOT_KERNEL_L4_PTRS 511	/* But we will do it in 4rd level */#ifndef __ASSEMBLY__#define VMALLOC_START    0xffffff0000000000UL#define VMALLOC_END      0xffffff7fffffffffUL#define MODULES_VADDR    0xffffffffa0000000UL#define MODULES_END      0xffffffffafffffffUL#define MODULES_LEN   (MODULES_END - MODULES_VADDR)#define IOMAP_START      0xfffffe8000000000UL#define _PAGE_BIT_PRESENT	0#define _PAGE_BIT_RW		1#define _PAGE_BIT_USER		2#define _PAGE_BIT_PWT		3#define _PAGE_BIT_PCD		4#define _PAGE_BIT_ACCESSED	5#define _PAGE_BIT_DIRTY		6#define _PAGE_BIT_PSE		7	/* 4 MB (or 2MB) page */#define _PAGE_BIT_GLOBAL	8	/* Global TLB entry PPro+ */#define _PAGE_BIT_NX           63       /* No execute: only valid after cpuid check */#define _PAGE_PRESENT	0x001#define _PAGE_RW	0x002#define _PAGE_USER	0x004#define _PAGE_PWT	0x008#define _PAGE_PCD	0x010#define _PAGE_ACCESSED	0x020#define _PAGE_DIRTY	0x040#define _PAGE_PSE	0x080	/* 2MB page */#define _PAGE_FILE	0x040	/* set:pagecache, unset:swap */#define _PAGE_GLOBAL	0x100	/* Global TLB entry */#define _PAGE_PROTNONE	0x080	/* If not present */#define _PAGE_NX        (1UL<<_PAGE_BIT_NX)#define _PAGE_TABLE	(_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED | _PAGE_DIRTY)#define _KERNPG_TABLE	(_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY)#define _PAGE_CHG_MASK	(PTE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY)#define PAGE_NONE	__pgprot(_PAGE_PROTNONE | _PAGE_ACCESSED)#define PAGE_SHARED	__pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED | _PAGE_NX)#define PAGE_SHARED_EXEC __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED)#define PAGE_COPY_NOEXEC __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED | _PAGE_NX)#define PAGE_COPY PAGE_COPY_NOEXEC#define PAGE_COPY_EXEC __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED)#define PAGE_READONLY	__pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED | _PAGE_NX)#define PAGE_READONLY_EXEC __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED)#define __PAGE_KERNEL \	(_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_NX)#define __PAGE_KERNEL_EXEC \	(_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED)#define __PAGE_KERNEL_NOCACHE \	(_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_PCD | _PAGE_ACCESSED | _PAGE_NX)#define __PAGE_KERNEL_RO \	(_PAGE_PRESENT | _PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_NX)#define __PAGE_KERNEL_VSYSCALL \	(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED)#define __PAGE_KERNEL_VSYSCALL_NOCACHE \	(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED | _PAGE_PCD)#define __PAGE_KERNEL_LARGE \	(__PAGE_KERNEL | _PAGE_PSE)#define MAKE_GLOBAL(x) __pgprot((x) | _PAGE_GLOBAL)#define PAGE_KERNEL MAKE_GLOBAL(__PAGE_KERNEL)#define PAGE_KERNEL_EXEC MAKE_GLOBAL(__PAGE_KERNEL_EXEC)#define PAGE_KERNEL_RO MAKE_GLOBAL(__PAGE_KERNEL_RO)#define PAGE_KERNEL_NOCACHE MAKE_GLOBAL(__PAGE_KERNEL_NOCACHE)#define PAGE_KERNEL_VSYSCALL MAKE_GLOBAL(__PAGE_KERNEL_VSYSCALL)#define PAGE_KERNEL_LARGE MAKE_GLOBAL(__PAGE_KERNEL_LARGE)#define PAGE_KERNEL_VSYSCALL_NOCACHE MAKE_GLOBAL(__PAGE_KERNEL_VSYSCALL_NOCACHE)/*         xwr */#define __P000	PAGE_NONE#define __P001	PAGE_READONLY#define __P010	PAGE_COPY#define __P011	PAGE_COPY#define __P100	PAGE_READONLY_EXEC#define __P101	PAGE_READONLY_EXEC#define __P110	PAGE_COPY_EXEC#define __P111	PAGE_COPY_EXEC#define __S000	PAGE_NONE#define __S001	PAGE_READONLY#define __S010	PAGE_SHARED#define __S011	PAGE_SHARED#define __S100	PAGE_READONLY_EXEC#define __S101	PAGE_READONLY_EXEC#define __S110	PAGE_SHARED_EXEC#define __S111	PAGE_SHARED_EXECstatic inline unsigned long pgd_bad(pgd_t pgd) {        unsigned long val = pgd_val(pgd);       val &= ~PTE_MASK;        val &= ~(_PAGE_USER | _PAGE_DIRTY);        return val & ~(_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED);      } 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?