2005-04-16 15:20:36 -07:00
/*
2006-09-27 15:13:36 +09:00
* This file contains the functions and defines necessary to modify and
* use the SuperH page table tree .
*
2005-04-16 15:20:36 -07:00
* Copyright ( C ) 1999 Niibe Yutaka
2007-11-19 18:26:19 +09:00
* Copyright ( C ) 2002 - 2007 Paul Mundt
2006-09-27 15:13:36 +09:00
*
* This file is subject to the terms and conditions of the GNU General
* Public License . See the file " COPYING " in the main directory of this
* archive for more details .
2005-04-16 15:20:36 -07:00
*/
2006-09-27 15:13:36 +09:00
# ifndef __ASM_SH_PGTABLE_H
# define __ASM_SH_PGTABLE_H
2005-04-16 15:20:36 -07:00
2010-01-13 19:11:14 +09:00
# ifdef CONFIG_X2TLB
2010-01-13 19:18:39 +09:00
# include <asm/pgtable-3level.h>
2009-12-13 14:38:50 +00:00
# else
2010-01-13 19:18:39 +09:00
# include <asm/pgtable-2level.h>
2009-12-13 14:38:50 +00:00
# endif
2006-09-27 15:13:36 +09:00
# include <asm/page.h>
2005-04-16 15:20:36 -07:00
# ifndef __ASSEMBLY__
# include <asm/addrspace.h>
# include <asm/fixmap.h>
/*
* ZERO_PAGE is a global shared page that is always zero : used
* for zero - mapped memory areas etc . .
*/
2006-09-27 15:13:36 +09:00
extern unsigned long empty_zero_page [ PAGE_SIZE / sizeof ( unsigned long ) ] ;
2005-04-16 15:20:36 -07:00
# define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))
# endif /* !__ASSEMBLY__ */
2007-11-10 19:16:55 +09:00
/*
* Effective and physical address definitions , to aid with sign
* extension .
*/
# define NEFF 32
# define NEFF_SIGN (1LL << (NEFF - 1))
# define NEFF_MASK (-1LL << NEFF)
2009-08-04 17:14:39 +09:00
static inline unsigned long long neff_sign_extend ( unsigned long val )
{
unsigned long long extended = val ;
return ( extended & NEFF_SIGN ) ? ( extended | NEFF_MASK ) : extended ;
}
2007-11-10 19:16:55 +09:00
# ifdef CONFIG_29BIT
# define NPHYS 29
# else
# define NPHYS 32
# endif
# define NPHYS_SIGN (1LL << (NPHYS - 1))
# define NPHYS_MASK (-1LL << NPHYS)
2007-02-14 14:13:10 +09:00
# define PGDIR_SIZE (1UL << PGDIR_SHIFT)
2005-04-16 15:20:36 -07:00
# define PGDIR_MASK (~(PGDIR_SIZE-1))
2006-11-20 14:30:26 +09:00
/* Entries per level */
2006-12-26 15:29:19 +09:00
# define PTRS_PER_PTE (PAGE_SIZE / (1 << PTE_MAGNITUDE))
2006-11-20 14:30:26 +09:00
2005-04-19 13:29:23 -07:00
# define FIRST_USER_ADDRESS 0
2005-04-16 15:20:36 -07:00
2009-10-06 21:22:25 +00:00
# define PHYS_ADDR_MASK29 0x1fffffff
# define PHYS_ADDR_MASK32 0xffffffff
# ifdef CONFIG_PMB
static inline unsigned long phys_addr_mask ( void )
{
/* Is the MMU in 29bit mode? */
if ( __in_29bit_mode ( ) )
return PHYS_ADDR_MASK29 ;
return PHYS_ADDR_MASK32 ;
}
2009-10-10 22:24:55 +09:00
# elif defined(CONFIG_32BIT)
2009-10-06 21:22:25 +00:00
static inline unsigned long phys_addr_mask ( void )
{
return PHYS_ADDR_MASK32 ;
}
2007-11-30 17:52:53 +09:00
# else
2009-10-06 21:22:25 +00:00
static inline unsigned long phys_addr_mask ( void )
{
return PHYS_ADDR_MASK29 ;
}
2007-11-30 17:52:53 +09:00
# endif
2009-10-06 21:22:25 +00:00
# define PTE_PHYS_MASK (phys_addr_mask() & PAGE_MASK)
2008-09-12 20:41:05 +09:00
# define PTE_FLAGS_MASK (~(PTE_PHYS_MASK) << PAGE_SHIFT)
2005-04-16 15:20:36 -07:00
2007-11-10 20:39:06 +09:00
# ifdef CONFIG_SUPERH32
2007-07-25 10:43:47 +09:00
# define VMALLOC_START (P3SEG)
2007-11-10 20:39:06 +09:00
# else
# define VMALLOC_START (0xf0000000)
# endif
2005-04-16 15:20:36 -07:00
# define VMALLOC_END (FIXADDR_START-2*PAGE_SIZE)
2007-11-19 18:26:19 +09:00
# if defined(CONFIG_SUPERH32)
# include <asm/pgtable_32.h>
2006-11-20 14:30:26 +09:00
# else
2007-11-19 18:26:19 +09:00
# include <asm/pgtable_64.h>
2005-04-16 15:20:36 -07:00
# endif
/*
2006-11-20 14:30:26 +09:00
* SH - X and lower ( legacy ) SuperH parts ( SH - 3 , SH - 4 , some SH - 4 A ) can ' t do page
* protection for execute , and considers it the same as a read . Also , write
* permission implies read permission . This is the closest we can get . .
*
* SH - X2 ( SH7785 ) and later parts take this to the opposite end of the extreme ,
* not only supporting separate execute , read , and write bits , but having
* completely separate permission bits for user and kernel space .
2005-04-16 15:20:36 -07:00
*/
2006-11-20 14:30:26 +09:00
/*xwr*/
2005-04-16 15:20:36 -07:00
# define __P000 PAGE_NONE
# define __P001 PAGE_READONLY
# define __P010 PAGE_COPY
# define __P011 PAGE_COPY
2006-11-20 14:30:26 +09:00
# define __P100 PAGE_EXECREAD
# define __P101 PAGE_EXECREAD
2005-04-16 15:20:36 -07:00
# define __P110 PAGE_COPY
# define __P111 PAGE_COPY
# define __S000 PAGE_NONE
# define __S001 PAGE_READONLY
2006-11-20 14:30:26 +09:00
# define __S010 PAGE_WRITEONLY
2005-04-16 15:20:36 -07:00
# define __S011 PAGE_SHARED
2006-11-20 14:30:26 +09:00
# define __S100 PAGE_EXECREAD
# define __S101 PAGE_EXECREAD
# define __S110 PAGE_RWX
# define __S111 PAGE_RWX
2005-04-16 15:20:36 -07:00
typedef pte_t * pte_addr_t ;
# define kern_addr_valid(addr) (1)
# define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \
remap_pfn_range ( vma , vaddr , pfn , size , prot )
2007-11-19 18:26:19 +09:00
# define pte_pfn(x) ((unsigned long)(((x).pte_low >> PAGE_SHIFT)))
2005-11-07 00:59:43 -08:00
2005-04-16 15:20:36 -07:00
/*
2009-12-31 12:19:24 +00:00
* Initialise the page table caches
2005-04-16 15:20:36 -07:00
*/
2009-12-31 12:19:24 +00:00
extern void pgtable_cache_init ( void ) ;
2005-04-16 15:20:36 -07:00
2007-11-19 18:26:19 +09:00
struct vm_area_struct ;
2009-07-29 00:12:17 +09:00
extern void __update_cache ( struct vm_area_struct * vma ,
unsigned long address , pte_t pte ) ;
extern void __update_tlb ( struct vm_area_struct * vma ,
unsigned long address , pte_t pte ) ;
static inline void
update_mmu_cache ( struct vm_area_struct * vma , unsigned long address , pte_t pte )
{
__update_cache ( vma , address , pte ) ;
__update_tlb ( vma , address , pte ) ;
}
2006-11-20 14:30:26 +09:00
extern pgd_t swapper_pg_dir [ PTRS_PER_PGD ] ;
extern void paging_init ( void ) ;
2007-12-17 10:52:11 +09:00
extern void page_table_range_init ( unsigned long start , unsigned long end ,
pgd_t * pgd ) ;
2006-11-20 14:30:26 +09:00
2009-05-07 16:38:16 +09:00
/* arch/sh/mm/mmap.c */
# define HAVE_ARCH_UNMAPPED_AREA
# define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN
2005-04-16 15:20:36 -07:00
# include <asm-generic/pgtable.h>
2007-11-19 18:26:19 +09:00
# endif /* __ASM_SH_PGTABLE_H */