Lines Matching refs:area
1133 static int xol_add_vma(struct mm_struct *mm, struct xol_area *area) in xol_add_vma() argument
1141 if (!area->vaddr) { in xol_add_vma()
1143 area->vaddr = get_unmapped_area(NULL, TASK_SIZE - PAGE_SIZE, in xol_add_vma()
1145 if (area->vaddr & ~PAGE_MASK) { in xol_add_vma()
1146 ret = area->vaddr; in xol_add_vma()
1151 ret = install_special_mapping(mm, area->vaddr, PAGE_SIZE, in xol_add_vma()
1152 VM_EXEC|VM_MAYEXEC|VM_DONTCOPY|VM_IO, &area->page); in xol_add_vma()
1157 mm->uprobes_state.xol_area = area; in xol_add_vma()
1168 struct xol_area *area; in __create_xol_area() local
1170 area = kmalloc(sizeof(*area), GFP_KERNEL); in __create_xol_area()
1171 if (unlikely(!area)) in __create_xol_area()
1174 area->bitmap = kzalloc(BITS_TO_LONGS(UINSNS_PER_PAGE) * sizeof(long), GFP_KERNEL); in __create_xol_area()
1175 if (!area->bitmap) in __create_xol_area()
1178 area->page = alloc_page(GFP_HIGHUSER); in __create_xol_area()
1179 if (!area->page) in __create_xol_area()
1182 area->vaddr = vaddr; in __create_xol_area()
1183 init_waitqueue_head(&area->wq); in __create_xol_area()
1185 set_bit(0, area->bitmap); in __create_xol_area()
1186 atomic_set(&area->slot_count, 1); in __create_xol_area()
1187 copy_to_page(area->page, 0, &insn, UPROBE_SWBP_INSN_SIZE); in __create_xol_area()
1189 if (!xol_add_vma(mm, area)) in __create_xol_area()
1190 return area; in __create_xol_area()
1192 __free_page(area->page); in __create_xol_area()
1194 kfree(area->bitmap); in __create_xol_area()
1196 kfree(area); in __create_xol_area()
1210 struct xol_area *area; in get_xol_area() local
1215 area = mm->uprobes_state.xol_area; in get_xol_area()
1217 return area; in get_xol_area()
1225 struct xol_area *area = mm->uprobes_state.xol_area; in uprobe_clear_state() local
1227 if (!area) in uprobe_clear_state()
1230 put_page(area->page); in uprobe_clear_state()
1231 kfree(area->bitmap); in uprobe_clear_state()
1232 kfree(area); in uprobe_clear_state()
1259 static unsigned long xol_take_insn_slot(struct xol_area *area) in xol_take_insn_slot() argument
1265 slot_nr = find_first_zero_bit(area->bitmap, UINSNS_PER_PAGE); in xol_take_insn_slot()
1267 if (!test_and_set_bit(slot_nr, area->bitmap)) in xol_take_insn_slot()
1273 wait_event(area->wq, (atomic_read(&area->slot_count) < UINSNS_PER_PAGE)); in xol_take_insn_slot()
1276 slot_addr = area->vaddr + (slot_nr * UPROBE_XOL_SLOT_BYTES); in xol_take_insn_slot()
1277 atomic_inc(&area->slot_count); in xol_take_insn_slot()
1288 struct xol_area *area; in xol_get_insn_slot() local
1291 area = get_xol_area(); in xol_get_insn_slot()
1292 if (!area) in xol_get_insn_slot()
1295 xol_vaddr = xol_take_insn_slot(area); in xol_get_insn_slot()
1299 arch_uprobe_copy_ixol(area->page, xol_vaddr, in xol_get_insn_slot()
1312 struct xol_area *area; in xol_free_insn_slot() local
1323 area = tsk->mm->uprobes_state.xol_area; in xol_free_insn_slot()
1324 vma_end = area->vaddr + PAGE_SIZE; in xol_free_insn_slot()
1325 if (area->vaddr <= slot_addr && slot_addr < vma_end) { in xol_free_insn_slot()
1329 offset = slot_addr - area->vaddr; in xol_free_insn_slot()
1334 clear_bit(slot_nr, area->bitmap); in xol_free_insn_slot()
1335 atomic_dec(&area->slot_count); in xol_free_insn_slot()
1336 if (waitqueue_active(&area->wq)) in xol_free_insn_slot()
1337 wake_up(&area->wq); in xol_free_insn_slot()
1473 struct xol_area *area; in uprobe_copy_process() local
1487 area = mm->uprobes_state.xol_area; in uprobe_copy_process()
1488 if (!area) in uprobe_copy_process()
1494 t->utask->dup_xol_addr = area->vaddr; in uprobe_copy_process()
1507 struct xol_area *area; in get_trampoline_vaddr() local
1510 area = current->mm->uprobes_state.xol_area; in get_trampoline_vaddr()
1512 if (area) in get_trampoline_vaddr()
1513 trampoline_vaddr = area->vaddr; in get_trampoline_vaddr()