Lines Matching +full:value +full:- +full:start

10  * the COPYING file in the top-level directory.
12 * Contributions after 2012-01-13 are licensed under the terms of the
22 #include "qemu/error-report.h"
23 #include "qemu/main-loop.h"
24 #include "qemu/qemu-print.h"
34 #include "system/address-spaces.h"
36 #include "memory-internal.h"
60 Int128 start; member
64 static AddrRange addrrange_make(Int128 start, Int128 size) in addrrange_make() argument
66 return (AddrRange) { start, size }; in addrrange_make()
71 return int128_eq(r1.start, r2.start) && int128_eq(r1.size, r2.size); in addrrange_equal()
76 return int128_add(r.start, r.size); in addrrange_end()
81 int128_addto(&range.start, delta); in addrrange_shift()
87 return int128_ge(addr, range.start) in addrrange_contains()
93 return addrrange_contains(r1, r2.start) in addrrange_intersects()
94 || addrrange_contains(r2, r1.start); in addrrange_intersects()
99 Int128 start = int128_max(r1.start, r2.start); in addrrange_intersection() local
101 return addrrange_make(start, int128_sub(end, start)); in addrrange_intersection()
113 if (_listener->_callback) { \
114 _listener->_callback(_listener, ##_args); \
120 if (_listener->_callback) { \
121 _listener->_callback(_listener, ##_args); \
136 QTAILQ_FOREACH(_listener, &(_as)->listeners, link_as) { \
137 if (_listener->_callback) { \
138 _listener->_callback(_listener, _section, ##_args); \
143 QTAILQ_FOREACH_REVERSE(_listener, &(_as)->listeners, link_as) { \
144 if (_listener->_callback) { \
145 _listener->_callback(_listener, _section, ##_args); \
177 if (int128_lt(a->addr.start, b->addr.start)) { in memory_region_ioeventfd_before()
179 } else if (int128_gt(a->addr.start, b->addr.start)) { in memory_region_ioeventfd_before()
181 } else if (int128_lt(a->addr.size, b->addr.size)) { in memory_region_ioeventfd_before()
183 } else if (int128_gt(a->addr.size, b->addr.size)) { in memory_region_ioeventfd_before()
185 } else if (a->match_data < b->match_data) { in memory_region_ioeventfd_before()
187 } else if (a->match_data > b->match_data) { in memory_region_ioeventfd_before()
189 } else if (a->match_data) { in memory_region_ioeventfd_before()
190 if (a->data < b->data) { in memory_region_ioeventfd_before()
192 } else if (a->data > b->data) { in memory_region_ioeventfd_before()
196 if (a->e < b->e) { in memory_region_ioeventfd_before()
198 } else if (a->e > b->e) { in memory_region_ioeventfd_before()
207 if (int128_eq(a->addr.start, b->addr.start) && in memory_region_ioeventfd_equal()
208 (!int128_nz(a->addr.size) || !int128_nz(b->addr.size) || in memory_region_ioeventfd_equal()
209 (int128_eq(a->addr.size, b->addr.size) && in memory_region_ioeventfd_equal()
210 (a->match_data == b->match_data) && in memory_region_ioeventfd_equal()
211 ((a->match_data && (a->data == b->data)) || !a->match_data) && in memory_region_ioeventfd_equal()
212 (a->e == b->e)))) in memory_region_ioeventfd_equal()
231 for (var = (view)->ranges; var < (view)->ranges + (view)->nr; ++var)
237 .mr = fr->mr, in section_from_flat_range()
239 .offset_within_region = fr->offset_in_region, in section_from_flat_range()
240 .size = fr->addr.size, in section_from_flat_range()
241 .offset_within_address_space = int128_get64(fr->addr.start), in section_from_flat_range()
242 .readonly = fr->readonly, in section_from_flat_range()
243 .nonvolatile = fr->nonvolatile, in section_from_flat_range()
244 .unmergeable = fr->unmergeable, in section_from_flat_range()
250 return a->mr == b->mr in flatrange_equal()
251 && addrrange_equal(a->addr, b->addr) in flatrange_equal()
252 && a->offset_in_region == b->offset_in_region in flatrange_equal()
253 && a->romd_mode == b->romd_mode in flatrange_equal()
254 && a->readonly == b->readonly in flatrange_equal()
255 && a->nonvolatile == b->nonvolatile in flatrange_equal()
256 && a->unmergeable == b->unmergeable; in flatrange_equal()
264 view->ref = 1; in flatview_new()
265 view->root = mr_root; in flatview_new()
277 if (view->nr == view->nr_allocated) { in flatview_insert()
278 view->nr_allocated = MAX(2 * view->nr, 10); in flatview_insert()
279 view->ranges = g_realloc(view->ranges, in flatview_insert()
280 view->nr_allocated * sizeof(*view->ranges)); in flatview_insert()
282 memmove(view->ranges + pos + 1, view->ranges + pos, in flatview_insert()
283 (view->nr - pos) * sizeof(FlatRange)); in flatview_insert()
284 view->ranges[pos] = *range; in flatview_insert()
285 memory_region_ref(range->mr); in flatview_insert()
286 ++view->nr; in flatview_insert()
293 trace_flatview_destroy(view, view->root); in flatview_destroy()
294 if (view->dispatch) { in flatview_destroy()
295 address_space_dispatch_free(view->dispatch); in flatview_destroy()
297 for (i = 0; i < view->nr; i++) { in flatview_destroy()
298 memory_region_unref(view->ranges[i].mr); in flatview_destroy()
300 g_free(view->ranges); in flatview_destroy()
301 memory_region_unref(view->root); in flatview_destroy()
307 return qatomic_fetch_inc_nonzero(&view->ref) > 0; in flatview_ref()
312 if (qatomic_fetch_dec(&view->ref) == 1) { in flatview_unref()
313 trace_flatview_destroy_rcu(view, view->root); in flatview_unref()
314 assert(view->root); in flatview_unref()
321 return int128_eq(addrrange_end(r1->addr), r2->addr.start) in can_merge()
322 && r1->mr == r2->mr in can_merge()
323 && int128_eq(int128_add(int128_make64(r1->offset_in_region), in can_merge()
324 r1->addr.size), in can_merge()
325 int128_make64(r2->offset_in_region)) in can_merge()
326 && r1->dirty_log_mask == r2->dirty_log_mask in can_merge()
327 && r1->romd_mode == r2->romd_mode in can_merge()
328 && r1->readonly == r2->readonly in can_merge()
329 && r1->nonvolatile == r2->nonvolatile in can_merge()
330 && !r1->unmergeable && !r2->unmergeable; in can_merge()
339 while (i < view->nr) { in flatview_simplify()
341 while (j < view->nr in flatview_simplify()
342 && can_merge(&view->ranges[j-1], &view->ranges[j])) { in flatview_simplify()
343 int128_addto(&view->ranges[i].addr.size, view->ranges[j].addr.size); in flatview_simplify()
348 memory_region_unref(view->ranges[k].mr); in flatview_simplify()
350 memmove(&view->ranges[i], &view->ranges[j], in flatview_simplify()
351 (view->nr - j) * sizeof(view->ranges[j])); in flatview_simplify()
352 view->nr -= j - i; in flatview_simplify()
358 if ((op & MO_BSWAP) != devend_memop(mr->ops->endianness)) { in adjust_endianness()
377 static inline void memory_region_shift_read_access(uint64_t *value, in memory_region_shift_read_access() argument
383 *value |= (tmp & mask) << shift; in memory_region_shift_read_access()
385 *value |= (tmp & mask) >> -shift; in memory_region_shift_read_access()
389 static inline uint64_t memory_region_shift_write_access(uint64_t *value, in memory_region_shift_write_access() argument
396 tmp = (*value >> shift) & mask; in memory_region_shift_write_access()
398 tmp = (*value << -shift) & mask; in memory_region_shift_write_access()
409 abs_addr += mr->addr; in memory_region_to_absolute_addr()
410 for (root = mr; root->container; ) { in memory_region_to_absolute_addr()
411 root = root->container; in memory_region_to_absolute_addr()
412 abs_addr += root->addr; in memory_region_to_absolute_addr()
421 return current_cpu->cpu_index; in get_cpu_index()
423 return -1; in get_cpu_index()
428 uint64_t *value, in memory_region_read_accessor() argument
436 tmp = mr->ops->read(mr->opaque, addr, size); in memory_region_read_accessor()
437 if (mr->subpage) { in memory_region_read_accessor()
444 memory_region_shift_read_access(value, shift, mask, tmp); in memory_region_read_accessor()
450 uint64_t *value, in memory_region_read_with_attrs_accessor() argument
459 r = mr->ops->read_with_attrs(mr->opaque, addr, &tmp, size, attrs); in memory_region_read_with_attrs_accessor()
460 if (mr->subpage) { in memory_region_read_with_attrs_accessor()
467 memory_region_shift_read_access(value, shift, mask, tmp); in memory_region_read_with_attrs_accessor()
473 uint64_t *value, in memory_region_write_accessor() argument
479 uint64_t tmp = memory_region_shift_write_access(value, shift, mask); in memory_region_write_accessor()
481 if (mr->subpage) { in memory_region_write_accessor()
488 mr->ops->write(mr->opaque, addr, tmp, size); in memory_region_write_accessor()
494 uint64_t *value, in memory_region_write_with_attrs_accessor() argument
500 uint64_t tmp = memory_region_shift_write_access(value, shift, mask); in memory_region_write_with_attrs_accessor()
502 if (mr->subpage) { in memory_region_write_with_attrs_accessor()
509 return mr->ops->write_with_attrs(mr->opaque, addr, tmp, size, attrs); in memory_region_write_with_attrs_accessor()
513 uint64_t *value, in access_with_adjusted_size() argument
520 uint64_t *value, in access_with_adjusted_size()
542 if (mr->dev && !mr->disable_reentrancy_guard && in access_with_adjusted_size()
543 !mr->ram_device && !mr->ram && !mr->rom_device && !mr->readonly) { in access_with_adjusted_size()
544 if (mr->dev->mem_reentrancy_guard.engaged_in_io) { in access_with_adjusted_size()
545 warn_report_once("Blocked re-entrant IO on MemoryRegion: " in access_with_adjusted_size()
550 mr->dev->mem_reentrancy_guard.engaged_in_io = true; in access_with_adjusted_size()
557 if (devend_big_endian(mr->ops->endianness)) { in access_with_adjusted_size()
559 r |= access_fn(mr, addr + i, value, access_size, in access_with_adjusted_size()
560 (size - access_size - i) * 8, access_mask, attrs); in access_with_adjusted_size()
564 r |= access_fn(mr, addr + i, value, access_size, i * 8, in access_with_adjusted_size()
568 if (mr->dev && reentrancy_guard_applied) { in access_with_adjusted_size()
569 mr->dev->mem_reentrancy_guard.engaged_in_io = false; in access_with_adjusted_size()
578 while (mr->container) { in memory_region_to_address_space()
579 mr = mr->container; in memory_region_to_address_space()
582 if (mr == as->root) { in memory_region_to_address_space()
608 if (!mr->enabled) { in render_memory_region()
612 int128_addto(&base, int128_make64(mr->addr)); in render_memory_region()
613 readonly |= mr->readonly; in render_memory_region()
614 nonvolatile |= mr->nonvolatile; in render_memory_region()
615 unmergeable |= mr->unmergeable; in render_memory_region()
617 tmp = addrrange_make(base, mr->size); in render_memory_region()
625 if (mr->alias) { in render_memory_region()
626 int128_subfrom(&base, int128_make64(mr->alias->addr)); in render_memory_region()
627 int128_subfrom(&base, int128_make64(mr->alias_offset)); in render_memory_region()
628 render_memory_region(view, mr->alias, base, clip, in render_memory_region()
634 QTAILQ_FOREACH(subregion, &mr->subregions, subregions_link) { in render_memory_region()
639 if (!mr->terminates) { in render_memory_region()
643 offset_in_region = int128_get64(int128_sub(clip.start, base)); in render_memory_region()
644 base = clip.start; in render_memory_region()
649 fr.romd_mode = mr->romd_mode; in render_memory_region()
655 for (i = 0; i < view->nr && int128_nz(remain); ++i) { in render_memory_region()
656 if (int128_ge(base, addrrange_end(view->ranges[i].addr))) { in render_memory_region()
659 if (int128_lt(base, view->ranges[i].addr.start)) { in render_memory_region()
661 int128_sub(view->ranges[i].addr.start, base)); in render_memory_region()
671 addrrange_end(view->ranges[i].addr)), in render_memory_region()
692 if (cb(fr->addr.start, fr->addr.size, fr->mr, in flatview_for_each_range()
693 fr->offset_in_region, opaque)) { in flatview_for_each_range()
701 while (mr->enabled) { in memory_region_get_flatview_root()
702 if (mr->alias) { in memory_region_get_flatview_root()
703 if (!mr->alias_offset && int128_ge(mr->size, mr->alias->size)) { in memory_region_get_flatview_root()
707 mr = mr->alias; in memory_region_get_flatview_root()
710 } else if (!mr->terminates) { in memory_region_get_flatview_root()
713 QTAILQ_FOREACH(child, &mr->subregions, subregions_link) { in memory_region_get_flatview_root()
714 if (child->enabled) { in memory_region_get_flatview_root()
719 if (!child->addr && int128_ge(mr->size, child->size)) { in memory_region_get_flatview_root()
758 view->dispatch = address_space_dispatch_new(view); in generate_memory_topology()
759 for (i = 0; i < view->nr; i++) { in generate_memory_topology()
761 section_from_flat_range(&view->ranges[i], view); in generate_memory_topology()
764 address_space_dispatch_compact(view->dispatch); in generate_memory_topology()
793 .offset_within_address_space = int128_get64(fd->addr.start), in address_space_add_del_ioeventfds()
794 .size = fd->addr.size, in address_space_add_del_ioeventfds()
797 fd->match_data, fd->data, fd->e); in address_space_add_del_ioeventfds()
806 .offset_within_address_space = int128_get64(fd->addr.start), in address_space_add_del_ioeventfds()
807 .size = fd->addr.size, in address_space_add_del_ioeventfds()
810 fd->match_data, fd->data, fd->e); in address_space_add_del_ioeventfds()
826 /* If somebody has replaced as->current_map concurrently, in address_space_get_flatview()
843 if (!as->ioeventfd_notifiers) { in address_space_update_ioeventfds()
849 * the previous size as the starting value, with some headroom to avoid in address_space_update_ioeventfds()
852 ioeventfd_max = QEMU_ALIGN_UP(as->ioeventfd_nb, 4); in address_space_update_ioeventfds()
857 for (i = 0; i < fr->mr->ioeventfd_nb; ++i) { in address_space_update_ioeventfds()
858 tmp = addrrange_shift(fr->mr->ioeventfds[i].addr, in address_space_update_ioeventfds()
859 int128_sub(fr->addr.start, in address_space_update_ioeventfds()
860 int128_make64(fr->offset_in_region))); in address_space_update_ioeventfds()
861 if (addrrange_intersects(fr->addr, tmp)) { in address_space_update_ioeventfds()
868 ioeventfds[ioeventfd_nb-1] = fr->mr->ioeventfds[i]; in address_space_update_ioeventfds()
869 ioeventfds[ioeventfd_nb-1].addr = tmp; in address_space_update_ioeventfds()
875 as->ioeventfds, as->ioeventfd_nb); in address_space_update_ioeventfds()
877 g_free(as->ioeventfds); in address_space_update_ioeventfds()
878 as->ioeventfds = ioeventfds; in address_space_update_ioeventfds()
879 as->ioeventfd_nb = ioeventfd_nb; in address_space_update_ioeventfds()
893 tmp = addrrange_shift(cmr->addr, in flat_range_coalesced_io_notify()
894 int128_sub(fr->addr.start, in flat_range_coalesced_io_notify()
895 int128_make64(fr->offset_in_region))); in flat_range_coalesced_io_notify()
896 if (!addrrange_intersects(tmp, fr->addr)) { in flat_range_coalesced_io_notify()
899 tmp = addrrange_intersection(tmp, fr->addr); in flat_range_coalesced_io_notify()
903 int128_get64(tmp.start), in flat_range_coalesced_io_notify()
907 int128_get64(tmp.start), in flat_range_coalesced_io_notify()
916 QTAILQ_FOREACH(cmr, &fr->mr->coalesced, link) { in flat_range_coalesced_io_del()
923 MemoryRegion *mr = fr->mr; in flat_range_coalesced_io_add()
926 if (QTAILQ_EMPTY(&mr->coalesced)) { in flat_range_coalesced_io_add()
930 QTAILQ_FOREACH(cmr, &mr->coalesced, link) { in flat_range_coalesced_io_add()
942 MemoryRegion *mr = fr->mr; in flat_range_coalesced_io_notify_listener_add_del()
945 QTAILQ_FOREACH(cmr, &mr->coalesced, link) { in flat_range_coalesced_io_notify_listener_add_del()
946 tmp = addrrange_shift(cmr->addr, in flat_range_coalesced_io_notify_listener_add_del()
947 int128_sub(fr->addr.start, in flat_range_coalesced_io_notify_listener_add_del()
948 int128_make64(fr->offset_in_region))); in flat_range_coalesced_io_notify_listener_add_del()
950 if (!addrrange_intersects(tmp, fr->addr)) { in flat_range_coalesced_io_notify_listener_add_del()
953 tmp = addrrange_intersection(tmp, fr->addr); in flat_range_coalesced_io_notify_listener_add_del()
955 if (add && listener->coalesced_io_add) { in flat_range_coalesced_io_notify_listener_add_del()
956 listener->coalesced_io_add(listener, mrs, in flat_range_coalesced_io_notify_listener_add_del()
957 int128_get64(tmp.start), in flat_range_coalesced_io_notify_listener_add_del()
959 } else if (!add && listener->coalesced_io_del) { in flat_range_coalesced_io_notify_listener_add_del()
960 listener->coalesced_io_del(listener, mrs, in flat_range_coalesced_io_notify_listener_add_del()
961 int128_get64(tmp.start), in flat_range_coalesced_io_notify_listener_add_del()
979 while (iold < old_view->nr || inew < new_view->nr) { in address_space_update_topology_pass()
980 if (iold < old_view->nr) { in address_space_update_topology_pass()
981 frold = &old_view->ranges[iold]; in address_space_update_topology_pass()
985 if (inew < new_view->nr) { in address_space_update_topology_pass()
986 frnew = &new_view->ranges[inew]; in address_space_update_topology_pass()
993 || int128_lt(frold->addr.start, frnew->addr.start) in address_space_update_topology_pass()
994 || (int128_eq(frold->addr.start, frnew->addr.start) in address_space_update_topology_pass()
1009 if (frnew->dirty_log_mask & ~frold->dirty_log_mask) { in address_space_update_topology_pass()
1011 frold->dirty_log_mask, in address_space_update_topology_pass()
1012 frnew->dirty_log_mask); in address_space_update_topology_pass()
1014 if (frold->dirty_log_mask & ~frnew->dirty_log_mask) { in address_space_update_topology_pass()
1016 frold->dirty_log_mask, in address_space_update_topology_pass()
1017 frnew->dirty_log_mask); in address_space_update_topology_pass()
1068 MemoryRegion *physmr = memory_region_get_flatview_root(as->root); in flatviews_reset()
1081 MemoryRegion *physmr = memory_region_get_flatview_root(as->root); in address_space_set_flatview()
1096 if (!QTAILQ_EMPTY(&as->listeners)) { in address_space_set_flatview()
1107 qatomic_rcu_set(&as->current_map, new_view); in address_space_set_flatview()
1114 * ref/unref the MemoryRegions they get---unless they use them in address_space_set_flatview()
1125 MemoryRegion *physmr = memory_region_get_flatview_root(as->root); in address_space_update_topology()
1147 --memory_region_transaction_depth; in memory_region_transaction_commit()
1176 qemu_ram_free(mr->ram_block); in memory_region_destructor_ram()
1194 if (bytes == p - name) { in memory_region_escape_name()
1218 mr->size = int128_make64(size); in memory_region_do_init()
1220 mr->size = int128_2_64(); in memory_region_do_init()
1222 mr->name = g_strdup(name); in memory_region_do_init()
1223 mr->owner = owner; in memory_region_do_init()
1224 mr->dev = (DeviceState *) object_dynamic_cast(mr->owner, TYPE_DEVICE); in memory_region_do_init()
1225 mr->ram_block = NULL; in memory_region_do_init()
1258 if (mr->container) { in memory_region_get_container()
1259 path = object_get_canonical_path(OBJECT(mr->container)); in memory_region_get_container()
1262 if (mr->container) { in memory_region_get_container()
1272 return OBJECT(mr->container); in memory_region_resolve_container()
1280 int32_t value = mr->priority; in memory_region_get_priority() local
1282 visit_type_int32(v, name, &value, errp); in memory_region_get_priority()
1289 uint64_t value = memory_region_size(mr); in memory_region_get_size() local
1291 visit_type_uint64(v, name, &value, errp); in memory_region_get_size()
1299 mr->ops = &unassigned_mem_ops; in memory_region_initfn()
1300 mr->enabled = true; in memory_region_initfn()
1301 mr->romd_mode = true; in memory_region_initfn()
1302 mr->destructor = memory_region_destructor_none; in memory_region_initfn()
1303 QTAILQ_INIT(&mr->subregions); in memory_region_initfn()
1304 QTAILQ_INIT(&mr->coalesced); in memory_region_initfn()
1311 op->resolve = memory_region_resolve_container; in memory_region_initfn()
1314 &mr->addr, OBJ_PROP_FLAG_READ); in memory_region_initfn()
1329 mr->is_iommu = true; in iommu_memory_region_initfn()
1365 uint64_t data = ldn_he_p(mr->ram_block->host + addr, size); in memory_region_ram_device_read()
1379 stn_he_p(mr->ram_block->host + addr, size, data); in memory_region_ram_device_write()
1404 if (mr->ops->valid.accepts in memory_region_access_valid()
1405 && !mr->ops->valid.accepts(mr->opaque, addr, size, is_write, attrs)) { in memory_region_access_valid()
1413 if (!mr->ops->valid.unaligned && (addr & (size - 1))) { in memory_region_access_valid()
1422 if (!mr->ops->valid.max_access_size) { in memory_region_access_valid()
1426 if (size > mr->ops->valid.max_access_size in memory_region_access_valid()
1427 || size < mr->ops->valid.min_access_size) { in memory_region_access_valid()
1433 mr->ops->valid.min_access_size, in memory_region_access_valid()
1434 mr->ops->valid.max_access_size); in memory_region_access_valid()
1448 if (mr->ops->read) { in memory_region_dispatch_read1()
1450 mr->ops->impl.min_access_size, in memory_region_dispatch_read1()
1451 mr->ops->impl.max_access_size, in memory_region_dispatch_read1()
1456 mr->ops->impl.min_access_size, in memory_region_dispatch_read1()
1457 mr->ops->impl.max_access_size, in memory_region_dispatch_read1()
1472 if (mr->alias) { in memory_region_dispatch_read()
1473 return memory_region_dispatch_read(mr->alias, in memory_region_dispatch_read()
1474 mr->alias_offset + addr, in memory_region_dispatch_read()
1500 for (i = 0; i < mr->ioeventfd_nb; i++) { in memory_region_dispatch_write_eventfds()
1501 ioeventfd.match_data = mr->ioeventfds[i].match_data; in memory_region_dispatch_write_eventfds()
1502 ioeventfd.e = mr->ioeventfds[i].e; in memory_region_dispatch_write_eventfds()
1504 if (memory_region_ioeventfd_equal(&ioeventfd, &mr->ioeventfds[i])) { in memory_region_dispatch_write_eventfds()
1521 if (mr->alias) { in memory_region_dispatch_write()
1522 return memory_region_dispatch_write(mr->alias, in memory_region_dispatch_write()
1523 mr->alias_offset + addr, in memory_region_dispatch_write()
1543 if (mr->ops->write) { in memory_region_dispatch_write()
1545 mr->ops->impl.min_access_size, in memory_region_dispatch_write()
1546 mr->ops->impl.max_access_size, in memory_region_dispatch_write()
1552 mr->ops->impl.min_access_size, in memory_region_dispatch_write()
1553 mr->ops->impl.max_access_size, in memory_region_dispatch_write()
1567 mr->ops = ops ? ops : &unassigned_mem_ops; in memory_region_init_io()
1568 mr->opaque = opaque; in memory_region_init_io()
1569 mr->terminates = true; in memory_region_init_io()
1591 mr->ram = true; in memory_region_init_ram_flags_nomigrate()
1592 mr->terminates = true; in memory_region_init_ram_flags_nomigrate()
1593 mr->destructor = memory_region_destructor_ram; in memory_region_init_ram_flags_nomigrate()
1594 mr->ram_block = qemu_ram_alloc(size, ram_flags, mr, &err); in memory_region_init_ram_flags_nomigrate()
1596 mr->size = int128_zero(); in memory_region_init_ram_flags_nomigrate()
1616 mr->ram = true; in memory_region_init_resizeable_ram()
1617 mr->terminates = true; in memory_region_init_resizeable_ram()
1618 mr->destructor = memory_region_destructor_ram; in memory_region_init_resizeable_ram()
1619 mr->ram_block = qemu_ram_alloc_resizeable(size, max_size, resized, in memory_region_init_resizeable_ram()
1622 mr->size = int128_zero(); in memory_region_init_resizeable_ram()
1643 mr->ram = true; in memory_region_init_ram_from_file()
1644 mr->readonly = !!(ram_flags & RAM_READONLY); in memory_region_init_ram_from_file()
1645 mr->terminates = true; in memory_region_init_ram_from_file()
1646 mr->destructor = memory_region_destructor_ram; in memory_region_init_ram_from_file()
1647 mr->align = align; in memory_region_init_ram_from_file()
1648 mr->ram_block = qemu_ram_alloc_from_file(size, mr, ram_flags, path, in memory_region_init_ram_from_file()
1651 mr->size = int128_zero(); in memory_region_init_ram_from_file()
1670 mr->ram = true; in memory_region_init_ram_from_fd()
1671 mr->readonly = !!(ram_flags & RAM_READONLY); in memory_region_init_ram_from_fd()
1672 mr->terminates = true; in memory_region_init_ram_from_fd()
1673 mr->destructor = memory_region_destructor_ram; in memory_region_init_ram_from_fd()
1674 mr->ram_block = qemu_ram_alloc_from_fd(size, size, NULL, mr, ram_flags, fd, in memory_region_init_ram_from_fd()
1677 mr->size = int128_zero(); in memory_region_init_ram_from_fd()
1693 mr->ram = true; in memory_region_init_ram_ptr()
1694 mr->terminates = true; in memory_region_init_ram_ptr()
1695 mr->destructor = memory_region_destructor_ram; in memory_region_init_ram_ptr()
1699 mr->ram_block = qemu_ram_alloc_from_ptr(size, ptr, mr, &error_abort); in memory_region_init_ram_ptr()
1709 mr->ram = true; in memory_region_init_ram_device_ptr()
1710 mr->terminates = true; in memory_region_init_ram_device_ptr()
1711 mr->ram_device = true; in memory_region_init_ram_device_ptr()
1712 mr->ops = &ram_device_mem_ops; in memory_region_init_ram_device_ptr()
1713 mr->opaque = mr; in memory_region_init_ram_device_ptr()
1714 mr->destructor = memory_region_destructor_ram; in memory_region_init_ram_device_ptr()
1718 mr->ram_block = qemu_ram_alloc_from_ptr(size, ptr, mr, &error_abort); in memory_region_init_ram_device_ptr()
1729 mr->alias = orig; in memory_region_init_alias()
1730 mr->alias_offset = offset; in memory_region_init_alias()
1743 mr->readonly = true; in memory_region_init_rom_nomigrate()
1759 mr->ops = ops; in memory_region_init_rom_device_nomigrate()
1760 mr->opaque = opaque; in memory_region_init_rom_device_nomigrate()
1761 mr->terminates = true; in memory_region_init_rom_device_nomigrate()
1762 mr->rom_device = true; in memory_region_init_rom_device_nomigrate()
1763 mr->destructor = memory_region_destructor_ram; in memory_region_init_rom_device_nomigrate()
1764 mr->ram_block = qemu_ram_alloc(size, 0, mr, &err); in memory_region_init_rom_device_nomigrate()
1766 mr->size = int128_zero(); in memory_region_init_rom_device_nomigrate()
1788 mr->terminates = true; /* then re-forwards */ in memory_region_init_iommu()
1789 QLIST_INIT(&iommu_mr->iommu_notify); in memory_region_init_iommu()
1790 iommu_mr->iommu_notify_flags = IOMMU_NOTIFIER_NONE; in memory_region_init_iommu()
1797 assert(!mr->container); in memory_region_finalize()
1801 * it has no references, so we can blindly clear mr->enabled. in memory_region_finalize()
1805 mr->enabled = false; in memory_region_finalize()
1807 while (!QTAILQ_EMPTY(&mr->subregions)) { in memory_region_finalize()
1808 MemoryRegion *subregion = QTAILQ_FIRST(&mr->subregions); in memory_region_finalize()
1813 mr->destructor(mr); in memory_region_finalize()
1815 g_free((char *)mr->name); in memory_region_finalize()
1816 g_free(mr->ioeventfds); in memory_region_finalize()
1822 return obj->parent; in memory_region_owner()
1833 * ref-ing the owner will also keep the memory region alive. in memory_region_ref()
1837 if (mr && mr->owner) { in memory_region_ref()
1838 object_ref(mr->owner); in memory_region_ref()
1844 if (mr && mr->owner) { in memory_region_unref()
1845 object_unref(mr->owner); in memory_region_unref()
1851 if (int128_eq(mr->size, int128_2_64())) { in memory_region_size()
1854 return int128_get64(mr->size); in memory_region_size()
1859 if (!mr->name) { in memory_region_name()
1860 ((MemoryRegion *)mr)->name = in memory_region_name()
1863 return mr->name; in memory_region_name()
1868 return mr->ram_device; in memory_region_is_ram_device()
1873 return mr->ram && (mr->ram_block->flags & RAM_PROTECTED); in memory_region_is_protected()
1878 return mr->ram_block && mr->ram_block->guest_memfd >= 0; in memory_region_has_guest_memfd()
1883 uint8_t mask = mr->dirty_log_mask; in memory_region_get_dirty_log_mask()
1884 RAMBlock *rb = mr->ram_block; in memory_region_get_dirty_log_mask()
1912 flags |= iommu_notifier->notifier_flags; in memory_region_update_iommu_notify_flags()
1915 if (flags != iommu_mr->iommu_notify_flags && imrc->notify_flag_changed) { in memory_region_update_iommu_notify_flags()
1916 ret = imrc->notify_flag_changed(iommu_mr, in memory_region_update_iommu_notify_flags()
1917 iommu_mr->iommu_notify_flags, in memory_region_update_iommu_notify_flags()
1922 iommu_mr->iommu_notify_flags = flags; in memory_region_update_iommu_notify_flags()
1933 if (mr->alias) { in memory_region_register_iommu_notifier()
1934 return memory_region_register_iommu_notifier(mr->alias, n, errp); in memory_region_register_iommu_notifier()
1939 assert(n->notifier_flags != IOMMU_NOTIFIER_NONE); in memory_region_register_iommu_notifier()
1940 assert(n->start <= n->end); in memory_region_register_iommu_notifier()
1941 assert(n->iommu_idx >= 0 && in memory_region_register_iommu_notifier()
1942 n->iommu_idx < memory_region_iommu_num_indexes(iommu_mr)); in memory_region_register_iommu_notifier()
1944 QLIST_INSERT_HEAD(&iommu_mr->iommu_notify, n, node); in memory_region_register_iommu_notifier()
1956 if (imrc->get_min_page_size) { in memory_region_iommu_get_min_page_size()
1957 return imrc->get_min_page_size(iommu_mr); in memory_region_iommu_get_min_page_size()
1970 if (imrc->replay) { in memory_region_iommu_replay()
1971 imrc->replay(iommu_mr, n); in memory_region_iommu_replay()
1978 iotlb = imrc->translate(iommu_mr, addr, IOMMU_NONE, n->iommu_idx); in memory_region_iommu_replay()
1980 n->notify(n, &iotlb); in memory_region_iommu_replay()
1983 /* if (2^64 - MR size) < granularity, it's possible to get an in memory_region_iommu_replay()
1996 if (mr->alias) { in memory_region_unregister_iommu_notifier()
1997 memory_region_unregister_iommu_notifier(mr->alias, n); in memory_region_unregister_iommu_notifier()
2008 const IOMMUTLBEntry *entry = &event->entry; in memory_region_notify_iommu_one()
2009 hwaddr entry_end = entry->iova + entry->addr_mask; in memory_region_notify_iommu_one()
2012 if (event->type == IOMMU_NOTIFIER_UNMAP) { in memory_region_notify_iommu_one()
2013 assert(entry->perm == IOMMU_NONE); in memory_region_notify_iommu_one()
2020 if (notifier->start > entry_end || notifier->end < entry->iova) { in memory_region_notify_iommu_one()
2024 if (notifier->notifier_flags & IOMMU_NOTIFIER_DEVIOTLB_UNMAP) { in memory_region_notify_iommu_one()
2026 tmp.iova = MAX(tmp.iova, notifier->start); in memory_region_notify_iommu_one()
2027 tmp.addr_mask = MIN(entry_end, notifier->end) - tmp.iova; in memory_region_notify_iommu_one()
2029 assert(entry->iova >= notifier->start && entry_end <= notifier->end); in memory_region_notify_iommu_one()
2032 if (event->type & notifier->notifier_flags) { in memory_region_notify_iommu_one()
2033 notifier->notify(notifier, &tmp); in memory_region_notify_iommu_one()
2043 event.entry.iova = notifier->start; in memory_region_unmap_iommu_notifier_range()
2045 event.entry.addr_mask = notifier->end - notifier->start; in memory_region_unmap_iommu_notifier_range()
2059 if (iommu_notifier->iommu_idx == iommu_idx) { in memory_region_notify_iommu()
2071 if (!imrc->get_attr) { in memory_region_iommu_get_attr()
2072 return -EINVAL; in memory_region_iommu_get_attr()
2075 return imrc->get_attr(iommu_mr, attr, data); in memory_region_iommu_get_attr()
2083 if (!imrc->attrs_to_index) { in memory_region_iommu_attrs_to_index()
2087 return imrc->attrs_to_index(iommu_mr, attrs); in memory_region_iommu_attrs_to_index()
2094 if (!imrc->num_indexes) { in memory_region_iommu_num_indexes()
2098 return imrc->num_indexes(iommu_mr); in memory_region_iommu_num_indexes()
2106 return mr->rdm; in memory_region_get_ram_discard_manager()
2113 g_assert(!rdm || !mr->rdm); in memory_region_set_ram_discard_manager()
2114 mr->rdm = rdm; in memory_region_set_ram_discard_manager()
2122 g_assert(rdmc->get_min_granularity); in ram_discard_manager_get_min_granularity()
2123 return rdmc->get_min_granularity(rdm, mr); in ram_discard_manager_get_min_granularity()
2131 g_assert(rdmc->is_populated); in ram_discard_manager_is_populated()
2132 return rdmc->is_populated(rdm, section); in ram_discard_manager_is_populated()
2142 g_assert(rdmc->replay_populated); in ram_discard_manager_replay_populated()
2143 return rdmc->replay_populated(rdm, section, replay_fn, opaque); in ram_discard_manager_replay_populated()
2153 g_assert(rdmc->replay_discarded); in ram_discard_manager_replay_discarded()
2154 rdmc->replay_discarded(rdm, section, replay_fn, opaque); in ram_discard_manager_replay_discarded()
2163 g_assert(rdmc->register_listener); in ram_discard_manager_register_listener()
2164 rdmc->register_listener(rdm, rdl, section); in ram_discard_manager_register_listener()
2172 g_assert(rdmc->unregister_listener); in ram_discard_manager_unregister_listener()
2173 rdmc->unregister_listener(rdm, rdl); in ram_discard_manager_unregister_listener()
2182 hwaddr len = iotlb->addr_mask + 1; in memory_translate_iotlb()
2183 bool writable = iotlb->perm & IOMMU_WO; in memory_translate_iotlb()
2190 mr = address_space_translate(&address_space_memory, iotlb->translated_addr, in memory_translate_iotlb()
2210 " via virtio-mem): %" HWADDR_PRIx "", in memory_translate_iotlb()
2211 iotlb->translated_addr); in memory_translate_iotlb()
2220 if (len & iotlb->addr_mask) { in memory_translate_iotlb()
2235 old_logging = mr->vga_logging_count; in memory_region_set_log()
2236 mr->vga_logging_count += log ? 1 : -1; in memory_region_set_log()
2237 if (!!old_logging == !!mr->vga_logging_count) { in memory_region_set_log()
2242 mr->dirty_log_mask = (mr->dirty_log_mask & ~mask) | (log * mask); in memory_region_set_log()
2243 memory_region_update_pending |= mr->enabled; in memory_region_set_log()
2250 assert(mr->ram_block); in memory_region_set_dirty()
2273 if (listener->log_sync) { in memory_region_sync_dirty_bitmap()
2274 as = listener->address_space; in memory_region_sync_dirty_bitmap()
2277 if (fr->dirty_log_mask && (!mr || fr->mr == mr)) { in memory_region_sync_dirty_bitmap()
2279 listener->log_sync(listener, &mrs); in memory_region_sync_dirty_bitmap()
2283 trace_memory_region_sync_dirty(mr ? mr->name : "(all)", listener->name, 0); in memory_region_sync_dirty_bitmap()
2284 } else if (listener->log_sync_global) { in memory_region_sync_dirty_bitmap()
2290 listener->log_sync_global(listener, last_stage); in memory_region_sync_dirty_bitmap()
2291 trace_memory_region_sync_dirty(mr ? mr->name : "(all)", listener->name, 1); in memory_region_sync_dirty_bitmap()
2296 void memory_region_clear_dirty_bitmap(MemoryRegion *mr, hwaddr start, in memory_region_clear_dirty_bitmap() argument
2307 if (!listener->log_clear) { in memory_region_clear_dirty_bitmap()
2310 as = listener->address_space; in memory_region_clear_dirty_bitmap()
2313 if (!fr->dirty_log_mask || fr->mr != mr) { in memory_region_clear_dirty_bitmap()
2323 sec_start = MAX(mrs.offset_within_region, start); in memory_region_clear_dirty_bitmap()
2325 sec_end = MIN(sec_end, start + len); in memory_region_clear_dirty_bitmap()
2337 sec_start - mrs.offset_within_region; in memory_region_clear_dirty_bitmap()
2339 sec_size = sec_end - sec_start; in memory_region_clear_dirty_bitmap()
2341 listener->log_clear(listener, &mrs); in memory_region_clear_dirty_bitmap()
2353 assert(mr->ram_block); in memory_region_snapshot_and_clear_dirty()
2363 assert(mr->ram_block); in memory_region_snapshot_get_dirty()
2370 if (mr->readonly != readonly) { in memory_region_set_readonly()
2372 mr->readonly = readonly; in memory_region_set_readonly()
2373 memory_region_update_pending |= mr->enabled; in memory_region_set_readonly()
2380 if (mr->nonvolatile != nonvolatile) { in memory_region_set_nonvolatile()
2382 mr->nonvolatile = nonvolatile; in memory_region_set_nonvolatile()
2383 memory_region_update_pending |= mr->enabled; in memory_region_set_nonvolatile()
2390 if (mr->romd_mode != romd_mode) { in memory_region_rom_device_set_romd()
2392 mr->romd_mode = romd_mode; in memory_region_rom_device_set_romd()
2393 memory_region_update_pending |= mr->enabled; in memory_region_rom_device_set_romd()
2401 assert(mr->ram_block); in memory_region_reset_dirty()
2409 while (mr->alias) { in memory_region_get_fd()
2410 mr = mr->alias; in memory_region_get_fd()
2412 return mr->ram_block->fd; in memory_region_get_fd()
2420 while (mr->alias) { in memory_region_get_ram_ptr()
2421 offset += mr->alias_offset; in memory_region_get_ram_ptr()
2422 mr = mr->alias; in memory_region_get_ram_ptr()
2424 assert(mr->ram_block); in memory_region_get_ram_ptr()
2425 return qemu_map_ram_ptr(mr->ram_block, offset); in memory_region_get_ram_ptr()
2437 return block->mr; in memory_region_from_host()
2442 return mr->ram_block ? mr->ram_block->offset : RAM_ADDR_INVALID; in memory_region_get_ram_addr()
2447 assert(mr->ram_block); in memory_region_ram_resize()
2449 qemu_ram_resize(mr->ram_block, newsize, errp); in memory_region_ram_resize()
2454 if (mr->ram_block) { in memory_region_msync()
2455 qemu_ram_msync(mr->ram_block, addr, size); in memory_region_msync()
2465 if (mr->dirty_log_mask) { in memory_region_writeback()
2485 if (fr->mr == mr) { in memory_region_update_coalesced_range()
2496 memory_region_add_coalescing(mr, 0, int128_get64(mr->size)); in memory_region_set_coalescing()
2505 cmr->addr = addrrange_make(int128_make64(offset), int128_make64(size)); in memory_region_add_coalescing()
2506 QTAILQ_INSERT_TAIL(&mr->coalesced, cmr, link); in memory_region_add_coalescing()
2515 if (QTAILQ_EMPTY(&mr->coalesced)) { in memory_region_clear_coalescing()
2520 mr->flush_coalesced_mmio = false; in memory_region_clear_coalescing()
2522 while (!QTAILQ_EMPTY(&mr->coalesced)) { in memory_region_clear_coalescing()
2523 cmr = QTAILQ_FIRST(&mr->coalesced); in memory_region_clear_coalescing()
2524 QTAILQ_REMOVE(&mr->coalesced, cmr, link); in memory_region_clear_coalescing()
2532 mr->flush_coalesced_mmio = true; in memory_region_set_flush_coalesced()
2538 if (QTAILQ_EMPTY(&mr->coalesced)) { in memory_region_clear_flush_coalesced()
2539 mr->flush_coalesced_mmio = false; in memory_region_clear_flush_coalesced()
2551 .addr.start = int128_make64(addr), in memory_region_add_eventfd()
2564 for (i = 0; i < mr->ioeventfd_nb; ++i) { in memory_region_add_eventfd()
2565 if (memory_region_ioeventfd_before(&mrfd, &mr->ioeventfds[i])) { in memory_region_add_eventfd()
2569 ++mr->ioeventfd_nb; in memory_region_add_eventfd()
2570 mr->ioeventfds = g_realloc(mr->ioeventfds, in memory_region_add_eventfd()
2571 sizeof(*mr->ioeventfds) * mr->ioeventfd_nb); in memory_region_add_eventfd()
2572 memmove(&mr->ioeventfds[i+1], &mr->ioeventfds[i], in memory_region_add_eventfd()
2573 sizeof(*mr->ioeventfds) * (mr->ioeventfd_nb-1 - i)); in memory_region_add_eventfd()
2574 mr->ioeventfds[i] = mrfd; in memory_region_add_eventfd()
2575 ioeventfd_update_pending |= mr->enabled; in memory_region_add_eventfd()
2587 .addr.start = int128_make64(addr), in memory_region_del_eventfd()
2600 for (i = 0; i < mr->ioeventfd_nb; ++i) { in memory_region_del_eventfd()
2601 if (memory_region_ioeventfd_equal(&mrfd, &mr->ioeventfds[i])) { in memory_region_del_eventfd()
2605 assert(i != mr->ioeventfd_nb); in memory_region_del_eventfd()
2606 memmove(&mr->ioeventfds[i], &mr->ioeventfds[i+1], in memory_region_del_eventfd()
2607 sizeof(*mr->ioeventfds) * (mr->ioeventfd_nb - (i+1))); in memory_region_del_eventfd()
2608 --mr->ioeventfd_nb; in memory_region_del_eventfd()
2609 mr->ioeventfds = g_realloc(mr->ioeventfds, in memory_region_del_eventfd()
2610 sizeof(*mr->ioeventfds)*mr->ioeventfd_nb + 1); in memory_region_del_eventfd()
2611 ioeventfd_update_pending |= mr->enabled; in memory_region_del_eventfd()
2617 MemoryRegion *mr = subregion->container; in memory_region_update_container_subregions()
2623 QTAILQ_FOREACH(other, &mr->subregions, subregions_link) { in memory_region_update_container_subregions()
2624 if (subregion->priority >= other->priority) { in memory_region_update_container_subregions()
2629 QTAILQ_INSERT_TAIL(&mr->subregions, subregion, subregions_link); in memory_region_update_container_subregions()
2631 memory_region_update_pending |= mr->enabled && subregion->enabled; in memory_region_update_container_subregions()
2641 assert(!subregion->container); in memory_region_add_subregion_common()
2642 subregion->container = mr; in memory_region_add_subregion_common()
2643 for (alias = subregion->alias; alias; alias = alias->alias) { in memory_region_add_subregion_common()
2644 alias->mapped_via_alias++; in memory_region_add_subregion_common()
2646 subregion->addr = offset; in memory_region_add_subregion_common()
2654 subregion->priority = 0; in memory_region_add_subregion()
2663 subregion->priority = priority; in memory_region_add_subregion_overlap()
2673 assert(subregion->container == mr); in memory_region_del_subregion()
2674 subregion->container = NULL; in memory_region_del_subregion()
2675 for (alias = subregion->alias; alias; alias = alias->alias) { in memory_region_del_subregion()
2676 alias->mapped_via_alias--; in memory_region_del_subregion()
2677 assert(alias->mapped_via_alias >= 0); in memory_region_del_subregion()
2679 QTAILQ_REMOVE(&mr->subregions, subregion, subregions_link); in memory_region_del_subregion()
2681 memory_region_update_pending |= mr->enabled && subregion->enabled; in memory_region_del_subregion()
2687 if (enabled == mr->enabled) { in memory_region_set_enabled()
2691 mr->enabled = enabled; in memory_region_set_enabled()
2703 if (int128_eq(s, mr->size)) { in memory_region_set_size()
2707 mr->size = s; in memory_region_set_size()
2714 MemoryRegion *container = mr->container; in memory_region_readd_subregion()
2720 memory_region_add_subregion_common(container, mr->addr, mr); in memory_region_readd_subregion()
2728 if (addr != mr->addr) { in memory_region_set_address()
2729 mr->addr = addr; in memory_region_set_address()
2736 assert(mr->alias); in memory_region_set_alias_offset()
2738 if (offset == mr->alias_offset) { in memory_region_set_alias_offset()
2743 mr->alias_offset = offset; in memory_region_set_alias_offset()
2744 memory_region_update_pending |= mr->enabled; in memory_region_set_alias_offset()
2750 if (unmergeable == mr->unmergeable) { in memory_region_set_unmergeable()
2755 mr->unmergeable = unmergeable; in memory_region_set_unmergeable()
2756 memory_region_update_pending |= mr->enabled; in memory_region_set_unmergeable()
2762 return mr->align; in memory_region_get_alignment()
2770 if (int128_le(addrrange_end(*addr), fr->addr.start)) { in cmp_flatrange_addr()
2771 return -1; in cmp_flatrange_addr()
2772 } else if (int128_ge(addr->start, addrrange_end(fr->addr))) { in cmp_flatrange_addr()
2780 return bsearch(&addr, view->ranges, view->nr, in flatview_lookup()
2786 return !!mr->container || mr->mapped_via_alias; in memory_region_is_mapped()
2802 addr += mr->addr; in memory_region_find_rcu()
2803 for (root = mr; root->container; ) { in memory_region_find_rcu()
2804 root = root->container; in memory_region_find_rcu()
2805 addr += root->addr; in memory_region_find_rcu()
2820 while (fr > view->ranges && addrrange_intersects(fr[-1].addr, range)) { in memory_region_find_rcu()
2821 --fr; in memory_region_find_rcu()
2824 ret.mr = fr->mr; in memory_region_find_rcu()
2826 range = addrrange_intersection(range, fr->addr); in memory_region_find_rcu()
2827 ret.offset_within_region = fr->offset_in_region; in memory_region_find_rcu()
2828 ret.offset_within_region += int128_get64(int128_sub(range.start, in memory_region_find_rcu()
2829 fr->addr.start)); in memory_region_find_rcu()
2831 ret.offset_within_address_space = int128_get64(range.start); in memory_region_find_rcu()
2832 ret.readonly = fr->readonly; in memory_region_find_rcu()
2833 ret.nonvolatile = fr->nonvolatile; in memory_region_find_rcu()
2854 if (tmp->mr) { in memory_region_section_new_copy()
2855 memory_region_ref(tmp->mr); in memory_region_section_new_copy()
2857 if (tmp->fv) { in memory_region_section_new_copy()
2858 bool ret = flatview_ref(tmp->fv); in memory_region_section_new_copy()
2867 if (s->fv) { in memory_region_section_free_copy()
2868 flatview_unref(s->fv); in memory_region_section_free_copy()
2870 if (s->mr) { in memory_region_section_free_copy()
2871 memory_region_unref(s->mr); in memory_region_section_free_copy()
2908 if (listener->log_global_start) { in memory_global_dirty_log_do_start()
2909 if (!listener->log_global_start(listener, errp)) { in memory_global_dirty_log_do_start()
2918 if (listener->log_global_stop) { in memory_global_dirty_log_do_start()
2919 listener->log_global_stop(listener); in memory_global_dirty_log_do_start()
2986 /* Note: postponed_stop_flags can be cleared in log start routine */ in memory_global_dirty_log_stop_postponed_run()
3030 if (listener->begin) { in listener_add_address_space()
3031 listener->begin(listener); in listener_add_address_space()
3038 * it can start to fail in the future, we need to be able to fail in listener_add_address_space()
3041 if (listener->log_global_start) { in listener_add_address_space()
3042 listener->log_global_start(listener, &error_abort); in listener_add_address_space()
3050 if (listener->region_add) { in listener_add_address_space()
3051 listener->region_add(listener, &section); in listener_add_address_space()
3058 if (fr->dirty_log_mask && listener->log_start) { in listener_add_address_space()
3059 listener->log_start(listener, &section, 0, fr->dirty_log_mask); in listener_add_address_space()
3067 for (i = 0; i < as->ioeventfd_nb; i++) { in listener_add_address_space()
3068 fd = &as->ioeventfds[i]; in listener_add_address_space()
3071 .offset_within_address_space = int128_get64(fd->addr.start), in listener_add_address_space()
3072 .size = fd->addr.size, in listener_add_address_space()
3075 if (listener->eventfd_add) { in listener_add_address_space()
3076 listener->eventfd_add(listener, &section, in listener_add_address_space()
3077 fd->match_data, fd->data, fd->e); in listener_add_address_space()
3081 if (listener->commit) { in listener_add_address_space()
3082 listener->commit(listener); in listener_add_address_space()
3095 if (listener->begin) { in listener_del_address_space()
3096 listener->begin(listener); in listener_del_address_space()
3102 if (fr->dirty_log_mask && listener->log_stop) { in listener_del_address_space()
3103 listener->log_stop(listener, &section, fr->dirty_log_mask, 0); in listener_del_address_space()
3109 if (listener->region_del) { in listener_del_address_space()
3110 listener->region_del(listener, &section); in listener_del_address_space()
3115 * de-register all eventfds for this address space for the current in listener_del_address_space()
3118 for (i = 0; i < as->ioeventfd_nb; i++) { in listener_del_address_space()
3119 fd = &as->ioeventfds[i]; in listener_del_address_space()
3122 .offset_within_address_space = int128_get64(fd->addr.start), in listener_del_address_space()
3123 .size = fd->addr.size, in listener_del_address_space()
3126 if (listener->eventfd_del) { in listener_del_address_space()
3127 listener->eventfd_del(listener, &section, in listener_del_address_space()
3128 fd->match_data, fd->data, fd->e); in listener_del_address_space()
3132 if (listener->commit) { in listener_del_address_space()
3133 listener->commit(listener); in listener_del_address_space()
3143 assert(!(listener->log_sync && listener->log_sync_global)); in memory_listener_register()
3145 listener->address_space = as; in memory_listener_register()
3147 || listener->priority >= QTAILQ_LAST(&memory_listeners)->priority) { in memory_listener_register()
3151 if (listener->priority < other->priority) { in memory_listener_register()
3158 if (QTAILQ_EMPTY(&as->listeners) in memory_listener_register()
3159 || listener->priority >= QTAILQ_LAST(&as->listeners)->priority) { in memory_listener_register()
3160 QTAILQ_INSERT_TAIL(&as->listeners, listener, link_as); in memory_listener_register()
3162 QTAILQ_FOREACH(other, &as->listeners, link_as) { in memory_listener_register()
3163 if (listener->priority < other->priority) { in memory_listener_register()
3172 if (listener->eventfd_add || listener->eventfd_del) { in memory_listener_register()
3173 as->ioeventfd_notifiers++; in memory_listener_register()
3179 if (!listener->address_space) { in memory_listener_unregister()
3183 if (listener->eventfd_add || listener->eventfd_del) { in memory_listener_unregister()
3184 listener->address_space->ioeventfd_notifiers--; in memory_listener_unregister()
3187 listener_del_address_space(listener, listener->address_space); in memory_listener_unregister()
3189 QTAILQ_REMOVE(&listener->address_space->listeners, listener, link_as); in memory_listener_unregister()
3190 listener->address_space = NULL; in memory_listener_unregister()
3195 while (!QTAILQ_EMPTY(&as->listeners)) { in address_space_remove_listeners()
3196 memory_listener_unregister(QTAILQ_FIRST(&as->listeners)); in address_space_remove_listeners()
3203 as->root = root; in address_space_init()
3204 as->current_map = NULL; in address_space_init()
3205 as->ioeventfd_nb = 0; in address_space_init()
3206 as->ioeventfds = NULL; in address_space_init()
3207 QTAILQ_INIT(&as->listeners); in address_space_init()
3209 as->max_bounce_buffer_size = DEFAULT_MAX_BOUNCE_BUFFER_SIZE; in address_space_init()
3210 as->bounce_buffer_size = 0; in address_space_init()
3211 qemu_mutex_init(&as->map_client_list_lock); in address_space_init()
3212 QLIST_INIT(&as->map_client_list); in address_space_init()
3213 as->name = g_strdup(name ? name : "anonymous"); in address_space_init()
3220 assert(qatomic_read(&as->bounce_buffer_size) == 0); in do_address_space_destroy()
3221 assert(QLIST_EMPTY(&as->map_client_list)); in do_address_space_destroy()
3222 qemu_mutex_destroy(&as->map_client_list_lock); in do_address_space_destroy()
3224 assert(QTAILQ_EMPTY(&as->listeners)); in do_address_space_destroy()
3226 flatview_unref(as->current_map); in do_address_space_destroy()
3227 g_free(as->name); in do_address_space_destroy()
3228 g_free(as->ioeventfds); in do_address_space_destroy()
3229 memory_region_unref(as->root); in do_address_space_destroy()
3234 MemoryRegion *root = as->root; in address_space_destroy()
3238 as->root = NULL; in address_space_destroy()
3242 /* At this point, as->dispatch and as->current_map are dummy in address_space_destroy()
3246 as->root = root; in address_space_destroy()
3252 if (mr->alias) { in memory_region_type()
3253 return memory_region_type(mr->alias); in memory_region_type()
3286 if (dev && dev->id) { in mtree_expand_owner()
3287 qemu_printf(" id=%s", dev->id); in mtree_expand_owner()
3302 Object *owner = mr->owner; in mtree_print_mr_owner()
3332 cur_start = base + mr->addr; in mtree_print_mr()
3333 cur_end = cur_start + MR_SIZE(mr->size); in mtree_print_mr()
3344 if (mr->alias) { in mtree_print_mr()
3349 if (ml->mr == mr->alias) { in mtree_print_mr()
3356 ml->mr = mr->alias; in mtree_print_mr()
3359 if (mr->enabled || display_disabled) { in mtree_print_mr()
3363 qemu_printf(HWADDR_FMT_plx "-" HWADDR_FMT_plx in mtree_print_mr()
3365 "-" HWADDR_FMT_plx "%s", in mtree_print_mr()
3367 mr->priority, in mtree_print_mr()
3368 mr->nonvolatile ? "nv-" : "", in mtree_print_mr()
3371 memory_region_name(mr->alias), in mtree_print_mr()
3372 mr->alias_offset, in mtree_print_mr()
3373 mr->alias_offset + MR_SIZE(mr->size), in mtree_print_mr()
3374 mr->enabled ? "" : " [disabled]"); in mtree_print_mr()
3381 if (mr->enabled || display_disabled) { in mtree_print_mr()
3385 qemu_printf(HWADDR_FMT_plx "-" HWADDR_FMT_plx in mtree_print_mr()
3388 mr->priority, in mtree_print_mr()
3389 mr->nonvolatile ? "nv-" : "", in mtree_print_mr()
3392 mr->enabled ? "" : " [disabled]"); in mtree_print_mr()
3402 QTAILQ_FOREACH(submr, &mr->subregions, subregions_link) { in mtree_print_mr()
3404 new_ml->mr = submr; in mtree_print_mr()
3406 if (new_ml->mr->addr < ml->mr->addr || in mtree_print_mr()
3407 (new_ml->mr->addr == ml->mr->addr && in mtree_print_mr()
3408 new_ml->mr->priority > ml->mr->priority)) { in mtree_print_mr()
3420 mtree_print_mr(ml->mr, level + 1, cur_start, in mtree_print_mr()
3436 static void mtree_print_flatview(gpointer key, gpointer value, in mtree_print_flatview() argument
3440 GArray *fv_address_spaces = value; in mtree_print_flatview()
3442 FlatRange *range = &view->ranges[0]; in mtree_print_flatview()
3444 int n = view->nr; in mtree_print_flatview()
3448 qemu_printf("FlatView #%d\n", fvi->counter); in mtree_print_flatview()
3449 ++fvi->counter; in mtree_print_flatview()
3451 for (i = 0; i < fv_address_spaces->len; ++i) { in mtree_print_flatview()
3454 as->name, memory_region_name(as->root)); in mtree_print_flatview()
3455 if (as->root->alias) { in mtree_print_flatview()
3456 qemu_printf(", alias %s", memory_region_name(as->root->alias)); in mtree_print_flatview()
3462 view->root ? memory_region_name(view->root) : "(none)"); in mtree_print_flatview()
3469 while (n--) { in mtree_print_flatview()
3470 mr = range->mr; in mtree_print_flatview()
3471 if (range->offset_in_region) { in mtree_print_flatview()
3472 qemu_printf(MTREE_INDENT HWADDR_FMT_plx "-" HWADDR_FMT_plx in mtree_print_flatview()
3474 int128_get64(range->addr.start), in mtree_print_flatview()
3475 int128_get64(range->addr.start) in mtree_print_flatview()
3476 + MR_SIZE(range->addr.size), in mtree_print_flatview()
3477 mr->priority, in mtree_print_flatview()
3478 range->nonvolatile ? "nv-" : "", in mtree_print_flatview()
3479 range->readonly ? "rom" : memory_region_type(mr), in mtree_print_flatview()
3481 range->offset_in_region); in mtree_print_flatview()
3483 qemu_printf(MTREE_INDENT HWADDR_FMT_plx "-" HWADDR_FMT_plx in mtree_print_flatview()
3485 int128_get64(range->addr.start), in mtree_print_flatview()
3486 int128_get64(range->addr.start) in mtree_print_flatview()
3487 + MR_SIZE(range->addr.size), in mtree_print_flatview()
3488 mr->priority, in mtree_print_flatview()
3489 range->nonvolatile ? "nv-" : "", in mtree_print_flatview()
3490 range->readonly ? "rom" : memory_region_type(mr), in mtree_print_flatview()
3493 if (fvi->owner) { in mtree_print_flatview()
3497 if (fvi->ac) { in mtree_print_flatview()
3498 for (i = 0; i < fv_address_spaces->len; ++i) { in mtree_print_flatview()
3500 if (fvi->ac->has_memory(current_machine, as, in mtree_print_flatview()
3501 int128_get64(range->addr.start), in mtree_print_flatview()
3502 MR_SIZE(range->addr.size) + 1)) { in mtree_print_flatview()
3503 qemu_printf(" %s", fvi->ac->name); in mtree_print_flatview()
3512 if (fvi->dispatch_tree && view->root) { in mtree_print_flatview()
3513 mtree_print_dispatch(view->dispatch, view->root); in mtree_print_flatview()
3520 static gboolean mtree_info_flatview_free(gpointer key, gpointer value, in mtree_info_flatview_free() argument
3524 GArray *fv_address_spaces = value; in mtree_info_flatview_free()
3545 if (ac->has_memory) { in mtree_info_flatview()
3576 /* Returns negative value if a < b; zero if a = b; positive value if a > b. */
3582 return g_strcmp0(as_a->name, as_b->name); in address_space_compare_name()
3589 qemu_printf("address-space: %s\n", as->name); in mtree_print_as_name()
3592 static void mtree_print_as(gpointer key, gpointer value, gpointer user_data) in mtree_print_as() argument
3595 GSList *as_same_root_mr_list = value; in mtree_print_as()
3599 mtree_print_mr(mr, 1, 0, asi->ml_head, asi->owner, asi->disabled); in mtree_print_as()
3603 static gboolean mtree_info_as_free(gpointer key, gpointer value, in mtree_info_as_free() argument
3606 GSList *as_same_root_mr_list = value; in mtree_info_as_free()
3629 /* Create hashtable, key=AS root MR, value = list of AS */ in mtree_info_as()
3630 as_same_root_mr_list = g_hash_table_lookup(views, as->root); in mtree_info_as()
3633 g_hash_table_insert(views, as->root, as_same_root_mr_list); in mtree_info_as()
3643 qemu_printf("memory-region: %s\n", memory_region_name(ml->mr)); in mtree_info_as()
3644 mtree_print_mr(ml->mr, 1, 0, &ml_head, owner, disabled); in mtree_info_as()