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