in tools/lldbmacros/memory.py [0:0]
def showmaphdrvme(maphdr, pmap, start_vaddr, end_vaddr, show_pager_info, show_all_shadows, reverse_order, show_rb_tree):
page_size = kern.globals.page_size
vnode_pager_ops = kern.globals.vnode_pager_ops
vnode_pager_ops_addr = unsigned(addressof(vnode_pager_ops))
if hasattr(kern.globals, 'compressor_object'):
compressor_object = kern.globals.compressor_object
else:
compressor_object = -1;
vme_list_head = maphdr.links
vme_ptr_type = GetType('vm_map_entry *')
print "{:<18s} {:>18s}:{:<18s} {:>10s} {:<8s} {:<16s} {:<18s} {:<18s}".format("entry","start","end","#pgs","tag.kmod","prot&flags","object","offset")
last_end = unsigned(maphdr.links.start)
skipped_entries = 0
for vme in IterateQueue(vme_list_head, vme_ptr_type, "links", reverse_order):
if start_vaddr != 0 and end_vaddr != 0:
if unsigned(vme.links.start) > end_vaddr:
break
if unsigned(vme.links.end) <= start_vaddr:
last_end = unsigned(vme.links.end)
skipped_entries = skipped_entries + 1
continue
if skipped_entries != 0:
print "... skipped {:d} entries ...".format(skipped_entries)
skipped_entries = 0
if unsigned(vme.links.start) != last_end:
print "{:18s} {:#018x}:{:#018x} {:>10d}".format("------------------",last_end,vme.links.start,(unsigned(vme.links.start) - last_end)/page_size)
last_end = unsigned(vme.links.end)
size = unsigned(vme.links.end) - unsigned(vme.links.start)
object = vme.vme_object.vmo_object
if object == 0:
object_str = "{: <#018x}".format(object)
elif vme.is_sub_map:
if object == kern.globals.bufferhdr_map:
object_str = "BUFFERHDR_MAP"
elif object == kern.globals.mb_map:
object_str = "MB_MAP"
elif object == kern.globals.bsd_pageable_map:
object_str = "BSD_PAGEABLE_MAP"
elif object == kern.globals.ipc_kernel_map:
object_str = "IPC_KERNEL_MAP"
elif object == kern.globals.ipc_kernel_copy_map:
object_str = "IPC_KERNEL_COPY_MAP"
elif object == kern.globals.kalloc_map:
object_str = "KALLOC_MAP"
elif hasattr(kern.globals, 'compressor_map') and object == kern.globals.compressor_map:
object_str = "COMPRESSOR_MAP"
elif hasattr(kern.globals, 'gzalloc_map') and object == kern.globals.gzalloc_map:
object_str = "GZALLOC_MAP"
elif hasattr(kern.globals, 'g_kext_map') and object == kern.globals.g_kext_map:
object_str = "G_KEXT_MAP"
elif hasattr(kern.globals, 'vector_upl_submap') and object == kern.globals.vector_upl_submap:
object_str = "VECTOR_UPL_SUBMAP"
else:
object_str = "submap:{: <#018x}".format(object)
else:
if object == kern.globals.kernel_object:
object_str = "KERNEL_OBJECT"
elif object == kern.globals.vm_submap_object:
object_str = "VM_SUBMAP_OBJECT"
elif object == compressor_object:
object_str = "COMPRESSOR_OBJECT"
else:
object_str = "{: <#018x}".format(object)
offset = unsigned(vme.vme_offset) & ~0xFFF
tag = unsigned(vme.vme_offset & 0xFFF)
protection = ""
if vme.protection & 0x1:
protection +="r"
else:
protection += "-"
if vme.protection & 0x2:
protection += "w"
else:
protection += "-"
if vme.protection & 0x4:
protection += "x"
else:
protection += "-"
max_protection = ""
if vme.max_protection & 0x1:
max_protection +="r"
else:
max_protection += "-"
if vme.max_protection & 0x2:
max_protection += "w"
else:
max_protection += "-"
if vme.max_protection & 0x4:
max_protection += "x"
else:
max_protection += "-"
vme_flags = ""
if vme.is_sub_map:
vme_flags += "s"
if vme.needs_copy:
vme_flags += "n"
if vme.use_pmap:
vme_flags += "p"
if vme.wired_count:
vme_flags += "w"
if vme.used_for_jit:
vme_flags += "j"
tagstr = ""
if pmap == kern.globals.kernel_pmap:
xsite = Cast(kern.globals.vm_allocation_sites[tag],'OSKextAccount *')
if xsite and xsite.site.flags & 0x0200:
tagstr = ".{:<3d}".format(xsite.loadTag)
rb_info = ""
if show_rb_tree:
rb_info = "l={: <#018x} r={: <#018x} p={: <#018x}".format(vme.store.entry.rbe_left, vme.store.entry.rbe_right, vme.store.entry.rbe_parent)
print "{: <#018x} {:#018x}:{:#018x} {:>10d} {:>3d}{:<4s} {:3s}/{:3s}/{:<8s} {:<18s} {:<#18x} {:s}".format(vme,vme.links.start,vme.links.end,(unsigned(vme.links.end)-unsigned(vme.links.start))/page_size,tag,tagstr,protection,max_protection,vme_flags,object_str,offset, rb_info)
if (show_pager_info or show_all_shadows) and vme.is_sub_map == 0 and vme.vme_object.vmo_object != 0:
object = vme.vme_object.vmo_object
else:
object = 0
showvmobject(object, offset, size, show_pager_info, show_all_shadows)
if start_vaddr != 0 or end_vaddr != 0:
print "..."
elif unsigned(maphdr.links.end) > last_end:
print "{:18s} {:#018x}:{:#018x} {:>10d}".format("------------------",last_end,maphdr.links.end,(unsigned(maphdr.links.end) - last_end)/page_size)
return None