This is xnu-12377.1.9. See this file in:
#include <darwintest.h>
#include <darwintest_utils.h>
#include <mach/mach.h>
#include <mach/message.h>
#include <stdlib.h>
#include <sys/sysctl.h>
#include <unistd.h>
#include <signal.h>
#include <mach/mach_vm.h>
#include <libproc.h>
#include <IOKit/IOKitLib.h>
#include <CoreFoundation/CoreFoundation.h>
#include <dispatch/dispatch.h>
#if defined(__arm64__)
#include <System/arm/cpu_capabilities.h>
#endif /* defined(__arm64__) */
// PT: These two files must be included before IOCircularDataQueueImplementation.h
#include <stdatomic.h>
#include <os/base_private.h>
#include <IOKit/IOCircularDataQueue.h>
#if 0
#include "device_user.h"
#include <../iokit/IOKit/IOCircularDataQueueImplementation.h>
#else
#include <IOKit/IOCircularDataQueueImplementation.h>
#endif
#include "service_helpers.h"
T_GLOBAL_META(
T_META_NAMESPACE("xnu.iokit"),
T_META_RUN_CONCURRENTLY(true),
T_META_ASROOT(true),
T_META_RADAR_COMPONENT_NAME("xnu"),
T_META_RADAR_COMPONENT_VERSION("IOKit"));
T_DECL(iodataqueues, "Test IODataQueues", T_META_TAG_VM_PREFERRED)
{
io_service_t service = IO_OBJECT_NULL;
io_connect_t connect = IO_OBJECT_NULL;
T_QUIET; T_ASSERT_POSIX_SUCCESS(IOTestServiceFindService("TestIODataQueues", &service),
"Find service");
T_QUIET; T_ASSERT_NE(service, MACH_PORT_NULL, "got service");
T_ASSERT_MACH_SUCCESS(IOServiceOpen(service, mach_task_self(), 1, &connect), "open service");
kern_return_t ret;
IOCircularDataQueue * queue;
for (int cycle = 0; cycle < 2; cycle++) {
ret = IOCircularDataQueueCreateWithConnection(kIOCircularDataQueueCreateConsumer, connect, 53, &queue);
#if defined(__arm64__) && defined(__LP64__)
if (0 == (kHasFeatLSE2 & _get_cpu_capabilities())) {
assert(kIOReturnUnsupported == ret);
break;
} else {
assert(kIOReturnSuccess == ret);
}
char buf[16];
size_t length = sizeof(buf);
ret = IOCircularDataQueueCopyLatest(queue, &buf[0], &length);
assert(kIOReturnSuccess == ret);
printf("[%ld]%s\n", length, &buf[0]);
if (0) {
// requires write access so disabled
ret = IOCircularDataQueueEnqueue(queue, "goodbye", sizeof("goodbye"));
assert(kIOReturnSuccess == ret);
}
ret = IOCircularDataQueueCopyLatest(queue, &buf[0], &length);
assert(kIOReturnSuccess == ret);
printf("[%ld]%s\n", length, &buf[0]);
ret = IOCircularDataQueueDestroy(&queue);
assert(kIOReturnSuccess == ret);
#else /* defined(__arm64__) && defined(__LP64__) */
assert(kIOReturnUnsupported == ret);
break;
#endif /* !(defined(__arm64__) && defined(__LP64__)) */
}
IOObjectRelease(service);
}