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/init.h> 12 #include <linux/fs.h> 13 #include <linux/mm.h> 14 #include <linux/hugetlb.h> 15 #include <linux/pagemap.h> 16 #include <linux/smp_lock.h> 17 #include <linux/slab.h> 18 #include <linux/sysctl.h> 19 20 #include <asm/mman.h> 21 #include <asm/pgalloc.h> 22 #include <asm/tlb.h> 23 #include <asm/tlbflush.h> 24 #include <asm/cacheflush.h> 25 26 pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr) 27 { 28 pgd_t *pgd; 29 pmd_t *pmd; 30 pte_t *pte = NULL; 31 32 pgd = pgd_offset(mm, addr); 33 if (pgd) { 34 pmd = pmd_alloc(mm, pgd, addr); 35 if (pmd) 36 pte = pte_alloc_map(mm, pmd, addr); 37 } 38 return pte; 39 } 40 41 pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr) 42 { 43 pgd_t *pgd; 44 pmd_t *pmd; 45 pte_t *pte = NULL; 46 47 pgd = pgd_offset(mm, addr); 48 if (pgd) { 49 pmd = pmd_offset(pgd, addr); 50 if (pmd) 51 pte = pte_offset_map(pmd, addr); 52 } 53 return pte; 54 } 55 56 void set_huge_pte_at(struct mm_struct *mm, unsigned long addr, 57 pte_t *ptep, pte_t entry) 58 { 59 int i; 60 61 for (i = 0; i < (1 << HUGETLB_PAGE_ORDER); i++) { 62 set_pte_at(mm, addr, ptep, entry); 63 ptep++; 64 addr += PAGE_SIZE; 65 pte_val(entry) += PAGE_SIZE; 66 } 67 } 68 69 pte_t huge_ptep_get_and_clear(struct mm_struct *mm, unsigned long addr, 70 pte_t *ptep) 71 { 72 pte_t entry; 73 int i; 74 75 entry = *ptep; 76 77 for (i = 0; i < (1 << HUGETLB_PAGE_ORDER); i++) { 78 pte_clear(mm, addr, ptep); 79 addr += PAGE_SIZE; 80 ptep++; 81 } 82 83 return entry; 84 } 85 86 struct page *follow_huge_addr(struct mm_struct *mm, 87 unsigned long address, int write) 88 { 89 return ERR_PTR(-EINVAL); 90 } 91 92 int pmd_huge(pmd_t pmd) 93 { 94 return 0; 95 } 96 97 struct page *follow_huge_pmd(struct mm_struct *mm, unsigned long address, 98 pmd_t *pmd, int write) 99 { 100 return NULL; 101 } 102