2005-11-11 14:25:24 +11:00
# ifndef _ASM_POWERPC_PAGE_64_H
# define _ASM_POWERPC_PAGE_64_H
/*
* 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 64 K pages remains Linux
* specific , every notion of page number shared with the firmware , TCEs ,
* iommu , etc . . . still uses a page size of 4 K .
*/
# 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 4 K pages .
*/
# define PAGE_FACTOR (PAGE_SHIFT - HW_PAGE_SHIFT)
2007-10-11 20:37:10 +10:00
/* Segment size; normal 256M segments */
2005-11-11 14:25:24 +11:00
# define SID_SHIFT 28
2007-08-20 14:58:36 +10:00
# define SID_MASK ASM_CONST(0xfffffffff)
2005-11-11 14:25:24 +11:00
# define ESID_MASK 0xfffffffff0000000UL
# define GET_ESID(x) (((x) >> SID_SHIFT) & SID_MASK)
2007-10-11 20:37:10 +10:00
/* 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)
2005-11-11 14:25:24 +11:00
# ifndef __ASSEMBLY__
# include <asm/cache.h>
typedef unsigned long pte_basic_t ;
2014-10-02 15:44:21 +10:00
static inline void clear_page ( void * addr )
2005-11-11 14:25:24 +11:00
{
2014-10-02 15:44:21 +10:00
unsigned long iterations ;
unsigned long onex , twox , fourx , eightx ;
iterations = ppc64_caches . dlines_per_page / 8 ;
/*
* Some verisions of gcc use multiply instructions to
* calculate the offsets so lets give it a hand to
* do better .
*/
onex = ppc64_caches . dline_size ;
twox = onex < < 1 ;
fourx = onex < < 2 ;
eightx = onex < < 3 ;
asm volatile (
2005-11-11 14:25:24 +11:00
" mtctr %1 # clear_page \n \
2014-10-02 15:44:21 +10:00
. balign 16 \ n \
1 : dcbz 0 , % 0 \ n \
dcbz % 3 , % 0 \ n \
dcbz % 4 , % 0 \ n \
dcbz % 5 , % 0 \ n \
dcbz % 6 , % 0 \ n \
dcbz % 7 , % 0 \ n \
dcbz % 8 , % 0 \ n \
dcbz % 9 , % 0 \ n \
add % 0 , % 0 , % 10 \ n \
2005-11-11 14:25:24 +11:00
bdnz + 1 b "
2014-10-02 15:44:21 +10:00
: " =&r " ( addr )
: " r " ( iterations ) , " 0 " ( addr ) , " b " ( onex ) , " b " ( twox ) ,
" b " ( twox + onex ) , " b " ( fourx ) , " b " ( fourx + onex ) ,
" b " ( twox + fourx ) , " b " ( eightx - onex ) , " r " ( eightx )
2005-11-11 14:25:24 +11:00
: " ctr " , " memory " ) ;
}
2011-05-08 21:18:38 +00:00
extern void copy_page ( void * to , void * from ) ;
2005-11-11 14:25:24 +11:00
/* Log 2 of page table size */
extern u64 ppc64_pft_size ;
# endif /* __ASSEMBLY__ */
2007-05-08 16:27:27 +10:00
# ifdef CONFIG_PPC_MM_SLICES
2005-11-11 14:25:24 +11:00
2007-05-08 16:27:27 +10:00
# define SLICE_LOW_SHIFT 28
# define SLICE_HIGH_SHIFT 40
2005-11-11 14:25:24 +11:00
2007-05-08 16:27:27 +10:00
# define SLICE_LOW_TOP (0x100000000ul)
# define SLICE_NUM_LOW (SLICE_LOW_TOP >> SLICE_LOW_SHIFT)
2016-04-29 23:25:49 +10:00
# define SLICE_NUM_HIGH (H_PGTABLE_RANGE >> SLICE_HIGH_SHIFT)
2005-11-11 14:25:24 +11:00
2007-05-08 16:27:27 +10:00
# define GET_LOW_SLICE_INDEX(addr) ((addr) >> SLICE_LOW_SHIFT)
# define GET_HIGH_SLICE_INDEX(addr) ((addr) >> SLICE_HIGH_SHIFT)
2005-11-11 14:25:24 +11:00
2012-09-10 02:52:57 +00:00
/*
* 1 bit per slice and we have one slice per 1 TB
* Right now we support only 64 TB .
* IF we change this we will have to change the type
* of high_slices
*/
# define SLICE_MASK_SIZE 8
2007-05-08 16:27:27 +10:00
# ifndef __ASSEMBLY__
struct slice_mask {
u16 low_slices ;
2012-09-10 02:52:52 +00:00
u64 high_slices ;
2007-05-08 16:27:27 +10:00
} ;
struct mm_struct ;
2005-11-11 14:25:24 +11:00
2007-05-08 16:27:27 +10:00
extern unsigned long slice_get_unmapped_area ( unsigned long addr ,
unsigned long len ,
unsigned long flags ,
unsigned int psize ,
2013-04-29 11:53:52 -07:00
int topdown ) ;
2005-11-11 14:25:24 +11:00
2007-05-08 16:27:27 +10:00
extern unsigned int get_slice_psize ( struct mm_struct * mm ,
unsigned long addr ) ;
2005-11-11 14:25:24 +11:00
2007-05-08 16:27:27 +10:00
extern void slice_set_user_psize ( struct mm_struct * mm , unsigned int psize ) ;
2008-06-18 15:29:12 +10:00
extern void slice_set_range_psize ( struct mm_struct * mm , unsigned long start ,
unsigned long len , unsigned int psize ) ;
2007-05-08 16:27:27 +10:00
# endif /* __ASSEMBLY__ */
# else
# define slice_init()
2009-07-28 11:59:34 +10:00
# ifdef CONFIG_PPC_STD_MMU_64
2008-06-18 15:29:12 +10:00
# define get_slice_psize(mm, addr) ((mm)->context.user_psize)
2007-08-15 16:51:18 +10:00
# 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 )
2009-07-28 11:59:34 +10:00
# else /* CONFIG_PPC_STD_MMU_64 */
# ifdef CONFIG_PPC_64K_PAGES
# define get_slice_psize(mm, addr) MMU_PAGE_64K
# else /* CONFIG_PPC_64K_PAGES */
# define get_slice_psize(mm, addr) MMU_PAGE_4K
# endif /* !CONFIG_PPC_64K_PAGES */
# define slice_set_user_psize(mm, psize) do { BUG(); } while(0)
# endif /* !CONFIG_PPC_STD_MMU_64 */
2008-06-18 15:29:12 +10:00
# define slice_set_range_psize(mm, start, len, psize) \
slice_set_user_psize ( ( mm ) , ( psize ) )
2007-05-08 16:27:27 +10:00
# endif /* CONFIG_PPC_MM_SLICES */
# ifdef CONFIG_HUGETLB_PAGE
2011-10-10 10:50:36 +00:00
# ifdef CONFIG_PPC_MM_SLICES
2007-05-08 16:27:27 +10:00
# define HAVE_ARCH_HUGETLB_UNMAPPED_AREA
2011-10-10 10:50:36 +00:00
# endif
2005-11-11 14:25:24 +11:00
# endif /* !CONFIG_HUGETLB_PAGE */
# define VM_DATA_DEFAULT_FLAGS \
2010-08-27 03:49:11 +00:00
( is_32bit_task ( ) ? \
2005-11-11 14:25:24 +11:00
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
2011-03-30 22:57:33 -03:00
* stack by default , so in the absence of a PT_GNU_STACK program header
2005-11-11 14:25:24 +11:00
* 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 \
2010-08-27 03:49:11 +00:00
( is_32bit_task ( ) ? \
2005-11-11 14:25:24 +11:00
VM_STACK_DEFAULT_FLAGS32 : VM_STACK_DEFAULT_FLAGS64 )
2009-05-13 22:56:30 +00:00
# include <asm-generic/getorder.h>
2005-11-11 14:25:24 +11:00
# endif /* _ASM_POWERPC_PAGE_64_H */