1/*- 2 * Copyright (c) 1982, 1986, 1989, 1991, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 16 unchanged lines hidden (view full) --- 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 * 29 * @(#)kern_proc.c 8.7 (Berkeley) 2/14/95 30 */ 31 32#include <sys/cdefs.h> |
33__FBSDID("$FreeBSD: head/sys/kern/kern_proc.c 185548 2008-12-02 06:50:26Z peter $"); |
34 |
35#include "opt_compat.h" |
36#include "opt_ddb.h" 37#include "opt_kdtrace.h" 38#include "opt_ktrace.h" 39#include "opt_kstack_pages.h" 40#include "opt_stack.h" 41 42#include <sys/param.h> 43#include <sys/systm.h> --- 1289 unchanged lines hidden (view full) --- 1333 PROC_UNLOCK(p); 1334 return (error); 1335 } 1336 sv_name = p->p_sysent->sv_name; 1337 PROC_UNLOCK(p); 1338 return (sysctl_handle_string(oidp, sv_name, 0, req)); 1339} 1340 |
1341#ifdef KINFO_OVMENTRY_SIZE 1342CTASSERT(sizeof(struct kinfo_ovmentry) == KINFO_OVMENTRY_SIZE); 1343#endif 1344 1345#ifdef COMPAT_FREEBSD7 |
1346static int |
1347sysctl_kern_proc_ovmmap(SYSCTL_HANDLER_ARGS) |
1348{ 1349 vm_map_entry_t entry, tmp_entry; 1350 unsigned int last_timestamp; 1351 char *fullpath, *freepath; |
1352 struct kinfo_ovmentry *kve; |
1353 struct vattr va; 1354 struct ucred *cred; 1355 int error, *name; 1356 struct vnode *vp; 1357 struct proc *p; 1358 vm_map_t map; 1359 1360 name = (int *)arg1; --- 137 unchanged lines hidden (view full) --- 1498 entry = tmp_entry; 1499 } 1500 } 1501 vm_map_unlock_read(map); 1502 PRELE(p); 1503 free(kve, M_TEMP); 1504 return (error); 1505} |
1506#endif /* COMPAT_FREEBSD7 */ |
1507 |
1508#ifdef KINFO_VMENTRY_SIZE 1509CTASSERT(sizeof(struct kinfo_vmentry) == KINFO_VMENTRY_SIZE); 1510#endif 1511 1512static int 1513sysctl_kern_proc_vmmap(SYSCTL_HANDLER_ARGS) 1514{ 1515 vm_map_entry_t entry, tmp_entry; 1516 unsigned int last_timestamp; 1517 char *fullpath, *freepath; 1518 struct kinfo_vmentry *kve; 1519 struct vattr va; 1520 struct ucred *cred; 1521 int error, *name; 1522 struct vnode *vp; 1523 struct proc *p; 1524 vm_map_t map; 1525 1526 name = (int *)arg1; 1527 if ((p = pfind((pid_t)name[0])) == NULL) 1528 return (ESRCH); 1529 if (p->p_flag & P_WEXIT) { 1530 PROC_UNLOCK(p); 1531 return (ESRCH); 1532 } 1533 if ((error = p_candebug(curthread, p))) { 1534 PROC_UNLOCK(p); 1535 return (error); 1536 } 1537 _PHOLD(p); 1538 PROC_UNLOCK(p); 1539 1540 kve = malloc(sizeof(*kve), M_TEMP, M_WAITOK); 1541 1542 map = &p->p_vmspace->vm_map; /* XXXRW: More locking required? */ 1543 vm_map_lock_read(map); 1544 for (entry = map->header.next; entry != &map->header; 1545 entry = entry->next) { 1546 vm_object_t obj, tobj, lobj; 1547 vm_offset_t addr; 1548 int vfslocked; 1549 1550 if (entry->eflags & MAP_ENTRY_IS_SUB_MAP) 1551 continue; 1552 1553 bzero(kve, sizeof(*kve)); 1554 1555 kve->kve_private_resident = 0; 1556 obj = entry->object.vm_object; 1557 if (obj != NULL) { 1558 VM_OBJECT_LOCK(obj); 1559 if (obj->shadow_count == 1) 1560 kve->kve_private_resident = 1561 obj->resident_page_count; 1562 } 1563 kve->kve_resident = 0; 1564 addr = entry->start; 1565 while (addr < entry->end) { 1566 if (pmap_extract(map->pmap, addr)) 1567 kve->kve_resident++; 1568 addr += PAGE_SIZE; 1569 } 1570 1571 for (lobj = tobj = obj; tobj; tobj = tobj->backing_object) { 1572 if (tobj != obj) 1573 VM_OBJECT_LOCK(tobj); 1574 if (lobj != obj) 1575 VM_OBJECT_UNLOCK(lobj); 1576 lobj = tobj; 1577 } 1578 1579 kve->kve_fileid = 0; 1580 kve->kve_fsid = 0; 1581 freepath = NULL; 1582 fullpath = ""; 1583 if (lobj) { 1584 vp = NULL; 1585 switch(lobj->type) { 1586 case OBJT_DEFAULT: 1587 kve->kve_type = KVME_TYPE_DEFAULT; 1588 break; 1589 case OBJT_VNODE: 1590 kve->kve_type = KVME_TYPE_VNODE; 1591 vp = lobj->handle; 1592 vref(vp); 1593 break; 1594 case OBJT_SWAP: 1595 kve->kve_type = KVME_TYPE_SWAP; 1596 break; 1597 case OBJT_DEVICE: 1598 kve->kve_type = KVME_TYPE_DEVICE; 1599 break; 1600 case OBJT_PHYS: 1601 kve->kve_type = KVME_TYPE_PHYS; 1602 break; 1603 case OBJT_DEAD: 1604 kve->kve_type = KVME_TYPE_DEAD; 1605 break; 1606 default: 1607 kve->kve_type = KVME_TYPE_UNKNOWN; 1608 break; 1609 } 1610 if (lobj != obj) 1611 VM_OBJECT_UNLOCK(lobj); 1612 1613 kve->kve_ref_count = obj->ref_count; 1614 kve->kve_shadow_count = obj->shadow_count; 1615 VM_OBJECT_UNLOCK(obj); 1616 if (vp != NULL) { 1617 vn_fullpath(curthread, vp, &fullpath, 1618 &freepath); 1619 cred = curthread->td_ucred; 1620 vfslocked = VFS_LOCK_GIANT(vp->v_mount); 1621 vn_lock(vp, LK_SHARED | LK_RETRY); 1622 if (VOP_GETATTR(vp, &va, cred) == 0) { 1623 kve->kve_fileid = va.va_fileid; 1624 kve->kve_fsid = va.va_fsid; 1625 } 1626 vput(vp); 1627 VFS_UNLOCK_GIANT(vfslocked); 1628 } 1629 } else { 1630 kve->kve_type = KVME_TYPE_NONE; 1631 kve->kve_ref_count = 0; 1632 kve->kve_shadow_count = 0; 1633 } 1634 1635 kve->kve_start = entry->start; 1636 kve->kve_end = entry->end; 1637 kve->kve_offset = entry->offset; 1638 1639 if (entry->protection & VM_PROT_READ) 1640 kve->kve_protection |= KVME_PROT_READ; 1641 if (entry->protection & VM_PROT_WRITE) 1642 kve->kve_protection |= KVME_PROT_WRITE; 1643 if (entry->protection & VM_PROT_EXECUTE) 1644 kve->kve_protection |= KVME_PROT_EXEC; 1645 1646 if (entry->eflags & MAP_ENTRY_COW) 1647 kve->kve_flags |= KVME_FLAG_COW; 1648 if (entry->eflags & MAP_ENTRY_NEEDS_COPY) 1649 kve->kve_flags |= KVME_FLAG_NEEDS_COPY; 1650 1651 strlcpy(kve->kve_path, fullpath, sizeof(kve->kve_path)); 1652 if (freepath != NULL) 1653 free(freepath, M_TEMP); 1654 1655 last_timestamp = map->timestamp; 1656 vm_map_unlock_read(map); 1657 /* Pack record size down */ 1658 kve->kve_structsize = offsetof(struct kinfo_vmentry, kve_path) + 1659 strlen(kve->kve_path) + 1; 1660 kve->kve_structsize = roundup(kve->kve_structsize, 1661 sizeof(uint64_t)); 1662 error = SYSCTL_OUT(req, kve, kve->kve_structsize); 1663 vm_map_lock_read(map); 1664 if (error) 1665 break; 1666 if (last_timestamp + 1 != map->timestamp) { 1667 vm_map_lookup_entry(map, addr - 1, &tmp_entry); 1668 entry = tmp_entry; 1669 } 1670 } 1671 vm_map_unlock_read(map); 1672 PRELE(p); 1673 free(kve, M_TEMP); 1674 return (error); 1675} 1676 |
1677#if defined(STACK) || defined(DDB) 1678static int 1679sysctl_kern_proc_kstack(SYSCTL_HANDLER_ARGS) 1680{ 1681 struct kinfo_kstack *kkstp; 1682 int error, i, *name, numthreads; 1683 lwpid_t *lwpidarray; 1684 struct thread *td; --- 155 unchanged lines hidden (view full) --- 1840 CTLFLAG_RD, sysctl_kern_proc, "Process table"); 1841 1842static SYSCTL_NODE(_kern_proc, (KERN_PROC_PID | KERN_PROC_INC_THREAD), pid_td, 1843 CTLFLAG_RD, sysctl_kern_proc, "Process table"); 1844 1845static SYSCTL_NODE(_kern_proc, (KERN_PROC_PROC | KERN_PROC_INC_THREAD), proc_td, 1846 CTLFLAG_RD, sysctl_kern_proc, "Return process table, no threads"); 1847 |
1848#ifdef COMPAT_FREEBSD7 1849static SYSCTL_NODE(_kern_proc, KERN_PROC_OVMMAP, ovmmap, CTLFLAG_RD, 1850 sysctl_kern_proc_ovmmap, "Old Process vm map entries"); 1851#endif 1852 |
1853static SYSCTL_NODE(_kern_proc, KERN_PROC_VMMAP, vmmap, CTLFLAG_RD, 1854 sysctl_kern_proc_vmmap, "Process vm map entries"); 1855 1856#if defined(STACK) || defined(DDB) 1857static SYSCTL_NODE(_kern_proc, KERN_PROC_KSTACK, kstack, CTLFLAG_RD, 1858 sysctl_kern_proc_kstack, "Process kernel stacks"); 1859#endif |