1 // SPDX-License-Identifier: GPL-2.0
3 #include <linux/hugetlb.h>
4 #include <linux/security.h>
5 #include <asm/pgtable.h>
6 #include <asm/pgalloc.h>
7 #include <asm/cacheflush.h>
8 #include <asm/machdep.h>
12 void radix__flush_hugetlb_page(struct vm_area_struct
*vma
, unsigned long vmaddr
)
15 struct hstate
*hstate
= hstate_file(vma
->vm_file
);
17 psize
= hstate_get_psize(hstate
);
18 radix__flush_tlb_page_psize(vma
->vm_mm
, vmaddr
, psize
);
21 void radix__local_flush_hugetlb_page(struct vm_area_struct
*vma
, unsigned long vmaddr
)
24 struct hstate
*hstate
= hstate_file(vma
->vm_file
);
26 psize
= hstate_get_psize(hstate
);
27 radix__local_flush_tlb_page_psize(vma
->vm_mm
, vmaddr
, psize
);
30 void radix__flush_hugetlb_tlb_range(struct vm_area_struct
*vma
, unsigned long start
,
34 struct hstate
*hstate
= hstate_file(vma
->vm_file
);
36 psize
= hstate_get_psize(hstate
);
37 radix__flush_tlb_range_psize(vma
->vm_mm
, start
, end
, psize
);
41 * A vairant of hugetlb_get_unmapped_area doing topdown search
42 * FIXME!! should we do as x86 does or non hugetlb area does ?
43 * ie, use topdown or not based on mmap_is_legacy check ?
46 radix__hugetlb_get_unmapped_area(struct file
*file
, unsigned long addr
,
47 unsigned long len
, unsigned long pgoff
,
50 struct mm_struct
*mm
= current
->mm
;
51 struct vm_area_struct
*vma
;
52 struct hstate
*h
= hstate_file(file
);
53 int fixed
= (flags
& MAP_FIXED
);
54 unsigned long high_limit
;
55 struct vm_unmapped_area_info info
;
57 high_limit
= DEFAULT_MAP_WINDOW
;
58 if (addr
>= high_limit
|| (fixed
&& (addr
+ len
> high_limit
)))
59 high_limit
= TASK_SIZE
;
61 if (len
& ~huge_page_mask(h
))
67 if (addr
> high_limit
- len
)
69 if (prepare_hugepage_range(file
, addr
, len
))
75 addr
= ALIGN(addr
, huge_page_size(h
));
76 vma
= find_vma(mm
, addr
);
77 if (high_limit
- len
>= addr
&& addr
>= mmap_min_addr
&&
78 (!vma
|| addr
+ len
<= vm_start_gap(vma
)))
82 * We are always doing an topdown search here. Slice code
85 info
.flags
= VM_UNMAPPED_AREA_TOPDOWN
;
87 info
.low_limit
= max(PAGE_SIZE
, mmap_min_addr
);
88 info
.high_limit
= mm
->mmap_base
+ (high_limit
- DEFAULT_MAP_WINDOW
);
89 info
.align_mask
= PAGE_MASK
& ~huge_page_mask(h
);
90 info
.align_offset
= 0;
92 return vm_unmapped_area(&info
);