Lines Matching full:start

96          * The guest pc is already pointing to the start of the TB for which  in adjust_signal_pc()
165 static PageFlagsNode *pageflags_find(vaddr start, vaddr last) in pageflags_find() argument
169 n = interval_tree_iter_first(&pageflags_root, start, last); in pageflags_find()
173 static PageFlagsNode *pageflags_next(PageFlagsNode *p, vaddr start, vaddr last) in pageflags_next() argument
177 n = interval_tree_iter_next(&p->itree, start, last); in pageflags_next()
192 rc = fn(priv, n->start, n->last + 1, p->flags); in walk_memory_regions()
202 static int dump_region(void *opaque, vaddr start, vaddr end, int prot) in dump_region() argument
215 width, start & mask, in dump_region()
217 width, (end - start) & mask, in dump_region()
230 width, "start", width, "end", width, "size", "prot"); in page_dump()
256 /* A subroutine of page_set_flags: insert a new node for [start,last]. */
257 static void pageflags_create(vaddr start, vaddr last, int flags) in pageflags_create() argument
261 p->itree.start = start; in pageflags_create()
267 /* A subroutine of page_set_flags: remove everything in [start,last]. */
268 static bool pageflags_unset(vaddr start, vaddr last) in pageflags_unset() argument
273 PageFlagsNode *p = pageflags_find(start, last); in pageflags_unset()
287 if (p->itree.start < start) { in pageflags_unset()
289 p->itree.last = start - 1; in pageflags_unset()
299 /* Truncate the node from the start. */ in pageflags_unset()
300 p->itree.start = last + 1; in pageflags_unset()
310 * A subroutine of page_set_flags: nothing overlaps [start,last],
313 static void pageflags_create_merge(vaddr start, vaddr last, int flags) in pageflags_create_merge() argument
317 if (start > 0) { in pageflags_create_merge()
318 prev = pageflags_find(start - 1, start - 1); in pageflags_create_merge()
347 next->itree.start = start; in pageflags_create_merge()
350 pageflags_create(start, last, flags); in pageflags_create_merge()
363 /* A subroutine of page_set_flags: add flags to [start,last]. */
364 static bool pageflags_set_clear(vaddr start, vaddr last, in pageflags_set_clear() argument
373 p = pageflags_find(start, last); in pageflags_set_clear()
376 pageflags_create_merge(start, last, set_flags); in pageflags_set_clear()
381 p_start = p->itree.start; in pageflags_set_clear()
401 if (start == p_start && last == p_last) { in pageflags_set_clear()
416 if (p_start < start) { in pageflags_set_clear()
418 p->itree.last = start - 1; in pageflags_set_clear()
423 pageflags_create(start, last, merge_flags); in pageflags_set_clear()
428 pageflags_create(start, p_last, merge_flags); in pageflags_set_clear()
431 start = p_last + 1; in pageflags_set_clear()
436 if (start < p_start && set_flags) { in pageflags_set_clear()
437 pageflags_create(start, p_start - 1, set_flags); in pageflags_set_clear()
441 p->itree.start = last + 1; in pageflags_set_clear()
444 pageflags_create(start, last, merge_flags); in pageflags_set_clear()
454 start = p_last + 1; in pageflags_set_clear()
464 if (start < p_start) { in pageflags_set_clear()
466 p->itree.start = start; in pageflags_set_clear()
470 start = p_last + 1; in pageflags_set_clear()
478 if (p_start < start) { in pageflags_set_clear()
479 p->itree.last = start - 1; in pageflags_set_clear()
489 p->itree.start = last + 1; in pageflags_set_clear()
496 pageflags_create(start, last, set_flags); in pageflags_set_clear()
503 void page_set_flags(vaddr start, vaddr last, int flags) in page_set_flags() argument
511 assert(start <= last); in page_set_flags()
517 start &= TARGET_PAGE_MASK; in page_set_flags()
531 page_reset_target_data(start, last); in page_set_flags()
532 inval_tb |= pageflags_unset(start, last); in page_set_flags()
535 inval_tb |= pageflags_set_clear(start, last, flags, in page_set_flags()
539 tb_invalidate_phys_range(NULL, start, last); in page_set_flags()
543 bool page_check_range(vaddr start, vaddr len, int flags) in page_check_range() argument
553 last = start + len - 1; in page_check_range()
554 if (last < start) { in page_check_range()
560 PageFlagsNode *p = pageflags_find(start, last); in page_check_range()
571 p = pageflags_find(start, last); in page_check_range()
578 if (start < p->itree.start) { in page_check_range()
594 if (!page_unprotect(NULL, start, 0)) { in page_check_range()
599 if (last - start < TARGET_PAGE_SIZE) { in page_check_range()
603 start += TARGET_PAGE_SIZE; in page_check_range()
611 start = p->itree.last + 1; in page_check_range()
621 bool page_check_range_empty(vaddr start, vaddr last) in page_check_range_empty() argument
623 assert(last >= start); in page_check_range_empty()
625 return pageflags_find(start, last) == NULL; in page_check_range_empty()
671 vaddr start, last; in tb_lock_page0() local
678 start = address & TARGET_PAGE_MASK; in tb_lock_page0()
679 last = start + TARGET_PAGE_SIZE - 1; in tb_lock_page0()
681 start = address & -host_page_size; in tb_lock_page0()
682 last = start + host_page_size - 1; in tb_lock_page0()
685 p = pageflags_find(start, last); in tb_lock_page0()
694 while ((p = pageflags_next(p, start, last)) != NULL) { in tb_lock_page0()
700 pageflags_set_clear(start, last, 0, PAGE_WRITE); in tb_lock_page0()
701 mprotect(g2h_untagged(start), last - start + 1, in tb_lock_page0()
750 vaddr start, len, i; in page_unprotect() local
754 start = address & TARGET_PAGE_MASK; in page_unprotect()
757 pageflags_set_clear(start, start + len - 1, PAGE_WRITE, 0); in page_unprotect()
759 tb_invalidate_phys_page_unwind(cpu, start, pc); in page_unprotect()
761 start = address & -host_page_size; in page_unprotect()
766 vaddr addr = start + i; in page_unprotect()
788 mprotect((void *)g2h_untagged(start), len, prot & PAGE_RWX); in page_unprotect()
899 void page_reset_target_data(vaddr start, vaddr last) in page_reset_target_data() argument
910 start &= TARGET_PAGE_MASK; in page_reset_target_data()
913 for (n = interval_tree_iter_first(&targetdata_root, start, last), in page_reset_target_data()
914 next = n ? interval_tree_iter_next(n, start, last) : NULL; in page_reset_target_data()
917 next = next ? interval_tree_iter_next(n, start, last) : NULL) { in page_reset_target_data()
921 if (n->start >= start && n->last <= last) { in page_reset_target_data()
927 if (n->start < start) { in page_reset_target_data()
928 n_start = start; in page_reset_target_data()
929 p_ofs = (start - n->start) >> TARGET_PAGE_BITS; in page_reset_target_data()
931 n_start = n->start; in page_reset_target_data()
969 n->start = region; in page_get_target_data()