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