diff options
Diffstat (limited to 'kernel/kprobes.c')
| -rw-r--r-- | kernel/kprobes.c | 132 |
1 files changed, 66 insertions, 66 deletions
diff --git a/kernel/kprobes.c b/kernel/kprobes.c index 0ed46f3e51e9..282035f3ae96 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c | |||
| @@ -1588,6 +1588,72 @@ static void __kprobes kill_kprobe(struct kprobe *p) | |||
| 1588 | arch_remove_kprobe(p); | 1588 | arch_remove_kprobe(p); |
| 1589 | } | 1589 | } |
| 1590 | 1590 | ||
| 1591 | /* Disable one kprobe */ | ||
| 1592 | int __kprobes disable_kprobe(struct kprobe *kp) | ||
| 1593 | { | ||
| 1594 | int ret = 0; | ||
| 1595 | struct kprobe *p; | ||
| 1596 | |||
| 1597 | mutex_lock(&kprobe_mutex); | ||
| 1598 | |||
| 1599 | /* Check whether specified probe is valid. */ | ||
| 1600 | p = __get_valid_kprobe(kp); | ||
| 1601 | if (unlikely(p == NULL)) { | ||
| 1602 | ret = -EINVAL; | ||
| 1603 | goto out; | ||
| 1604 | } | ||
| 1605 | |||
| 1606 | /* If the probe is already disabled (or gone), just return */ | ||
| 1607 | if (kprobe_disabled(kp)) | ||
| 1608 | goto out; | ||
| 1609 | |||
| 1610 | kp->flags |= KPROBE_FLAG_DISABLED; | ||
| 1611 | if (p != kp) | ||
| 1612 | /* When kp != p, p is always enabled. */ | ||
| 1613 | try_to_disable_aggr_kprobe(p); | ||
| 1614 | |||
| 1615 | if (!kprobes_all_disarmed && kprobe_disabled(p)) | ||
| 1616 | disarm_kprobe(p); | ||
| 1617 | out: | ||
| 1618 | mutex_unlock(&kprobe_mutex); | ||
| 1619 | return ret; | ||
| 1620 | } | ||
| 1621 | EXPORT_SYMBOL_GPL(disable_kprobe); | ||
| 1622 | |||
| 1623 | /* Enable one kprobe */ | ||
| 1624 | int __kprobes enable_kprobe(struct kprobe *kp) | ||
| 1625 | { | ||
| 1626 | int ret = 0; | ||
| 1627 | struct kprobe *p; | ||
| 1628 | |||
| 1629 | mutex_lock(&kprobe_mutex); | ||
| 1630 | |||
| 1631 | /* Check whether specified probe is valid. */ | ||
| 1632 | p = __get_valid_kprobe(kp); | ||
| 1633 | if (unlikely(p == NULL)) { | ||
| 1634 | ret = -EINVAL; | ||
| 1635 | goto out; | ||
| 1636 | } | ||
| 1637 | |||
| 1638 | if (kprobe_gone(kp)) { | ||
| 1639 | /* This kprobe has gone, we couldn't enable it. */ | ||
| 1640 | ret = -EINVAL; | ||
| 1641 | goto out; | ||
| 1642 | } | ||
| 1643 | |||
| 1644 | if (p != kp) | ||
| 1645 | kp->flags &= ~KPROBE_FLAG_DISABLED; | ||
| 1646 | |||
| 1647 | if (!kprobes_all_disarmed && kprobe_disabled(p)) { | ||
| 1648 | p->flags &= ~KPROBE_FLAG_DISABLED; | ||
| 1649 | arm_kprobe(p); | ||
| 1650 | } | ||
| 1651 | out: | ||
| 1652 | mutex_unlock(&kprobe_mutex); | ||
| 1653 | return ret; | ||
| 1654 | } | ||
| 1655 | EXPORT_SYMBOL_GPL(enable_kprobe); | ||
| 1656 | |||
| 1591 | void __kprobes dump_kprobe(struct kprobe *kp) | 1657 | void __kprobes dump_kprobe(struct kprobe *kp) |
| 1592 | { | 1658 | { |
| 1593 | printk(KERN_WARNING "Dumping kprobe:\n"); | 1659 | printk(KERN_WARNING "Dumping kprobe:\n"); |
| @@ -1805,72 +1871,6 @@ static const struct file_operations debugfs_kprobes_operations = { | |||
| 1805 | .release = seq_release, | 1871 | .release = seq_release, |
| 1806 | }; | 1872 | }; |
| 1807 | 1873 | ||
| 1808 | /* Disable one kprobe */ | ||
| 1809 | int __kprobes disable_kprobe(struct kprobe *kp) | ||
| 1810 | { | ||
| 1811 | int ret = 0; | ||
| 1812 | struct kprobe *p; | ||
| 1813 | |||
| 1814 | mutex_lock(&kprobe_mutex); | ||
| 1815 | |||
| 1816 | /* Check whether specified probe is valid. */ | ||
| 1817 | p = __get_valid_kprobe(kp); | ||
| 1818 | if (unlikely(p == NULL)) { | ||
| 1819 | ret = -EINVAL; | ||
| 1820 | goto out; | ||
| 1821 | } | ||
| 1822 | |||
| 1823 | /* If the probe is already disabled (or gone), just return */ | ||
| 1824 | if (kprobe_disabled(kp)) | ||
| 1825 | goto out; | ||
| 1826 | |||
| 1827 | kp->flags |= KPROBE_FLAG_DISABLED; | ||
| 1828 | if (p != kp) | ||
| 1829 | /* When kp != p, p is always enabled. */ | ||
| 1830 | try_to_disable_aggr_kprobe(p); | ||
| 1831 | |||
| 1832 | if (!kprobes_all_disarmed && kprobe_disabled(p)) | ||
| 1833 | disarm_kprobe(p); | ||
| 1834 | out: | ||
| 1835 | mutex_unlock(&kprobe_mutex); | ||
| 1836 | return ret; | ||
| 1837 | } | ||
| 1838 | EXPORT_SYMBOL_GPL(disable_kprobe); | ||
| 1839 | |||
| 1840 | /* Enable one kprobe */ | ||
| 1841 | int __kprobes enable_kprobe(struct kprobe *kp) | ||
| 1842 | { | ||
| 1843 | int ret = 0; | ||
| 1844 | struct kprobe *p; | ||
| 1845 | |||
| 1846 | mutex_lock(&kprobe_mutex); | ||
| 1847 | |||
| 1848 | /* Check whether specified probe is valid. */ | ||
| 1849 | p = __get_valid_kprobe(kp); | ||
| 1850 | if (unlikely(p == NULL)) { | ||
| 1851 | ret = -EINVAL; | ||
| 1852 | goto out; | ||
| 1853 | } | ||
| 1854 | |||
| 1855 | if (kprobe_gone(kp)) { | ||
| 1856 | /* This kprobe has gone, we couldn't enable it. */ | ||
| 1857 | ret = -EINVAL; | ||
| 1858 | goto out; | ||
| 1859 | } | ||
| 1860 | |||
| 1861 | if (p != kp) | ||
| 1862 | kp->flags &= ~KPROBE_FLAG_DISABLED; | ||
| 1863 | |||
| 1864 | if (!kprobes_all_disarmed && kprobe_disabled(p)) { | ||
| 1865 | p->flags &= ~KPROBE_FLAG_DISABLED; | ||
| 1866 | arm_kprobe(p); | ||
| 1867 | } | ||
| 1868 | out: | ||
| 1869 | mutex_unlock(&kprobe_mutex); | ||
| 1870 | return ret; | ||
| 1871 | } | ||
| 1872 | EXPORT_SYMBOL_GPL(enable_kprobe); | ||
| 1873 | |||
| 1874 | static void __kprobes arm_all_kprobes(void) | 1874 | static void __kprobes arm_all_kprobes(void) |
| 1875 | { | 1875 | { |
| 1876 | struct hlist_head *head; | 1876 | struct hlist_head *head; |
