📄 pgtable.h
字号:
{ pte_val(pte) |= _PAGE_MODIFIED; if (pte_val(pte) & _PAGE_WRITE) pte_val(pte) |= _PAGE_SILENT_WRITE; return pte;}extern inline pte_t pte_mkyoung(pte_t pte){ pte_val(pte) |= _PAGE_ACCESSED; if (pte_val(pte) & _PAGE_READ) pte_val(pte) |= _PAGE_SILENT_READ; return pte;}/* * Conversion functions: convert a page and protection to a page entry, * and a page entry and page directory to the page they refer to. */#define mk_pte(page, pgprot) \({ \ pte_t __pte; \ \ pte_val(__pte) = ((unsigned long)(page - mem_map) << PAGE_SHIFT) | \ pgprot_val(pgprot); \ \ __pte; \})extern inline pte_t mk_pte_phys(unsigned long physpage, pgprot_t pgprot){ return __pte(((physpage & PAGE_MASK) - PAGE_OFFSET) | pgprot_val(pgprot));}extern inline pte_t pte_modify(pte_t pte, pgprot_t newprot){ return __pte((pte_val(pte) & _PAGE_CHG_MASK) | pgprot_val(newprot));}#define page_pte(page) page_pte_prot(page, __pgprot(0))/* to find an entry in a kernel page-table-directory */#define pgd_offset_k(address) pgd_offset(&init_mm, address)#define pgd_index(address) ((address) >> PGDIR_SHIFT)/* to find an entry in a page-table-directory */extern inline pgd_t *pgd_offset(struct mm_struct *mm, unsigned long address){ return mm->pgd + pgd_index(address);}/* Find an entry in the second-level page table.. */extern inline pmd_t *pmd_offset(pgd_t *dir, unsigned long address){ return (pmd_t *) dir;}/* Find an entry in the third-level page table.. */ extern inline pte_t *pte_offset(pmd_t * dir, unsigned long address){ return (pte_t *) (pmd_page(*dir)) + ((address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1));}/* * Initialize new page directory with pointers to invalid ptes */extern void pgd_init(unsigned long page);extern void __bad_pte(pmd_t *pmd);extern void __bad_pte_kernel(pmd_t *pmd);#define pte_free_kernel(pte) free_pte_fast(pte)#define pte_free(pte) free_pte_fast(pte)#define pgd_free(pgd) free_pgd_fast(pgd)#define pgd_alloc() get_pgd_fast()extern int do_check_pgt_cache(int, int);extern pgd_t swapper_pg_dir[1024];extern void paging_init(void);extern void update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t pte);#define SWP_TYPE(x) (((x).val >> 1) & 0x3f)#define SWP_OFFSET(x) ((x).val >> 8)#define SWP_ENTRY(type,offset) ((swp_entry_t) { ((type) << 1) | ((offset) << 8) })#define pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) })#define swp_entry_to_pte(x) ((pte_t) { (x).val })/* Needs to be defined here and not in linux/mm.h, as it is arch dependent */#define PageSkip(page) (0)#define kern_addr_valid(addr) (1)/* TLB operations. */extern inline void tlb_probe(void){ __asm__ __volatile__( ".set push\n\t" ".set reorder\n\t" "tlbp\n\t" ".set pop");}extern inline void tlb_read(void){ __asm__ __volatile__( ".set push\n\t" ".set reorder\n\t" "tlbr\n\t" ".set pop");}extern inline void tlb_write_indexed(void){ __asm__ __volatile__( ".set push\n\t" ".set reorder\n\t" "tlbwi\n\t" ".set pop");}extern inline void tlb_write_random(void){ __asm__ __volatile__( ".set push\n\t" ".set reorder\n\t" "tlbwr\n\t" ".set pop");}/* Dealing with various CP0 mmu/cache related registers. *//* CP0_PAGEMASK register */extern inline unsigned long get_pagemask(void){ unsigned long val; __asm__ __volatile__( ".set push\n\t" ".set reorder\n\t" "mfc0 %0, $5\n\t" ".set pop" : "=r" (val)); return val;}extern inline void set_pagemask(unsigned long val){ __asm__ __volatile__( ".set push\n\t" ".set reorder\n\t" "mtc0 %0, $5\n\t" ".set pop" : : "r" (val));}/* CP0_ENTRYLO0 and CP0_ENTRYLO1 registers */extern inline unsigned long get_entrylo0(void){ unsigned long val; __asm__ __volatile__( ".set push\n\t" ".set reorder\n\t" "mfc0 %0, $2\n\t" ".set pop" : "=r" (val)); return val;}extern inline void set_entrylo0(unsigned long val){ __asm__ __volatile__( ".set push\n\t" ".set reorder\n\t" "mtc0 %0, $2\n\t" ".set pop" : : "r" (val));}extern inline unsigned long get_entrylo1(void){ unsigned long val; __asm__ __volatile__( ".set push\n\t" ".set reorder\n\t" "mfc0 %0, $3\n\t" ".set pop" : "=r" (val)); return val;}extern inline void set_entrylo1(unsigned long val){ __asm__ __volatile__( ".set push\n\t" ".set reorder\n\t" "mtc0 %0, $3\n\t" ".set pop" : : "r" (val));}/* CP0_ENTRYHI register */extern inline unsigned long get_entryhi(void){ unsigned long val; __asm__ __volatile__( ".set push\n\t" ".set reorder\n\t" "mfc0 %0, $10\n\t" ".set pop" : "=r" (val)); return val;}extern inline void set_entryhi(unsigned long val){ __asm__ __volatile__( ".set push\n\t" ".set reorder\n\t" "mtc0 %0, $10\n\t" ".set pop" : : "r" (val));}/* CP0_INDEX register */extern inline unsigned long get_index(void){ unsigned long val; __asm__ __volatile__( ".set push\n\t" ".set reorder\n\t" "mfc0 %0, $0\n\t" ".set pop" : "=r" (val)); return val;}extern inline void set_index(unsigned long val){ __asm__ __volatile__( ".set push\n\t" ".set reorder\n\t" "mtc0 %0, $0\n\t" ".set pop" : : "r" (val));}/* CP0_WIRED register */extern inline unsigned long get_wired(void){ unsigned long val; __asm__ __volatile__( ".set push\n\t" ".set reorder\n\t" "mfc0 %0, $6\n\t" ".set pop" : "=r" (val)); return val;}extern inline void set_wired(unsigned long val){ __asm__ __volatile__( ".set push\n\t" ".set reorder\n\t" "mtc0 %0, $6\n\t" ".set pop" : : "r" (val));}/* CP0_TAGLO and CP0_TAGHI registers */extern inline unsigned long get_taglo(void){ unsigned long val; __asm__ __volatile__( ".set push\n\t" ".set reorder\n\t" "mfc0 %0, $28\n\t" ".set pop" : "=r" (val)); return val;}extern inline void set_taglo(unsigned long val){ __asm__ __volatile__( ".set push\n\t" ".set reorder\n\t" "mtc0 %0, $28\n\t" ".set pop" : : "r" (val));}extern inline unsigned long get_taghi(void){ unsigned long val; __asm__ __volatile__( ".set push\n\t" ".set reorder\n\t" "mfc0 %0, $29\n\t" ".set pop" : "=r" (val)); return val;}extern inline void set_taghi(unsigned long val){ __asm__ __volatile__( ".set push\n\t" ".set reorder\n\t" "mtc0 %0, $29\n\t" ".set pop" : : "r" (val));}/* CP0_CONTEXT register */extern inline unsigned long get_context(void){ unsigned long val; __asm__ __volatile__( ".set push\n\t" ".set reorder\n\t" "mfc0 %0, $4\n\t" ".set pop" : "=r" (val)); return val;}extern inline void set_context(unsigned long val){ __asm__ __volatile__( ".set push\n\t" ".set reorder\n\t" "mtc0 %0, $4\n\t" ".set pop" : : "r" (val));}#include <asm-generic/pgtable.h>#endif /* !defined (_LANGUAGE_ASSEMBLY) */#define io_remap_page_range remap_page_range#endif /* _ASM_PGTABLE_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -