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 + -
显示快捷键?