1 #include <IOKit/IOKitKeys.h>
2 #include "TestIODataQueues.h"
3
4 #if DEVELOPMENT || DEBUG
5
6 OSDefineMetaClassAndStructors(TestIODataQueues, IOService);
7
8 OSDefineMetaClassAndStructors(TestIODataQueuesUserClient, IOUserClient2022);
9
10 bool
start(IOService * provider)11 TestIODataQueues::start(IOService * provider)
12 {
13 OSString * str = OSString::withCStringNoCopy("TestIODataQueuesUserClient");
14 bool ok = IOService::start(provider);
15 if (ok && str != NULL) {
16 IOReturn ret;
17 ret = IOCircularDataQueueCreateWithEntries(kIOCircularDataQueueCreateProducer, 128, 16, &fCDQueue);
18 assert(kIOReturnSuccess == ret);
19 ret = IOCircularDataQueueEnqueue(fCDQueue, "hello", sizeof("hello"));
20 assert(kIOReturnSuccess == ret);
21
22 setProperty(gIOUserClientClassKey, str);
23 registerService();
24 }
25 OSSafeReleaseNULL(str);
26 return ok;
27 }
28
29
30 IOReturn
clientClose()31 TestIODataQueuesUserClient::clientClose()
32 {
33 if (!isInactive()) {
34 terminate();
35 }
36 return kIOReturnSuccess;
37 }
38
39 bool
start(IOService * provider)40 TestIODataQueuesUserClient::start(IOService * provider)
41 {
42 bool ok = IOUserClient2022::start(provider);
43 if (!ok) {
44 return false;
45 }
46 fTestIODataQueues = OSRequiredCast(TestIODataQueues, provider);
47
48 setProperty(kIOUserClientDefaultLockingKey, kOSBooleanTrue);
49 setProperty(kIOUserClientDefaultLockingSetPropertiesKey, kOSBooleanTrue);
50 setProperty(kIOUserClientDefaultLockingSingleThreadExternalMethodKey, kOSBooleanTrue);
51 setProperty(kIOUserClientEntitlementsKey, "com.apple.iokit.TestIODataQueues");
52
53 return true;
54 }
55
56 IOReturn
clientMemoryForType(UInt32 type,IOOptionBits * koptions,IOMemoryDescriptor ** kmemory)57 TestIODataQueuesUserClient::clientMemoryForType(UInt32 type,
58 IOOptionBits * koptions,
59 IOMemoryDescriptor ** kmemory)
60 {
61 IOReturn ret = kIOReturnSuccess;
62
63 *kmemory = IOCircularDataQueueCopyMemoryDescriptor(fTestIODataQueues->fCDQueue);
64 assert(*kmemory);
65 *koptions = kIOMapReadOnly;
66
67 return ret;
68 }
69
70 IOReturn
externalMethod(uint32_t selector,IOExternalMethodArgumentsOpaque * args)71 TestIODataQueuesUserClient::externalMethod(uint32_t selector, IOExternalMethodArgumentsOpaque * args)
72 {
73 static const IOExternalMethodDispatch2022 dispatchArray[] = {
74 };
75
76 return dispatchExternalMethod(selector, args, dispatchArray, sizeof(dispatchArray) / sizeof(dispatchArray[0]), this, NULL);
77 }
78
79 #endif /* DEVELOPMENT || DEBUG */
80