Deleted Added
full compact
kern_proc.c (185029) kern_proc.c (185548)
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>
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 185029 2008-11-17 20:49:29Z pjd $");
33__FBSDID("$FreeBSD: head/sys/kern/kern_proc.c 185548 2008-12-02 06:50:26Z peter $");
34
34
35#include "opt_compat.h"
35#include "opt_ddb.h"
36#include "opt_kdtrace.h"
37#include "opt_ktrace.h"
38#include "opt_kstack_pages.h"
39#include "opt_stack.h"
40
41#include <sys/param.h>
42#include <sys/systm.h>

--- 1289 unchanged lines hidden (view full) ---

1332 PROC_UNLOCK(p);
1333 return (error);
1334 }
1335 sv_name = p->p_sysent->sv_name;
1336 PROC_UNLOCK(p);
1337 return (sysctl_handle_string(oidp, sv_name, 0, req));
1338}
1339
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
1340static int
1346static int
1341sysctl_kern_proc_vmmap(SYSCTL_HANDLER_ARGS)
1347sysctl_kern_proc_ovmmap(SYSCTL_HANDLER_ARGS)
1342{
1343 vm_map_entry_t entry, tmp_entry;
1344 unsigned int last_timestamp;
1345 char *fullpath, *freepath;
1348{
1349 vm_map_entry_t entry, tmp_entry;
1350 unsigned int last_timestamp;
1351 char *fullpath, *freepath;
1346 struct kinfo_vmentry *kve;
1352 struct kinfo_ovmentry *kve;
1347 struct vattr va;
1348 struct ucred *cred;
1349 int error, *name;
1350 struct vnode *vp;
1351 struct proc *p;
1352 vm_map_t map;
1353
1354 name = (int *)arg1;

--- 137 unchanged lines hidden (view full) ---

1492 entry = tmp_entry;
1493 }
1494 }
1495 vm_map_unlock_read(map);
1496 PRELE(p);
1497 free(kve, M_TEMP);
1498 return (error);
1499}
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 */
1500
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
1501#if defined(STACK) || defined(DDB)
1502static int
1503sysctl_kern_proc_kstack(SYSCTL_HANDLER_ARGS)
1504{
1505 struct kinfo_kstack *kkstp;
1506 int error, i, *name, numthreads;
1507 lwpid_t *lwpidarray;
1508 struct thread *td;

--- 155 unchanged lines hidden (view full) ---

1664 CTLFLAG_RD, sysctl_kern_proc, "Process table");
1665
1666static SYSCTL_NODE(_kern_proc, (KERN_PROC_PID | KERN_PROC_INC_THREAD), pid_td,
1667 CTLFLAG_RD, sysctl_kern_proc, "Process table");
1668
1669static SYSCTL_NODE(_kern_proc, (KERN_PROC_PROC | KERN_PROC_INC_THREAD), proc_td,
1670 CTLFLAG_RD, sysctl_kern_proc, "Return process table, no threads");
1671
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
1672static SYSCTL_NODE(_kern_proc, KERN_PROC_VMMAP, vmmap, CTLFLAG_RD,
1673 sysctl_kern_proc_vmmap, "Process vm map entries");
1674
1675#if defined(STACK) || defined(DDB)
1676static SYSCTL_NODE(_kern_proc, KERN_PROC_KSTACK, kstack, CTLFLAG_RD,
1677 sysctl_kern_proc_kstack, "Process kernel stacks");
1678#endif
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