2005-04-17 02:20:36 +04:00
/*
2006-09-27 10:13:36 +04:00
* This file contains the functions and defines necessary to modify and
* use the SuperH page table tree .
*
2005-04-17 02:20:36 +04:00
* Copyright ( C ) 1999 Niibe Yutaka
2007-11-19 12:26:19 +03:00
* Copyright ( C ) 2002 - 2007 Paul Mundt
2006-09-27 10:13:36 +04: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-17 02:20:36 +04:00
*/
2006-09-27 10:13:36 +04:00
# ifndef __ASM_SH_PGTABLE_H
# define __ASM_SH_PGTABLE_H
2005-04-17 02:20:36 +04:00
2006-09-27 10:13:36 +04:00
# include <asm-generic/pgtable-nopmd.h>
# include <asm/page.h>
2005-04-17 02:20:36 +04: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 10:13:36 +04:00
extern unsigned long empty_zero_page [ PAGE_SIZE / sizeof ( unsigned long ) ] ;
2005-04-17 02:20:36 +04:00
# define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))
# endif /* !__ASSEMBLY__ */
2007-11-10 13:16:55 +03: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)
# ifdef CONFIG_29BIT
# define NPHYS 29
# else
# define NPHYS 32
# endif
# define NPHYS_SIGN (1LL << (NPHYS - 1))
# define NPHYS_MASK (-1LL << NPHYS)
2006-11-20 08:30:26 +03:00
/*
* traditional two - level paging structure
*/
/* PTE bits */
2007-11-21 10:19:12 +03:00
# if defined(CONFIG_X2TLB) || defined(CONFIG_SUPERH64)
2006-11-20 08:30:26 +03:00
# define PTE_MAGNITUDE 3 /* 64-bit PTEs on extended mode SH-X2 TLB */
# else
# define PTE_MAGNITUDE 2 /* 32-bit PTEs */
# endif
# define PTE_SHIFT PAGE_SHIFT
# define PTE_BITS (PTE_SHIFT - PTE_MAGNITUDE)
/* PGD bits */
# define PGDIR_SHIFT (PTE_SHIFT + PTE_BITS)
2007-02-14 08:13:10 +03:00
# define PGDIR_SIZE (1UL << PGDIR_SHIFT)
2005-04-17 02:20:36 +04:00
# define PGDIR_MASK (~(PGDIR_SIZE-1))
2006-11-20 08:30:26 +03:00
/* Entries per level */
2006-12-26 09:29:19 +03:00
# define PTRS_PER_PTE (PAGE_SIZE / (1 << PTE_MAGNITUDE))
2007-09-21 06:55:03 +04:00
# define PTRS_PER_PGD (PAGE_SIZE / sizeof(pgd_t))
2006-11-20 08:30:26 +03:00
2005-04-17 02:20:36 +04:00
# define USER_PTRS_PER_PGD (TASK_SIZE / PGDIR_SIZE)
2005-04-20 00:29:23 +04:00
# define FIRST_USER_ADDRESS 0
2005-04-17 02:20:36 +04:00
2007-11-30 11:52:53 +03:00
# ifdef CONFIG_32BIT
# define PHYS_ADDR_MASK 0xffffffff
# else
# define PHYS_ADDR_MASK 0x1fffffff
# endif
# define PTE_PHYS_MASK (PHYS_ADDR_MASK & PAGE_MASK)
2005-04-17 02:20:36 +04:00
2007-11-10 14:39:06 +03:00
# ifdef CONFIG_SUPERH32
2007-07-25 05:43:47 +04:00
# define VMALLOC_START (P3SEG)
2007-11-10 14:39:06 +03:00
# else
# define VMALLOC_START (0xf0000000)
# endif
2005-04-17 02:20:36 +04:00
# define VMALLOC_END (FIXADDR_START-2*PAGE_SIZE)
2007-11-19 12:26:19 +03:00
# if defined(CONFIG_SUPERH32)
# include <asm/pgtable_32.h>
2006-11-20 08:30:26 +03:00
# else
2007-11-19 12:26:19 +03:00
# include <asm/pgtable_64.h>
2005-04-17 02:20:36 +04:00
# endif
/*
2006-11-20 08:30:26 +03: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-17 02:20:36 +04:00
*/
2006-11-20 08:30:26 +03:00
/*xwr*/
2005-04-17 02:20:36 +04:00
# define __P000 PAGE_NONE
# define __P001 PAGE_READONLY
# define __P010 PAGE_COPY
# define __P011 PAGE_COPY
2006-11-20 08:30:26 +03:00
# define __P100 PAGE_EXECREAD
# define __P101 PAGE_EXECREAD
2005-04-17 02:20:36 +04:00
# define __P110 PAGE_COPY
# define __P111 PAGE_COPY
# define __S000 PAGE_NONE
# define __S001 PAGE_READONLY
2006-11-20 08:30:26 +03:00
# define __S010 PAGE_WRITEONLY
2005-04-17 02:20:36 +04:00
# define __S011 PAGE_SHARED
2006-11-20 08:30:26 +03:00
# define __S100 PAGE_EXECREAD
# define __S101 PAGE_EXECREAD
# define __S110 PAGE_RWX
# define __S111 PAGE_RWX
2005-04-17 02:20:36 +04: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 12:26:19 +03:00
# define pte_pfn(x) ((unsigned long)(((x).pte_low >> PAGE_SHIFT)))
2005-11-07 11:59:43 +03:00
2005-04-17 02:20:36 +04:00
/*
* No page table caches to initialise
*/
# define pgtable_cache_init() do { } while (0)
2007-07-31 12:07:28 +04:00
# if !defined(CONFIG_CACHE_OFF) && (defined(CONFIG_CPU_SH4) || \
defined ( CONFIG_SH7705_CACHE_32KB ) )
2007-11-19 12:26:19 +03:00
struct mm_struct ;
2007-03-05 13:46:47 +03:00
# define __HAVE_ARCH_PTEP_GET_AND_CLEAR
2007-11-19 12:26:19 +03:00
pte_t ptep_get_and_clear ( struct mm_struct * mm , unsigned long addr , pte_t * ptep ) ;
2007-03-05 13:46:47 +03:00
# endif
2007-11-19 12:26:19 +03:00
struct vm_area_struct ;
extern void update_mmu_cache ( struct vm_area_struct * vma ,
unsigned long address , pte_t pte ) ;
2006-11-20 08:30:26 +03:00
extern pgd_t swapper_pg_dir [ PTRS_PER_PGD ] ;
extern void paging_init ( void ) ;
2007-12-17 04:52:11 +03:00
extern void page_table_range_init ( unsigned long start , unsigned long end ,
pgd_t * pgd ) ;
2006-11-20 08:30:26 +03:00
2005-04-17 02:20:36 +04:00
# include <asm-generic/pgtable.h>
2007-11-19 12:26:19 +03:00
# endif /* __ASM_SH_PGTABLE_H */