-def FindVMEntriesForVnode(task, vn):
- """ returns an array of vme that have the vnode set to defined vnode
- each entry in array is of format (vme, start_addr, end_address, protection)
- """
- retval = []
- vmmap = task.map
- pmap = vmmap.pmap
- pager_ops_addr = unsigned(addressof(kern.globals.vnode_pager_ops))
- debuglog("pager_ops_addr %s" % hex(pager_ops_addr))
-
- if unsigned(pmap) == 0:
- return retval
- vme_list_head = vmmap.hdr.links
- vme_ptr_type = gettype('vm_map_entry *')
- for vme in IterateQueue(vme_list_head, vme_ptr_type, 'links'):
- #print vme
- if unsigned(vme.is_sub_map) == 0 and unsigned(vme.object.vm_object) != 0:
- obj = vme.object.vm_object
- else:
- continue
-
- while obj != 0:
- if obj.pager != 0:
- if obj.internal:
- pass
- else:
- vn_pager = Cast(obj.pager, 'vnode_pager *')
- if unsigned(vn_pager.pager_ops) == pager_ops_addr and unsigned(vn_pager.vnode_handle) == unsigned(vn):
- retval.append((vme, unsigned(vme.links.start), unsigned(vme.links.end), unsigned(vme.protection)))
- obj = obj.shadow
- return retval
-
-@lldb_command('showtaskloadinfo')
-def ShowTaskLoadInfo(cmd_args=None, cmd_options={}):
- """ Print the load address and uuid for the process
- Usage: (lldb)showtaskloadinfo <task_t>
- """
- if not cmd_args:
- raise ArgumentError("Insufficient arguments")
- t = kern.GetValueFromAddress(cmd_args[0], 'struct task *')
- print_format = "0x{0:x} - 0x{1:x} {2: <50s} (??? - ???) <{3: <36s}> {4: <50s}"
- p = Cast(t.bsd_info, 'struct proc *')
- uuid = p.p_uuid
- uuid_out_string = "{a[0]:02X}{a[1]:02X}{a[2]:02X}{a[3]:02X}-{a[4]:02X}{a[5]:02X}-{a[6]:02X}{a[7]:02X}-{a[8]:02X}{a[9]:02X}-{a[10]:02X}{a[11]:02X}{a[12]:02X}{a[13]:02X}{a[14]:02X}{a[15]:02X}".format(a=uuid)
- filepath = GetVnodePath(p.p_textvp)
- libname = filepath.split('/')[-1]
- #print "uuid: %s file: %s" % (uuid_out_string, filepath)
- mappings = FindVMEntriesForVnode(t, p.p_textvp)
- load_addr = 0
- end_addr = 0
- for m in mappings:
- if m[3] == 5:
- load_addr = m[1]
- end_addr = m[2]
- #print "Load address: %s" % hex(m[1])
- print print_format.format(load_addr, end_addr, libname, uuid_out_string, filepath)
- return None
-