Lines Matching +full:protect +full:- +full:exec

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * address space "slices" (meta-segments) support
39 (int)SLICE_NUM_LOW, &mask->low_slices); in slice_print_mask()
41 (int)SLICE_NUM_HIGH, mask->high_slices); in slice_print_mask()
63 unsigned long end = start + len - 1; in slice_range_to_mask()
65 ret->low_slices = 0; in slice_range_to_mask()
67 bitmap_zero(ret->high_slices, SLICE_NUM_HIGH); in slice_range_to_mask()
71 (unsigned long)(SLICE_LOW_TOP - 1)); in slice_range_to_mask()
73 ret->low_slices = (1u << (GET_LOW_SLICE_INDEX(mend) + 1)) in slice_range_to_mask()
74 - (1u << GET_LOW_SLICE_INDEX(start)); in slice_range_to_mask()
80 unsigned long count = GET_HIGH_SLICE_INDEX(align_end) - start_index; in slice_range_to_mask()
82 bitmap_set(ret->high_slices, start_index, count); in slice_range_to_mask()
91 if ((mm_ctx_slb_addr_limit(&mm->context) - len) < addr) in slice_area_is_free()
114 return !slice_area_is_free(mm, start, end - start); in slice_high_has_vma()
122 ret->low_slices = 0; in slice_mask_for_free()
124 bitmap_zero(ret->high_slices, SLICE_NUM_HIGH); in slice_mask_for_free()
128 ret->low_slices |= 1u << i; in slice_mask_for_free()
130 if (slice_addr_is_low(high_limit - 1)) in slice_mask_for_free()
135 __set_bit(i, ret->high_slices); in slice_mask_for_free()
142 unsigned long end = start + len - 1; in slice_check_range_fits()
147 (unsigned long)(SLICE_LOW_TOP - 1)); in slice_check_range_fits()
150 - (1u << GET_LOW_SLICE_INDEX(start)); in slice_check_range_fits()
152 if ((low_slices & available->low_slices) != low_slices) in slice_check_range_fits()
158 unsigned long count = GET_HIGH_SLICE_INDEX(align_end) - start_index; in slice_check_range_fits()
162 if (!test_bit(i, available->high_slices)) in slice_check_range_fits()
176 if (mm != current->active_mm) in slice_flush_segments()
179 copy_mm_to_paca(current->active_mm); in slice_flush_segments()
200 psize_mask = slice_mask_for_size(&mm->context, psize); in slice_convert()
202 /* We need to use a spinlock here to protect against in slice_convert()
203 * concurrent 64k -> 4k demotion ... in slice_convert()
207 lpsizes = mm_ctx_low_slices(&mm->context); in slice_convert()
209 if (!(mask->low_slices & (1u << i))) in slice_convert()
217 old_mask = slice_mask_for_size(&mm->context, old_psize); in slice_convert()
218 old_mask->low_slices &= ~(1u << i); in slice_convert()
219 psize_mask->low_slices |= 1u << i; in slice_convert()
226 hpsizes = mm_ctx_high_slices(&mm->context); in slice_convert()
227 for (i = 0; i < GET_HIGH_SLICE_INDEX(mm_ctx_slb_addr_limit(&mm->context)); i++) { in slice_convert()
228 if (!test_bit(i, mask->high_slices)) in slice_convert()
236 old_mask = slice_mask_for_size(&mm->context, old_psize); in slice_convert()
237 __clear_bit(i, old_mask->high_slices); in slice_convert()
238 __set_bit(i, psize_mask->high_slices); in slice_convert()
246 (unsigned long)mm_ctx_low_slices(&mm->context), in slice_convert()
247 (unsigned long)mm_ctx_high_slices(&mm->context)); in slice_convert()
269 return !!(available->low_slices & (1u << slice)); in slice_scan_available()
274 return !!test_bit(slice, available->high_slices); in slice_scan_available()
289 info.align_mask = PAGE_MASK & ((1ul << pshift) - 1); in slice_find_area_bottomup()
321 return -ENOMEM; in slice_find_area_bottomup()
336 info.align_mask = PAGE_MASK & ((1ul << pshift) - 1); in slice_find_area_topdown()
339 addr = mm->mmap_base; in slice_find_area_topdown()
347 addr += mm_ctx_slb_addr_limit(&mm->context) - DEFAULT_MAP_WINDOW; in slice_find_area_topdown()
351 if (!slice_scan_available(addr - 1, available, 0, &addr)) in slice_find_area_topdown()
363 else if (slice_scan_available(addr - 1, available, 0, &prev)) { in slice_find_area_topdown()
376 * so fall back to the bottom-up function here. This scenario in slice_find_area_topdown()
397 dst->low_slices = src->low_slices; in slice_copy_mask()
400 bitmap_copy(dst->high_slices, src->high_slices, SLICE_NUM_HIGH); in slice_copy_mask()
407 dst->low_slices = src1->low_slices | src2->low_slices; in slice_or_mask()
410 bitmap_or(dst->high_slices, src1->high_slices, src2->high_slices, SLICE_NUM_HIGH); in slice_or_mask()
417 dst->low_slices = src1->low_slices & ~src2->low_slices; in slice_andnot_mask()
420 bitmap_andnot(dst->high_slices, src1->high_slices, src2->high_slices, SLICE_NUM_HIGH); in slice_andnot_mask()
440 struct mm_struct *mm = current->mm; in slice_get_unmapped_area()
449 return -ENOMEM; in slice_get_unmapped_area()
450 if (len & (page_size - 1)) in slice_get_unmapped_area()
451 return -EINVAL; in slice_get_unmapped_area()
453 if (addr & (page_size - 1)) in slice_get_unmapped_area()
454 return -EINVAL; in slice_get_unmapped_area()
455 if (addr > high_limit - len) in slice_get_unmapped_area()
456 return -ENOMEM; in slice_get_unmapped_area()
459 if (high_limit > mm_ctx_slb_addr_limit(&mm->context)) { in slice_get_unmapped_area()
465 mm_ctx_set_slb_addr_limit(&mm->context, high_limit); in slice_get_unmapped_area()
471 BUG_ON(mm->task_size == 0); in slice_get_unmapped_area()
472 BUG_ON(mm_ctx_slb_addr_limit(&mm->context) == 0); in slice_get_unmapped_area()
484 if (addr > high_limit - len || addr < mmap_min_addr || in slice_get_unmapped_area()
492 maskp = slice_mask_for_size(&mm->context, psize); in slice_get_unmapped_area()
519 compat_maskp = slice_mask_for_size(&mm->context, MMU_PAGE_4K); in slice_get_unmapped_area()
548 if (newaddr != -ENOMEM) { in slice_get_unmapped_area()
574 return -EBUSY; in slice_get_unmapped_area()
584 if (newaddr != -ENOMEM) { in slice_get_unmapped_area()
596 if (IS_ENABLED(CONFIG_PPC_64K_PAGES) && newaddr == -ENOMEM && in slice_get_unmapped_area()
598 /* retry the search with 4k-page slices included */ in slice_get_unmapped_area()
604 if (newaddr == -ENOMEM) in slice_get_unmapped_area()
605 return -ENOMEM; in slice_get_unmapped_area()
618 return -ENOMEM; in slice_get_unmapped_area()
636 return -ENOMEM; in slice_get_unmapped_area()
649 mm_ctx_user_psize(&current->mm->context), 0); in arch_get_unmapped_area()
659 mm_ctx_user_psize(&current->mm->context), 1); in arch_get_unmapped_area_topdown()
670 psizes = mm_ctx_low_slices(&mm->context); in get_slice_psize()
673 psizes = mm_ctx_high_slices(&mm->context); in get_slice_psize()
690 * In the case of exec, use the default limit. In the in slice_init_new_context_exec()
694 mm_ctx_set_slb_addr_limit(&mm->context, SLB_ADDR_LIMIT_DEFAULT); in slice_init_new_context_exec()
695 mm_ctx_set_user_psize(&mm->context, psize); in slice_init_new_context_exec()
700 lpsizes = mm_ctx_low_slices(&mm->context); in slice_init_new_context_exec()
703 hpsizes = mm_ctx_high_slices(&mm->context); in slice_init_new_context_exec()
709 mask = slice_mask_for_size(&mm->context, psize); in slice_init_new_context_exec()
710 mask->low_slices = ~0UL; in slice_init_new_context_exec()
712 bitmap_fill(mask->high_slices, SLICE_NUM_HIGH); in slice_init_new_context_exec()
718 struct mm_struct *mm = current->mm; in slice_setup_new_exec()
725 mm_ctx_set_slb_addr_limit(&mm->context, DEFAULT_MAP_WINDOW); in slice_setup_new_exec()
764 unsigned int psize = mm_ctx_user_psize(&mm->context); in slice_is_hugepage_only_range()
768 maskp = slice_mask_for_size(&mm->context, psize); in slice_is_hugepage_only_range()
775 compat_maskp = slice_mask_for_size(&mm->context, MMU_PAGE_4K); in slice_is_hugepage_only_range()