-
-/*********************** proc_info implementation *************/
-
-#include <sys/bsdtask_info.h>
-
-static int fill_vnodeinfoforaddr( vm_map_entry_t entry, uint32_t * vnodeaddr, uint32_t * vid);
-
-
-int
-fill_procregioninfo(task_t task, uint64_t arg, struct proc_regioninfo_internal *pinfo, uint32_t *vnodeaddr, uint32_t *vid)
-{
-
- vm_map_t map = task->map;
- vm_map_offset_t address = (vm_map_offset_t )arg;
- vm_map_entry_t tmp_entry;
- vm_map_entry_t entry;
- vm_map_offset_t start;
- vm_region_extended_info_data_t extended;
- vm_region_top_info_data_t top;
-
-
- if (map == VM_MAP_NULL)
- return(0);
-
- vm_map_lock_read(map);
-
- start = address;
- if (!vm_map_lookup_entry(map, start, &tmp_entry)) {
- if ((entry = tmp_entry->vme_next) == vm_map_to_entry(map)) {
- vm_map_unlock_read(map);
- return(0);
- }
- } else {
- entry = tmp_entry;
- }
-
- start = entry->vme_start;
-
- pinfo->pri_offset = entry->offset;
- pinfo->pri_protection = entry->protection;
- pinfo->pri_max_protection = entry->max_protection;
- pinfo->pri_inheritance = entry->inheritance;
- pinfo->pri_behavior = entry->behavior;
- pinfo->pri_user_wired_count = entry->user_wired_count;
- pinfo->pri_user_tag = entry->alias;
-
- if (entry->is_sub_map) {
- pinfo->pri_flags |= PROC_REGION_SUBMAP;
- } else {
- if (entry->is_shared)
- pinfo->pri_flags |= PROC_REGION_SHARED;
- }
-
-
- extended.protection = entry->protection;
- extended.user_tag = entry->alias;
- extended.pages_resident = 0;
- extended.pages_swapped_out = 0;
- extended.pages_shared_now_private = 0;
- extended.pages_dirtied = 0;
- extended.external_pager = 0;
- extended.shadow_depth = 0;
-
- vm_map_region_walk(map, start, entry, entry->offset, entry->vme_end - start, &extended);
-
- if (extended.external_pager && extended.ref_count == 2 && extended.share_mode == SM_SHARED)
- extended.share_mode = SM_PRIVATE;
-
- top.private_pages_resident = 0;
- top.shared_pages_resident = 0;
- vm_map_region_top_walk(entry, &top);
-
-
- pinfo->pri_pages_resident = extended.pages_resident;
- pinfo->pri_pages_shared_now_private = extended.pages_shared_now_private;
- pinfo->pri_pages_swapped_out = extended.pages_swapped_out;
- pinfo->pri_pages_dirtied = extended.pages_dirtied;
- pinfo->pri_ref_count = extended.ref_count;
- pinfo->pri_shadow_depth = extended.shadow_depth;
- pinfo->pri_share_mode = extended.share_mode;
-
- pinfo->pri_private_pages_resident = top.private_pages_resident;
- pinfo->pri_shared_pages_resident = top.shared_pages_resident;
- pinfo->pri_obj_id = top.obj_id;
-
- pinfo->pri_address = (uint64_t)start;
- pinfo->pri_size = (uint64_t)(entry->vme_end - start);
- pinfo->pri_depth = 0;
-
- if ((vnodeaddr != 0) && (entry->is_sub_map == 0)) {
- *vnodeaddr = (uint32_t)0;
-
- if (fill_vnodeinfoforaddr(entry, vnodeaddr, vid) ==0) {
- vm_map_unlock_read(map);
- return(1);
- }
- }
-
- vm_map_unlock_read(map);
- return(1);
-}
-
-static int
-fill_vnodeinfoforaddr(
- vm_map_entry_t entry,
- uint32_t * vnodeaddr,
- uint32_t * vid)
-{
- vm_object_t top_object, object;
- memory_object_t memory_object;
- memory_object_pager_ops_t pager_ops;
- kern_return_t kr;
- int shadow_depth;
-
-
- if (entry->is_sub_map) {
- return(0);
- } else {
- /*
- * The last object in the shadow chain has the
- * relevant pager information.
- */
- top_object = entry->object.vm_object;
- if (top_object == VM_OBJECT_NULL) {
- object = VM_OBJECT_NULL;
- shadow_depth = 0;
- } else {
- vm_object_lock(top_object);
- for (object = top_object, shadow_depth = 0;
- object->shadow != VM_OBJECT_NULL;
- object = object->shadow, shadow_depth++) {
- vm_object_lock(object->shadow);
- vm_object_unlock(object);
- }
- }
- }
-
- if (object == VM_OBJECT_NULL) {
- return(0);
- } else if (object->internal) {
- vm_object_unlock(object);
- return(0);
- } else if (! object->pager_ready ||
- object->terminating ||
- ! object->alive) {
- vm_object_unlock(object);
- return(0);
- } else {
- memory_object = object->pager;
- pager_ops = memory_object->mo_pager_ops;
- if (pager_ops == &vnode_pager_ops) {
- kr = vnode_pager_get_object_vnode(
- memory_object,
- vnodeaddr, vid);
- if (kr != KERN_SUCCESS) {
- vm_object_unlock(object);
- return(0);
- }
- } else {
- vm_object_unlock(object);
- return(0);
- }
- }
- vm_object_unlock(object);
- return(1);
-}
-
-kern_return_t
-vnode_pager_get_object_vnode (
- memory_object_t mem_obj,
- uint32_t * vnodeaddr,
- uint32_t * vid)
-{
- vnode_pager_t vnode_object;
-
- vnode_object = vnode_pager_lookup(mem_obj);
- if (vnode_object->vnode_handle) {
- *vnodeaddr = (uint32_t)vnode_object->vnode_handle;
- *vid = (uint32_t)vnode_vid((void *)vnode_object->vnode_handle);
-
- return(KERN_SUCCESS);
- }
-
- return(KERN_FAILURE);
-}
-