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