linux/include/asm-powerpc/page_64.h
<<
>>
Prefs
   1#ifndef _ASM_POWERPC_PAGE_64_H
   2#define _ASM_POWERPC_PAGE_64_H
   3#ifdef __KERNEL__
   4
   5/*
   6 * Copyright (C) 2001 PPC64 Team, IBM Corp
   7 *
   8 * This program is free software; you can redistribute it and/or
   9 * modify it under the terms of the GNU General Public License
  10 * as published by the Free Software Foundation; either version
  11 * 2 of the License, or (at your option) any later version.
  12 */
  13
  14/*
  15 * We always define HW_PAGE_SHIFT to 12 as use of 64K pages remains Linux
  16 * specific, every notion of page number shared with the firmware, TCEs,
  17 * iommu, etc... still uses a page size of 4K.
  18 */
  19#define HW_PAGE_SHIFT           12
  20#define HW_PAGE_SIZE            (ASM_CONST(1) << HW_PAGE_SHIFT)
  21#define HW_PAGE_MASK            (~(HW_PAGE_SIZE-1))
  22
  23/*
  24 * PAGE_FACTOR is the number of bits factor between PAGE_SHIFT and
  25 * HW_PAGE_SHIFT, that is 4K pages.
  26 */
  27#define PAGE_FACTOR             (PAGE_SHIFT - HW_PAGE_SHIFT)
  28
  29/* Segment size */
  30#define SID_SHIFT               28
  31#define SID_MASK                0xfffffffffUL
  32#define ESID_MASK               0xfffffffff0000000UL
  33#define GET_ESID(x)             (((x) >> SID_SHIFT) & SID_MASK)
  34
  35#ifndef __ASSEMBLY__
  36#include <asm/cache.h>
  37
  38typedef unsigned long pte_basic_t;
  39
  40static __inline__ void clear_page(void *addr)
  41{
  42        unsigned long lines, line_size;
  43
  44        line_size = ppc64_caches.dline_size;
  45        lines = ppc64_caches.dlines_per_page;
  46
  47        __asm__ __volatile__(
  48        "mtctr  %1      # clear_page\n\
  491:      dcbz    0,%0\n\
  50        add     %0,%0,%3\n\
  51        bdnz+   1b"
  52        : "=r" (addr)
  53        : "r" (lines), "0" (addr), "r" (line_size)
  54        : "ctr", "memory");
  55}
  56
  57extern void copy_4K_page(void *to, void *from);
  58
  59#ifdef CONFIG_PPC_64K_PAGES
  60static inline void copy_page(void *to, void *from)
  61{
  62        unsigned int i;
  63        for (i=0; i < (1 << (PAGE_SHIFT - 12)); i++) {
  64                copy_4K_page(to, from);
  65                to += 4096;
  66                from += 4096;
  67        }
  68}
  69#else /* CONFIG_PPC_64K_PAGES */
  70static inline void copy_page(void *to, void *from)
  71{
  72        copy_4K_page(to, from);
  73}
  74#endif /* CONFIG_PPC_64K_PAGES */
  75
  76/* Log 2 of page table size */
  77extern u64 ppc64_pft_size;
  78
  79/* Large pages size */
  80#ifdef CONFIG_HUGETLB_PAGE
  81extern unsigned int HPAGE_SHIFT;
  82#else
  83#define HPAGE_SHIFT PAGE_SHIFT
  84#endif
  85#define HPAGE_SIZE              ((1UL) << HPAGE_SHIFT)
  86#define HPAGE_MASK              (~(HPAGE_SIZE - 1))
  87#define HUGETLB_PAGE_ORDER      (HPAGE_SHIFT - PAGE_SHIFT)
  88
  89#endif /* __ASSEMBLY__ */
  90
  91#ifdef CONFIG_PPC_MM_SLICES
  92
  93#define SLICE_LOW_SHIFT         28
  94#define SLICE_HIGH_SHIFT        40
  95
  96#define SLICE_LOW_TOP           (0x100000000ul)
  97#define SLICE_NUM_LOW           (SLICE_LOW_TOP >> SLICE_LOW_SHIFT)
  98#define SLICE_NUM_HIGH          (PGTABLE_RANGE >> SLICE_HIGH_SHIFT)
  99
 100#define GET_LOW_SLICE_INDEX(addr)       ((addr) >> SLICE_LOW_SHIFT)
 101#define GET_HIGH_SLICE_INDEX(addr)      ((addr) >> SLICE_HIGH_SHIFT)
 102
 103#ifndef __ASSEMBLY__
 104
 105struct slice_mask {
 106        u16 low_slices;
 107        u16 high_slices;
 108};
 109
 110struct mm_struct;
 111
 112extern unsigned long slice_get_unmapped_area(unsigned long addr,
 113                                             unsigned long len,
 114                                             unsigned long flags,
 115                                             unsigned int psize,
 116                                             int topdown,
 117                                             int use_cache);
 118
 119extern unsigned int get_slice_psize(struct mm_struct *mm,
 120                                    unsigned long addr);
 121
 122extern void slice_init_context(struct mm_struct *mm, unsigned int psize);
 123extern void slice_set_user_psize(struct mm_struct *mm, unsigned int psize);
 124
 125#define ARCH_HAS_HUGEPAGE_ONLY_RANGE
 126extern int is_hugepage_only_range(struct mm_struct *m,
 127                                  unsigned long addr,
 128                                  unsigned long len);
 129
 130#endif /* __ASSEMBLY__ */
 131#else
 132#define slice_init()
 133#endif /* CONFIG_PPC_MM_SLICES */
 134
 135#ifdef CONFIG_HUGETLB_PAGE
 136
 137#define ARCH_HAS_HUGETLB_FREE_PGD_RANGE
 138#define ARCH_HAS_SETCLEAR_HUGE_PTE
 139#define HAVE_ARCH_HUGETLB_UNMAPPED_AREA
 140
 141#endif /* !CONFIG_HUGETLB_PAGE */
 142
 143#ifdef MODULE
 144#define __page_aligned __attribute__((__aligned__(PAGE_SIZE)))
 145#else
 146#define __page_aligned \
 147        __attribute__((__aligned__(PAGE_SIZE), \
 148                __section__(".data.page_aligned")))
 149#endif
 150
 151#define VM_DATA_DEFAULT_FLAGS \
 152        (test_thread_flag(TIF_32BIT) ? \
 153         VM_DATA_DEFAULT_FLAGS32 : VM_DATA_DEFAULT_FLAGS64)
 154
 155/*
 156 * This is the default if a program doesn't have a PT_GNU_STACK
 157 * program header entry. The PPC64 ELF ABI has a non executable stack
 158 * stack by default, so in the absense of a PT_GNU_STACK program header
 159 * we turn execute permission off.
 160 */
 161#define VM_STACK_DEFAULT_FLAGS32        (VM_READ | VM_WRITE | VM_EXEC | \
 162                                         VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
 163
 164#define VM_STACK_DEFAULT_FLAGS64        (VM_READ | VM_WRITE | \
 165                                         VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
 166
 167#define VM_STACK_DEFAULT_FLAGS \
 168        (test_thread_flag(TIF_32BIT) ? \
 169         VM_STACK_DEFAULT_FLAGS32 : VM_STACK_DEFAULT_FLAGS64)
 170
 171#include <asm-generic/page.h>
 172
 173#endif /* __KERNEL__ */
 174#endif /* _ASM_POWERPC_PAGE_64_H */
 175
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.