1 /* 2 * arch/sh/mm/hugetlbpage.c 3 * 4 * SuperH HugeTLB page support. 5 * 6 * Cloned from sparc64 by Paul Mundt. 7 * 8 * Copyright (C) 2002, 2003 David S. Miller (davem@redhat.com) 9 */ 10 11 #include <linux/config.h> 12 #include <linux/init.h> 13 #include <linux/fs.h> 14 #include <linux/mm.h> 15 #include <linux/hugetlb.h> 16 #include <linux/pagemap.h> 17 #include <linux/smp_lock.h> 18 #include <linux/slab.h> 19 #include <linux/sysctl.h> 20 21 #include <asm/mman.h> 22 #include <asm/pgalloc.h> 23 #include <asm/tlb.h> 24 #include <asm/tlbflush.h> 25 #include <asm/cacheflush.h> 26 27 pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr) 28 { 29 pgd_t *pgd; 30 pmd_t *pmd; 31 pte_t *pte = NULL; 32 33 pgd = pgd_offset(mm, addr); 34 if (pgd) { 35 pmd = pmd_alloc(mm, pgd, addr); 36 if (pmd) 37 pte = pte_alloc_map(mm, pmd, addr); 38 } 39 return pte; 40 } 41 42 pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr) 43 { 44 pgd_t *pgd; 45 pmd_t *pmd; 46 pte_t *pte = NULL; 47 48 pgd = pgd_offset(mm, addr); 49 if (pgd) { 50 pmd = pmd_offset(pgd, addr); 51 if (pmd) 52 pte = pte_offset_map(pmd, addr); 53 } 54 return pte; 55 } 56 57 void set_huge_pte_at(struct mm_struct *mm, unsigned long addr, 58 pte_t *ptep, pte_t entry) 59 { 60 int i; 61 62 for (i = 0; i < (1 << HUGETLB_PAGE_ORDER); i++) { 63 set_pte_at(mm, addr, ptep, entry); 64 ptep++; 65 addr += PAGE_SIZE; 66 pte_val(entry) += PAGE_SIZE; 67 } 68 } 69 70 pte_t huge_ptep_get_and_clear(struct mm_struct *mm, unsigned long addr, 71 pte_t *ptep) 72 { 73 pte_t entry; 74 int i; 75 76 entry = *ptep; 77 78 for (i = 0; i < (1 << HUGETLB_PAGE_ORDER); i++) { 79 pte_clear(mm, addr, ptep); 80 addr += PAGE_SIZE; 81 ptep++; 82 } 83 84 return entry; 85 } 86 87 /* 88 * This function checks for proper alignment of input addr and len parameters. 89 */ 90 int is_aligned_hugepage_range(unsigned long addr, unsigned long len) 91 { 92 if (len & ~HPAGE_MASK) 93 return -EINVAL; 94 if (addr & ~HPAGE_MASK) 95 return -EINVAL; 96 return 0; 97 } 98 99 struct page *follow_huge_addr(struct mm_struct *mm, 100 unsigned long address, int write) 101 { 102 return ERR_PTR(-EINVAL); 103 } 104 105 int pmd_huge(pmd_t pmd) 106 { 107 return 0; 108 } 109 110 struct page *follow_huge_pmd(struct mm_struct *mm, unsigned long address, 111 pmd_t *pmd, int write) 112 { 113 return NULL; 114 } 115