2005-04-16 15:20:36 -07:00
# ifndef _X86_64_PAGE_H
# define _X86_64_PAGE_H
2008-01-30 13:32:44 +01:00
# define PAGETABLE_LEVELS 4
# define THREAD_ORDER 1
# define THREAD_SIZE (PAGE_SIZE << THREAD_ORDER)
2008-03-23 01:02:58 -07:00
# define CURRENT_MASK (~(THREAD_SIZE - 1))
2008-01-30 13:32:44 +01:00
# define EXCEPTION_STACK_ORDER 0
# define EXCEPTION_STKSZ (PAGE_SIZE << EXCEPTION_STACK_ORDER)
# define DEBUG_STACK_ORDER (EXCEPTION_STACK_ORDER + 1)
# define DEBUG_STKSZ (PAGE_SIZE << DEBUG_STACK_ORDER)
# define IRQSTACK_ORDER 2
# define IRQSTACKSIZE (PAGE_SIZE << IRQSTACK_ORDER)
# define STACKFAULT_STACK 1
# define DOUBLEFAULT_STACK 2
# define NMI_STACK 3
# define DEBUG_STACK 4
# define MCE_STACK 5
# define N_EXCEPTION_STACKS 5 /* hw limit: 7 */
2008-02-04 16:48:09 +01:00
# define PUD_PAGE_SIZE (_AC(1, UL) << PUD_SHIFT)
# define PUD_PAGE_MASK (~(PUD_PAGE_SIZE-1))
2008-06-25 00:19:16 -04:00
/*
* Set __PAGE_OFFSET to the most negative possible address +
* PGDIR_SIZE * 16 ( pgd slot 272 ) . The gap is to allow a space for a
* hypervisor to fit . Choosing 16 slots here is arbitrary , but it ' s
* what Xen requires .
*/
# define __PAGE_OFFSET _AC(0xffff880000000000, UL)
2008-01-30 13:32:44 +01:00
# define __PHYSICAL_START CONFIG_PHYSICAL_START
# define __KERNEL_ALIGN 0x200000
2005-04-16 15:20:36 -07:00
2008-01-30 13:32:44 +01:00
/*
* Make sure kernel is aligned to 2 MB address . Catching it at compile
* time is better . Change your config file and compile the kernel
* for a 2 MB aligned address ( CONFIG_PHYSICAL_START )
*/
# if (CONFIG_PHYSICAL_START % __KERNEL_ALIGN) != 0
# error "CONFIG_PHYSICAL_START must be a multiple of 2MB"
# endif
# define __START_KERNEL (__START_KERNEL_map + __PHYSICAL_START)
# define __START_KERNEL_map _AC(0xffffffff80000000, UL)
/* See Documentation/x86_64/mm.txt for a description of the memory map. */
# define __PHYSICAL_MASK_SHIFT 46
# define __VIRTUAL_MASK_SHIFT 48
2008-02-21 11:04:11 +01:00
/*
2008-02-21 12:50:51 +01:00
* Kernel image size is limited to 512 MB ( see level2_kernel_pgt in
2008-02-21 11:04:11 +01:00
* arch / x86 / kernel / head_64 . S ) , and it is mapped here :
*/
2008-03-23 01:02:58 -07:00
# define KERNEL_IMAGE_SIZE (512 * 1024 * 1024)
2008-02-21 13:39:30 +01:00
# define KERNEL_IMAGE_START _AC(0xffffffff80000000, UL)
2005-04-16 15:20:36 -07:00
# ifndef __ASSEMBLY__
2008-01-30 13:32:44 +01:00
void clear_page ( void * page ) ;
void copy_page ( void * to , void * from ) ;
2008-06-24 22:14:09 -07:00
/* duplicated to the one in bootmem.h */
extern unsigned long max_pfn ;
2008-01-30 13:32:44 +01:00
extern unsigned long phys_base ;
extern unsigned long __phys_addr ( unsigned long ) ;
# define __phys_reloc_hide(x) (x)
/*
* These are used to make use of C type - checking . .
*/
typedef unsigned long pteval_t ;
typedef unsigned long pmdval_t ;
typedef unsigned long pudval_t ;
typedef unsigned long pgdval_t ;
typedef unsigned long pgprotval_t ;
typedef unsigned long phys_addr_t ;
2008-02-08 04:22:04 -08:00
typedef struct page * pgtable_t ;
2008-01-30 13:32:44 +01:00
typedef struct { pteval_t pte ; } pte_t ;
2005-04-16 15:20:36 -07:00
2008-01-30 13:32:44 +01:00
# define vmemmap ((struct page *)VMEMMAP_START)
2005-04-16 15:20:36 -07:00
2008-03-12 03:53:28 +01:00
extern unsigned long init_memory_mapping ( unsigned long start ,
unsigned long end ) ;
2008-06-22 02:44:49 -07:00
extern void initmem_init ( unsigned long start_pfn , unsigned long end_pfn ) ;
2008-07-01 14:45:32 -05:00
extern void init_extra_mapping_uc ( unsigned long phys , unsigned long size ) ;
extern void init_extra_mapping_wb ( unsigned long phys , unsigned long size ) ;
2008-01-30 13:32:44 +01:00
# endif /* !__ASSEMBLY__ */
2006-04-27 15:48:08 +01:00
2008-01-30 13:32:41 +01:00
# ifdef CONFIG_FLATMEM
2008-06-24 22:14:09 -07:00
# define pfn_valid(pfn) ((pfn) < max_pfn)
2008-01-30 13:32:41 +01:00
# endif
2005-04-16 15:20:36 -07:00
# endif /* _X86_64_PAGE_H */