xref: /xnu-11215/iokit/Tests/Tests.cpp (revision 8d741a5d)
1 /*
2  * Copyright (c) 1998-2021 Apple Computer, Inc. All rights reserved.
3  *
4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5  *
6  * This file contains Original Code and/or Modifications of Original Code
7  * as defined in and that are subject to the Apple Public Source License
8  * Version 2.0 (the 'License'). You may not use this file except in
9  * compliance with the License. The rights granted to you under the License
10  * may not be used to create, or enable the creation or redistribution of,
11  * unlawful or unlicensed copies of an Apple operating system, or to
12  * circumvent, violate, or enable the circumvention or violation of, any
13  * terms of an Apple operating system software license agreement.
14  *
15  * Please obtain a copy of the License at
16  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17  *
18  * The Original Code and all software distributed under the License are
19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23  * Please see the License for the specific language governing rights and
24  * limitations under the License.
25  *
26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27  */
28 /*
29  *
30  */
31 
32 #define TEST_HEADERS    0
33 #define IOKIT_ENABLE_SHARED_PTR
34 
35 #if TEST_HEADERS
36 
37 #include <libkern/OSByteOrder.h>
38 #include <libkern/c++/OSArray.h>
39 #include <libkern/c++/OSAllocation.h>
40 #include <libkern/c++/OSBoolean.h>
41 #include <libkern/c++/OSBoundedArray.h>
42 #include <libkern/c++/OSBoundedArrayRef.h>
43 #include <libkern/c++/OSBoundedPtr.h>
44 #include <libkern/c++/OSCollection.h>
45 #include <libkern/c++/OSCollectionIterator.h>
46 #include <libkern/c++/OSContainers.h>
47 #include <libkern/c++/OSCPPDebug.h>
48 #include <libkern/c++/OSData.h>
49 #include <libkern/c++/OSDictionary.h>
50 #include <libkern/c++/OSEndianTypes.h>
51 #include <libkern/c++/OSIterator.h>
52 #include <libkern/c++/OSKext.h>
53 #include <libkern/c++/OSLib.h>
54 #include <libkern/c++/OSMetaClass.h>
55 #include <libkern/c++/OSNumber.h>
56 #include <libkern/c++/OSObject.h>
57 #include <libkern/c++/OSOrderedSet.h>
58 #include <libkern/c++/OSSerialize.h>
59 #include <libkern/c++/OSSet.h>
60 #include <libkern/c++/OSSharedPtr.h>
61 #include <libkern/c++/OSString.h>
62 #include <libkern/c++/OSSymbol.h>
63 #include <libkern/c++/OSUnserialize.h>
64 #include <libkern/c++/OSValueObject.h>
65 #include <libkern/crypto/aes.h>
66 #include <libkern/crypto/aesxts.h>
67 #include <libkern/crypto/crypto_internal.h>
68 #include <libkern/crypto/des.h>
69 #include <libkern/crypto/md5.h>
70 #include <libkern/crypto/register_crypto.h>
71 #include <libkern/crypto/sha1.h>
72 #include <libkern/crypto/sha2.h>
73 #include <libkern/kernel_mach_header.h>
74 #include <libkern/kext_request_keys.h>
75 #include <libkern/kxld.h>
76 #include <libkern/kxld_types.h>
77 #include <libkern/locks.h>
78 #include <libkern/mkext.h>
79 #include <libkern/OSAtomic.h>
80 #include <libkern/OSBase.h>
81 #include <libkern/OSDebug.h>
82 #include <libkern/OSKextLib.h>
83 #include <libkern/OSKextLibPrivate.h>
84 #include <libkern/OSReturn.h>
85 #include <libkern/OSSerializeBinary.h>
86 #include <libkern/OSTypes.h>
87 #include <libkern/prelink.h>
88 #include <libkern/stack_protector.h>
89 #include <libkern/sysctl.h>
90 #include <libkern/tree.h>
91 #include <libkern/zconf.h>
92 #include <libkern/zlib.h>
93 
94 #include <IOKit/AppleKeyStoreInterface.h>
95 #include <IOKit/assert.h>
96 #include <IOKit/IOBSD.h>
97 #include <IOKit/IOBufferMemoryDescriptor.h>
98 #include <IOKit/IOCatalogue.h>
99 #include <IOKit/IOCommand.h>
100 #include <IOKit/IOCommandGate.h>
101 #include <IOKit/IOCommandPool.h>
102 #include <IOKit/IOCommandQueue.h>
103 #include <IOKit/IOConditionLock.h>
104 #include <IOKit/IOCPU.h>
105 //#include <IOKit/IODataQueue.h>
106 #include <IOKit/IODataQueueShared.h>
107 #include <IOKit/IODeviceMemory.h>
108 #include <IOKit/IODeviceTreeSupport.h>
109 #include <IOKit/IODMACommand.h>
110 #include <IOKit/IODMAController.h>
111 #include <IOKit/IODMAEventSource.h>
112 #include <IOKit/IOEventSource.h>
113 #include <IOKit/IOFilterInterruptEventSource.h>
114 #include <IOKit/IOHibernatePrivate.h>
115 #include <IOKit/IOInterleavedMemoryDescriptor.h>
116 #include <IOKit/IOInterruptAccounting.h>
117 #include <IOKit/IOInterruptAccountingPrivate.h>
118 #include <IOKit/IOInterruptController.h>
119 #include <IOKit/IOInterruptEventSource.h>
120 #include <IOKit/IOInterrupts.h>
121 #include <IOKit/IOKernelReporters.h>
122 #include <IOKit/IOKernelReportStructs.h>
123 #include <IOKit/IOKitDebug.h>
124 #include <IOKit/IOKitDiagnosticsUserClient.h>
125 #include <IOKit/IOKitKeys.h>
126 #include <IOKit/IOKitKeysPrivate.h>
127 #include <IOKit/IOKitServer.h>
128 #include <IOKit/IOLib.h>
129 #include <IOKit/IOLocks.h>
130 #include <IOKit/IOLocksPrivate.h>
131 #include <IOKit/IOMapper.h>
132 #include <IOKit/IOMemoryCursor.h>
133 #include <IOKit/IOMemoryDescriptor.h>
134 #include <IOKit/IOMessage.h>
135 #include <IOKit/IOMultiMemoryDescriptor.h>
136 #include <IOKit/IONotifier.h>
137 #include <IOKit/IONVRAM.h>
138 #include <IOKit/IOPlatformExpert.h>
139 #include <IOKit/IOPolledInterface.h>
140 #include <IOKit/IORangeAllocator.h>
141 #include <IOKit/IORegistryEntry.h>
142 #include <IOKit/IOReportMacros.h>
143 #include <IOKit/IOReportTypes.h>
144 #include <IOKit/IOReturn.h>
145 #include <IOKit/IOService.h>
146 #include <IOKit/IOServicePM.h>
147 #include <IOKit/IOSharedDataQueue.h>
148 #include <IOKit/IOSharedLock.h>
149 #include <IOKit/IOStatistics.h>
150 #include <IOKit/IOStatisticsPrivate.h>
151 #include <IOKit/IOSubMemoryDescriptor.h>
152 #include <IOKit/IOSyncer.h>
153 #include <IOKit/IOTimerEventSource.h>
154 #include <IOKit/IOTimeStamp.h>
155 #include <IOKit/IOTypes.h>
156 #include <IOKit/IOUserClient.h>
157 #include <IOKit/IOWorkLoop.h>
158 #include <IOKit/nvram/IONVRAMController.h>
159 #include <IOKit/OSMessageNotification.h>
160 #include <IOKit/platform/AppleMacIO.h>
161 #include <IOKit/platform/AppleMacIODevice.h>
162 #include <IOKit/platform/AppleNMI.h>
163 #include <IOKit/platform/ApplePlatformExpert.h>
164 #include <IOKit/power/IOPwrController.h>
165 #include <IOKit/pwr_mgt/IOPM.h>
166 #include <IOKit/pwr_mgt/IOPMinformee.h>
167 #include <IOKit/pwr_mgt/IOPMinformeeList.h>
168 #include <IOKit/pwr_mgt/IOPMLibDefs.h>
169 #include <IOKit/pwr_mgt/IOPMlog.h>
170 #include <IOKit/pwr_mgt/IOPMPowerSource.h>
171 #include <IOKit/pwr_mgt/IOPMPowerSourceList.h>
172 #include <IOKit/pwr_mgt/IOPMpowerState.h>
173 #include <IOKit/pwr_mgt/IOPMPrivate.h>
174 #include <IOKit/pwr_mgt/IOPowerConnection.h>
175 #include <IOKit/pwr_mgt/RootDomain.h>
176 #include <IOKit/rtc/IORTCController.h>
177 #include <IOKit/system.h>
178 #include <IOKit/system_management/IOWatchDogTimer.h>
179 #include <math.h>
180 
181 #endif /* TEST_HEADERS */
182 
183 #include <vm/vm_kern_xnu.h>
184 #include <sys/sysctl.h>
185 #include <libkern/c++/OSData.h>
186 #include <IOKit/IOService.h>
187 #include <IOKit/IOUserClient.h>
188 #include "Tests.h"
189 
190 
191 #if DEVELOPMENT || DEBUG
192 
193 #include <IOKit/IOWorkLoop.h>
194 #include <IOKit/IOTimerEventSource.h>
195 #include <IOKit/IOInterruptEventSource.h>
196 #include <IOKit/IOCommandGate.h>
197 #include <IOKit/IOPlatformExpert.h>
198 #include <IOKit/IOSharedDataQueue.h>
199 #include <IOKit/IODataQueueShared.h>
200 #include <IOKit/IOServiceStateNotificationEventSource.h>
201 #include <IOKit/IOKitKeysPrivate.h>
202 #include <IOKit/IOKitServer.h>
203 #include <IOKit/IOBSD.h>
204 #include <IOKit/IODeviceTreeSupport.h>
205 #include <kern/ipc_kobject.h>
206 #include <libkern/Block.h>
207 #include <libkern/Block_private.h>
208 #include <libkern/c++/OSAllocation.h>
209 #include <libkern/c++/OSBoundedArray.h>
210 #include <libkern/c++/OSBoundedArrayRef.h>
211 #include <libkern/c++/OSBoundedPtr.h>
212 #include <libkern/c++/OSSharedPtr.h>
213 #include <os/cpp_util.h>
214 #include <DriverKit/IODataQueueDispatchSource.h>
215 #include <libkern/zlib.h>
216 
217 static uint64_t gIOWorkLoopTestDeadline;
218 
219 #if TEST_ZLIB
220 
221 static void *
TestZLib_alloc(void * __unused opaque,u_int items,u_int size)222 TestZLib_alloc(void * __unused opaque, u_int items, u_int size)
223 {
224 	kern_return_t kr;
225 	vm_offset_t result;
226 
227 	kr = kmem_alloc(kernel_map, &result,
228 	    round_page(items * size) + ptoa(2),
229 	    (kma_flags_t)
230 	    (KMA_NOFAIL | KMA_KSTACK | KMA_KOBJECT |
231 	    KMA_GUARD_FIRST | KMA_GUARD_LAST),
232 	    VM_KERN_MEMORY_DIAG);
233 
234 	assert(KERN_SUCCESS == kr);
235 
236 	return (void *)(uintptr_t) (result + ptoa(1));
237 }
238 
239 static void
TestZLib_free(void * __unused ref,void * ptr)240 TestZLib_free(void * __unused ref, void * ptr)
241 {
242 }
243 
244 static int
TestZLib(int newValue)245 TestZLib(int newValue)
246 {
247 	static const char reproData[] =
248 	    "AAABAACAADAAEAAFAAGAAHAAIAAJAAKAALAAMAANAAOAAPAAQAARAASAATAAUAAVA"
249 	    "AWAAXAAYAAZABBABCABDABEABFABGABHABIABJABKABLABMABNABOABPABQABRABS"
250 	    "ABTABUABVABWABXABYABZACBACCACDACEACFACGACHACIACJACKACLACMACNACOAC"
251 	    "PACQACRACSACTACUACVACWACXACYACZADBADCADDADEADFADGADHADIADJADKADLA"
252 	    "DMADNADOADPADQADRADSADTADUADVADWADXADYADZAEBAECAEDAEEAEFAEGAEHAEI"
253 	    "AEJAEKAELAEMAENAEOAEPAEQAERAESAETAEUAEVAEWAEXAEYAEZAFBAFCAFDAFEAF"
254 	    "FAFGAFHAFIAFJAFKAFLAFMAFNAFOAFPAFQAFRAFSAFTAFUAFVAFWAFXAFYAFZAGBA"
255 	    "GCAGDAGEAGFAGGAGHAGIAGJAGKAGLAGMAGNAGOAGPAGQAGRAGSAGTAGUAGVAGWAGX"
256 	    "AGYAGZAHBAHCAHDAHEAHFAHGAHHAHIAHJAHKAHLAHMAHNAHOAHPAHQAHRAHSAHTAH"
257 	    "UAHVAHWAHXAHYAHZAIBAICAIDAIEAIFAIGAIHAIIAIJAIKAILAIMAINAIOAIPAIQA"
258 	    "IRAISAITAIUAIVAIWAIXAIYAIZAJBAJCAJDAJEAJFAJGAJHAJIAJJAJKAJLAJMAJN"
259 	    "AJOAJPAJQAJRAJSAJTAJUAJVAJWAJXAJYAJZAKBAKCAKDAKEAKFAKGAKHAKIAKJAK"
260 	    "KAKLAKMAKNAKOAKPAKQAKRAKSAKTAKUAKVAKWAKXAKYAKZALBALCALDALEALFALGA"
261 	    "LHALIALJALKALLALMALNALOALPALQALRALSALTALUALVALWALXALYALZAMBAMCAMD"
262 	    "AMEAMFAMGAMHAMIAMJAMKAMLAMMAMNAMOAMPAMQAMRAMSAMTAMUAMVAMWAM"
263 	    "XAMYAM"
264 	    "ZANBANCANDANEANFANGANHANIANJANKANLANMANNANOANPANQANRANSANTANUANVA"
265 	    "NWANXANYANZAOBAOCAODAOEAOFAOGAOHAOIAOJAOKAOLAOMAONAOOAOPAOQAORAOS"
266 	    "AOTAOUAOVAOWAOXAOYAOZAPBAPCAPDAPEAPFAPGAPHAPIAPJAPKAPLAPMAPNAPOAP"
267 	    "PAPQAPRAPSAPTAPUAPVAPWAPXAPYAPZAQBAQCAQDAQEAQFAQGAQHAQIAQJAQKAQLA"
268 	    "QMAQNAQOAQPAQQAQRAQSAQTAQUAQVAQWAQXAQYAQZARBARCARDAREARFARGARHARI"
269 	    "ARJARKARLARMARNAROARPARQARRARSARTARUARVARWARXARYARZASBASCASDASEAS"
270 	    "FASGASHASIASJASKASLASMASNASOASPASQASRASSASTASUASVASWASXASYASZATBA"
271 	    "TCATDATEATFATGATHATIATJATKATLATMATNATOATPATQATRATSATTATUATVATWATX"
272 	    "ATYATZAUBAUCAUDAUEAUFAUGAUHAUIAUJAUKAULAUMAUNAUOAUPAUQAURAUSAUTAU"
273 	    "UAUVAUWAUXAUYAUZAVBAVCAVDAVEAVFAVGAVHAVIAVJAVKAVLAVMAVNAVOAVPAVQA"
274 	    "VRAVSAVTAVUAVVAVWAVXAVYAVZAWBAWCAWDAWEAWFAWGAWHAWIAWJAWKAWLAWMAWN"
275 	    "AWOAWPAWQAWRAWSAWTAWUAWVAWWAWXAWYAWZAXBAXCAXDAXEAXFAXGAXHAXIAXJAX"
276 	    "KAXLAXMAXNAXOAXPAXQAXRAXSAXTAXUAXVAXWAXXAXYAXZAYBAYCAYDAYEAYFAYGA"
277 	    "YHAYIAYJAYKAYLAYMAYNAYOAYPAYQAYRAYSAYTAYUAYVAYWAYXAYYAYZAZBAZCAZD"
278 	    "AZEAZFAZGAZHAZIAZJAZKAZLAZMAZNAZOAZPAZQAZRAZSAZTAZUAZVAZWAZXAZYAZ"
279 	    "ZBBBCBBDBBEBBFBBGBBHBBIBBJBBKBBLBBMBBNBBOBBPBBQBBRBBSBBTBBUBBVBBW"
280 	    "BBXBBYBBZBCCBCDBCEBCFBCGBCHBCIBCJBCKBCLBCMBCNBCOBCPBCQBCRBCSBCTBC"
281 	    "UBCVBCWBCXBCYBCZBDCBDDBDEBDFBDGBDHBDIBDJBDKBDLBDMBDNBDOBDPBDQBDRB"
282 	    "DSBDTBDUBDVBDWBDXBDYBDZBECBEDBEEBEFBEGBEHBEIBEJBEKBELBEMBENBEOBEP"
283 	    "BEQBERBESBETBEUBEVBEWBEXBEYBEZBFCBFDBFEBFFBFGBFHBFIBFJBFKBFLBFMBF"
284 	    "NBFOBFPBFQBFRBFSBFTBFUBFVBFWBFXBFYBFZBGCBGDBGEBGFBGGBGHBGIBGJBGKB"
285 	    "GLBGMBGNBGOBGPBGQBGRBGSBGTBGUBGVBGWBGXBGYBGZBHCBHDBHEBHFBHGBHHBHI"
286 	    "BHJBHKBHLBHMBHNBHOBHPBHQBHRBHSBHTBHUBHVBHWBHXBHYBHZBICBIDBIEBIFBI"
287 	    "GBIHBIIBIJBIKBILBIMBINBIOBIPBIQBIRBISBITBIUBIVBIWBIXBIYBIZBJCBJDB"
288 	    "JEBJFBJGBJHBJIBJJBJKBJLBJMBJNBJOBJPBJQBJRBJSBJTBJUBJVBJWBJXBJYBJZ"
289 	    "BKCBKDBKEBKFBKGBKHBKIBKJBKKBKLBKMBKNBKOBKPBKQBKRBKSBKTBKUBKVBKWBK"
290 	    "XBKYBKZBLCBLDBLEBLFBLGBLHBLIBLJBLKBLLBLMBLNBLOBLPBLQBLRBLSBLTBLUB"
291 	    "LVBLWBLXBLYBLZBMCBMDBMEBMFBMGBMHBMIBMJBMKBMLBMMBMNBMOBMPBMQBMRBMS"
292 	    "BMTBMUBMVBMWBMXBMYBMZBNCBNDBNEBNFBNGBNHBNIBNJBNKBNLBNMBNNBNOBNPBN"
293 	    "QBNRBNSBNTBNUBNVBNWBNXBNYBNZBOCBODBOEBOFBOGBOHBOIBOJBOKBOLBOMBONB"
294 	    "OOBOPBOQBORBOSBOTBOUBOVBOWBOXBOYBOZBPCBPDBPEBPFBPGBPHBPIBPJBPKBPL"
295 	    "BPMBPNBPOBPPBPQBPRBPSBPTBPUBPVBPWBPXBPYBPZBQCBQDBQEBQFBQGBQHBQIBQ"
296 	    "JBQKBQLBQMBQNBQOBQPBQQBQRBQSBQTBQUBQVBQWBQXBQYBQZBRCBRDBREBRFBRGB"
297 	    "RHBRIBRJBRKBRLBRMBRNBROBRPBRQBRRBRSBRTBRUBRVBRWBRXBRYBRZBSCBSDBSE"
298 	    "BSFBSGBSHBSIBSJBSKBSLBSMBSNBSOBSPBSQBSRBSSBSTBSUBSVBSWBSXBSYBSZBT"
299 	    "CBTDBTEBTFBTGBTHBTIBTJBTKBTLBTMBTNBTOBTPBTQBTRBTSBTTBTUBTVBTWBTXB"
300 	    "TYBTZBUCBUDBUEBUFBUGBUHBUIBUJBUKBULBUMBUNBUOBUPBUQBURBUSBUTBUUBUV"
301 	    "BUWBUXBUYBUZBVCBVDBVEBVFBVGBVHBVIBVJBVKBVLBVMBVNBVOBVPBVQBVRBVSBV"
302 	    "TBVUBVVBVWBVXBVYBVZBWCBWDBWEBWFBWGBWHBWIBWJBWKBWLBWMBWNBWOBWPBWQB"
303 	    "WRBWSBWTBWUBWVBWWBWXBWYBWZBXCBXDBXEBXFBXGBXHBXIBXJBXKBXLBXMBXNBXO"
304 	    "BXPBXQBXRBXSBXTBXUBXVBXWBXXBXYBXZBYCBYDBYEBYFBYGBYHBYIBYJBYKBYLBY"
305 	    "MBYNBYOBYPBYQBYRBYSBYTBYUBYVBYWBYXBYYBYZBZCBZDBZEBZFBZGBZHBZIBZJB"
306 	    "ZKBZLBZMBZNBZOBZPBZQBZRBZSBZTBZUBZVBZWBZXBZYBZZCCCDCCECCFCCGCCHCC"
307 	    "ICCJCCKCCLCCMCCNCCOCCPCCQCCRCCSCCTCCUCCVCCWCCXCCYCCZCDDCDECDFCDGC"
308 	    "DHCDICDJCDKCDLCDMCDNCDOCDPCDQCDRCDSCDTCDUCDVCDWCDXCDYCDZCEDCEECEF"
309 	    "CEGCEHCEICEJCEKCELCEMCENCEOCEPCEQCERCESCETCEUCEVCEWCEXCEYCEZCFDCF"
310 	    "ECFFCFGCFHCFICFJCFKCFLCFMCFNCFOCFPCFQCFRCFSCFTCFUCFVCFWCFXCFYCFZC"
311 	    "GDCGECGFCGGCGHCGICGJCGKCGLCGMCGNCGOCGPCGQCGRCGSCGTCGUCGVCGWCGXCGY"
312 	    "CGZCHDCHECHFCHGCHHCHICHJCHKCHLCHMCHNCHOCHPCHQCHRCHSCHTCHUCHVCHWCH"
313 	    "XCHYCHZCIDCIECIFCIGCIHCIICIJCIKCILCIMCINCIOCIPCIQCIRCISCITCIUCIVC"
314 	    "IWCIXCIYCIZCJDCJECJFCJGCJHCJICJJCJKCJLCJMCJNCJOCJPCJQCJRCJSCJTCJU"
315 	    "CJVCJWCJXCJYCJZCKDCKECKFCKGCKHCKICKJCKKCKLCKMCKNCKOCKPCKQCKRCKSCK"
316 	    "TCKUCKVCKWCKXCKYCKZCLDCLECLFCLGCLHCLICLJCLKCLLCLMCLNCLOCLPCLQCLRC"
317 	    "LSCLTCLUCLVCLWCLXCLYCLZCMDCMECMFCMGCMHCMICMJCMKCMLCMMCMNCMOCMPCMQ"
318 	    "CMRCMSCMTCMUCMVCMWCMXCMYCMZCNDCNECNFCNGCNHCNICNJCNKCNLCNMCNNCNOCN"
319 	    "PCNQCNRCNSCNTCNUCNVCNWCNXCNYCNZCODCOECOFCOGCOHCOICOJCOKCOLCOMCONC"
320 	    "OOCOPCOQCORCOSCOTCOUCOVCOWCOXCOYCOZCPDCPECPFCPGCPHCPICPJCPKCPLCPM"
321 	    "CPNCPOCPPCPQCPRCPSCPTCPUCPVCPWCPXCPYCPZCQDCQECQFCQGCQHCQICQJCQKCQ"
322 	    "LCQMCQNCQOCQPCQQCQRCQSCQTCQUCQVCQWCQXCQYCQZCRDCRECRFCRGCRHCRICRJC"
323 	    "RKCRLCRMCRNCROCRPCRQCRRCRSCRTCRUCRVCRWCRXCRYCRZCSDCSECSFCSGCSHCSI"
324 	    "CSJCSKCSLCSMCSNCSOCSPCSQCSRCSSCSTCSUCSVCSWCSXCSYCSZCTDCTECTFCTGCT"
325 	    "HCTICTJCTKCTLCTMCTNCTOCTPCTQCTRCTSCTTCTUCTVCTWCTXCTYCTZCUDCUECUFC"
326 	    "UGCUHCUICUJCUKCULCUMCUNCUOCUPCUQCURCUSCUTCUUCUVCUWCUXCUYCUZCVDCVE"
327 	    "CVFCVGCVHCVICVJCVKCVLCVMCVNCVOCVPCVQCVRCVSCVTCVUCVVCVWCVXCVYCVZCW"
328 	    "DCWECWFCWGCWHCWICWJCWKCWLCWMCWNCWOCWPCWQCWRCWSCWTCWUCWVCWWCWXCWYC"
329 	    "WZCXDCXECXFCXGCXHCXICXJCXKCXLCXMCXNCXOCXPCXQCXRCXSCXTCXUCXVCXWCXX"
330 	    "CXYCXZCYDCYECYFCYGCYHCYICYJCYKCYLCYMCYNCYOCYPCYQCYRCYSCYTCYUCYVCY"
331 	    "WCYXCYYCYZCZDCZECZFCZGCZHCZICZJCZKCZLCZMCZNCZOCZPCZQCZRCZSCZTCZUC"
332 	    "ZVCZWCZXCZYCZZDDDEDDFDDGDDHDDIDDJDDKDDLDDMDDNDDODDPDDQDDRDDSDDTDD"
333 	    "UDDVDDWDDXDDYDDZDEEDEFDEGDEHDEIDEJDEKDELDEMDENDEODEPDEQDERDESDETD"
334 	    "EUDEVDEWDEXDEYDEZDFEDFFDFGDFHDFIDFJDFKDFLDFMDFNDFODFPDFQDFRDFSDFT"
335 	    "DFUDFVDFWDFXDFYDFZDGEDGFDGGDGHDGIDGJDGKDGLDGMDGNDGODGPDGQDGRDGSDG"
336 	    "TDGUDGVDGWDGXDGYDGZDHEDHFDHGDHHDHIDHJDHKDHLDHMDHNDHODHPDHQDHRDHSD"
337 	    "HTDHUDHVDHWDHXDHYDHZDIEDIFDIGDIHDIIDIJDIKDILDIMDINDIODIPDIQDIRDIS"
338 	    "DITDIUDIVDIWDIXDIYDIZDJEDJFDJGDJHDJIDJJDJKDJLDJMDJNDJODJPDJQDJRDJ"
339 	    "SDJTDJUDJVDJWDJXDJYDJZDKEDKFDKGDKHDKIDKJDKKDKLDKMDKNDKODKPDKQDKRD"
340 	    "KSDKTDKUDKVDKWDKXDKYDKZDLEDLFDLGDLHDLIDLJDLKDLLDLMDLNDLODLPDLQDLR"
341 	    "DLSDLTDLUDLVDLWDLXDLYDLZDMEDMFDMGDMHDMIDMJDMKDMLDMMDMNDMODMPDMQDM"
342 	    "RDMSDMTDMUDMVDMWDMXDMYDMZDNEDNFDNGDNHDNIDNJDNKDNLDNMDNNDNODNPDNQD"
343 	    "NRDNSDNTDNUDNVDNWDNXDNYDNZDOEDOFDOGDOHDOIDOJDOKDOLDOMDONDOODOPDOQ"
344 	    "DORDOSDOTDOUDOVDOWDOXDOYDOZDPEDPFDPGDPHDPIDPJDPKDPLDPMDPNDPODPPDP"
345 	    "QDPRDPSDPTDPUDPVDPWDPXDPYDPZDQEDQFDQGDQHDQIDQJDQKDQLDQMDQNDQODQPD"
346 	    "QQDQRDQSDQTDQUDQVDQWDQXDQYDQZDREDRFDRGDRHDRIDRJDRKDRLDRMDRNDRODRP"
347 	    "DRQDRRDRSDRTDRUDRVDRWDRXDRYDRZDSEDSFDSGDSHDSIDSJDSKDSLDSMDSNDSODS"
348 	    "PDSQDSRDSSDSTDSUDSVDSWDSXDSYDSZDTEDTFDTGDTHDTIDTJDTKDTLDTMDTNDTOD"
349 	    "TPDTQDTRDTSDTTDTUDTVDTWDTXDTYDTZDUEDUFDUGDUHDUIDUJDUKDULDUMDUNDUO"
350 	    "DUPDUQDURDUSDUTDUUDUVDUWDUXDUYDUZDVEDVFDVGDVHDVIDVJDVKDVLDVMDVNDV"
351 	    "ODVPDVQDVRDVSDVTDVUDVVDVWDVXDVYDVZDWEDWFDWGDWHDWIDWJDWKDWLDWMDWND"
352 	    "WODWPDWQDWRDWSDWTDWUDWVDWWDWXDWYDWZDXEDXFDXGDXHDXIDXJDXKDXLDXMDXN"
353 	    "DXODXPDXQDXRDXSDXTDXUDXVDXWDXXDXYDXZDYEDYFDYGDYHDYIDYJDYKDYLDYMDY"
354 	    "NDYODYPDYQDYRDYSDYTDYUDYVDYWDYXDYYDYZDZEDZFDZGDZHDZIDZJDZKDZLDZMD"
355 	    "ZNDZODZPDZQDZRDZSDZTDZUDZVDZWDZXDZYDZZEEEFEEGEEHEEIEEJEEKEELEEMEE"
356 	    "NEEOEEPEEQEEREESEETEEUEEVEEWEEXEEYEEZEFFEFGEFHEFIEFJEFKEFLEFMEFNE"
357 	    "FOEFPEFQEFREFSEFTEFUEFVEFWEFXEFYEFZEGFEGGEGHEGIEGJEGKEGLEGMEGNEGO"
358 	    "EGPEGQEGREGSEGTEGUEGVEGWEGXEGYEGZEHFEHGEHHEHIEHJEHKEHLEHMEHNEHOEH"
359 	    "PEHQEHREHSEHTEHUEHVEHWEHXEHYEHZEIFEIGEIHEIIEIJEIKEILEIMEINEIOEIPE"
360 	    "IQEIREISEITEIUEIVEIWEIXEIYEIZEJFEJGEJHEJIEJJEJKEJLEJMEJNEJOEJPEJQ"
361 	    "EJREJSEJTEJUEJVEJWEJXEJYEJZEKFEKGEKHEKIEKJEKKEKLEKMEKNEKOEKPEKQEK"
362 	    "REKSEKTEKUEKVEKWEKXEKYEKZELFELGELHELIELJELKELLELMELNELOELPELQELRE"
363 	    "LSELTELUELVELWELXELYELZEMFEMGEMHEMIEMJEMKEMLEMMEMNEMOEMPEMQEMREMS"
364 	    "EMTEMUEMVEMWEMXEMYEMZENFENGENHENIENJENKENLENMENNENOENPENQENRENSEN"
365 	    "TENUENVENWENXENYENZEOFEOGEOHEOIEOJEOKEOLEOMEONEOOEOPEOQEOREOSEOTE"
366 	    "OUEOVEOWEOXEOYEOZEPFEPGEPHEPIEPJEPKEPLEPMEPNEPOEPPEPQEPREPSEPTEPU"
367 	    "EPVEPWEPXEPYEPZEQFEQGEQHEQIEQJEQKEQLEQMEQNEQOEQPEQQEQREQSEQTEQUEQ"
368 	    "VEQWEQXEQYEQZERFERGERHERIERJERKERLERMERNEROERPERQERRERSERTERUERVE"
369 	    "RWERXERYERZESFESGESHESIESJESKESLESMESNESOESPESQESRESSESTESUESVESW"
370 	    "ESXESYESZETFETGETHETIETJETKETLETMETNETOETPETQETRETSETTETUETVETWET"
371 	    "XETYETZEUFEUGEUHEUIEUJEUKEULEUMEUNEUOEUPEUQEUREUSEUTEUUEUVEUWEUXE"
372 	    "UYEUZEVFEVGEVHEVIEVJEVKEVLEVMEVNEVOEVPEVQEVREVSEVTEVUEVVEVWEVXEVY"
373 	    "EVZEWFEWGEWHEWIEWJEWKEWLEWMEWNEWOEWPEWQEWREWSEWTEWUEWVEWWEWXEWYEW"
374 	    "ZEXFEXGEXHEXIEXJEXKEXLEXMEXNEXOEXPEXQEXREXSEXTEXUEXVEXWEXXEXYEXZE"
375 	    "YFEYGEYHEYIEYJEYKEYLEYMEYNEYOEYPEYQEYREYSEYTEYUEYVEYWEYXEYYEYZEZF"
376 	    "EZGEZHEZIEZJEZKEZLEZMEZNEZOEZPEZQEZREZSEZTEZUEZVEZWEZXEZYEZZFFFGF"
377 	    "FHFFIFFJFFKFFLFFMFFNFFOFFPFFQFFRFFSFFTFFUFFVFFWFFXFFYFFZFGGFGHFGI"
378 	    "FGJFGKFGLFGMFGNFGOFGPFGQFGRFGSFGTFGUFGVFGWFGXFGYFGZFHGFHHFHIFHJFH"
379 	    "KFHLFHMFHNFHOFHPFHQFHRFHSFHTFHUFHVFHWFHXFHYFHZFIGFIHFIIFIJFIKFILF"
380 	    "IMFINFIOFIPFIQFIRFISFITFIUFIVFIWFIXFIYFIZFJGFJHFJIFJJFJKFJLFJMFJN"
381 	    "FJOFJPFJQFJRFJSFJTFJUFJVFJWFJXFJYFJZFKGFKHFKIFKJFKKFKLFKMFKNFKOFK"
382 	    "PFKQFKRFKSFKTFKUFKVFKWFKXFKYFKZFLGFLHFLIFLJFLKFLLFLMFLNFLOFLPFLQF"
383 	    "LRFLSFLTFLUFLVFLWFLXFLYFLZFMGFMHFMIFMJFMKFMLFMMFMNFMOFMPFMQFMRFMS"
384 	    "FMTFMUFMVFMWFMXFMYFMZFNGFNHFNIFNJFNKFNLFNMFNNFNOFNPFNQFNRFNSFNTFN"
385 	    "UFNVFNWFNXFNYFNZFOGFOHFOIFOJFOKFOLFOMFONFOOFOPFOQFORFOSFOTFOUFOVF"
386 	    "OWFOXFOYFOZFPGFPHFPIFPJFPKFPLFPMFPNFPOFPPFPQFPRFPSFPTFPUFPVFPWFPX"
387 	    "FPYFPZFQGFQHFQIFQJFQKFQLFQMFQNFQOFQPFQQFQRFQSFQTFQUFQVFQWFQXFQYFQ"
388 	    "ZFRGFRHFRIFRJFRKFRLFRMFRNFROFRPFRQFRRFRSFRTFRUFRVFRWFRXFRYFRZFSGF"
389 	    "SHFSIFSJFSKFSLFSMFSNFSOFSPFSQFSRFSSFSTFSUFSVFSWFSXFSYFSZFTGFTHFTI"
390 	    "FTJFTKFTLFTMFTNFTOFTPFTQFTRFTSFTTFTUFTVFTWFTXFTYFTZFUGFUHFUIFUJFU"
391 	    "KFULFUMFUNFUOFUPFUQFURFUSFUTFUUFUVFUWFUXFUYFUZFVGFVHFVIFVJFVKFVLF"
392 	    "VMFVNFVOFVPFVQFVRFVSFVTFVUFVVFVWFVXFVYFVZFWGFWHFWIFWJFWKFWLFWMFWN"
393 	    "FWOFWPFWQFWRFWSFWTFWUFWVFWWFWXFWYFWZFXGFXHFXIFXJFXKFXLFXMFXNFXOFX"
394 	    "PFXQFXRFXSFXTFXUFXVFXWFXXFXYFXZFYGFYHFYIFYJFYKFYLFYMFYNFYOFYPFYQF"
395 	    "YRFYSFYTFYUFYVFYWFYXFYYFYZFZGFZHFZIFZJFZKFZLFZMFZNFZOFZPFZQFZRFZS"
396 	    "FZTFZUFZVFZWFZXFZYFZZGGGHGGIGGJGGKGGLGGMGGNGGOGGPGGQGGRGGSGGTGGUG"
397 	    "GVGGWGGXGGYGGZGHHGHIGHJGHKGHLGHMGHNGHOGHPGHQGHRGHSGHTGHUGHVGHWGHX"
398 	    "GHYGHZGIHGIIGIJGIKGILGIMGINGIOGIPGIQGIRGISGITGIUGIVGIWGIXGIYGIZGJ"
399 	    "HGJIGJJGJKGJLGJMGJNGJOGJPGJQGJRGJSGJTGJUGJVGJWGJXGJYGJZGKHGKIGKJG"
400 	    "KKGKLGKMGKNGKOGKPGKQGKRGKSGKTGKUGKVGKWGKXGKYGKZGLHGLIGLJGLKGLLGLM"
401 	    "GLNGLOGLPGLQGLRGLSGLTGLUGLVGLWGLXGLYGLZGMHGMIGMJGMKGMLGMMGMNGMOGM"
402 	    "PGMQGMRGMSGMTGMUGMVGMWGMXGMYGMZGNHGNIGNJGNKGNLGNMGNNGNOGNPGNQGNRG"
403 	    "NSGNTGNUGNVGNWGNXGNYGNZGOHGOIGOJGOKGOLGOMGONGOOGOPGOQGORGOSGOTGOU"
404 	    "GOVGOWGOXGOYGOZGPHGPIGPJGPKGPLGPMGPNGPOGPPGPQGPRGPSGPTGPUGPVGPWGP"
405 	    "XGPYGPZGQHGQIGQJGQKGQLGQMGQNGQOGQPGQQGQRGQSGQTGQUGQVGQWGQXGQYGQZG"
406 	    "RHGRIGRJGRKGRLGRMGRNGROGRPGRQGRRGRSGRTGRUGRVGRWGRXGRYGRZGSHGSIGSJ"
407 	    "GSKGSLGSMGSNGSOGSPGSQGSRGSSGSTGSUGSVGSWGSXGSYGSZGTHGTIGTJGTKGTLGT"
408 	    "MGTNGTOGTPGTQGTRGTSGTTGTUGTVGTWGTXGTYGTZGUHGUIGUJGUKGULGUMGUNGUOG"
409 	    "UPGUQGURGUSGUTGUUGUVGUWGUXGUYGUZGVHGVIGVJGVKGVLGVMGVNGVOGVPGVQGVR"
410 	    "GVSGVTGVUGVVGVWGVXGVYGVZGWHGWIGWJGWKGWLGWMGWNGWOGWPGWQGWRGWSGWTGW"
411 	    "UGWVGWWGWXGWYGWZGXHGXIGXJGXKGXLGXMGXNGXOGXPGXQGXRGXSGXTGXUGXVGXWG"
412 	    "XXGXYGXZGYHGYIGYJGYKGYLGYMGYNGYOGYPGYQGYRGYSGYTGYUGYVGYWGYXGYYGYZ"
413 	    "GZHGZIGZJGZKGZLGZMGZNGZOGZPGZQGZRGZSGZTGZUGZVGZWGZXGZYGZZHHHIHHJH"
414 	    "HKHHLHHMHHNHHOHHPHHQHHRHHSHHTHHUHHVHHWHHXHHYHHZHIIHIJHIKHILHIMHIN"
415 	    "HIOHIPHIQHIRHISHITHIUHIVHIWHIXHIYHIZHJIHJJHJKHJLHJMHJNHJOHJPHJQHJ"
416 	    "RHJSHJTHJUHJVHJWHJXHJYHJZHKIHKJHKKHKLHKMHKNHKOHKPHKQHKRHKSHKTHKUH"
417 	    "KVHKWHKXHKYHKZHLIHLJHLKHLLHLMHLNHLOHLPHLQHLRHLSHLTHLUHLVHLWHLXHLY"
418 	    "HLZHMIHMJHMKHMLHMMHMNHMOHMPHMQHMRHMSHMTHMUHMVHMWHMXHMYHMZHNIHNJHN"
419 	    "KHNLHNMHNNHNOHNPHNQHNRHNSHNTHNUHNVHNWHNXHNYHNZHOIHOJHOKHOLHOMHONH"
420 	    "OOHOPHOQHORHOSHOTHOUHOVHOWHOXHOYHOZHPIHPJHPKHPLHPMHPNHPOHPPHPQHPR"
421 	    "HPSHPTHPUHPVHPWHPXHPYHPZHQIHQJHQKHQLHQMHQNHQOHQPHQQHQRHQSHQTHQUHQ"
422 	    "VHQWHQXHQYHQZHRIHRJHRKHRLHRMHRNHROHRPHRQHRRHRSHRTHRUHRVHRWHRXHRYH"
423 	    "RZHSIHSJHSKHSLHSMHSNHSOHSPHSQHSRHSSHSTHSUHSVHSWHSXHSYHSZHTIHTJHTK"
424 	    "HTLHTMHTNHTOHTPHTQHTRHTSHTTHTUHTVHTWHTXHTYHTZHUIHUJHUKHULHUMHUNHU"
425 	    "OHUPHUQHURHUSHUTHUUHUVHUWHUXHUYHUZHVIHVJHVKHVLHVMHVNHVOHVPHVQHVRH"
426 	    "VSHVTHVUHVVHVWHVXHVYHVZHWIHWJHWKHWLHWMHWNHWOHWPHWQHWRHWSHWTHWUHWV"
427 	    "HWWHWXHWYHWZHXIHXJHXKHXLHXMHXNHXOHXPHXQHXRHXSHXTHXUHXVHXWHXXHXYHX"
428 	    "ZHYIHYJHYKHYLHYMHYNHYOHYPHYQHYRHYSHYTHYUHYVHYWHYXHYYHYZHZIHZJHZKH"
429 	    "ZLHZMHZNHZOHZPHZQHZRHZSHZTHZUHZVHZWHZXHZYHZZIIIJIIKIILIIMIINIIOII"
430 	    "PIIQIIRIISIITIIUIIVIIWIIXIIYIIZIJJIJKIJLIJMIJNIJOIJPIJQIJRIJSIJTI"
431 	    "JUIJVIJWIJXIJYIJZIKJIKKIKLIKMIKNIKOIKPIKQIKRIKSIKTIKUIKVIKWIKXIKY"
432 	    "IKZILJILKILLILMILNILOILPILQILRILSILTILUILVILWILXILYILZIMJIMKIMLIM"
433 	    "MIMNIMOIMPIMQIMRIMSIMTIMUIMVIMWIMXIMYIMZINJINKINLINMINNINOINPINQI"
434 	    "NRINSINTINUINVINWINXINYINZIOJIOKIOLIOMIONIOOIOPIOQIORIOSIOTIOUIOV"
435 	    "IOWIOXIOYIOZIPJIPKIPLIPMIPNIPOIPPIPQIPRIPSIPTIPUIPVIPWIPXIPYIPZIQ"
436 	    "JIQKIQLIQMIQNIQOIQPIQQIQRIQSIQTIQUIQVIQWIQXIQYIQZIRJIRKIRLIRMIRNI"
437 	    "ROIRPIRQIRRIRSIRTIRUIRVIRWIRXIRYIRZISJISKISLISMISNISOISPISQISRISS"
438 	    "ISTISUISVISWISXISYISZITJITKITLITMITNITOITPITQITRITSITTITUITVITWIT"
439 	    "XITYITZIUJIUKIULIUMIUNIUOIUPIUQIURIUSIUTIUUIUVIUWIUXIUYIUZIVJIVKI"
440 	    "VLIVMIVNIVOIVPIVQIVRIVSIVTIVUIVVIVWIVXIVYIVZIWJIWKIWLIWMIWNIWOIWP"
441 	    "IWQIWRIWSIWTIWUIWVIWWIWXIWYIWZIXJIXKIXLIXMIXNIXOIXPIXQIXRIXSIXTIX"
442 	    "UIXVIXWIXXIXYIXZIYJIYKIYLIYMIYNIYOIYPIYQIYRIYSIYTIYUIYVIYWIYXIYYI"
443 	    "YZIZJIZKIZLIZMIZNIZOIZPIZQIZRIZSIZTIZUIZVIZWIZXIZYIZZJJJKJJLJJMJJ"
444 	    "NJJOJJPJJQJJRJJSJJTJJUJJVJJWJJXJJYJJZJKKJKLJKMJKNJKOJKPJKQJKRJKSJ"
445 	    "KTJKUJKVJKWJKXJKYJKZJLKJLLJLMJLNJLOJLPJLQJLRJLSJLTJLUJLVJLWJLXJLY"
446 	    "JLZJMKJMLJMMJMNJMOJMPJMQJMRJMSJMTJMUJMVJMWJMXJMYJMZJNKJNLJNMJNNJN"
447 	    "OJNPJNQJNRJNSJNTJNUJNVJNWJNXJNYJNZJOKJOLJOMJONJOOJOPJOQJORJOSJOTJ"
448 	    "OUJOVJOWJOXJOYJOZJPKJPLJPMJPNJPOJPPJPQJPRJPSJPTJPUJPVJPWJPXJPYJPZ"
449 	    "JQKJQLJQMJQNJQOJQPJQQJQRJQSJQTJQUJQVJQWJQXJQYJQZJRKJRLJRMJRNJROJR"
450 	    "PJRQJRRJRSJRTJRUJRVJRWJRXJRYJRZJSKJSLJSMJSNJSOJSPJSQJSRJSSJSTJSUJ"
451 	    "SVJSWJSXJSYJSZJTKJTLJTMJTNJTOJTPJTQJTRJTSJTTJTUJTVJTWJTXJTYJTZJUK"
452 	    "JULJUMJUNJUOJUPJUQJURJUSJUTJUUJUVJUWJUXJUYJUZJVKJVLJVMJVNJVOJVPJV"
453 	    "QJVRJVSJVTJVUJVVJVWJVXJVYJVZJWKJWLJWMJWNJWOJWPJWQJWRJWSJWTJWUJWVJ"
454 	    "WWJWXJWYJWZJXKJXLJXMJXNJXOJXPJXQJXRJXSJXTJXUJXVJXWJXXJXYJXZJYKJYL"
455 	    "JYMJYNJYOJYPJYQJYRJYSJYTJYUJYVJYWJYXJYYJYZJZKJZLJZMJZNJZOJZPJZQJZ"
456 	    "RJZSJZTJZUJZVJZWJZXJZYJZZKKKLKKMKKNKKOKKPKKQKKRKKSKKTKKUKKVKKWKKX"
457 	    "KKYKKZKLLKLMKLNKLOKLPKLQKLRKLSKLTKLUKLVKLWKLXKLYKLZKMLKMMKMNKMOKM"
458 	    "PKMQKMRKMSKMTKMUKMVKMWKMXKMYKMZKNLKNMKNNKNOKNPKNQKNRKNSKNTKNUKNVK"
459 	    "NWKNXKNYKNZKOLKOMKONKOOKOPKOQKORKOSKOTKOUKOVKOWKOXKOYKOZKPLKPMKPN"
460 	    "KPOKPPKPQKPRKPSKPTKPUKPVKPWKPXKPYKPZKQLKQMKQNKQOKQPKQQKQRKQSKQTKQ"
461 	    "UKQVKQWKQXKQYKQZKRLKRMKRNKROKRPKRQKRRKRSKRTKRUKRVKRWKRXKRYKRZKSLK"
462 	    "SMKSNKSOKSPKSQKSRKSSKSTKSUKSVKSWKSXKSYKSZKTLKTMKTNKTOKTPKTQKTRKTS"
463 	    "KTTKTUKTVKTWKTXKTYKTZKULKUMKUNKUOKUPKUQKURKUSKUTKUUKUVKUWKUXKUYKU"
464 	    "ZKVLKVMKVNKVOKVPKVQKVRKVSKVTKVUKVVKVWKVXKVYKVZKWLKWMKWNKWOKWPKWQK"
465 	    "WRKWSKWTKWUKWVKWWKWXKWYKWZKXLKXMKXNKXOKXPKXQKXRKXSKXTKXUKXVKXWKXX"
466 	    "KXYKXZKYLKYMKYNKYOKYPKYQKYRKYSKYTKYUKYVKYWKYXKYYKYZKZLKZMKZNKZOKZ"
467 	    "PKZQKZRKZSKZTKZUKZVKZWKZXKZYKZZLLLMLLNLLOLLPLLQLLRLLSLLTLLULLVLLW"
468 	    "LLXLLYLLZLMMLMNLMOLMPLMQLMRLMSLMTLMULMVLMWLMXLMYLMZLNMLNNLNOLNPLN"
469 	    "QLNRLNSLNTLNULNVLNWLNXLNYLNZLOMLONLOOLOPLOQLORLOSLOTLOULOVLOWLOXL"
470 	    "OYLOZLPMLPNLPOLPPLPQLPRLPSLPTLPULPVLPWLPXLPYLPZLQMLQNLQOLQPLQQLQR"
471 	    "LQSLQTLQULQVLQWLQXLQYLQZLRMLRNLROLRPLRQLRRLRSLRTLRULRVLRWLRXLRYLR"
472 	    "ZLSMLSNLSOLSPLSQLSRLSSLSTLSULSVLSWLSXLSYLSZLTMLTNLTOLTPLTQLTRLTSL"
473 	    "TTLTULTVLTWLTXLTYLTZLUMLUNLUOLUPLUQLURLUSLUTLUULUVLUWLUXLUYLUZLVM"
474 	    "LVNLVOLVPLVQLVRLVSLVTLVULVVLVWLVXLVYLVZLWMLWNLWOLWPLWQLWRLWSLWTLW"
475 	    "ULWVLWWLWXLWYLWZLXMLXNLXOLXPLXQLXRLXSLXTLXULXVLXWLXXLXYLXZLYMLYNL"
476 	    "YOLYPLYQLYRLYSLYTLYULYVLYWLYXLYYLYZLZMLZNLZOLZPLZQLZRLZSLZTLZULZV"
477 	    "LZWLZXLZYLZZMMMNMMOMMPMMQMMRMMSMMTMMUMMVMMWMMXMMYMMZMNNMNOMNPMNQM"
478 	    "NRMNSMNTMNUMNVMNWMNXMNYMNZMONMOOMOPMOQMORMOSMOTMOUMOVMOWMOXMOYMOZ"
479 	    "MPNMPOMPPMPQMPRMPSMPTMPUMPVMPWMPXMPYMPZMQNMQOMQPMQQMQRMQSMQTMQUMQ"
480 	    "VMQWMQXMQYMQZMRNMROMRPMRQMRRMRSMRTMRUMRVMRWMRXMRYMRZMSNMSOMSPMSQM"
481 	    "SRMSSMSTMSUMSVMSWMSXMSYMSZMTNMTOMTPMTQMTRMTSMTTMTUMTVMTWMTX"
482 	    "MTYMTZ"
483 	    "MUNMUOMUPMUQMURMUSMUTMUUMUVMUWMUXMUYMUZMVNMVOMVPMVQMVRMVSMVTMVUMV"
484 	    "VMVWMVXMVYMVZMWNMWOMWPMWQMWRMWSMWTMWUMWVMWWMWXMWYMWZMXNMXOMXPMXQM"
485 	    "XRMXSMXTMXUMXVMXWMXXMXYMXZMYNMYOMYPMYQMYRMYSMYTMYUMYVMYWMYXMYYMYZ"
486 	    "MZNMZOMZPMZQMZRMZSMZTMZUMZVMZWMZXMZYMZZNNNONNPNNQNNRNNSNNTNNUNNVN"
487 	    "NWNNXNNYNNZNOONOPNOQNORNOSNOTNOUNOVNOWNOXNOYNOZNPONPPNPQNPRNPSNPT"
488 	    "NPUNPVNPWNPXNPYNPZNQONQPNQQNQRNQSNQTNQUNQVNQWNQXNQYNQZNRONRPNRQNR"
489 	    "RNRSNRTNRUNRVNRWNRXNRYNRZNSONSPNSQNSRNSSNSTNSUNSVNSWNSXNSYNSZNTON"
490 	    "TPNTQNTRNTSNTTNTUNTVNTWNTXNTYNTZNUONUPNUQNURNUSNUTNUUNUVNUWNUXNUY"
491 	    "NUZNVONVPNVQNVRNVSNVTNVUNVVNVWNVXNVYNVZNWONWPNWQNWRNWSNWTNWUNWVNW"
492 	    "WNWXNWYNWZNXONXPNXQNXRNXSNXTNXUNXVNXWNXXNXYNXZNYONYPNYQNYRNYSNYTN"
493 	    "YUNYVNYWNYXNYYNYZNZONZPNZQNZRNZSNZTNZUNZVNZWNZXNZYNZZOOOPOOQOOROO"
494 	    "SOOTOOUOOVOOWOOXOOYOOZOPPOPQOPROPSOPTOPUOPVOPWOPXOPYOPZOQPOQQOQRO"
495 	    "QSOQTOQUOQVOQWOQXOQYOQZORPORQORRORSORTORUORVORWORXORYORZOSPOSQOSR"
496 	    "OSSOSTOSUOSVOSWOSXOSYOSZOTPOTQOTROTSOTTOTUOTVOTWOTXOTYOTZOUPOUQOU"
497 	    "ROUSOUTOUUOUVOUWOUXOUYOUZOVPOVQOVROVSOVTOVUOVVOVWOVXOVYOVZOWPOWQO"
498 	    "WROWSOWTOWUOWVOWWOWXOWYOWZOXPOXQOXROXSOXTOXUOXVOXWOXXOXYOXZOYPOYQ"
499 	    "OYROYSOYTOYUOYVOYWOYXOYYOYZOZPOZQOZROZSOZTOZUOZVOZWOZXOZYOZZPPPQP"
500 	    "PRPPSPPTPPUPPVPPWPPXPPYPPZPQQPQRPQSPQTPQUPQVPQWPQXPQYPQZPRQPRRPRS"
501 	    "PRTPRUPRVPRWPRXPRYPRZPSQPSRPSSPSTPSUPSVPSWPSXPSYPSZPTQPTRPTSPTTPT"
502 	    "UPTVTABUABVABWABXABYABZACBACCACDACEACFACGACHACIACJACKACLACMACNACO"
503 	    "ACPACQACRACSACTACUACVACWACXACYACZADBADCADDADEADFADGADHADIADJADKAD"
504 	    "LADMADAAABAACAADAAEAAFAAGAAHAAIAAJAAKAALAAMAANAAOAAPAAQAARAASAATA"
505 	    "AUAAVAAWAAXAAYAAZABBABCABDABEABFABGABHABIABJABKABLABMABNABOABPABQ"
506 	    "ABRABSABHAFIAFJAFKAFLAFMAFNAFOAFPAFQAFRAFSAFTAFUAFVAFWAFXAFYAFZAG"
507 	    "BAGCAGDAGEAGFAGGAGHAGIAGJAGKAGLAGMAGNAGOAGPAGQAGRAGSAGTAGUAGVAGWA"
508 	    "GXAGYAGZAHNADOADPADQADRADSADTADUADVADWADXADYADZAEBAECAEDAEEAEFAEG"
509 	    "AEHAEIAEJAEKAELAEMAENAEOAEPAEQAERAESAETAEUAEVAEWAEXAEYAEZAFBAFCAF"
510 	    "DAFEAFFAFGAFUAIVAIWAIXAIYAIZAJBAJCAJDAJEAJFAJGAJHAJIAJJAJKAJLAJMA"
511 	    "JNAJOAJPAJQAJRAJSAJTAJUAJVAJWAJXAJYAJZAKBAKCAKDAKEAKFAKGAKHAKIAKJ"
512 	    "AKKAKLAKMAKNAKBAHCAHDAHEAHFAHGAHHAHIAHJAHKAHLAHMAHNAHOAHPAHQAHRAH"
513 	    "SAHTAHUAHVAHWAHXAHYAHZAIBAICAIDAIEAIFAIGAIHAIIAIJAIKAILAIMAINAIOA"
514 	    "IPAIQAIRAISAITAIIAMJAMKAMLAMMAMNAMOAMPAMQAMRAMSAMTAMUAMVAMWAM"
515 	    "XAMY"
516 	    "AMZANBANCANDANEANFANGANHANIANJANKANLANMANNANOANPANQANRANSANTANUAN"
517 	    "VANWANXANYANZAOBAOOAKPAKQAKRAKSAKTAKUAKVAKWAKXAKYAKZALBALCALDALEA"
518 	    "LFALGALHALIALJALKALLALMALNALOALPALQALRALSALTALUALVALWALXALYALZAMB"
519 	    "AMCAMDAMEAMFAMGAMHAMVAPWAPXAPYAPZAQBAQCAQDAQEAQFAQGAQHAQIAQJAQKAQ"
520 	    "LAQMAQNAQOAQPAQQAQRAQSAQTAQUAQVAQWAQXAQYAQZARBARCARDAREARFARGARHA"
521 	    "RIARJARKARLARMARNAROARCAODAOEAOFAOGAOHAOIAOJAOKAOLAOMAONAOOAOPAOQ"
522 	    "AORAOSAOTAOUAOVAOWAOXAOYAOZAPBAPCAPDAPEAPFAPGAPHAPIAPJAPKAPLAPMAP"
523 	    "NAPOAPPAPQAPRAPSAPTAPUAPJATKATLATMATNATOATPATQATRATSATTATUATVATWA"
524 	    "TXATYATZAUBAUCAUDAUEAUFAUGAUHAUIAUJAUKAULAUMAUNAUOAUPAUQAURAUSAUT"
525 	    "AUUAUVAUWAUXAUYAUZAVBAVCAVPARQARRARSARTARUARVARWARXARYARZASBASCAS"
526 	    "DASEASFASGASHASIASJASKASLASMASNASOASPASQASRASSASTASUASVASWASXASYA"
527 	    "SZATBATCATDATEATFATGATHATIATWAWXAWYAWZAXBAXCAXDAXEAXFAXGAXHAXIAXJ"
528 	    "AXKAXLAXMAXNAXOAXPAXQAXRAXSAXTAXUAXVAXWAXXAXYAXZAYBAYCAYDAYEAYFAY"
529 	    "GAYHAYIAYJAYKAYLAYMAYNAYOAYPAYDAVEAVFAVGAVHAVIAVJAVKAVLAVMAVNAVOA"
530 	    "VPAVQAVRAVSAVTAVUAVVAVWAVXAVYAVZAWBAWCAWDAWEAWFAWGAWHAWIAWJAWKAWL"
531 	    "AWMAWNAWOAWPAWQAWRAWSAWTAWUAWVAWBLBBMBBNBBOBBPBBQBBRBBSBBTBBUBBVB"
532 	    "BWBBXBBYBBZBCCBCDBCEBCFBCGBCHBCIBCJBCKBCLBCMBCNBCOBCPBCQBCRBCSBCT"
533 	    "BCUBCVBCWBCXBCYBCZBDCBDDBDEBDFBDGBQAYRAYSAYTAYUAYVAYWAYXAYYAYZAZB"
534 	    "AZCAZDAZEAZFAZGAZHAZIAZJAZKAZLAZMAZNAZOAZPAZQAZRAZSAZTAZUAZVAZWAZ"
535 	    "XAZYAZZBBBCBBDBBEBBFBBGBBHBBIBBJBBKBFDBFEBFFBFGBFHBFIBFJBFKBFLBFM"
536 	    "BFNBFOBFPBFQBFRBFSBFTBFUBFVBFWBFXBFYBFZBGCBGDBGEBGFBGGBGHBGIBGJBG"
537 	    "KBGLBGMBGNBGOBGPBGQBGRBGSBGTBGUBGVBGWBDHBDIBDJBDKBDLBDMBDNBDOBDPB"
538 	    "DQBDRBDSBDTBDUBDVBDWBDXBDYBDZBECBEDBEEBEFBEGBEHBEIBEJBEKBELBEMBEN"
539 	    "BEOBEPBEQBERBESBETBEUBEVBEWBEXBEYBEZBFCBITBIUBIVBIWBIXBIYBIZBJCBJ"
540 	    "DBJEBJFBJGBJHBJIBJJBJKBJLBJMBJNBJOBJPBJQBJRBJSBJTBJUBJVBJWBJXBJYB"
541 	    "JZBKCBKDBKEBKFBKGBKHBKIBKJBKKBKLBKMBKNBKOBGXBGYBGZBHCBHDBHEBHFBHG"
542 	    "BHHBHIBHJBHKBHLBHMBHNBHOBHPBHQBHRBHSBHTBHUBHVBHWBHXBHYBHZBICBIDBI"
543 	    "EBIFBIGBIHBIIBIJBIKBILBIMBINBIOBIPBIQBIRBISBMLBMMBMNBMOBMPBMQBMRB"
544 	    "MSBMTBMUBMVBMWBMXBMYBMZBNCBNDBNEBNFBNGBNHBNIBNJBNKBNLBNMBNNBNOBNP"
545 	    "BNQBNRBNSBNTBNUBNVBNWBNXBNYBNZBOCBODBOEBOFBOGBKPBKQBKRBKSBKTBKUBK"
546 	    "VBKWBKXBKYBKZBLCBLDBLEBLFBLGBLHBLIBLJBLKBLLBLMBLNBLOBLPBLQBLRBLSB"
547 	    "LTBLUBLVBLWBLXBLYBLZBMCBMDBMEBMFBMGBMHBMIBMJBMKBQDBQEBQFBQGBQHBQI"
548 	    "BQJBQKBQLBQMBQNBQOBQPBQQBQRBQSBQTBQUBQVBQWBQXBQYBQZBRCBRDBREBRFBR"
549 	    "GBRHBRIBRJBRKBRLBRMBRNBROBRPBRQBRRBRSBRTBRUBRVBRWBOHBOIBOJBOKBOLB"
550 	    "OMBONBOOBOPBOQBORBOSBOTBOUBOVBOWBOXBOYBOZBPCBPDBPEBPFBPGBPHBPIBPJ"
551 	    "BPKBPLBPMBPNBPOBPPBPQBPRBPSBPTBPUBPVBPWBPXBPYBPZBQCBTTBTUBTVBTWBT"
552 	    "XBTYBTZBUCBUDBUEBUFBUGBUHBUIBUJBUKBULBUMBUNBUOBUPBUQBURBUSBUTBUUB"
553 	    "UVBUWBUXBUYBUZBVCBVDBVEBVFBVGBVHBVIBVJBVKBVLBVMBVNBVOBRXBRYBRZBSC"
554 	    "BSDBSEBSFBSGBSHBSIBSJBSKBSLBSMBSNBSOBSPBSQBSRBSSBSTBSUBSVBSWBSXBS"
555 	    "YBSZBTCBTDBTEBTFBTGBTHBTIBTJBTKBTLBTMBTNBTOBTPBTQBTRBTSBXLBXMBXNB"
556 	    "XOBXPBXQBXRBXSBXTBXUBXVBXWBXXBXYBXZBYCBYDBYEBYFBYGBYHBYIBYJBYKBYL"
557 	    "BYMBYNBYOBYPBYQBYRBYSBYTBYUBYVBYWBYXBYYBYZBZCBZDBZEBZFBZGBVPBVQBV"
558 	    "RBVSBVTBVUBVVBVWBVXBVYBVZBWCBWDBWEBWFBWGBWHBWIBWJBWKBWLBWMBWNBWOB"
559 	    "WPBWQBWRBWSBWTBWUBWVBWWBWXBWYBWZBXCBXDBXEBXFBXGBXHBXIBXJBXKBCDFCD"
560 	    "GCDHCDICDJCDKCDLCDMCDNCDOCDPCDQCDRCDSCDTCDUCDVCDWCDXCDYCDZCEDCEEC"
561 	    "EFCEGCEHCEICEJCEKCELCEMCENCEOCEPCEQCERCESCETCEUCEVCEWCEXCEYCEZZHB"
562 	    "ZIBZJBZKBZLBZMBZNBZOBZPBZQBZRBZSBZTBZUBZVBZWBZXBZYBZZCCCDCCECCFCC"
563 	    "GCCHCCICCJCCKCCLCCMCCNCCOCCPCCQCCRCCSCCTCCUCCVCCWCCXCCYCCZCDDCDEC"
564 	    "GYCGZCHDCHECHFCHGCHHCHICHJCHKCHLCHMCHNCHOCHPCHQCHRCHSCHTCHUCHVCHW"
565 	    "CHXCHYCHZCIDCIECIFCIGCIHCIICIJCIKCILCIMCINCIOCIPCIQCIRCISCITCIUCI"
566 	    "VCFDCFECFFCFGCFHCFICFJCFKCFLCFMCFNCFOCFPCFQCFRCFSCFTCFUCFVCFWCFXC"
567 	    "FYCFZCGDCGECGFCGGCGHCGICGJCGKCGLCGMCGNCGOCGPCGQCGRCGSCGTCGUCGVCGW"
568 	    "CGXCKUCKVCKWCKXCKYCKZCLDCLECLFCLGCLHCLICLJCLKCLLCLMCLNCLOCLPCLQCL"
569 	    "RCLSCLTCLUCLVCLWCLXCLYCLZCMDCMECMFCMGCMHCMICMJCMKCMLCMMCMNCMOCMPC"
570 	    "MQCMRCIWCIXCIYCIZCJDCJECJFCJGCJHCJICJJCJKCJLCJMCJNCJOCJPCJQCJRCJS"
571 	    "CJTCJUCJVCJWCJXCJYCJZCKDCKECKFCKGCKHCKICKJCKKCKLCKMCKNCKOCKPCKQCK"
572 	    "RCKSCKTCOQCORCOSCOTCOUCOVCOWCOXCOYCOZCPDCPECPFCPGCPHCPICPJCPKCPLC"
573 	    "PMCPNCPOCPPCPQCPRCPSCPTCPUCPVCPWCPXCPYCPZCQDCQECQFCQGCQHCQICQJCQK"
574 	    "CQLCQMCQNCMSCMTCMUCMVCMWCMXCMYCMZCNDCNECNFCNGCNHCNICNJCNKCNLCNMCN"
575 	    "NCNOCNPCNQCNRCNSCNTCNUCNVCNWCNXCNYCNZCODCOECOFCOGCOHCOICOJCOKCOLC"
576 	    "OMCONCOOCOPCSMCSNCSOCSPCSQCSRCSSCSTCSUCSVCSWCSXCSYCSZCTDCTECTFCTG"
577 	    "CTHCTICTJCTKCTLCTMCTNCTOCTPCTQCTRCTSCTTCTUCTVCTWCTXCTYCTZCUDCUECU"
578 	    "FCUGCUHCUICUJCQOCQPCQQCQRCQSCQTCQUCQVCQWCQXCQYCQZCRDCRECRFCRGCRHC"
579 	    "RICRJCRKCRLCRMCRNCROCRPCRQCRRCRSCRTCRUCRVCRWCRXCRYCRZCSDCSECSFCSG"
580 	    "CSHCSICSJCSKCSLCWICWJCWKCWLCWMCWNCWOCWPCWQCWRCWSCWTCWUCWVCWWCWXCW"
581 	    "YCWZCXDCXECXFCXGCXHCXICXJCXKCXLCXMCXNCXOCXPCXQCXRCXSCXTCXUCXVCXWC"
582 	    "XXCXYCXZCYDCYECYFCUKCULCUMCUNCUOCUPCUQCURCUSCUTCUUCUVCUWCUXCUYCUZ"
583 	    "CVDCVECVFCVGCVHCVICVJCVKCVLCVMCVNCVOCVPCVQCVRCVSCVTCVUCVVCVWCVXCV"
584 	    "YCVZCWDCWECWFCWGCWHEDDFDDGDDHDDIDDJDDKDDLDDMDDNDDODDPDDQDDRDDSDDT"
585 	    "DDUDDVDDWDDXDDYDDZDEEDEFDEGDEHDEIDEJDEKDELDEMDENDEODEPDEQDERDESDE"
586 	    "TDEUDEVDEWDEXDEYDEZDFCYGCYHCYICYJCYKCYLCYMCYNCYOCYPCYQCYRCYSCYTCY"
587 	    "UCYVCYWCYXCYYCYZCZDCZECZFCZGCZHCZICZJCZKCZLCZMCZNCZOCZPCZQCZRCZSC"
588 	    "ZTCZUCZVCZWCZXCZYCZZDDDEDHFDHGDHHDHIDHJDHKDHLDHMDHNDHODHPDHQDHRDH"
589 	    "SDHTDHUDHVDHWDHXDHYDHZDIEDIFDIGDIHDIIDIJDIKDILDIMDINDIODIPDIQDIRD"
590 	    "ISDITDIUDIVDIWDIXDIYDIZDJEDFFDFGDFHDFIDFJDFKDFLDFMDFNDFODFPDFQDFR"
591 	    "DFSDFTDFUDFVDFWDFXDFYDFZDGEDGFDGGDGHDGIDGJDGKDGLDGMDGNDGODGPDGQDG"
592 	    "RDGSDGTDGUDGVDGWDGXDGYDGZDHEDLFDLGDLHDLIDLJDLKDLLDLMDLNDLODLPDLQD"
593 	    "LRDLSDLTDLUDLVDLWDLXDLYDLZDMEDMFDMGDMHDMIDMJDMKDMLDMMDMNDMODMPDMQ"
594 	    "DMRDMSDMTDMUDMVDMWDMXDMYDMZDNEDJFDJGDJHDJIDJJDJKDJLDJMDJNDJODJPDJ"
595 	    "QDJRDJSDJTDJUDJVDJWDJXDJYDJZDKEDKFDKGDKHDKIDKJDKKDKLDKMDKNDKODKPD"
596 	    "KQDKRDKSDKTDKUDKVDKWDKXDKYDKZDLEDPFDPGDPHDPIDPJDPKDPLDPMDPNDPODPP"
597 	    "DPQDPRDPSDPTDPUDPVDPWDPXDPYDPZDQEDQFDQGDQHDQIDQJDQKDQLDQMDQNDQODQ"
598 	    "PDQQDQRDQSDQTDQUDQVDQWDQXDQYDQZDREDNFDNGDNHDNIDNJDNKDNLDNMDNNDNOD"
599 	    "NPDNQDNRDNSDNTDNUDNVDNWDNXDNYDNZDOEDOFDOGDOHDOIDOJDOKDOLDOMDONDOO"
600 	    "DOPDOQDORDOSDOTDOUDOVDOWDOXDOYDOZDPEDTFDTGDTHDTIDTJDTKDTLDTMDTNDT"
601 	    "ODTPDTQDTRDTSDTTDTUDTVDTWDTXDTYDTZDUEDUFDUGDUHDUIDUJDUKDULDUMDUND"
602 	    "UODUPDUQDURDUSDUTDUUDUVDUWDUXDUYDUZDVEDRFDRGDRHDRIDRJDRKDRLDRMDRN"
603 	    "DRODRPDRQDRRDRSDRTDRUDRVDRWDRXDRYDRZDSEDSFDSGDSHDSIDSJDSKDSLDSMDS"
604 	    "NDSODSPDSQDSRDSSDSTDSUDSVDSWDSXDSYDSZDTEDXFDXGDXHDXIDXJDXKDXLDXMD"
605 	    "XNDXODXPDXQDXRDXSDXTDXUDXVDXWDXXDXYDXZDYEDYFDYGDYHDYIDYJDYKDYLDYM"
606 	    "DYNDYODYPDYQDYRDYSDYTDYUDYVDYWDYXDYYDYZDZEDVFDVGDVHDVIDVJDVKDVLDV"
607 	    "MDVNDVODVPDVQDVRDVSDVTDVUDVVDVWDVXDVYDVZDWEDWFDWGDWHDWIDWJDWKDWLD"
608 	    "WMDWNDWODWPDWQDWRDWSDWTDWUDWVDWWDWXDWYDWZDXFGEFHEFIEFJEFKEFLEFMEF"
609 	    "NEFOEFPEFQEFREFSEFTEFUEFVEFWEFXEFYEFZEGFEGGEGHEGIEGJEGKEGLEGMEGNE"
610 	    "GOEGPEGQEGREGSEGTEGUEGVEGWEGXEGYEGZEHFEHGEHHEEDZFDZGDZHDZIDZJDZKD"
611 	    "ZLDZMDZNDZODZPDZQDZRDZSDZTDZUDZVDZWDZXDZYDZZEEEFEEGEEHEEIEEJEEKEE"
612 	    "LEEMEENEEOEEPEEQEEREESEETEEUEEVEEWEEXEEYEEZEFFEJKEJLEJMEJNEJOEJPE"
613 	    "JQEJREJSEJTEJUEJVEJWEJXEJYEJZEKFEKGEKHEKIEKJEKKEKLEKMEKNEKOEKPEKQ"
614 	    "EKREKSEKTEKUEKVEKWEKXEKYEKZELFELGELHELIELJELKELLEHIEHJEHKEHLEHMEH"
615 	    "NEHOEHPEHQEHREHSEHTEHUEHVEHWEHXEHYEHZEIFEIGEIHEIIEIJEIKEILEIMEINE"
616 	    "IOEIPEIQEIREISEITEIUEIVEIWEIXEIYEIZEJFEJGEJHEJIEJJENOENPENQENRENS"
617 	    "ENTENUENVENWENXENYENZEOFEOGEOHEOIEOJEOKEOLEOMEONEOOEOPEOQEOREOSEO"
618 	    "TEOUEOVEOWEOXEOYEOZEPFEPGEPHEPIEPJEPKEPLEPMEPNEPOEPPELMELNELOELPE"
619 	    "LQELRELSELTELUELVELWELXELYELZEMFEMGEMHEMIEMJEMKEMLEMMEMNEMOEMPEMQ"
620 	    "EMREMSEMTEMUEMVEMWEMXEMYEMZENFENGENHENIENJENKENLENMENNERSERTERUER"
621 	    "VERWERXERYERZESFESGESHESIESJESKESLESMESNESOESPESQESRESSESTESUESVE"
622 	    "SWESXESYESZETFETGETHETIETJETKETLETMETNETOETPETQETRETSETTEPQEPREPS"
623 	    "EPTEPUEPVEPWEPXEPYEPZEQFEQGEQHEQIEQJEQKEQLEQMEQNEQOEQPEQQEQREQSEQ"
624 	    "TEQUEQVEQWEQXEQYEQZERFERGERHERIERJERKERLERMERNEROERPERQERREVWEVXE"
625 	    "VYEVZEWFEWGEWHEWIEWJEWKEWLEWMEWNEWOEWPEWQEWREWSEWTEWUEWVEWWEWXEWY"
626 	    "EWZEXFEXGEXHEXIEXJEXKEXLEXMEXNEXOEXPEXQEXREXSEXTEXUEXVEXWEXXETUET"
627 	    "VETWETXETYETZEUFEUGEUHEUIEUJEUKEULEUMEUNEUOEUPEUQEUREUSEUTEUUEUVE"
628 	    "UWEUXEUYEUZEVFEVGEVHEVIEVJEVKEVLEVMEVNEVOEVPEVQEVREVSEVTEVUEVVEFF"
629 	    "GFFHFFIFFJFFKFFLFFMFFNFFOFFPFFQFFRFFSFFTFFUFFVFFWFFXFFYFFZFGGFGHF"
630 	    "GIFGJFGKFGLFGMFGNFGOFGPFGQFGRFGSFGTFGUFGVFGWFGXFGYFGZFHGFHHFHIFHJ"
631 	    "XYEXZEYFEYGEYHEYIEYJEYKEYLEYMEYNEYOEYPEYQEYREYSEYTEYUEYVEYWEYXEYY"
632 	    "EYZEZFEZGEZHEZIEZJEZKEZLEZMEZNEZOEZPEZQEZREZSEZTEZUEZVEZWEZXEZYEZ"
633 	    "ZFFJOFJPFJQFJRFJSFJTFJUFJVFJWFJXFJYFJZFKGFKHFKIFKJFKKFKLFKMFKNFKO"
634 	    "FKPFKQFKRFKSFKTFKUFKVFKWFKXFKYFKZFLGFLHFLIFLJFLKFLLFLMFLNFLOFLPFL"
635 	    "QFLRFHKFHLFHMFHNFHOFHPFHQFHRFHSFHTFHUFHVFHWFHXFHYFHZFIGFIHFIIFIJF"
636 	    "IKFILFIMFINFIOFIPFIQFIRFISFITFIUFIVFIWFIXFIYFIZFJGFJHFJIFJJFJKFJL"
637 	    "FJMFJNFNWFNXFNYFNZFOGFOHFOIFOJFOKFOLFOMFONFOOFOPFOQFORFOSFOTFOUFO"
638 	    "VFOWFOXFOYFOZFPGFPHFPIFPJFPKFPLFPMFPNFPOFPPFPQFPRFPSFPTFPUFPVFPWF"
639 	    "PXFPYFPZFLSFLTFLUFLVFLWFLXFLYFLZFMGFMHFMIFMJFMKFMLFMMFMNFMOFMPFMQ"
640 	    "FMRFMSFMTFMUFMVFMWFMXFMYFMZFNGFNHFNIFNJFNKFNLFNMFNNFNOFNPFNQFNRFN"
641 	    "SFNTFNUFNVFSKFSLFSMFSNFSOFSPFSQFSRFSSFSTFSUFSVFSWFSXFSYFSZFTGFTHF"
642 	    "TIFTJFTKFTLFTMFTNFTOFTPFTQFTRFTSFTTFTUFTVFTWFTXFTYFTZFUGFUHFUIFUJ"
643 	    "FUKFULFUMFUNFQGFQHFQIFQJFQKFQLFQMFQNFQOFQPFQQFQRFQSFQTFQUFQVFQWFQ"
644 	    "XFQYFQZFRGFRHFRIFRJFRKFRLFRMFRNFROFRPFRQFRRFRSFRTFRUFRVFRWFRXFRYF"
645 	    "RZFSGFSHFSIFSJFWSFWTFWUFWVFWWFWXFWYFWZFXGFXHFXIFXJFXKFXLFXMFXNFXO"
646 	    "FXPFXQFXRFXSFXTFXUFXVFXWFXXFXYFXZFYGFYHFYIFYJFYKFYLFYMFYNFYOFYPFY"
647 	    "QFYRFYSFYTFYUFYVFUOFUPFUQFURFUSFUTFUUFUVFUWFUXFUYFUZFVGFVHFVIFVJF"
648 	    "VKFVLFVMFVNFVOFVPFVQFVRFVSFVTFVUFVVFVWFVXFVYFVZFWGFWHFWIFWJFWKFWL"
649 	    "FWMFWNFWOFWPFWQFWRHGHIGHJGHKGHLGHMGHNGHOGHPGHQGHRGHSGHTGHUGHVGHWG"
650 	    "HXGHYGHZGIHGIIGIJGIKGILGIMGINGIOGIPGIQGIRGISGITGIUGIVGIWGIXGIYGIZ"
651 	    "GJHGJIGJJGJKGJLGJMGJFYWFYXFYYFYZFZGFZHFZIFZJFZKFZLFZMFZNFZOFZPFZQ"
652 	    "FZRFZSFZTFZUFZVFZWFZXFZYFZZGGGHGGIGGJGGKGGLGGMGGNGGOGGPGGQGGRGGSG"
653 	    "GTGGUGGVGGWGGXGGYGGZGHTGLUGLVGLWGLXGLYGLZGMHGMIGMJGMKGMLGMMGMNGMO"
654 	    "GMPGMQGMRGMSGMTGMUGMVGMWGMXGMYGMZGNHGNIGNJGNKGNLGNMGNNGNOGNPGNQGN"
655 	    "RGNSGNTGNUGNVGNWGNXGNYGNNGJOGJPGJQGJRGJSGJTGJUGJVGJWGJXGJYGJZGKHG"
656 	    "KIGKJGKKGKLGKMGKNGKOGKPGKQGKRGKSGKTGKUGKVGKWGKXGKYGKZGLHGLIGLJGLK"
657 	    "GLLGLMGLNGLOGLPGLQGLRGLSGLMGQNGQOGQPGQQGQRGQSGQTGQUGQVGQWGQXGQYGQ"
658 	    "ZGRHGRIGRJGRKGRLGRMGRNGROGRPGRQGRRGRSGRTGRUGRVGRWGRXGRYGRZGSHGSIG"
659 	    "SJGSKGSLGSMGSNGSOGSPGSQGSRGSZGOHGOIGOJGOKGOLGOMGONGOOGOPGOQGORGOS"
660 	    "GOTGOUGOVGOWGOXGOYGOZGPHGPIGPJGPKGPLGPMGPNGPOGPPGPQGPRGPSGPTGPUGP"
661 	    "VGPWGPXGPYGPZGQHGQIGQJGQKGQLGQYGUZGVHGVIGVJGVKGVLGVMGVNGVOGVPGVQG"
662 	    "VRGVSGVTGVUGVVGVWGVXGVYGVZGWHGWIGWJGWKGWLGWMGWNGWOGWPGWQGWRGWSGWT"
663 	    "GWUGWVGWWGWXGWYGWZGXHGXIGXJGXKGXSGSTGSUGSVGSWGSXGSYGSZGTHGTIGTJGT"
664 	    "KGTLGTMGTNGTOGTPGTQGTRGTSGTTGTUGTVGTWGTXGTYGTZGUHGUIGUJGUKGULGUMG"
665 	    "UNGUOGUPGUQGURGUSGUTGUUGUVGUWGUXGURGZSGZTGZUGZVGZWGZXGZYGZZHHHIHH"
666 	    "JHHKHHLHHMHHNHHOHHPHHQHHRHHSHHTHHUHHVHHWHHXHHYHHZHIIHIJHIKHILHIMH"
667 	    "INHIOHIPHIQHIRHISHITHIUHIVHIWHIXHIYHLGXMGXNGXOGXPGXQGXRGXSGXTGXUG"
668 	    "XVGXWGXXGXYGXZGYHGYIGYJGYKGYLGYMGYNGYOGYPGYQGYRGYSGYTGYUGYVGYWGYX"
669 	    "GYYGYZGZHGZIGZJGZKGZLGZMGZNGZOGZPGZQGZLPHLQHLRHLSHLTHLUHLVHLWHLXH"
670 	    "LYHLZHMIHMJHMKHMLHMMHMNHMOHMPHMQHMRHMSHMTHMUHMVHMWHMXHMYHMZHNIHNJ"
671 	    "HNKHNLHNMHNNHNOHNPHNQHNRHNSHNTHNUHNVHNWHIZHJIHJJHJKHJLHJMHJNHJOHJ"
672 	    "PHJQHJRHJSHJTHJUHJVHJWHJXHJYHJZHKIHKJHKKHKLHKMHKNHKOHKPHKQHKRHKSH"
673 	    "KTHKUHKVHKWHKXHKYHKZHLIHLJHLKHLLHLMHLNHLOHQNHQOHQPHQQHQRHQSHQTHQU"
674 	    "HQVHQWHQXHQYHQZHRIHRJHRKHRLHRMHRNHROHRPHRQHRRHRSHRTHRUHRVHRWHRXHR"
675 	    "YHRZHSIHSJHSKHSLHSMHSNHSOHSPHSQHSRHSSHSTHSUHNXHNYHNZHOIHOJHOKHOLH"
676 	    "OMHONHOOHOPHOQHORHOSHOTHOUHOVHOWHOXHOYHOZHPIHPJHPKHPLHPMHPNHPOHPP"
677 	    "HPQHPRHPSHPTHPUHPVHPWHPXHPYHPZHQIHQJHQKHQLHQMHVLHVMHVNHVOHVPHVQHV"
678 	    "RHVSHVTHVUHVVHVWHVXHVYHVZHWIHWJHWKHWLHWMHWNHWOHWPHWQHWRHWSHWTHWUH"
679 	    "WVHWWHWXHWYHWZHXIHXJHXKHXLHXMHXNHXOHXPHXQHXRHXSHSVHSWHSXHSYHSZHTI"
680 	    "HTJHTKHTLHTMHTNHTOHTPHTQHTRHTSHTTHTUHTVHTWHTXHTYHTZHUIHUJHUKHULHU"
681 	    "MHUNHUOHUPHUQHURHUSHUTHUUHUVHUWHUXHUYHUZHVIHVJHVKHIIKIILIIMIINIIO"
682 	    "IIPIIQIIRIISIITIIUIIVIIWIIXIIYIIZIJJIJKIJLIJMIJNIJOIJPIJQIJRIJSIJ"
683 	    "TIJUIJVIJWIJXIJYIJZIKJIKKIKLIKMIKNIKOIKPIKQIKRIKSIKTXTHXUHXVHXWHX"
684 	    "XHXYHXZHYIHYJHYKHYLHYMHYNHYOHYPHYQHYRHYSHYTHYUHYVHYWHYXHYYHYZHZIH"
685 	    "ZJHZKHZLHZMHZNHZOHZPHZQHZRHZSHZTHZUHZVHZWHZXHZYHZZIIIJINNINOINPIN"
686 	    "QINRINSINTINUINVINWINXINYINZIOJIOKIOLIOMIONIOOIOPIOQIORIOSIOTIOUI"
687 	    "OVIOWIOXIOYIOZIPJIPKIPLIPMIPNIPOIPPIPQIPRIPSIPTIPUIPVIPWIKUIKVIKW"
688 	    "IKXIKYIKZILJILKILLILMILNILOILPILQILRILSILTILUILVILWILXILYILZIMJIM"
689 	    "KIMLIMMIMNIMOIMPIMQIMRIMSIMTIMUIMVIMWIMXIMYIMZINJINKINLINMISQISRI"
690 	    "SSISTISUISVISWISXISYISZITJITKITLITMITNITOITPITQITRITSITTITUITVITW"
691 	    "ITXITYITZIUJIUKIULIUMIUNIUOIUPIUQIURIUSIUTIUUIUVIUWIUXIUYIUZIPXIP"
692 	    "YIPZIQJIQKIQLIQMIQNIQOIQPIQQIQRIQSIQTIQUIQVIQWIQXIQYIQZIRJIRKIRLI"
693 	    "RMIRNIROIRPIRQIRRIRSIRTIRUIRVIRWIRXIRYIRZISJISKISLISMISNISOISPIXT"
694 	    "IXUIXVIXWIXXIXYIXZIYJIYKIYLIYMIYNIYOIYPIYQIYRIYSIYTIYUIYVIYWIYXIY"
695 	    "YIYZIZJIZKIZLIZMIZNIZOIZPIZQIZRIZSIZTIZUIZVIZWIZXIZYIZZJJJKJJLJJI"
696 	    "VJIVKIVLIVMIVNIVOIVPIVQIVRIVSIVTIVUIVVIVWIVXIVYIVZIWJIWKIWLIWMIWN"
697 	    "IWOIWPIWQIWRIWSIWTIWUIWVIWWIWXIWYIWZIXJIXKIXLIXMIXNIXOIXPIXQIXRIX"
698 	    "SYJLZJMKJMLJMMJMNJMOJMPJMQJMRJMSJMTJMUJMVJMWJMXJMYJMZJNKJNLJNMJNN"
699 	    "JNOJNPJNQJNRJNSJNTJNUJNVJNWJNXJNYJNZJOKJOLJOMJONJOOJOPJOQJORJOSJO"
700 	    "TJOMJJNJJOJJPJJQJJRJJSJJTJJUJJVJJWJJXJJYJJZJKKJKLJKMJKNJKOJKPJKQJ"
701 	    "KRJKSJKTJKUJKVJKWJKXJKYJKZJLKJLLJLMJLNJLOJLPJLQJLRJLSJLTJLUJLVJLW"
702 	    "JLXJLQJRRJRSJRTJRUJRVJRWJRXJRYJRZJSKJSLJSMJSNJSOJSPJSQJSRJSSJSTJS"
703 	    "UJSVJSWJSXJSYJSZJTKJTLJTMJTNJTOJTPJTQJTRJTSJTTJTUJTVJTWJTXJTYJTZJ"
704 	    "UKJULJUUJOVJOWJOXJOYJOZJPKJPLJPMJPNJPOJPPJPQJPRJPSJPTJPUJPVJPWJPX"
705 	    "JPYJPZJQKJQLJQMJQNJQOJQPJQQJQRJQSJQTJQUJQVJQWJQXJQYJQZJRKJRLJRMJR"
706 	    "NJROJRPJRYJWZJXKJXLJXMJXNJXOJXPJXQJXRJXSJXTJXUJXVJXWJXXJXYJXZJYKJ"
707 	    "YLJYMJYNJYOJYPJYQJYRJYSJYTJYUJYVJYWJYXJYYJYZJZKJZLJZMJZNJZOJZPJZQ"
708 	    "JZRJZSJZTJZMJUNJUOJUPJUQJURJUSJUTJUUJUVJUWJUXJUYJUZJVKJVLJVMJVNJV"
709 	    "OJVPJVQJVRJVSJVTJVUJVVJVWJVXJVYJVZJWKJWLJWMJWNJWOJWPJWQJWRJWSJWTJ"
710 	    "WUJWVJWWJWXJWMTKMUKMVKMWKMXKMYKMZKNLKNMKNNKNOKNPKNQKNRKNSKNTKNUKN"
711 	    "VKNWKNXKNYKNZKOLKOMKONKOOKOPKOQKORKOSKOTKOUKOVKOWKOXKOYKOZKPLKPMK"
712 	    "PNKPOKPPKPQKPRKUJZVJZWJZXJZYJZZKKKLKKMKKNKKOKKPKKQKKRKKSKKTKKUKKV"
713 	    "KKWKKXKKYKKZKLLKLMKLNKLOKLPKLQKLRKLSKLTKLUKLVKLWKLXKLYKLZKMLKMMKM"
714 	    "NKMOKMPKMQKMRKMSKSRKSSKSTKSUKSVKSWKSXKSYKSZKTLKTMKTNKTOKTPKTQKTRK"
715 	    "TSKTTKTUKTVKTWKTXKTYKTZKULKUMKUNKUOKUPKUQKURKUSKUTKUUKUVKUWKUXKUY"
716 	    "KUZKVLKVMKVNKVOKVPKPSKPTKPUKPVKPWKPXKPYKPZKQLKQMKQNKQOKQPKQQKQRKQ"
717 	    "SKQTKQUKQVKQWKQXKQYKQZKRLKRMKRNKROKRPKRQKRRKRSKRTKRUKRVKRWKRXKRYK"
718 	    "RZKSLKSMKSNKSOKSPKSQKYPKYQKYRKYSKYTKYUKYVKYWKYXKYYKYZKZLKZMKZNKZO"
719 	    "KZPKZQKZRKZSKZTKZUKZVKZWKZXKZYKZZLLLMLLNLLOLLPLLQLLRLLSLLTLLULLVL"
720 	    "LWLLXLLYLLZLMMLMNLMOLMPVQKVRKVSKVTKVUKVVKVWKVXKVYKVZKWLKWMKWNKWOK"
721 	    "WPKWQKWRKWSKWTKWUKWVKWWKWXKWYKWZKXLKXMKXNKXOKXPKXQKXRKXSKXTKXUKXV"
722 	    "KXWKXXKXYKXZKYLKYMKYNKYOKLPSLPTLPULPVLPWLPXLPYLPZLQMLQNLQOLQPLQQL"
723 	    "QRLQSLQTLQULQVLQWLQXLQYLQZLRMLRNLROLRPLRQLRRLRSLRTLRULRVLRWLRXLRY"
724 	    "LRZLSMLSNLSOLSPLSQLSRLSSLSTLMQLMRLMSLMTLMULMVLMWLMXLMYLMZLNMLNNLN"
725 	    "OLNPLNQLNRLNSLNTLNULNVLNWLNXLNYLNZLOMLONLOOLOPLOQLORLOSLOTLOULOVL"
726 	    "OWLOXLOYLOZLPMLPNLPOLPPLPQLPRLVWLVXLVYLVZLWMLWNLWOLWPLWQLWRLWSLWT"
727 	    "LWULWVLWWLWXLWYLWZLXMLXNLXOLXPLXQLXRLXSLXTLXULXVLXWLXXLXYLXZLYMLY"
728 	    "NLYOLYPLYQLYRLYSLYTLYULYVLYWLYXLSULSVLSWLSXLSYLSZLTMLTNLTOLTPLTQL"
729 	    "TRLTSLTTLTULTVLTWLTXLTYLTZLUMLUNLUOLUPLUQLURLUSLUTLUULUVLUWLUXLUY"
730 	    "LUZLVMLVNLVOLVPLVQLVRLVSLVTLVULVVOMOPMOQMORMOSMOTMOUMOVMOWMOXMOYM"
731 	    "OZMPNMPOMPPMPQMPRMPSMPTMPUMPVMPWMPXMPYMPZMQNMQOMQPMQQMQRMQSMQTMQU"
732 	    "MQVMQWMQXMQYMQZMRNMROMRPMRQMRRMRSMRLYYLYZLZMLZNLZOLZPLZQLZRLZSLZT"
733 	    "LZULZVLZWLZXLZYLZZMMMNMMOMMPMMQMMRMMSMMTMMUMMVMMWMMXMMYMMZMNNMNOM"
734 	    "NPMNQMNRMNSMNTMNUMNVMNWMNXMNYMNZMONMOYMUZMVNMVOMVPMVQMVRMVSMVTMVU"
735 	    "MVVMVWMVXMVYMVZMWNMWOMWPMWQMWRMWSMWTMWUMWVMWWMWXMWYMWZMXNMXOMXPMX"
736 	    "QMXRMXSMXTMXUMXVMXWMXXMXYMXZMYNMYOMYPMYTMRUMRVMRWMRXMRYMRZMSNMSOM"
737 	    "SPMSQMSRMSSMSTMSUMSVMSWMSXMSYMSZMTNMTOMTPMTQMTRMTSMTTMTUMTVMTWMTX"
738 	    "MTYMTZMUNMUOMUPMUQMURMUSMUTMUUMUVMUWMUXMUOXNOYNOZNPONPPNPQNPRNPSN"
739 	    "PTNPUNPVNPWNPXNPYNPZNQONQPNQQNQRNQSNQTNQUNQVNQWNQXNQYNQZNRONRPNRQ"
740 	    "NRRNRSNRTNRUNRVNRWNRXNRYNRZNSONSPNSQNSRNSSNQMYRMYSMYTMYUMYVMYWMYX"
741 	    "MYYMYZMZNMZOMZPMZQMZRMZSMZTMZUMZVMZWMZXMZYMZZNNNONNPNNQNNRNNSNNTN"
742 	    "NUNNVNNWNNXNNYNNZNOONOPNOQNORNOSNOTNOUNOVNOWNWPNWQNWRNWSNWTNWUNWV"
743 	    "NWWNWXNWYNWZNXONXPNXQNXRNXSNXTNXUNXVNXWNXXNXYNXZNYONYPNYQNYRNYSNY"
744 	    "TNYUNYVNYWNYXNYYNYZNZONZPNZQNZRNZSNZTNZUNZVNZWNSTNSUNSVNSWNSXNSYN"
745 	    "SZNTONTPNTQNTRNTSNTTNTUNTVNTWNTXNTYNTZNUONUPNUQNURNUSNUTNUUNUVNUW"
746 	    "NUXNUYNUZNVONVPNVQNVRNVSNVTNVUNVVNVWNVXNVYNVZNWONORXORYORZOSPOSQO"
747 	    "SROSSOSTOSUOSVOSWOSXOSYOSZOTPOTQOTROTSOTTOTUOTVOTWOTXOTYOTZOUPOUQ"
748 	    "OUROUSOUTOUUOUVOUWOUXOUYOUZOVPOVQOVROVSOVTOVUOVVOVWZXNZYNZZOOOPOO"
749 	    "QOOROOSOOTOOUOOVOOWOOXOOYOOZOPPOPQOPROPSOPTOPUOPVOPWOPXOPYOPZOQPO"
750 	    "QQOQROQSOQTOQUOQVOQWOQXOQYOQZORPORQORRORSORTORUORVORWOZXOZYOZZPPP"
751 	    "QPPRPPSPPTPPUPPVPPWPPXPPYPPZPQQPQRPQSPQTPQUPQVPQWPQXPQYPQZPRQPRRP"
752 	    "RSPRTPRUPRVPRWPRXPRYPRZPSQPSRPSSPSTPSUPSVPSWPSXPSYPSZPTOVXOVYOVZO"
753 	    "WPOWQOWROWSOWTOWUOWVOWWOWXOWYOWZOXPOXQOXROXSOXTOXUOXVOXWOXXOXYOXZ"
754 	    "OYPOYQOYROYSOYTOYUOYVOYWOYXOYYOYZOZPOZQOZROZSOZTOZUOZVOZWQPTRPTSP"
755 	    "TTPTUPTV";
756 
757 	z_stream strm = {};
758 	uint8_t *buf;
759 	size_t count;
760 	uLong bound;
761 
762 	strm.zalloc = &TestZLib_alloc;
763 	strm.zfree  = &TestZLib_free;
764 	deflateInit2(&strm,
765 	    Z_DEFAULT_COMPRESSION,
766 	    Z_DEFLATED,
767 	    15,
768 	    1,
769 	    Z_FIXED);
770 
771 	count = strlen(reproData);
772 	bound = deflateBound(&strm, count);
773 	buf   = IONew(uint8_t, bound);
774 
775 	strm.avail_out  = (uInt) bound;
776 	strm.next_out   = buf;
777 	strm.next_in    = (Bytef *) &reproData[0];
778 	strm.avail_in   = (uInt) count;
779 
780 	deflate(&strm, Z_FINISH);
781 	deflateEnd(&strm);
782 	IODelete(buf, uint8_t, bound);
783 
784 	return 0;
785 }
786 #endif /* TEST_ZLIB */
787 
788 
789 static void
TESAction(OSObject * owner,IOTimerEventSource * tes)790 TESAction(OSObject * owner, IOTimerEventSource * tes)
791 {
792 	if (mach_absolute_time() < gIOWorkLoopTestDeadline) {
793 		tes->setTimeout(1, kMicrosecondScale);
794 	}
795 }
796 
797 static int
IOWorkLoopTest(int newValue)798 IOWorkLoopTest(int newValue)
799 {
800 	IOReturn err;
801 	uint32_t idx;
802 	OSSharedPtr<IOWorkLoop> wl;
803 	OSSharedPtr<IOTimerEventSource> tes;
804 	OSSharedPtr<IOInterruptEventSource> ies;
805 
806 	wl = IOWorkLoop::workLoop();
807 	assert(wl);
808 	tes = IOTimerEventSource::timerEventSource(kIOTimerEventSourceOptionsPriorityWorkLoop, wl.get(), &TESAction);
809 	assert(tes);
810 	err = wl->addEventSource(tes.get());
811 	assert(kIOReturnSuccess == err);
812 	clock_interval_to_deadline(100, kMillisecondScale, &gIOWorkLoopTestDeadline);
813 	for (idx = 0; mach_absolute_time() < gIOWorkLoopTestDeadline; idx++) {
814 		tes->setTimeout(idx & 1023, kNanosecondScale);
815 	}
816 	tes->cancelTimeout();
817 	wl->removeEventSource(tes.get());
818 
819 	int value = 3;
820 
821 	tes = IOTimerEventSource::timerEventSource(kIOTimerEventSourceOptionsDefault, wl.get(), ^(IOTimerEventSource * tes){
822 		kprintf("wl %p, value %d\n", wl.get(), value);
823 	});
824 	err = wl->addEventSource(tes.get());
825 	assert(kIOReturnSuccess == err);
826 
827 	value = 2;
828 	tes->setTimeout(1, kNanosecondScale);
829 	IOSleep(1);
830 	wl->removeEventSource(tes.get());
831 
832 	ies = IOInterruptEventSource::interruptEventSource(wl.get(), NULL, 0, ^void (IOInterruptEventSource *sender, int count){
833 		kprintf("ies block %p, %d\n", sender, count);
834 	});
835 
836 	assert(ies);
837 	kprintf("ies %p\n", ies.get());
838 	err = wl->addEventSource(ies.get());
839 	assert(kIOReturnSuccess == err);
840 	ies->interruptOccurred(NULL, NULL, 0);
841 	IOSleep(1);
842 	ies->interruptOccurred(NULL, NULL, 0);
843 	IOSleep(1);
844 	wl->removeEventSource(ies.get());
845 
846 	return 0;
847 }
848 
849 static int
OSCollectionTest(int newValue)850 OSCollectionTest(int newValue)
851 {
852 	OSSharedPtr<OSArray> array = OSArray::withCapacity(8);
853 	array->setObject(kOSBooleanTrue);
854 	array->setObject(kOSBooleanFalse);
855 	array->setObject(kOSBooleanFalse);
856 	array->setObject(kOSBooleanTrue);
857 	array->setObject(kOSBooleanFalse);
858 	array->setObject(kOSBooleanTrue);
859 
860 	__block unsigned int index;
861 	index = 0;
862 	array->iterateObjects(^bool (OSObject * obj) {
863 		kprintf("%d:%d ", index, (obj == kOSBooleanTrue) ? 1 : (obj == kOSBooleanFalse) ? 0 : 2);
864 		index++;
865 		return false;
866 	});
867 	kprintf("\n");
868 
869 	OSSharedPtr<OSDictionary> dict = IOService::resourceMatching("hello");
870 	assert(dict);
871 	index = 0;
872 	dict->iterateObjects(^bool (const OSSymbol * sym, OSObject * obj) {
873 		OSString * str = OSDynamicCast(OSString, obj);
874 		assert(str);
875 		kprintf("%d:%s=%s\n", index, sym->getCStringNoCopy(), str->getCStringNoCopy());
876 		index++;
877 		return false;
878 	});
879 
880 	OSSharedPtr<OSSerializer> serializer = OSSerializer::withBlock(^bool (OSSerialize * s){
881 		return gIOBSDUnitKey->serialize(s);
882 	});
883 	assert(serializer);
884 	IOService::getPlatform()->setProperty("OSSerializer_withBlock", serializer.get());
885 
886 	OSSharedPtr<OSString> ab = OSString::withCString("abcdef", 2);
887 	assert(strcmp(ab->getCStringNoCopy(), "ab") == 0);
888 	OSSharedPtr<OSString> defgh = OSString::withCString("defgh", 10);
889 	assert(strcmp(defgh->getCStringNoCopy(), "defgh") == 0);
890 	OSSharedPtr<OSString> zyxwvut = OSString::withCString("zyxwvut", 7);
891 	assert(strcmp(zyxwvut->getCStringNoCopy(), "zyxwvut") == 0);
892 
893 
894 	dict = OSDictionary::withCapacity(4);
895 	OSSharedPtr<OSNumber> num = OSNumber::withDouble(1234.5678);
896 	dict->setObject("test", num);
897 
898 	OSSharedPtr<OSSerialize> s = OSSerialize::binaryWithCapacity(4096);
899 	dict->serialize(s.get());
900 
901 	OSSharedPtr<OSObject> o = OSUnserializeXML((const char *) s->text(), s->getLength());
902 	assert(dict->isEqualTo(o.get()));
903 
904 	dict = OSDynamicPtrCast<OSDictionary>(o);
905 	__assert_only OSNumber * nnum = OSDynamicCast(OSNumber, dict->getObject("test"));
906 	assert(12345678 == (int)(10000 * nnum->doubleValue()));
907 
908 	return 0;
909 }
910 
911 static int
OSAllocationTests(int)912 OSAllocationTests(int)
913 {
914 	OSDataAllocation<int> ints(100, OSAllocateMemory);
915 	assert(ints);
916 
917 	{
918 		int counter = 0;
919 		for (int& i : ints) {
920 			i = counter++;
921 		}
922 	}
923 
924 	{
925 		int counter = 0;
926 		for (__assert_only int& i : ints) {
927 			assert(i == counter);
928 			++counter;
929 		}
930 	}
931 
932 	OSDataAllocation<int> arrayZero(100, OSAllocateMemoryZero);
933 	assert(arrayZero);
934 	for (__assert_only const auto& i : arrayZero) {
935 		assert(i == 0);
936 	}
937 
938 #if XNU_PLATFORM_MacOSX
939 	// Make sure we can have two-level OSAllocations
940 	{
941 		OSAllocation<OSDataAllocation<int> > testArray(10, OSAllocateMemory);
942 		for (int i = 0; i < 10; i++) {
943 			testArray[i] = OSDataAllocation<int>(10, OSAllocateMemory);
944 			for (int j = 0; j < 10; ++j) {
945 				testArray[i][j] = i + j;
946 			}
947 		}
948 
949 		for (int i = 0; i < 10; i++) {
950 			for (int j = 0; j < 10; ++j) {
951 				assert(testArray[i][j] == i + j);
952 			}
953 		}
954 	}
955 #endif /* XNU_PLATFORM_MacOSX */
956 
957 	return 0;
958 }
959 
960 static int
OSDataAllocationTests(int)961 OSDataAllocationTests(int)
962 {
963 	OSDataAllocation<int> ints(100, OSAllocateMemory);
964 	assert(ints);
965 
966 	{
967 		int counter = 0;
968 		for (int& i : ints) {
969 			i = counter++;
970 		}
971 	}
972 
973 	{
974 		int counter = 0;
975 		for (__assert_only const int& i : ints) {
976 			assert(i == counter);
977 			++counter;
978 		}
979 	}
980 
981 	OSDataAllocation<int> arrayZero(100, OSAllocateMemoryZero);
982 	assert(arrayZero);
983 	for (__assert_only const auto& i : arrayZero) {
984 		assert(i == 0);
985 	}
986 
987 	return 0;
988 }
989 
990 static int
OSBoundedArrayTests(int)991 OSBoundedArrayTests(int)
992 {
993 	OSBoundedArray<int, 5> ints = {0, 1, 2, 3, 4};
994 	assert(ints.size() == 5);
995 
996 	{
997 		int counter = 0;
998 		for (int& i : ints) {
999 			i = counter++;
1000 		}
1001 	}
1002 
1003 	{
1004 		int counter = 0;
1005 		for (__assert_only int& i : ints) {
1006 			assert(i == counter);
1007 			++counter;
1008 		}
1009 	}
1010 
1011 	return 0;
1012 }
1013 
1014 static int
OSBoundedArrayRefTests(int)1015 OSBoundedArrayRefTests(int)
1016 {
1017 	OSBoundedArray<int, 5> storage = {0, 1, 2, 3, 4};
1018 	OSBoundedArrayRef<int> ints(storage);
1019 	assert(ints);
1020 
1021 	{
1022 		int counter = 0;
1023 		for (int& i : ints) {
1024 			i = counter++;
1025 		}
1026 	}
1027 
1028 	{
1029 		int counter = 0;
1030 		for (__assert_only int& i : ints) {
1031 			assert(i == counter);
1032 			++counter;
1033 		}
1034 	}
1035 
1036 	assert(ints.length() == 5);
1037 	ints = OSBoundedArrayRef<int>();
1038 	assert(ints.length() == 0);
1039 	return 0;
1040 }
1041 
1042 class OSArraySubclass : public OSArray {
1043 	OSDeclareDefaultStructors(OSArraySubclass);
1044 public:
1045 	static OSSharedPtr<OSArraySubclass> withCapacity(unsigned int inCapacity);
1046 	virtual unsigned int iteratorSize() const APPLE_KEXT_OVERRIDE;
1047 };
1048 
1049 OSDefineMetaClassAndStructors(OSArraySubclass, OSArray);
1050 
1051 OSSharedPtr<OSArraySubclass>
withCapacity(unsigned int inCapacity)1052 OSArraySubclass::withCapacity(unsigned int inCapacity)
1053 {
1054 	OSSharedPtr<OSArraySubclass> me = OSMakeShared<OSArraySubclass>();
1055 
1056 	if (me && !me->initWithCapacity(inCapacity)) {
1057 		return nullptr;
1058 	}
1059 
1060 	return me;
1061 }
1062 
1063 unsigned int
iteratorSize() const1064 OSArraySubclass::iteratorSize() const
1065 {
1066 	unsigned int result = 64;
1067 	// Has to be larger than the OSArray iterator size to prevent out-of-bounds writes
1068 	assert(result >= OSArray::iteratorSize());
1069 	return result;
1070 }
1071 
1072 class OSCISubclass : public OSCollectionIterator {
1073 	OSDeclareDefaultStructors(OSCISubclass);
1074 public:
1075 	static OSSharedPtr<OSCISubclass> withCollection(const OSCollection * inColl);
1076 };
1077 
1078 OSDefineMetaClassAndStructors(OSCISubclass, OSCollectionIterator);
1079 
1080 OSSharedPtr<OSCISubclass>
withCollection(const OSCollection * inColl)1081 OSCISubclass::withCollection(const OSCollection * inColl)
1082 {
1083 	OSSharedPtr<OSCISubclass> me = OSMakeShared<OSCISubclass>();
1084 
1085 	if (me && !me->initWithCollection(inColl)) {
1086 		return nullptr;
1087 	}
1088 
1089 	return me;
1090 }
1091 
1092 static int
OSCollectionIteratorTests(int)1093 OSCollectionIteratorTests(int)
1094 {
1095 	OSSharedPtr<OSArray> array = OSArray::withCapacity(0);
1096 	OSSharedPtr<OSString> firstObj = OSString::withCString("test object");
1097 	OSSharedPtr<OSString> secondObj = OSString::withCString("test object 2");
1098 	OSObject * current = NULL;
1099 	OSSharedPtr<OSCollectionIterator> osci = NULL;
1100 	OSSharedPtr<OSCISubclass> osciSubclass = NULL;
1101 	size_t index = 0;
1102 	array->setObject(firstObj);
1103 	array->setObject(secondObj);
1104 
1105 	// Test iteration over a normal OSArray
1106 	osci = OSCollectionIterator::withCollection(array.get());
1107 	assert(osci != NULL);
1108 
1109 	index = 0;
1110 	while ((current = osci->getNextObject()) != NULL) {
1111 		if (index == 0) {
1112 			assert(current == firstObj);
1113 		} else if (index == 1) {
1114 			assert(current == secondObj);
1115 		} else {
1116 			panic("index out of range");
1117 		}
1118 		index++;
1119 	}
1120 
1121 	// Test iteration with a OSCollectionIterator subclass over a normal OSArray
1122 	osciSubclass = OSCISubclass::withCollection(array.get());
1123 	assert(osciSubclass != NULL);
1124 
1125 	index = 0;
1126 	while ((current = osciSubclass->getNextObject()) != NULL) {
1127 		if (index == 0) {
1128 			assert(current == firstObj);
1129 		} else if (index == 1) {
1130 			assert(current == secondObj);
1131 		} else {
1132 			panic("index out of range");
1133 		}
1134 		index++;
1135 	}
1136 
1137 	// Create the OSArray subclass
1138 	OSSharedPtr<OSArraySubclass> arraySubclass = OSArraySubclass::withCapacity(0);
1139 	arraySubclass->setObject(firstObj);
1140 	arraySubclass->setObject(secondObj);
1141 	// Test iteration over a subclassed OSArray, with a large iterator size
1142 	osci = OSCollectionIterator::withCollection(arraySubclass.get());
1143 	assert(osci != NULL);
1144 
1145 	index = 0;
1146 	while ((current = osci->getNextObject()) != NULL) {
1147 		if (index == 0) {
1148 			assert(current == firstObj);
1149 		} else if (index == 1) {
1150 			assert(current == secondObj);
1151 		} else {
1152 			panic("index out of range");
1153 		}
1154 		index++;
1155 	}
1156 
1157 	// Test iteration with a OSCollectionIterator subclass over a subclassed OSArray,
1158 	// with a large iterator size.
1159 	osciSubclass = OSCISubclass::withCollection(arraySubclass.get());
1160 	assert(osciSubclass != NULL);
1161 
1162 	index = 0;
1163 	while ((current = osciSubclass->getNextObject()) != NULL) {
1164 		if (index == 0) {
1165 			assert(current == firstObj);
1166 		} else if (index == 1) {
1167 			assert(current == secondObj);
1168 		} else {
1169 			panic("index out of range");
1170 		}
1171 		index++;
1172 	}
1173 
1174 	return 0;
1175 }
1176 
1177 static int
OSBoundedPtrTests(int)1178 OSBoundedPtrTests(int)
1179 {
1180 	int array[5] = {55, 66, 77, 88, 99};
1181 	OSBoundedPtr<int> begin(&array[0], &array[0], &array[5]);
1182 	OSBoundedPtr<int> end(&array[5], &array[0], &array[5]);
1183 
1184 	{
1185 		int counter = 0;
1186 		for (OSBoundedPtr<int> b = begin; b != end; ++b) {
1187 			*b = counter++;
1188 		}
1189 	}
1190 
1191 	{
1192 		int counter = 0;
1193 		for (OSBoundedPtr<int> b = begin; b != end; ++b) {
1194 			assert(*b == counter);
1195 			++counter;
1196 		}
1197 	}
1198 
1199 	return 0;
1200 }
1201 
1202 static int
IODataQueueDispatchSourceTests(int)1203 IODataQueueDispatchSourceTests(int)
1204 {
1205 	constexpr uint32_t NUM_ELEMENTS = 10;
1206 	constexpr uint32_t ELEMENT_SIZE = 16;
1207 	size_t entryHeaderSize;
1208 	IODataQueueDispatchSource * dqds;
1209 	kern_return_t kr;
1210 	IODataQueueClientEnqueueEntryBlock enqueueBlock = ^(void *data, size_t dataSize) {};
1211 	IODataQueueClientDequeueEntryBlock dequeueBlock = ^(const void *data, size_t dataSize) {};
1212 	uint32_t enqueued = 0;
1213 	uint32_t tail = 0;
1214 	uint32_t head = 0;
1215 
1216 	entryHeaderSize = IODataQueueDispatchSource::GetDataQueueEntryHeaderSize();
1217 
1218 	kr = IODataQueueDispatchSource::Create(NUM_ELEMENTS * (ELEMENT_SIZE + entryHeaderSize), NULL, &dqds);
1219 	assert(kr == kIOReturnSuccess);
1220 	assert(dqds != NULL);
1221 
1222 	// empty queue, should be able to enqueue NUM_ELEMENTS
1223 	kr = dqds->CanEnqueueData(ELEMENT_SIZE, NUM_ELEMENTS);
1224 	assert(kr == kIOReturnSuccess);
1225 
1226 	kr = dqds->CanEnqueueData(ELEMENT_SIZE, NUM_ELEMENTS + 1);
1227 	assert(kr == kIOReturnOverrun);
1228 
1229 	for (uint32_t i = 0; i < NUM_ELEMENTS * 10000; i++) {
1230 		// Randomly dequeue and enqueue elements
1231 
1232 		if (enqueued > 0) {
1233 			if (enqueued < NUM_ELEMENTS - 1 && (random() % 2) == 0) {
1234 				kr = dqds->Enqueue(ELEMENT_SIZE, enqueueBlock);
1235 				assert(kr == kIOReturnSuccess);
1236 				enqueued++;
1237 				tail++;
1238 			} else {
1239 				kr = dqds->Dequeue(dequeueBlock);
1240 				assert(kr == kIOReturnSuccess);
1241 				enqueued--;
1242 				head++;
1243 			}
1244 		} else {
1245 			kr = dqds->Enqueue(ELEMENT_SIZE, enqueueBlock);
1246 			assert(kr == kIOReturnSuccess);
1247 			enqueued++;
1248 			tail++;
1249 		}
1250 		if (tail > NUM_ELEMENTS) {
1251 			tail = 1;
1252 		}
1253 		if (head > NUM_ELEMENTS) {
1254 			head = 1;
1255 		}
1256 
1257 		for (uint32_t j = 0; j <= NUM_ELEMENTS; j++) {
1258 			// Can we enqueue `j` elements
1259 			kr = dqds->CanEnqueueData(ELEMENT_SIZE, j);
1260 
1261 			if (j < NUM_ELEMENTS - enqueued || (head <= tail && tail == enqueued && j == NUM_ELEMENTS - enqueued)) {
1262 				if (kr != kIOReturnSuccess) {
1263 					panic("i=%u j=%u enqueued=%u head=%u tail=%u kr=%d expected kIOReturnSuccess\n", i, j, enqueued, head, tail, kr);
1264 				}
1265 			} else {
1266 				if (kr != kIOReturnOverrun) {
1267 					panic("i=%u j=%u enqueued=%u head=%u tail=%u kr=%d expected kIOReturnOverrun\n", i, j, enqueued, head, tail, kr);
1268 				}
1269 			}
1270 
1271 			if ((random() % 16) == 1) {
1272 				// Verify result of CanEnqueueData
1273 
1274 				if (kr == kIOReturnSuccess) {
1275 					// There is space for `j` elements
1276 
1277 					for (uint32_t k = 0; k < j; k++) {
1278 						kr = dqds->Enqueue(ELEMENT_SIZE, enqueueBlock);
1279 						assert(kr == kIOReturnSuccess);
1280 						enqueued++;
1281 						tail++;
1282 						if (tail > NUM_ELEMENTS) {
1283 							tail = 1;
1284 						}
1285 					}
1286 				} else if (j == 1) {
1287 					// if we are checking to see if we can enqueue one element and CanEnqueueData says there's no space,
1288 					// ensure we can't Enqueue that element
1289 					kr = dqds->Enqueue(ELEMENT_SIZE, enqueueBlock);
1290 					assert(kr == kIOReturnOverrun);
1291 				}
1292 			}
1293 		}
1294 	}
1295 
1296 	OSSafeReleaseNULL(dqds);
1297 
1298 	return kIOReturnSuccess;
1299 }
1300 
1301 struct TrivialAggregateTestType {
1302 	int a;
1303 	bool b;
1304 	float c;
1305 };
1306 OSDefineValueObjectForDependentType(int)
OSDefineValueObjectForDependentType(TrivialAggregateTestType)1307 OSDefineValueObjectForDependentType(TrivialAggregateTestType)
1308 
1309 static int
1310 OSValueObjectTests(int)
1311 {
1312 	// test simple built-in type
1313 	{
1314 		using T = int;
1315 		OSSharedPtr<OSValueObject<T> > test = OSValueObject<T>::create();
1316 		assert(test);
1317 		if (test) {
1318 			assert(test->getRef() == 0);
1319 			assert(test->isEqualTo(0));
1320 			assert(test->getBytesNoCopy());
1321 			assert(test->getBytesNoCopy() == test->getMutableBytesNoCopy());
1322 			assert(test->getLength() == sizeof(T));
1323 		}
1324 	}
1325 
1326 	// test trivial aggregate type
1327 	{
1328 		using T = TrivialAggregateTestType;
1329 		OSSharedPtr<OSValueObject<T> > test = OSValueObject<T>::create();
1330 		assert(test);
1331 		if (test) {
1332 			const auto *const bytes = reinterpret_cast<const uint8_t*>(test->getBytesNoCopy());
1333 			bool bytesAreZero = true;
1334 			for (size_t byteIndex = 0; byteIndex < test->getLength(); byteIndex++) {
1335 				bytesAreZero &= bytes[byteIndex] == 0;
1336 			}
1337 			assert(bytesAreZero);
1338 		}
1339 	}
1340 
1341 	return KERN_SUCCESS;
1342 }
1343 
1344 
1345 static int
IOSharedDataQueue_44636964(__unused int newValue)1346 IOSharedDataQueue_44636964(__unused int newValue)
1347 {
1348 	OSSharedPtr<IOSharedDataQueue> sd = IOSharedDataQueue::withCapacity(DATA_QUEUE_ENTRY_HEADER_SIZE + sizeof(UInt64));
1349 	UInt64 data = 0x11223344aa55aa55;
1350 	UInt32 data2 = 0x44332211;
1351 	UInt32 size = sizeof(UInt32);
1352 	/* enqueue moves tail to end */
1353 	sd->enqueue(&data, sizeof(UInt64));
1354 	/* dequeue moves head to end */
1355 	sd->dequeue(&data, &size);
1356 	/* Tail wraps around, head is still at end */
1357 	sd->enqueue(&data2, sizeof(UInt32));
1358 	/* something in the queue so peek() should return non-null */
1359 	assert(sd->peek() != NULL);
1360 	return KERN_SUCCESS;
1361 }
1362 
1363 #if 0
1364 #include <IOKit/IOUserClient.h>
1365 class TestUserClient : public IOUserClient
1366 {
1367 	OSDeclareDefaultStructors(TestUserClient);
1368 	virtual void stop( IOService *provider) APPLE_KEXT_OVERRIDE;
1369 	virtual bool finalize(IOOptionBits options) APPLE_KEXT_OVERRIDE;
1370 	virtual IOReturn externalMethod( uint32_t selector,
1371 	    IOExternalMethodArguments * arguments,
1372 	    IOExternalMethodDispatch * dispatch,
1373 	    OSObject * target,
1374 	    void * reference ) APPLE_KEXT_OVERRIDE;
1375 };
1376 
1377 void
1378 TestUserClient::stop( IOService *provider)
1379 {
1380 	kprintf("TestUserClient::stop\n");
1381 }
1382 bool
1383 TestUserClient::finalize(IOOptionBits options)
1384 {
1385 	kprintf("TestUserClient::finalize\n");
1386 	return true;
1387 }
1388 IOReturn
1389 TestUserClient::externalMethod( uint32_t selector,
1390     IOExternalMethodArguments * arguments,
1391     IOExternalMethodDispatch * dispatch,
1392     OSObject * target,
1393     void * reference )
1394 {
1395 	getProvider()->terminate();
1396 	IOSleep(500);
1397 	return 0;
1398 }
1399 OSDefineMetaClassAndStructors(TestUserClient, IOUserClient);
1400 #endif
1401 
1402 static int
IOServiceTest(int newValue)1403 IOServiceTest(int newValue)
1404 {
1405 	OSSharedPtr<OSDictionary> matching;
1406 	IONotifier        * note;
1407 	__block IOService * found;
1408 
1409 #if 0
1410 	found = new IOService;
1411 	found->init();
1412 	found->setName("IOTestUserClientProvider");
1413 	found->attach(IOService::getPlatform());
1414 	found->setProperty("IOUserClientClass", "TestUserClient");
1415 	found->registerService();
1416 #endif
1417 
1418 	matching = IOService::serviceMatching("IOPlatformExpert");
1419 	assert(matching);
1420 	found = nullptr;
1421 	note = IOService::addMatchingNotification(gIOMatchedNotification, matching.get(), 0,
1422 	    ^bool (IOService * newService, IONotifier * notifier) {
1423 		kprintf("found %s, %d\n", newService->getName(), newService->getRetainCount());
1424 		found = newService;
1425 		found->retain();
1426 		return true;
1427 	}
1428 	    );
1429 	assert(note);
1430 	assert(found);
1431 	note->remove();
1432 
1433 	note = found->registerInterest(gIOBusyInterest,
1434 	    ^IOReturn (uint32_t messageType, IOService * provider,
1435 	    void   * messageArgument, size_t argSize) {
1436 		kprintf("%p messageType 0x%08x %p\n", provider, messageType, messageArgument);
1437 		return kIOReturnSuccess;
1438 	}).detach();
1439 	assert(note);
1440 	IOSleep(1 * 1000);
1441 	note->remove();
1442 	found->release();
1443 
1444 	return 0;
1445 }
1446 
1447 static void
OSStaticPtrCastTests()1448 OSStaticPtrCastTests()
1449 {
1450 	// const& overload
1451 	{
1452 		OSSharedPtr<OSDictionary> const dict = OSMakeShared<OSDictionary>();
1453 		OSSharedPtr<OSCollection> collection = OSStaticPtrCast<OSCollection>(dict);
1454 		assert(collection == dict);
1455 	}
1456 	{
1457 		OSSharedPtr<OSDictionary> const dict = nullptr;
1458 		OSSharedPtr<OSCollection> collection = OSStaticPtrCast<OSCollection>(dict);
1459 		assert(collection == nullptr);
1460 	}
1461 	// && overload
1462 	{
1463 		OSSharedPtr<OSDictionary> dict = OSMakeShared<OSDictionary>();
1464 		__assert_only OSDictionary* oldDict = dict.get();
1465 		__assert_only OSSharedPtr<OSCollection> collection = OSStaticPtrCast<OSCollection>(os::move(dict));
1466 		assert(collection.get() == oldDict);
1467 		assert(dict == nullptr);
1468 	}
1469 	{
1470 		OSSharedPtr<OSDictionary> dict = nullptr;
1471 		OSSharedPtr<OSCollection> collection = OSStaticPtrCast<OSCollection>(os::move(dict));
1472 		assert(collection == nullptr);
1473 		assert(dict == nullptr);
1474 	}
1475 }
1476 
1477 static void
OSConstPtrCastTests()1478 OSConstPtrCastTests()
1479 {
1480 	// const& overload
1481 	{
1482 		OSSharedPtr<OSDictionary const> const dict = OSMakeShared<OSDictionary>();
1483 		OSSharedPtr<OSDictionary> dict2 = OSConstPtrCast<OSDictionary>(dict);
1484 		assert(dict2 == dict);
1485 	}
1486 	{
1487 		OSSharedPtr<OSDictionary const> const dict = OSMakeShared<OSDictionary>();
1488 		OSSharedPtr<OSDictionary const> dict2 = OSConstPtrCast<OSDictionary const>(dict);
1489 		assert(dict2 == dict);
1490 	}
1491 	{
1492 		OSSharedPtr<OSDictionary const> const dict = nullptr;
1493 		OSSharedPtr<OSDictionary> dict2 = OSConstPtrCast<OSDictionary>(dict);
1494 		assert(dict2 == nullptr);
1495 	}
1496 	{
1497 		OSSharedPtr<OSDictionary const> const dict = nullptr;
1498 		OSSharedPtr<OSDictionary const> dict2 = OSConstPtrCast<OSDictionary const>(dict);
1499 		assert(dict2 == nullptr);
1500 	}
1501 
1502 	// && overload
1503 	{
1504 		OSSharedPtr<OSDictionary const> dict = OSMakeShared<OSDictionary>();
1505 		__assert_only OSDictionary const* oldDict = dict.get();
1506 		__assert_only OSSharedPtr<OSDictionary> dict2 = OSConstPtrCast<OSDictionary>(os::move(dict));
1507 		assert(dict == nullptr);
1508 		assert(dict2 == oldDict);
1509 	}
1510 	{
1511 		OSSharedPtr<OSDictionary const> dict = nullptr;
1512 		OSSharedPtr<OSDictionary> dict2 = OSConstPtrCast<OSDictionary>(os::move(dict));
1513 		assert(dict == nullptr);
1514 		assert(dict2 == nullptr);
1515 	}
1516 }
1517 
1518 static void
OSDynamicPtrCastTests()1519 OSDynamicPtrCastTests()
1520 {
1521 	OSSharedPtr<OSDictionary> const dict = OSMakeShared<OSDictionary>();
1522 	{
1523 		OSSharedPtr<OSCollection> collection = OSDynamicPtrCast<OSCollection>(dict);
1524 		assert(collection != nullptr);
1525 	}
1526 	{
1527 		OSSharedPtr<OSArray> array = OSDynamicPtrCast<OSArray>(dict);
1528 		assert(array == nullptr);
1529 		assert(dict != nullptr);
1530 	}
1531 	{
1532 		OSTaggedSharedPtr<OSCollection, OSCollection> taggedDict(dict.get(), OSRetain);
1533 		OSTaggedSharedPtr<OSCollection, OSCollection> collection = OSDynamicPtrCast<OSCollection>(taggedDict);
1534 		assert(collection != nullptr);
1535 	}
1536 	{
1537 		OSTaggedSharedPtr<OSCollection, OSCollection> taggedDict(dict.get(), OSRetain);
1538 		OSTaggedSharedPtr<OSArray, OSCollection> array = OSDynamicPtrCast<OSArray>(taggedDict);
1539 		assert(array == nullptr);
1540 		assert(dict != nullptr);
1541 	}
1542 	{
1543 		OSSharedPtr<OSCollection> collection = OSDynamicPtrCast<OSCollection>(dict);
1544 		assert(collection.get() == OSDynamicCast(OSDictionary, dict.get()));
1545 		OSSharedPtr<OSDictionary> newDict = OSDynamicPtrCast<OSDictionary>(os::move(collection));
1546 		assert(collection == nullptr);
1547 		assert(newDict != nullptr);
1548 		assert(newDict.get() == dict.get());
1549 	}
1550 }
1551 
1552 
1553 class IOTestUserNotification : public IOUserNotification
1554 {
1555 	OSDeclareDefaultStructors(IOTestUserNotification);
1556 };
1557 
1558 OSDefineMetaClassAndStructors(IOTestUserNotification, IOUserNotification)
1559 
1560 struct IOUserNotificationTestThreadArgs {
1561 	IOTestUserNotification * userNotify;
1562 	IOLock * lock;
1563 	size_t * completed;
1564 	size_t iterations;
1565 };
1566 
1567 static bool
IOUserNotificationMatchingHandler(void * target __unused,void * ref __unused,IOService * newService __unused,IONotifier * notifier __unused)1568 IOUserNotificationMatchingHandler( void * target __unused,
1569     void * ref __unused, IOService * newService __unused, IONotifier * notifier __unused )
1570 {
1571 	return true;
1572 }
1573 
1574 static void
IOUserNotificationTestThread(void * arg,wait_result_t result __unused)1575 IOUserNotificationTestThread(void * arg, wait_result_t result __unused)
1576 {
1577 	IOUserNotificationTestThreadArgs * threadArgs = (IOUserNotificationTestThreadArgs *)arg;
1578 
1579 	OSSharedPtr<OSDictionary> dict = OSDictionary::withCapacity(0);
1580 	OSSharedPtr<OSString> rootPath = OSString::withCStringNoCopy(":/");
1581 	dict->setObject(gIOPathMatchKey, rootPath);
1582 
1583 	for (size_t i = 0; i < threadArgs->iterations; i++) {
1584 		if (i % 2 == 0) {
1585 			IONotifier * notify = IOService::addMatchingNotification( gIOWillTerminateNotification, dict.get(),
1586 			    &IOUserNotificationMatchingHandler, NULL );
1587 			threadArgs->userNotify->setNotification(notify);
1588 		} else {
1589 			threadArgs->userNotify->setNotification(NULL);
1590 		}
1591 	}
1592 
1593 	threadArgs->userNotify->setNotification(NULL);
1594 
1595 	IOLockLock(threadArgs->lock);
1596 	*threadArgs->completed = *threadArgs->completed + 1;
1597 	IOLockWakeup(threadArgs->lock, (event_t)threadArgs->completed, true);
1598 	IOLockUnlock(threadArgs->lock);
1599 }
1600 
1601 static int
IOUserNotificationTests(__unused int newValue)1602 IOUserNotificationTests(__unused int newValue)
1603 {
1604 	constexpr size_t numThreads = 10;
1605 	constexpr size_t numIterations = 500000;
1606 	OSSharedPtr<IOTestUserNotification> userNotify = OSMakeShared<IOTestUserNotification>();
1607 	IOLock * lock = IOLockAlloc();
1608 	size_t threadsCompleted;
1609 	size_t i = 0;
1610 	thread_t threads[numThreads];
1611 	kern_return_t kr;
1612 	bool result;
1613 
1614 	struct IOUserNotificationTestThreadArgs threadArgs = {
1615 		.userNotify = userNotify.get(),
1616 		.lock = lock,
1617 		.completed = &threadsCompleted,
1618 		.iterations = numIterations,
1619 	};
1620 
1621 	result = userNotify->init();
1622 	assert(result);
1623 
1624 	for (i = 0; i < numThreads; i++) {
1625 		kr = kernel_thread_start(&IOUserNotificationTestThread, (void *)&threadArgs, &threads[i]);
1626 		assert(kr == KERN_SUCCESS);
1627 	}
1628 
1629 	IOLockLock(lock);
1630 	while (threadsCompleted < numThreads) {
1631 		IOLockSleep(lock, &threadsCompleted, THREAD_UNINT);
1632 		IOLog("%s: Threads completed: %zu/%zu\n", __func__, threadsCompleted, numThreads);
1633 	}
1634 	IOLockUnlock(lock);
1635 
1636 	for (i = 0; i < numThreads; i++) {
1637 		thread_deallocate(threads[i]);
1638 	}
1639 
1640 	userNotify->setNotification(NULL);
1641 
1642 	IOLockFree(lock);
1643 
1644 	return KERN_SUCCESS;
1645 }
1646 
1647 static void
IOServiceMatchingSharedPtrTests()1648 IOServiceMatchingSharedPtrTests()
1649 {
1650 	OSSharedPtr<const OSSymbol> name = OSSymbol::withCString("name");
1651 	OSSharedPtr<const OSSymbol> value = OSSymbol::withCString("value");
1652 
1653 	{
1654 		OSSharedPtr<OSDictionary> table;
1655 		OSSharedPtr<OSDictionary> result = IOService::serviceMatching("name", table);
1656 		assert(result);
1657 		assert(result->getRetainCount() == 1);
1658 
1659 		table = result;
1660 		assert(table->getRetainCount() == 2);
1661 		OSSharedPtr<OSDictionary> result2 = IOService::serviceMatching("name", table);
1662 		assert(result2);
1663 		assert(result2 == table);
1664 		assert(result2->getRetainCount() == 3);
1665 	}
1666 
1667 	{
1668 		OSSharedPtr<OSDictionary> table;
1669 		OSSharedPtr<OSDictionary> result = IOService::serviceMatching(name.get(), table);
1670 		assert(result);
1671 		assert(result->getRetainCount() == 1);
1672 
1673 		table = result;
1674 		assert(table->getRetainCount() == 2);
1675 		OSSharedPtr<OSDictionary> result2 = IOService::serviceMatching(name.get(), table);
1676 		assert(result2);
1677 		assert(result2 == table);
1678 		assert(result2->getRetainCount() == 3);
1679 	}
1680 
1681 	{
1682 		OSSharedPtr<OSDictionary> table;
1683 		OSSharedPtr<OSDictionary> result = IOService::nameMatching("name", table);
1684 		assert(result);
1685 		assert(result->getRetainCount() == 1);
1686 
1687 		table = result;
1688 		assert(table->getRetainCount() == 2);
1689 		OSSharedPtr<OSDictionary> result2 = IOService::nameMatching("name", table);
1690 		assert(result2);
1691 		assert(result2 == table);
1692 		assert(result2->getRetainCount() == 3);
1693 	}
1694 
1695 	{
1696 		OSSharedPtr<OSDictionary> table;
1697 		OSSharedPtr<OSDictionary> result = IOService::nameMatching(name.get(), table);
1698 		assert(result);
1699 		assert(result->getRetainCount() == 1);
1700 
1701 		table = result;
1702 		assert(table->getRetainCount() == 2);
1703 		OSSharedPtr<OSDictionary> result2 = IOService::nameMatching(name.get(), table);
1704 		assert(result2);
1705 		assert(result2 == table);
1706 		assert(result2->getRetainCount() == 3);
1707 	}
1708 
1709 	{
1710 		OSSharedPtr<OSDictionary> table;
1711 		OSSharedPtr<OSDictionary> result = IOService::resourceMatching("name", table);
1712 		assert(result);
1713 		assert(result->getRetainCount() == 1);
1714 
1715 		table = result;
1716 		assert(table->getRetainCount() == 2);
1717 		OSSharedPtr<OSDictionary> result2 = IOService::resourceMatching("name", table);
1718 		assert(result2);
1719 		assert(result2 == table);
1720 		assert(result2->getRetainCount() == 3);
1721 	}
1722 
1723 	{
1724 		OSSharedPtr<OSDictionary> table;
1725 		OSSharedPtr<OSDictionary> result = IOService::resourceMatching(name.get(), table);
1726 		assert(result);
1727 		assert(result->getRetainCount() == 1);
1728 
1729 		table = result;
1730 		assert(table->getRetainCount() == 2);
1731 		OSSharedPtr<OSDictionary> result2 = IOService::resourceMatching(name.get(), table);
1732 		assert(result2);
1733 		assert(result2 == table);
1734 		assert(result2->getRetainCount() == 3);
1735 	}
1736 
1737 	{
1738 		OSSharedPtr<OSDictionary> table;
1739 		OSSharedPtr<OSDictionary> result = IOService::propertyMatching(name.get(), value.get(), table);
1740 		assert(result);
1741 		assert(result->getRetainCount() == 1);
1742 
1743 		table = result;
1744 		assert(table->getRetainCount() == 2);
1745 		OSSharedPtr<OSDictionary> result2 = IOService::propertyMatching(name.get(), value.get(), table);
1746 		assert(result2);
1747 		assert(result2 == table);
1748 		assert(result2->getRetainCount() == 3);
1749 	}
1750 
1751 	{
1752 		OSSharedPtr<OSDictionary> table;
1753 		OSSharedPtr<OSDictionary> result = IOService::registryEntryIDMatching(12, table);
1754 		assert(result);
1755 		assert(result->getRetainCount() == 1);
1756 
1757 		table = result;
1758 		assert(table->getRetainCount() == 2);
1759 		OSSharedPtr<OSDictionary> result2 = IOService::registryEntryIDMatching(12, table);
1760 		assert(result2);
1761 		assert(result2 == table);
1762 		assert(result2->getRetainCount() == 3);
1763 	}
1764 }
1765 
1766 static int
OSSharedPtrTests(int)1767 OSSharedPtrTests(int)
1768 {
1769 	OSDynamicPtrCastTests();
1770 	OSConstPtrCastTests();
1771 	OSStaticPtrCastTests();
1772 	IOServiceMatchingSharedPtrTests();
1773 	return 0;
1774 }
1775 
1776 static int
IOServiceStateNotificationTests(int)1777 IOServiceStateNotificationTests(int)
1778 {
1779 	IOService * service = IOService::getSystemStateNotificationService();
1780 	OSSharedPtr<OSString> str = OSString::withCString(kIOSystemStateClamshellKey);
1781 	kern_return_t kr = service->StateNotificationItemCreate(str.get(), NULL);
1782 	assert(kIOReturnSuccess == kr);
1783 
1784 	void (^sendClam)(OSBoolean * state) = ^void (OSBoolean * state) {
1785 		OSSharedPtr<OSDictionary> value;
1786 		kern_return_t kr;
1787 
1788 		value = OSDictionary::withCapacity(4);
1789 		value->setObject("value", state);
1790 		kr = IOService::getSystemStateNotificationService()->StateNotificationItemSet(str.get(), value.get());
1791 		assert(kIOReturnSuccess == kr);
1792 	};
1793 	sendClam(kOSBooleanTrue);
1794 	IOSleep(100);
1795 	sendClam(kOSBooleanFalse);
1796 
1797 	str = OSString::withCString("test");
1798 	OSSharedPtr<OSArray> array = OSArray::withCapacity(4);
1799 	array->setObject(str.get());
1800 	IOStateNotificationListenerRef listenerRef;
1801 	kr = service->stateNotificationListenerAdd(array.get(), &listenerRef, ^kern_return_t () {
1802 		IOLog("test handler\n");
1803 		kern_return_t kr;
1804 		OSDictionary * dict;
1805 		kr = service->StateNotificationItemCopy(str.get(), &dict);
1806 		if (kIOReturnSuccess == kr) {
1807 		        OSSharedPtr<OSSerialize> s = OSSerialize::withCapacity(4096);
1808 		        dict->serialize(s.get());
1809 		        IOLog("test handler %s\n", s->text());
1810 		}
1811 		return kIOReturnSuccess;
1812 	});
1813 	assert(kIOReturnSuccess == kr);
1814 
1815 	OSSharedPtr<IOEventSource> es =
1816 	    IOServiceStateNotificationEventSource::serviceStateNotificationEventSource(
1817 		service, array.get(),
1818 		^void () {
1819 		IOLog("test es handler\n");
1820 		kern_return_t kr;
1821 		OSDictionary * dict;
1822 		kr = service->StateNotificationItemCopy(str.get(), &dict);
1823 		if (kIOReturnSuccess == kr) {
1824 		        OSSharedPtr<OSSerialize> s = OSSerialize::withCapacity(4096);
1825 		        dict->serialize(s.get());
1826 		        IOLog("test es handler %s\n", s->text());
1827 		}
1828 	});
1829 	assert(es);
1830 	IOService::getPlatform()->getWorkLoop()->addEventSource(es.get());
1831 	es->enable();
1832 	IOSleep(30 * 1000);
1833 	IOService::getPlatform()->getWorkLoop()->removeEventSource(es.get());
1834 
1835 	return kIOReturnSuccess;
1836 }
1837 
1838 static int
IOMallocPageableTests(int)1839 IOMallocPageableTests(int)
1840 {
1841 	vm_size_t size = 0;
1842 	vm_size_t alignment = 0;
1843 
1844 	for (size = 0; size <= 4 * page_size; size += 64) {
1845 		for (alignment = 1; alignment <= page_size; alignment <<= 1) {
1846 			uintptr_t alignMask = alignment - 1;
1847 			void * addr = IOMallocPageable(size, alignment);
1848 			if (addr == NULL) {
1849 				IOLog("IOMallocPageable(size=%u, alignment=%u) failed\n", (uint32_t)size, (uint32_t)alignment);
1850 				return kIOReturnError;
1851 			}
1852 			if (((uintptr_t)addr & alignMask) != 0) {
1853 				IOLog("IOMallocPageable(size=%u, alignment=%u) returned unaligned pointer %p\n", (uint32_t)size, (uint32_t)alignment, addr);
1854 				return kIOReturnError;
1855 			}
1856 			IOFreePageable(addr, size);
1857 
1858 			addr = IOMallocPageableZero(size, alignment);
1859 			if (addr == NULL) {
1860 				IOLog("IOMallocPageableZero(size=%u, alignment=%u) failed\n", (uint32_t)size, (uint32_t)alignment);
1861 				return kIOReturnError;
1862 			}
1863 			if (((uintptr_t)addr & alignMask) != 0) {
1864 				IOLog("IOMallocPageableZero(size=%u, alignment=%u) returned unaligned pointer %p\n", (uint32_t)size, (uint32_t)alignment, addr);
1865 				return kIOReturnError;
1866 			}
1867 			for (char * ptr = (char *)addr; ptr < (char *)addr + size; ptr++) {
1868 				if (*ptr != 0) {
1869 					IOLog("IOMallocPageableZero(size=%u, alignment=%u) -> %p, byte at %p is nonzero\n", (uint32_t)size, (uint32_t)alignment, addr, ptr);
1870 				}
1871 			}
1872 			IOFreePageable(addr, size);
1873 		}
1874 	}
1875 
1876 	return kIOReturnSuccess;
1877 }
1878 
1879 static int
Test100367284(int)1880 Test100367284(int)
1881 {
1882 	OSSharedPtr<IOService> entry;
1883 	OSSharedPtr<IOService> replace;
1884 	OSSharedPtr<IOService> root;
1885 
1886 	root = OSDynamicPtrCast<IOService>(IORegistryEntry::fromPath("/", gIODTPlane));
1887 	entry = OSMakeShared<IOService>();
1888 	entry->init();
1889 	entry->attachToParent(root.get(), gIODTPlane);
1890 	entry->attachToParent(root.get(), gIOServicePlane);
1891 
1892 	replace = OSMakeShared<IOService>();
1893 	replace->init(entry.get(), gIODTPlane);
1894 	replace->detachFromParent(root.get(), gIODTPlane);
1895 
1896 	return kIOReturnSuccess;
1897 }
1898 
1899 // Test the lockForArbitration(not-required) path
1900 
1901 struct LockForArbitrationTestThreadArgs {
1902 	OSSharedPtr<IOService> a;
1903 	OSSharedPtr<IOService> b;
1904 	IOLock lock;
1905 	int state;
1906 };
1907 
1908 static void
TestLockForArbitrationThread(void * arg,wait_result_t result __unused)1909 TestLockForArbitrationThread(void * arg, wait_result_t result __unused)
1910 {
1911 	LockForArbitrationTestThreadArgs * threadArgs = (LockForArbitrationTestThreadArgs *)arg;
1912 	bool ok;
1913 
1914 	ok = threadArgs->b->lockForArbitration();
1915 	assert(ok);
1916 
1917 	IOLockLock(&threadArgs->lock);
1918 	threadArgs->state = 1;
1919 	thread_wakeup(&threadArgs->state);
1920 	IOLockUnlock(&threadArgs->lock);
1921 
1922 	ok = threadArgs->a->lockForArbitration(false);
1923 	assert(!ok);            // fails
1924 	threadArgs->b->unlockForArbitration();
1925 
1926 	IOLockLock(&threadArgs->lock);
1927 	threadArgs->state = 2;
1928 	thread_wakeup(&threadArgs->state);
1929 	IOLockUnlock(&threadArgs->lock);
1930 }
1931 
1932 static int
TestLockForArbitration(int)1933 TestLockForArbitration(int)
1934 {
1935 	struct LockForArbitrationTestThreadArgs threadArgs;
1936 	thread_t thread;
1937 	kern_return_t kr;
1938 	bool ok;
1939 
1940 	threadArgs.a = OSMakeShared<IOService>();
1941 	threadArgs.a->init();
1942 	threadArgs.b = OSMakeShared<IOService>();
1943 	threadArgs.b->init();
1944 	IOLockInlineInit(&threadArgs.lock);
1945 	threadArgs.state = 0;
1946 
1947 	ok = threadArgs.a->lockForArbitration();
1948 	assert(ok);
1949 
1950 	IOLockLock(&threadArgs.lock);
1951 	kr = kernel_thread_start(&TestLockForArbitrationThread, (void *)&threadArgs, &thread);
1952 	assert(kr == KERN_SUCCESS);
1953 	while (1 != threadArgs.state) {
1954 		IOLockSleep(&threadArgs.lock, &threadArgs.state, THREAD_UNINT);
1955 	}
1956 	IOLockUnlock(&threadArgs.lock);
1957 
1958 	ok = threadArgs.b->lockForArbitration();
1959 	assert(ok);
1960 	threadArgs.b->unlockForArbitration();
1961 	threadArgs.a->unlockForArbitration();
1962 
1963 	IOLockLock(&threadArgs.lock);
1964 	while (2 != threadArgs.state) {
1965 		IOLockSleep(&threadArgs.lock, &threadArgs.state, THREAD_UNINT);
1966 	}
1967 	IOLockUnlock(&threadArgs.lock);
1968 	IOLockInlineDestroy(&threadArgs.lock);
1969 
1970 	return kIOReturnSuccess;
1971 }
1972 
1973 // --
1974 
1975 #endif  /* DEVELOPMENT || DEBUG */
1976 
1977 #ifndef __clang_analyzer__
1978 // All the scary things that this function is doing, such as the intentional
1979 // overrelease of an OSData, are hidden from the static analyzer.
1980 static int
sysctl_iokittest(__unused struct sysctl_oid * oidp,__unused void * arg1,__unused int arg2,struct sysctl_req * req)1981 sysctl_iokittest(__unused struct sysctl_oid *oidp, __unused void *arg1, __unused int arg2, struct sysctl_req *req)
1982 {
1983 	int error;
1984 	int newValue, changed;
1985 
1986 	error = sysctl_io_number(req, 0, sizeof(int), &newValue, &changed);
1987 	if (error) {
1988 		return error;
1989 	}
1990 
1991 #if DEVELOPMENT || DEBUG
1992 	if (changed && (66 == newValue)) {
1993 		IOReturn ret;
1994 		OSSharedPtr<IOWorkLoop> wl = IOWorkLoop::workLoop();
1995 		OSSharedPtr<IOCommandGate> cg = IOCommandGate::commandGate(wl.get());
1996 		ret = wl->addEventSource(cg.get());
1997 
1998 		struct x {
1999 			uint64_t h;
2000 			uint64_t l;
2001 		};
2002 		struct x y;
2003 
2004 		y.h = 0x1111111122222222;
2005 		y.l = 0x3333333344444444;
2006 
2007 		kprintf("ret1 %d\n", ret);
2008 		ret = cg->runActionBlock(^(){
2009 			printf("hello %d 0x%qx\n", wl->inGate(), y.h);
2010 			return 99;
2011 		});
2012 		kprintf("ret %d\n", ret);
2013 	}
2014 
2015 	if (changed && (999 == newValue)) {
2016 		OSSharedPtr<OSData> data = OSData::withCapacity(16);
2017 		data->release();
2018 	}
2019 
2020 	if (changed && (newValue >= 6666) && (newValue <= 6669)) {
2021 		OSSharedPtr<OSIterator> iter;
2022 		IOService  * service;
2023 
2024 		service = NULL;
2025 		OSSharedPtr<OSDictionary> matchingDict = IOService::nameMatching("XHC1");
2026 		iter = IOService::getMatchingServices(matchingDict.get());
2027 		if (iter && (service = (IOService *) iter->getNextObject())) {
2028 			if (newValue == 6666) {
2029 				IOLog("terminating 0x%qx\n", service->getRegistryEntryID());
2030 				service->terminate();
2031 			} else if (newValue == 6667) {
2032 				IOLog("register 0x%qx\n", service->getRegistryEntryID());
2033 				service->registerService();
2034 			}
2035 		}
2036 		if (service) {
2037 			return 0;
2038 		}
2039 	}
2040 
2041 
2042 	if (changed && (555 == newValue)) {
2043 		IOServiceStateNotificationTests(newValue);
2044 	}
2045 #if TEST_ZLIB
2046 	if (changed && (122 == newValue)) {
2047 		error = TestZLib(newValue);
2048 		assert(KERN_SUCCESS == error);
2049 	}
2050 #endif /* TEST_ZLIB */
2051 	if (changed && newValue) {
2052 		error = TestLockForArbitration(newValue);
2053 		assert(KERN_SUCCESS == error);
2054 		error = Test100367284(newValue);
2055 		assert(KERN_SUCCESS == error);
2056 		error = IOWorkLoopTest(newValue);
2057 		assert(KERN_SUCCESS == error);
2058 		error = IOServiceTest(newValue);
2059 		assert(KERN_SUCCESS == error);
2060 		error = OSCollectionTest(newValue);
2061 		assert(KERN_SUCCESS == error);
2062 		error = OSCollectionIteratorTests(newValue);
2063 		assert(KERN_SUCCESS == error);
2064 		error = OSAllocationTests(newValue);
2065 		assert(KERN_SUCCESS == error);
2066 		error = OSDataAllocationTests(newValue);
2067 		assert(KERN_SUCCESS == error);
2068 		error = OSBoundedArrayTests(newValue);
2069 		assert(KERN_SUCCESS == error);
2070 		error = OSBoundedArrayRefTests(newValue);
2071 		assert(KERN_SUCCESS == error);
2072 		error = OSBoundedPtrTests(newValue);
2073 		assert(KERN_SUCCESS == error);
2074 		error = OSValueObjectTests(newValue);
2075 		assert(KERN_SUCCESS == error);
2076 		error = IOMemoryDescriptorTest(newValue);
2077 		assert(KERN_SUCCESS == error);
2078 		error = OSSharedPtrTests(newValue);
2079 		assert(KERN_SUCCESS == error);
2080 		error = IOSharedDataQueue_44636964(newValue);
2081 		assert(KERN_SUCCESS == error);
2082 		error = IOUserNotificationTests(newValue);
2083 		assert(KERN_SUCCESS == error);
2084 		error = IOMallocPageableTests(newValue);
2085 		assert(KERN_SUCCESS == error);
2086 		error = IODataQueueDispatchSourceTests(newValue);
2087 		assert(KERN_SUCCESS == error);
2088 	}
2089 #endif  /* DEVELOPMENT || DEBUG */
2090 
2091 	return error;
2092 }
2093 
2094 
2095 SYSCTL_PROC(_kern, OID_AUTO, iokittest,
2096     CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_KERN | CTLFLAG_LOCKED,
2097     NULL, 0, sysctl_iokittest, "I", "");
2098 #endif // __clang_analyzer__
2099 
2100 #if DEVELOPMENT || DEBUG
2101 
2102 /*
2103  * A simple wrapper around an IOService. This terminates the IOService in free().
2104  */
2105 class TestIOServiceHandle : public OSObject
2106 {
2107 	OSDeclareDefaultStructors(TestIOServiceHandle);
2108 public:
2109 	static TestIOServiceHandle * withService(IOService * service);
2110 
2111 private:
2112 	bool initWithService(IOService * service);
2113 	virtual void free() APPLE_KEXT_OVERRIDE;
2114 
2115 	IOService * fService;
2116 };
2117 
2118 OSDefineMetaClassAndStructors(TestIOServiceHandle, OSObject);
2119 
2120 TestIOServiceHandle *
withService(IOService * service)2121 TestIOServiceHandle::withService(IOService * service)
2122 {
2123 	TestIOServiceHandle * handle = new TestIOServiceHandle;
2124 	if (handle && !handle->initWithService(service)) {
2125 		return NULL;
2126 	}
2127 	return handle;
2128 }
2129 
2130 bool
initWithService(IOService * service)2131 TestIOServiceHandle::initWithService(IOService * service)
2132 {
2133 	fService = service;
2134 	fService->retain();
2135 	return true;
2136 }
2137 
2138 void
free()2139 TestIOServiceHandle::free()
2140 {
2141 	if (fService) {
2142 		fService->terminate();
2143 		OSSafeReleaseNULL(fService);
2144 	}
2145 }
2146 
2147 /*
2148  * Set up test IOServices. See the available services in xnu/iokit/Tests/TestServices.
2149  *
2150  * xnu darwintests use this sysctl to make these test services available. A send right is pushed
2151  * to the task that called the sysctl, which when deallocated removes the service. This ensures
2152  * that the registry isn't polluted by misbehaving tests.
2153  *
2154  * Since this sysctl allows callers to instantiate arbitrary classes based on their class name,
2155  * this can be a security concern. Tests that call this sysctl need the
2156  * kIOServiceTestServiceManagementEntitlementKey entitlement.
2157  */
2158 static int
sysctl_iokit_test_service_setup(struct sysctl_oid * oidp,__unused void * arg1,__unused int arg2,struct sysctl_req * req)2159 sysctl_iokit_test_service_setup(struct sysctl_oid *oidp, __unused void *arg1, __unused int arg2, struct sysctl_req *req)
2160 {
2161 	char classname[128] = {0};
2162 	IOService * service; // must not release
2163 	OSObject * obj = NULL; // must release
2164 	IOService * provider = NULL; // must not release
2165 	TestIOServiceHandle * handle = NULL; // must release
2166 	mach_port_name_t name __unused;
2167 	int error;
2168 
2169 	if (!IOTaskHasEntitlement(current_task(), kIOServiceTestServiceManagementEntitlementKey)) {
2170 		error = EPERM;
2171 		goto finish;
2172 	}
2173 
2174 	error = sysctl_handle_string(oidp, classname, sizeof(classname), req);
2175 	if (error != 0) {
2176 		goto finish;
2177 	}
2178 
2179 	/*
2180 	 * All test services currently attach to IOResources.
2181 	 */
2182 	provider = IOService::getResourceService();
2183 	if (!provider) {
2184 		IOLog("Failed to find IOResources\n");
2185 		error = ENOENT;
2186 		goto finish;
2187 	}
2188 
2189 	obj = OSMetaClass::allocClassWithName(classname);
2190 	if (!obj) {
2191 		IOLog("Failed to alloc class %s\n", classname);
2192 		error = ENOENT;
2193 		goto finish;
2194 	}
2195 
2196 	service = OSDynamicCast(IOService, obj);
2197 
2198 	if (!service) {
2199 		IOLog("Instance of class %s is not an IOService\n", classname);
2200 		error = EINVAL;
2201 		goto finish;
2202 	}
2203 
2204 	if (!service->init()) {
2205 		IOLog("Failed to initialize %s\n", classname);
2206 		error = EINVAL;
2207 		goto finish;
2208 	}
2209 
2210 	if (!service->attach(provider)) {
2211 		IOLog("Failed to attach %s\n", classname);
2212 		error = EINVAL;
2213 		goto finish;
2214 	}
2215 
2216 	if (!service->start(provider)) {
2217 		IOLog("Failed to start %s\n", classname);
2218 		error = EINVAL;
2219 		goto finish;
2220 	}
2221 
2222 	handle = TestIOServiceHandle::withService(service);
2223 	if (!handle) {
2224 		IOLog("Failed to create service handle\n");
2225 		error = ENOMEM;
2226 		goto finish;
2227 	}
2228 	name = iokit_make_send_right(current_task(), handle, IKOT_IOKIT_OBJECT);
2229 
2230 	error = 0;
2231 
2232 finish:
2233 
2234 	OSSafeReleaseNULL(obj);
2235 	OSSafeReleaseNULL(handle);
2236 	return error;
2237 }
2238 
2239 
2240 SYSCTL_PROC(_kern, OID_AUTO, iokit_test_service_setup,
2241     CTLTYPE_STRING | CTLFLAG_WR | CTLFLAG_KERN | CTLFLAG_LOCKED,
2242     NULL, 0, sysctl_iokit_test_service_setup, "-", "");
2243 
2244 #endif /* DEVELOPMENT || DEBUG */
2245 
2246 
2247 static __unused void
CastCompileTest(OSObject * obj)2248 CastCompileTest(OSObject *obj)
2249 {
2250 	IOService * service1 = OSDynamicCast(IOService, obj);
2251 	if (service1) {
2252 		service1->terminate();
2253 	}
2254 	IOService *service2 = OSRequiredCast(IOService, obj);
2255 	if (service2) {
2256 		service2->terminate();
2257 	}
2258 }
2259