Lines Matching refs:last

148 static PageFlagsNode *pageflags_find(target_ulong start, target_ulong last)  in pageflags_find()  argument
152 n = interval_tree_iter_first(&pageflags_root, start, last); in pageflags_find()
157 target_ulong last) in pageflags_next() argument
161 n = interval_tree_iter_next(&p->itree, start, last); in pageflags_next()
176 rc = fn(priv, n->start, n->last + 1, p->flags); in walk_memory_regions()
232 static void pageflags_create(target_ulong start, target_ulong last, int flags) in pageflags_create() argument
237 p->itree.last = last; in pageflags_create()
243 static bool pageflags_unset(target_ulong start, target_ulong last) in pageflags_unset() argument
248 PageFlagsNode *p = pageflags_find(start, last); in pageflags_unset()
260 p_last = p->itree.last; in pageflags_unset()
264 p->itree.last = start - 1; in pageflags_unset()
266 if (last < p_last) { in pageflags_unset()
267 pageflags_create(last + 1, p_last, p->flags); in pageflags_unset()
270 } else if (p_last <= last) { in pageflags_unset()
275 p->itree.start = last + 1; in pageflags_unset()
288 static void pageflags_create_merge(target_ulong start, target_ulong last, in pageflags_create_merge() argument
303 if (last + 1 != 0) { in pageflags_create_merge()
304 next = pageflags_find(last + 1, last + 1); in pageflags_create_merge()
316 prev->itree.last = next->itree.last; in pageflags_create_merge()
319 prev->itree.last = last; in pageflags_create_merge()
326 pageflags_create(start, last, flags); in pageflags_create_merge()
340 static bool pageflags_set_clear(target_ulong start, target_ulong last, in pageflags_set_clear() argument
349 p = pageflags_find(start, last); in pageflags_set_clear()
352 pageflags_create_merge(start, last, set_flags); in pageflags_set_clear()
358 p_last = p->itree.last; in pageflags_set_clear()
377 if (start == p_start && last == p_last) { in pageflags_set_clear()
394 p->itree.last = start - 1; in pageflags_set_clear()
397 if (last < p_last) { in pageflags_set_clear()
399 pageflags_create(start, last, merge_flags); in pageflags_set_clear()
401 pageflags_create(last + 1, p_last, p_flags); in pageflags_set_clear()
406 if (p_last < last) { in pageflags_set_clear()
415 if (last < p_last) { in pageflags_set_clear()
417 p->itree.start = last + 1; in pageflags_set_clear()
420 pageflags_create(start, last, merge_flags); in pageflags_set_clear()
429 if (p_last < last) { in pageflags_set_clear()
445 if (p_last < last) { in pageflags_set_clear()
455 p->itree.last = start - 1; in pageflags_set_clear()
458 if (p_last < last) { in pageflags_set_clear()
461 if (last < p_last) { in pageflags_set_clear()
462 pageflags_create(last + 1, p_last, p_flags); in pageflags_set_clear()
464 } else if (last < p_last) { in pageflags_set_clear()
465 p->itree.start = last + 1; in pageflags_set_clear()
472 pageflags_create(start, last, set_flags); in pageflags_set_clear()
484 void page_set_flags(target_ulong start, target_ulong last, int flags) in page_set_flags() argument
492 assert(start <= last); in page_set_flags()
493 assert(last <= GUEST_ADDR_MAX); in page_set_flags()
499 last |= ~TARGET_PAGE_MASK; in page_set_flags()
512 page_reset_target_data(start, last); in page_set_flags()
513 inval_tb |= pageflags_unset(start, last); in page_set_flags()
516 inval_tb |= pageflags_set_clear(start, last, flags, in page_set_flags()
520 tb_invalidate_phys_range(start, last); in page_set_flags()
526 target_ulong last; in page_check_range() local
534 last = start + len - 1; in page_check_range()
535 if (last < start) { in page_check_range()
541 PageFlagsNode *p = pageflags_find(start, last); in page_check_range()
552 p = pageflags_find(start, last); in page_check_range()
580 if (last - start < TARGET_PAGE_SIZE) { in page_check_range()
588 if (last <= p->itree.last) { in page_check_range()
592 start = p->itree.last + 1; in page_check_range()
602 bool page_check_range_empty(target_ulong start, target_ulong last) in page_check_range_empty() argument
604 assert(last >= start); in page_check_range_empty()
606 return pageflags_find(start, last) == NULL; in page_check_range_empty()
641 if (max <= p->itree.last) { in page_find_range_empty()
646 min = p->itree.last + 1; in page_find_range_empty()
653 target_ulong start, last; in page_protect() local
660 last = start + TARGET_PAGE_SIZE - 1; in page_protect()
663 last = start + qemu_host_page_size - 1; in page_protect()
666 p = pageflags_find(start, last); in page_protect()
672 if (unlikely(p->itree.last < last)) { in page_protect()
675 while ((p = pageflags_next(p, start, last)) != NULL) { in page_protect()
681 pageflags_set_clear(start, last, 0, PAGE_WRITE); in page_protect()
870 void page_reset_target_data(target_ulong start, target_ulong last) in page_reset_target_data() argument
877 last |= ~TARGET_PAGE_MASK; in page_reset_target_data()
879 for (n = interval_tree_iter_first(&targetdata_root, start, last), in page_reset_target_data()
880 next = n ? interval_tree_iter_next(n, start, last) : NULL; in page_reset_target_data()
883 next = next ? interval_tree_iter_next(n, start, last) : NULL) { in page_reset_target_data()
887 if (n->start >= start && n->last <= last) { in page_reset_target_data()
900 n_last = MIN(last, n->last); in page_reset_target_data()
930 n->last = region | ~TBD_MASK; in page_get_target_data()
940 void page_reset_target_data(target_ulong start, target_ulong last) { } in page_reset_target_data() argument