page_64.h

来自「linux 内核源代码」· C头文件 代码 · 共 188 行

H
188
字号
#ifndef _ASM_POWERPC_PAGE_64_H#define _ASM_POWERPC_PAGE_64_H#ifdef __KERNEL__/* * Copyright (C) 2001 PPC64 Team, IBM Corp * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. *//* * We always define HW_PAGE_SHIFT to 12 as use of 64K pages remains Linux * specific, every notion of page number shared with the firmware, TCEs, * iommu, etc... still uses a page size of 4K. */#define HW_PAGE_SHIFT		12#define HW_PAGE_SIZE		(ASM_CONST(1) << HW_PAGE_SHIFT)#define HW_PAGE_MASK		(~(HW_PAGE_SIZE-1))/* * PAGE_FACTOR is the number of bits factor between PAGE_SHIFT and * HW_PAGE_SHIFT, that is 4K pages. */#define PAGE_FACTOR		(PAGE_SHIFT - HW_PAGE_SHIFT)/* Segment size; normal 256M segments */#define SID_SHIFT		28#define SID_MASK		ASM_CONST(0xfffffffff)#define ESID_MASK		0xfffffffff0000000UL#define GET_ESID(x)		(((x) >> SID_SHIFT) & SID_MASK)/* 1T segments */#define SID_SHIFT_1T		40#define SID_MASK_1T		0xffffffUL#define ESID_MASK_1T		0xffffff0000000000UL#define GET_ESID_1T(x)		(((x) >> SID_SHIFT_1T) & SID_MASK_1T)#ifndef __ASSEMBLY__#include <asm/cache.h>typedef unsigned long pte_basic_t;static __inline__ void clear_page(void *addr){	unsigned long lines, line_size;	line_size = ppc64_caches.dline_size;	lines = ppc64_caches.dlines_per_page;	__asm__ __volatile__(	"mtctr	%1	# clear_page\n\1:      dcbz	0,%0\n\	add	%0,%0,%3\n\	bdnz+	1b"        : "=r" (addr)        : "r" (lines), "0" (addr), "r" (line_size)	: "ctr", "memory");}extern void copy_4K_page(void *to, void *from);#ifdef CONFIG_PPC_64K_PAGESstatic inline void copy_page(void *to, void *from){	unsigned int i;	for (i=0; i < (1 << (PAGE_SHIFT - 12)); i++) {		copy_4K_page(to, from);		to += 4096;		from += 4096;	}}#else /* CONFIG_PPC_64K_PAGES */static inline void copy_page(void *to, void *from){	copy_4K_page(to, from);}#endif /* CONFIG_PPC_64K_PAGES *//* Log 2 of page table size */extern u64 ppc64_pft_size;/* Large pages size */#ifdef CONFIG_HUGETLB_PAGEextern unsigned int HPAGE_SHIFT;#else#define HPAGE_SHIFT PAGE_SHIFT#endif#define HPAGE_SIZE		((1UL) << HPAGE_SHIFT)#define HPAGE_MASK		(~(HPAGE_SIZE - 1))#define HUGETLB_PAGE_ORDER	(HPAGE_SHIFT - PAGE_SHIFT)#endif /* __ASSEMBLY__ */#ifdef CONFIG_PPC_MM_SLICES#define SLICE_LOW_SHIFT		28#define SLICE_HIGH_SHIFT	40#define SLICE_LOW_TOP		(0x100000000ul)#define SLICE_NUM_LOW		(SLICE_LOW_TOP >> SLICE_LOW_SHIFT)#define SLICE_NUM_HIGH		(PGTABLE_RANGE >> SLICE_HIGH_SHIFT)#define GET_LOW_SLICE_INDEX(addr)	((addr) >> SLICE_LOW_SHIFT)#define GET_HIGH_SLICE_INDEX(addr)	((addr) >> SLICE_HIGH_SHIFT)#ifndef __ASSEMBLY__struct slice_mask {	u16 low_slices;	u16 high_slices;};struct mm_struct;extern unsigned long slice_get_unmapped_area(unsigned long addr,					     unsigned long len,					     unsigned long flags,					     unsigned int psize,					     int topdown,					     int use_cache);extern unsigned int get_slice_psize(struct mm_struct *mm,				    unsigned long addr);extern void slice_init_context(struct mm_struct *mm, unsigned int psize);extern void slice_set_user_psize(struct mm_struct *mm, unsigned int psize);#define slice_mm_new_context(mm)	((mm)->context.id == 0)#define ARCH_HAS_HUGEPAGE_ONLY_RANGEextern int is_hugepage_only_range(struct mm_struct *m,				  unsigned long addr,				  unsigned long len);#endif /* __ASSEMBLY__ */#else#define slice_init()#define slice_set_user_psize(mm, psize)		\do {						\	(mm)->context.user_psize = (psize);	\	(mm)->context.sllp = SLB_VSID_USER | mmu_psize_defs[(psize)].sllp; \} while (0)#define slice_mm_new_context(mm)	1#endif /* CONFIG_PPC_MM_SLICES */#ifdef CONFIG_HUGETLB_PAGE#define ARCH_HAS_HUGETLB_FREE_PGD_RANGE#define ARCH_HAS_SETCLEAR_HUGE_PTE#define HAVE_ARCH_HUGETLB_UNMAPPED_AREA#endif /* !CONFIG_HUGETLB_PAGE */#ifdef MODULE#define __page_aligned __attribute__((__aligned__(PAGE_SIZE)))#else#define __page_aligned \	__attribute__((__aligned__(PAGE_SIZE), \		__section__(".data.page_aligned")))#endif#define VM_DATA_DEFAULT_FLAGS \	(test_thread_flag(TIF_32BIT) ? \	 VM_DATA_DEFAULT_FLAGS32 : VM_DATA_DEFAULT_FLAGS64)/* * This is the default if a program doesn't have a PT_GNU_STACK * program header entry. The PPC64 ELF ABI has a non executable stack * stack by default, so in the absense of a PT_GNU_STACK program header * we turn execute permission off. */#define VM_STACK_DEFAULT_FLAGS32	(VM_READ | VM_WRITE | VM_EXEC | \					 VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)#define VM_STACK_DEFAULT_FLAGS64	(VM_READ | VM_WRITE | \					 VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)#define VM_STACK_DEFAULT_FLAGS \	(test_thread_flag(TIF_32BIT) ? \	 VM_STACK_DEFAULT_FLAGS32 : VM_STACK_DEFAULT_FLAGS64)#include <asm-generic/page.h>#endif /* __KERNEL__ */#endif /* _ASM_POWERPC_PAGE_64_H */

⌨️ 快捷键说明

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