2019-05-27 08:55:01 +02:00
/* SPDX-License-Identifier: GPL-2.0-or-later */
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
*/
2018-07-05 16:24:57 +00:00
# include <asm/asm-const.h>
2005-11-11 14:25:24 +11:00
/*
* 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 ;
2017-01-08 17:31:47 -06:00
iterations = ppc64_caches . l1d . blocks_per_page / 8 ;
2014-10-02 15:44:21 +10:00
/*
* Some verisions of gcc use multiply instructions to
* calculate the offsets so lets give it a hand to
* do better .
*/
2017-01-08 17:31:47 -06:00
onex = ppc64_caches . l1d . block_size ;
2014-10-02 15:44:21 +10:00
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__ */
# 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 .
*/
2020-04-10 14:33:05 -07:00
# define VM_STACK_DEFAULT_FLAGS32 VM_DATA_FLAGS_EXEC
# define VM_STACK_DEFAULT_FLAGS64 VM_DATA_FLAGS_NON_EXEC
2005-11-11 14:25:24 +11:00
# 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 */