Lines Matching refs:mm
23 static inline unsigned long mpx_bd_size_bytes(struct mm_struct *mm) in mpx_bd_size_bytes() argument
25 if (is_64bit_mm(mm)) in mpx_bd_size_bytes()
31 static inline unsigned long mpx_bt_size_bytes(struct mm_struct *mm) in mpx_bt_size_bytes() argument
33 if (is_64bit_mm(mm)) in mpx_bt_size_bytes()
45 struct mm_struct *mm = current->mm; in mpx_mmap() local
49 if (len != mpx_bt_size_bytes(mm)) in mpx_mmap()
52 down_write(&mm->mmap_sem); in mpx_mmap()
55 up_write(&mm->mmap_sem); in mpx_mmap()
341 struct mm_struct *mm = current->mm; in mpx_enable_management() local
356 down_write(&mm->mmap_sem); in mpx_enable_management()
357 mm->bd_addr = bd_base; in mpx_enable_management()
358 if (mm->bd_addr == MPX_INVALID_BOUNDS_DIR) in mpx_enable_management()
361 up_write(&mm->mmap_sem); in mpx_enable_management()
367 struct mm_struct *mm = current->mm; in mpx_disable_management() local
372 down_write(&mm->mmap_sem); in mpx_disable_management()
373 mm->bd_addr = MPX_INVALID_BOUNDS_DIR; in mpx_disable_management()
374 up_write(&mm->mmap_sem); in mpx_disable_management()
378 static int mpx_cmpxchg_bd_entry(struct mm_struct *mm, in mpx_cmpxchg_bd_entry() argument
391 if (is_64bit_mm(mm)) { in mpx_cmpxchg_bd_entry()
412 static int allocate_bt(struct mm_struct *mm, long __user *bd_entry) in allocate_bt() argument
424 bt_addr = mpx_mmap(mpx_bt_size_bytes(mm)); in allocate_bt()
443 ret = mpx_cmpxchg_bd_entry(mm, &actual_old_val, bd_entry, in allocate_bt()
475 vm_munmap(bt_addr, mpx_bt_size_bytes(mm)); in allocate_bt()
494 struct mm_struct *mm = current->mm; in do_mpx_bt_fault() local
513 (bd_entry >= bd_base + mpx_bd_size_bytes(mm))) in do_mpx_bt_fault()
516 return allocate_bt(mm, (long __user *)bd_entry); in do_mpx_bt_fault()
525 if (!kernel_managing_mpx_tables(current->mm)) in mpx_handle_bd_fault()
549 gup_ret = get_user_pages(current, current->mm, (unsigned long)addr, in mpx_resolve_fault()
565 static unsigned long mpx_bd_entry_to_bt_addr(struct mm_struct *mm, in mpx_bd_entry_to_bt_addr() argument
580 if (is_64bit_mm(mm)) in mpx_bd_entry_to_bt_addr()
593 int get_user_bd_entry(struct mm_struct *mm, unsigned long *bd_entry_ret, in get_user_bd_entry() argument
599 if (is_64bit_mm(mm)) in get_user_bd_entry()
615 static int get_bt_addr(struct mm_struct *mm, in get_bt_addr() argument
631 ret = get_user_bd_entry(mm, &bd_entry, bd_entry_ptr); in get_bt_addr()
646 bt_addr = mpx_bd_entry_to_bt_addr(mm, bd_entry); in get_bt_addr()
670 static inline int bt_entry_size_bytes(struct mm_struct *mm) in bt_entry_size_bytes() argument
672 if (is_64bit_mm(mm)) in bt_entry_size_bytes()
683 static unsigned long mpx_get_bt_entry_offset_bytes(struct mm_struct *mm, in mpx_get_bt_entry_offset_bytes() argument
689 if (is_64bit_mm(mm)) { in mpx_get_bt_entry_offset_bytes()
713 offset *= bt_entry_size_bytes(mm); in mpx_get_bt_entry_offset_bytes()
724 static inline unsigned long bd_entry_virt_space(struct mm_struct *mm) in bd_entry_virt_space() argument
733 if (!is_64bit_mm(mm)) in bd_entry_virt_space()
749 static noinline int zap_bt_entries_mapping(struct mm_struct *mm, in zap_bt_entries_mapping() argument
764 start = bt_addr + mpx_get_bt_entry_offset_bytes(mm, start_mapping); in zap_bt_entries_mapping()
765 end = bt_addr + mpx_get_bt_entry_offset_bytes(mm, end_mapping - 1); in zap_bt_entries_mapping()
771 end += bt_entry_size_bytes(mm); in zap_bt_entries_mapping()
778 vma = find_vma(mm, start); in zap_bt_entries_mapping()
809 static unsigned long mpx_get_bd_entry_offset(struct mm_struct *mm, in mpx_get_bd_entry_offset() argument
823 if (is_64bit_mm(mm)) { in mpx_get_bd_entry_offset()
829 return (addr / bd_entry_virt_space(mm)) * bd_entry_size; in mpx_get_bd_entry_offset()
835 return (addr / bd_entry_virt_space(mm)) * bd_entry_size; in mpx_get_bd_entry_offset()
846 static int unmap_entire_bt(struct mm_struct *mm, in unmap_entire_bt() argument
858 ret = mpx_cmpxchg_bd_entry(mm, &actual_old_val, in unmap_entire_bt()
897 return do_munmap(mm, bt_addr, mpx_bt_size_bytes(mm)); in unmap_entire_bt()
900 static int try_unmap_single_bt(struct mm_struct *mm, in try_unmap_single_bt() argument
909 unsigned long bta_start_vaddr = start & ~(bd_entry_virt_space(mm)-1); in try_unmap_single_bt()
910 unsigned long bta_end_vaddr = bta_start_vaddr + bd_entry_virt_space(mm); in try_unmap_single_bt()
920 next = find_vma_prev(mm, start, &prev); in try_unmap_single_bt()
940 next = find_vma_prev(mm, start, &prev); in try_unmap_single_bt()
951 bde_vaddr = mm->bd_addr + mpx_get_bd_entry_offset(mm, start); in try_unmap_single_bt()
952 ret = get_bt_addr(mm, bde_vaddr, &bt_addr); in try_unmap_single_bt()
970 return unmap_entire_bt(mm, bde_vaddr, bt_addr); in try_unmap_single_bt()
971 return zap_bt_entries_mapping(mm, bt_addr, start, end); in try_unmap_single_bt()
974 static int mpx_unmap_tables(struct mm_struct *mm, in mpx_unmap_tables() argument
984 bd_entry_virt_space(mm)); in mpx_unmap_tables()
993 ret = try_unmap_single_bt(mm, one_unmap_start, one_unmap_end); in mpx_unmap_tables()
1010 void mpx_notify_unmap(struct mm_struct *mm, struct vm_area_struct *vma, in mpx_notify_unmap() argument
1019 if (!kernel_managing_mpx_tables(current->mm)) in mpx_notify_unmap()
1037 ret = mpx_unmap_tables(mm, start, end); in mpx_notify_unmap()