int error = EINVAL;
uint32_t request = arg2;
+ if (!IOStatistics::isEnabled()) {
+ return ENOENT;
+ }
+
switch (request) {
case kIOStatisticsGeneral:
error = IOStatistics::getStatistics(req);
SYSCTL_NODE(_debug, OID_AUTO, iokit_statistics, CTLFLAG_RW | CTLFLAG_LOCKED, NULL, "IOStatistics");
static SYSCTL_PROC(_debug_iokit_statistics, OID_AUTO, general,
- CTLTYPE_STRUCT | CTLFLAG_RD | CTLFLAG_NOAUTO | CTLFLAG_KERN | CTLFLAG_LOCKED,
+ CTLTYPE_STRUCT | CTLFLAG_RD | CTLFLAG_KERN | CTLFLAG_LOCKED,
NULL, kIOStatisticsGeneral, oid_sysctl, "S", "");
static SYSCTL_PROC(_debug_iokit_statistics, OID_AUTO, workloop,
- CTLTYPE_STRUCT | CTLFLAG_RD | CTLFLAG_NOAUTO | CTLFLAG_KERN | CTLFLAG_LOCKED,
+ CTLTYPE_STRUCT | CTLFLAG_RD | CTLFLAG_KERN | CTLFLAG_LOCKED,
NULL, kIOStatisticsWorkLoop, oid_sysctl, "S", "");
static SYSCTL_PROC(_debug_iokit_statistics, OID_AUTO, userclient,
- CTLTYPE_STRUCT | CTLFLAG_RW | CTLFLAG_NOAUTO | CTLFLAG_KERN | CTLFLAG_LOCKED,
+ CTLTYPE_STRUCT | CTLFLAG_RW | CTLFLAG_KERN | CTLFLAG_LOCKED,
NULL, kIOStatisticsUserClient, oid_sysctl, "S", "");
+
void
IOStatistics::initialize()
{
return;
}
- sysctl_register_oid(&sysctl__debug_iokit_statistics_general);
- sysctl_register_oid(&sysctl__debug_iokit_statistics_workloop);
- sysctl_register_oid(&sysctl__debug_iokit_statistics_userclient);
-
lock = IORWLockAlloc();
if (!lock) {
return;
goto exit;
}
- buffer = (char*)kalloc(calculatedSize);
+ buffer = (char*)kheap_alloc(KHEAP_TEMP, calculatedSize,
+ (zalloc_flags_t)(Z_WAITOK | Z_ZERO));
if (!buffer) {
error = ENOMEM;
goto exit;
}
- memset(buffer, 0, calculatedSize);
-
ptr = buffer;
header = (IOStatisticsHeader*)((void*)ptr);
error = SYSCTL_OUT(req, buffer, calculatedSize);
- kfree(buffer, calculatedSize);
+ kheap_free(KHEAP_TEMP, buffer, calculatedSize);
exit:
IORWLockUnlock(IOStatistics::lock);
goto exit;
}
- buffer = (char*)kalloc(calculatedSize);
+ buffer = (char*)kheap_alloc(KHEAP_TEMP, calculatedSize,
+ (zalloc_flags_t)(Z_WAITOK | Z_ZERO));
if (!buffer) {
error = ENOMEM;
goto exit;
}
- memset(buffer, 0, calculatedSize);
header = (IOStatisticsWorkLoopHeader*)((void*)buffer);
header->sig = IOSTATISTICS_SIG_WORKLOOP;
error = SYSCTL_OUT(req, buffer, size);
- kfree(buffer, calculatedSize);
+ kheap_free(KHEAP_TEMP, buffer, calculatedSize);
exit:
IORWLockUnlock(IOStatistics::lock);
LOG(2, "IOStatistics::getUserClientStatistics - requesting kext w/load tag: %d\n", requestedLoadTag);
- buffer = (char*)kalloc(calculatedSize);
+ buffer = (char*)kheap_alloc(KHEAP_TEMP, calculatedSize,
+ (zalloc_flags_t)(Z_WAITOK | Z_ZERO));
if (!buffer) {
error = ENOMEM;
goto exit;
}
- memset(buffer, 0, calculatedSize);
header = (IOStatisticsUserClientHeader*)((void*)buffer);
header->sig = IOSTATISTICS_SIG_USERCLIENT;
error = EINVAL;
}
- kfree(buffer, calculatedSize);
+ kheap_free(KHEAP_TEMP, buffer, calculatedSize);
exit:
IORWLockUnlock(IOStatistics::lock);
if (!enabled) {
return;
}
+ if (size > INT_MAX) {
+ return;
+ }
ke = getKextNodeFromBacktrace(FALSE);
if (ke) {
- OSAddAtomic(size, &ke->memoryCounters[index]);
+ OSAddAtomic((SInt32) size, &ke->memoryCounters[index]);
releaseKextNode(ke);
}
}