1/* $Id: page.h,v 1.1.1.1 2008/10/15 03:27:26 james26_jang Exp $ */ 2 3#ifndef _SPARC64_PAGE_H 4#define _SPARC64_PAGE_H 5 6#define PAGE_SHIFT 13 7#ifndef __ASSEMBLY__ 8/* I have my suspicions... -DaveM */ 9#define PAGE_SIZE (1UL << PAGE_SHIFT) 10#else 11#define PAGE_SIZE (1 << PAGE_SHIFT) 12#endif 13 14#define PAGE_MASK (~(PAGE_SIZE-1)) 15 16 17#ifdef __KERNEL__ 18 19#ifndef __ASSEMBLY__ 20 21#ifdef CONFIG_DEBUG_BUGVERBOSE 22extern void do_BUG(const char *file, int line); 23#define BUG() do { \ 24 do_BUG(__FILE__, __LINE__); \ 25 __builtin_trap(); \ 26} while (0) 27#else 28#define BUG() __builtin_trap() 29#endif 30 31#define PAGE_BUG(page) BUG() 32 33/* Sparc64 is slow at multiplication, we prefer to use some extra space. */ 34#define WANT_PAGE_VIRTUAL 1 35 36extern void _clear_page(void *page); 37#define clear_page(X) _clear_page((void *)(X)) 38extern void clear_user_page(void *page, unsigned long vaddr); 39extern void copy_user_page(void *to, void *from, unsigned long vaddr); 40 41/* GROSS, defining this makes gcc pass these types as aggregates, 42 * and thus on the stack, turn this crap off... -DaveM 43 */ 44 45/* #define STRICT_MM_TYPECHECKS */ 46 47#ifdef STRICT_MM_TYPECHECKS 48/* These are used to make use of C type-checking.. */ 49typedef struct { unsigned long pte; } pte_t; 50typedef struct { unsigned long iopte; } iopte_t; 51typedef struct { unsigned int pmd; } pmd_t; 52typedef struct { unsigned int pgd; } pgd_t; 53typedef struct { unsigned long ctxd; } ctxd_t; 54typedef struct { unsigned long pgprot; } pgprot_t; 55typedef struct { unsigned long iopgprot; } iopgprot_t; 56 57#define pte_val(x) ((x).pte) 58#define iopte_val(x) ((x).iopte) 59#define pmd_val(x) ((unsigned long)(x).pmd) 60#define pgd_val(x) ((unsigned long)(x).pgd) 61#define ctxd_val(x) ((x).ctxd) 62#define pgprot_val(x) ((x).pgprot) 63#define iopgprot_val(x) ((x).iopgprot) 64 65#define __pte(x) ((pte_t) { (x) } ) 66#define __iopte(x) ((iopte_t) { (x) } ) 67#define __pmd(x) ((pmd_t) { (x) } ) 68#define __pgd(x) ((pgd_t) { (x) } ) 69#define __ctxd(x) ((ctxd_t) { (x) } ) 70#define __pgprot(x) ((pgprot_t) { (x) } ) 71#define __iopgprot(x) ((iopgprot_t) { (x) } ) 72 73#else 74/* .. while these make it easier on the compiler */ 75typedef unsigned long pte_t; 76typedef unsigned long iopte_t; 77typedef unsigned int pmd_t; 78typedef unsigned int pgd_t; 79typedef unsigned long ctxd_t; 80typedef unsigned long pgprot_t; 81typedef unsigned long iopgprot_t; 82 83#define pte_val(x) (x) 84#define iopte_val(x) (x) 85#define pmd_val(x) ((unsigned long)(x)) 86#define pgd_val(x) ((unsigned long)(x)) 87#define ctxd_val(x) (x) 88#define pgprot_val(x) (x) 89#define iopgprot_val(x) (x) 90 91#define __pte(x) (x) 92#define __iopte(x) (x) 93#define __pmd(x) (x) 94#define __pgd(x) (x) 95#define __ctxd(x) (x) 96#define __pgprot(x) (x) 97#define __iopgprot(x) (x) 98 99#endif /* (STRICT_MM_TYPECHECKS) */ 100 101#define TASK_UNMAPPED_BASE ((current->thread.flags & SPARC_FLAG_32BIT) ? \ 102 (0x0000000070000000UL) : (PAGE_OFFSET)) 103 104#endif /* !(__ASSEMBLY__) */ 105 106/* to align the pointer to the (next) page boundary */ 107#define PAGE_ALIGN(addr) (((addr)+PAGE_SIZE-1)&PAGE_MASK) 108 109#ifndef __ASSEMBLY__ 110/* Do prdele, look what happens to be in %g4... */ 111register unsigned long PAGE_OFFSET asm("g4"); 112#else 113#define PAGE_OFFSET 0xFFFFF80000000000 114#endif 115 116#define __pa(x) ((unsigned long)(x) - PAGE_OFFSET) 117#define __va(x) ((void *)((unsigned long) (x) + PAGE_OFFSET)) 118#define virt_to_page(kaddr) (mem_map + ((__pa(kaddr)-phys_base) >> PAGE_SHIFT)) 119#define VALID_PAGE(page) ((page - mem_map) < max_mapnr) 120 121#define virt_to_phys __pa 122#define phys_to_virt __va 123 124#ifndef __ASSEMBLY__ 125 126/* The following structure is used to hold the physical 127 * memory configuration of the machine. This is filled in 128 * probe_memory() and is later used by mem_init() to set up 129 * mem_map[]. We statically allocate SPARC_PHYS_BANKS of 130 * these structs, this is arbitrary. The entry after the 131 * last valid one has num_bytes==0. 132 */ 133 134struct sparc_phys_banks { 135 unsigned long base_addr; 136 unsigned long num_bytes; 137}; 138 139#define SPARC_PHYS_BANKS 32 140 141extern struct sparc_phys_banks sp_banks[SPARC_PHYS_BANKS]; 142 143/* Pure 2^n version of get_order */ 144extern __inline__ int get_order(unsigned long size) 145{ 146 int order; 147 148 size = (size-1) >> (PAGE_SHIFT-1); 149 order = -1; 150 do { 151 size >>= 1; 152 order++; 153 } while (size); 154 return order; 155} 156 157#endif /* !(__ASSEMBLY__) */ 158 159#define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_EXEC | \ 160 VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) 161 162#endif /* !(__KERNEL__) */ 163 164#endif /* !(_SPARC64_PAGE_H) */ 165