1/*
2 * Copyright (c) 1998-2019 Apple 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 * Copyright (c) 1998 Apple Computer, Inc. All rights reserved.
30 *
31 * HISTORY
32 *
33 */
34
35
36#ifndef _IOKIT_IOPLATFORMEXPERT_H
37#define _IOKIT_IOPLATFORMEXPERT_H
38
39#ifdef __cplusplus
40#include <IOKit/IOLib.h>
41#include <IOKit/IOService.h>
42#include <IOKit/IOInterrupts.h>
43#include <IOKit/IOInterruptController.h>
44#include <libkern/c++/OSPtr.h>
45
46extern "C" {
47#else
48#include <kern/clock.h>
49#endif
50
51#include <libkern/OSTypes.h>
52
53typedef enum {
54 kCoprocessorVersionNone = 0x00000000,
55 kCoprocessorVersion1 = 0x00010000,
56 kCoprocessorVersion2 = 0x00020000,
57} coprocessor_type_t;
58
59
60/*
61 * PEGetMachineName() and PEGetModelName() are inconsistent across
62 * architectures, and considered deprecated.
63 * PEGetTargetName() and PEGetProductName() instead.
64 */
65extern boolean_t PEGetMachineName( char * name, int maxLength );
66extern boolean_t PEGetModelName( char * name, int maxLength );
67
68extern boolean_t PEGetTargetName( char * name, int maxLength );
69extern boolean_t PEGetProductName( char * name, int maxLength );
70extern int PEGetPlatformEpoch( void );
71
72enum {
73 kPEHaltCPU,
74 kPERestartCPU,
75 kPEHangCPU,
76 kPEUPSDelayHaltCPU,
77 kPEPanicRestartCPU,
78 kPEPanicSync,
79 kPEPagingOff,
80 kPEPanicBegin,
81 kPEPanicEnd,
82 kPEPanicRestartCPUNoCallouts,
83 kPEPanicDiagnosticsDone,
84 kPEPanicDiagnosticsInProgress,
85};
86
87/* Bitmask of details related to panic callouts */
88#define kPanicDetailsForcePowerOff 0x1
89
90extern int (*PE_halt_restart)(unsigned int type);
91extern int PEHaltRestart(unsigned int type);
92
93#ifdef XNU_KERNEL_PRIVATE
94
95extern int PEHaltRestartInternal(unsigned int type, uint32_t details);
96
97enum {
98 kIOSystemShutdownNotificationStageProcessExit = 0,
99 kIOSystemShutdownNotificationStageRootUnmount = 1,
100 kIOSystemShutdownNotificationTerminateDEXTs = 2,
101};
102extern void IOSystemShutdownNotification(int howto, int stage);
103
104extern uint32_t gEnforcePlatformActionSafety;
105#endif /* XNU_KERNEL_PRIVATE */
106
107#ifdef KERNEL_PRIVATE
108extern boolean_t IOPMRootDomainGetWillShutdown(void);
109extern void PEInitiatePanic(void);
110#endif /* KERNEL_PRIVATE */
111
112// Save the Panic Info. Returns the number of bytes saved.
113extern UInt32 PESavePanicInfo(UInt8 *buffer, UInt32 length);
114extern void PESavePanicInfoAction(void *buffer, UInt32 offset, UInt32 length);
115
116/*
117 * SMC requires that all data is flushed in multiples of 16 bytes at 16 byte
118 * boundaries.
119 */
120#define PANIC_FLUSH_BOUNDARY 16
121
122extern long PEGetGMTTimeOfDay( void );
123extern void PESetGMTTimeOfDay( long secs );
124extern void PEGetUTCTimeOfDay( clock_sec_t * secs, clock_usec_t * usecs );
125extern void PESetUTCTimeOfDay( clock_sec_t secs, clock_usec_t usecs );
126
127/* unless it's a "well-known" property, these will read/write out the value as raw data */
128
129extern boolean_t PEWriteNVRAMBooleanProperty(const char *symbol, boolean_t value);
130extern boolean_t PEWriteNVRAMProperty(const char *symbol, const void *value, const unsigned int len);
131extern boolean_t PEWriteNVRAMPropertyWithCopy(const char *symbol, const void *value, const unsigned int len);
132extern boolean_t PEReadNVRAMProperty(const char *symbol, void *value, unsigned int *len);
133extern boolean_t PEReadNVRAMBooleanProperty(const char *symbol, boolean_t *value);
134extern boolean_t PERemoveNVRAMProperty(const char *symbol);
135extern boolean_t PESyncNVRAM(void);
136
137extern coprocessor_type_t PEGetCoprocessorVersion( void );
138
139#ifdef __cplusplus
140} /* extern "C" */
141
142#define kIOPlatformMapperPresentKey "IOPlatformMapperPresent"
143
144
145
146
147extern OSSymbol * gPlatformInterruptControllerName;
148
149/*
150 * IOPlatformSleepAction
151 *
152 * Sleep is called after power management has finished all of the power plane
153 * driver power management notifications and state transitions and has
154 * committed to sleep, but before the other CPUs are powered off.
155 * The scheduler is still active.
156 */
157extern const OSSymbol *gIOPlatformSleepActionKey;
158
159/*
160 * IOPlatformWakeAction
161 *
162 * Wake is called with the scheduler enabled, but before
163 * powering on other CPUs, so try to minimize work done in this path to speed
164 * up wake time.
165 */
166extern const OSSymbol *gIOPlatformWakeActionKey;
167
168/*
169 * IOPlatformQuiesceAction
170 *
171 * Quiesce is called after all CPUs are off, scheduling is disabled,
172 * and the boot CPU is about to pull the plug.
173 * Mutexes and blocking are disallowed in this context and will panic.
174 * Do not pass this action to super() (incl. IOService, IOPlatformExpert)
175 */
176extern const OSSymbol *gIOPlatformQuiesceActionKey;
177
178/*
179 * IOPlatformActiveAction
180 *
181 * Active is called very early in the wake path before enabling the scheduler
182 * on the boot CPU.
183 * Mutexes and blocking are disallowed in this context and will panic.
184 * Do not pass this action to super() (incl. IOService, IOPlatformExpert)
185 */
186extern const OSSymbol *gIOPlatformActiveActionKey;
187
188/*
189 * IOPlatformHaltRestartAction
190 *
191 * Halt/Restart is called after the kernel finishes shutting down the
192 * system and is ready to power off or reboot.
193 *
194 * It is not guaranteed to be called in non-graceful shutdown scenarios.
195 */
196extern const OSSymbol *gIOPlatformHaltRestartActionKey;
197
198/*
199 * IOPlatformPanicAction
200 *
201 * Panic is called when the system is panicking before it records a core file
202 * (if it is configured to do so)
203 *
204 * It can be called at any time, in any context, in any state. Don't depend
205 * on anything being powered on in a useful state.
206 *
207 * Mutexes and blocking are disallowed in this context and will fail.
208 *
209 * If you hang or panic again in this callout, the panic log may not be recorded,
210 * leading to the loss of field reports about customer issues.
211 */
212extern const OSSymbol *gIOPlatformPanicActionKey;
213
214class IORangeAllocator;
215class IONVRAMController;
216class IOPMrootDomain;
217
218class IOPlatformExpert : public IOService
219{
220 OSDeclareDefaultStructors(IOPlatformExpert);
221
222private:
223 long _peBootROMType;
224 long _peChipSetType;
225 long _peMachineType;
226
227protected:
228 IOPMrootDomain * root;
229 int _pePMFeatures;
230 int _pePrivPMFeatures;
231 int _peNumBatteriesSupported;
232 OSArray * thePowerTree;
233
234 bool searchingForAdditionalParents;
235 OSNumber * multipleParentKeyValue;
236 int numInstancesRegistered;
237
238 struct ExpansionData { };
239 ExpansionData *iope_reserved __unused;
240
241 virtual void setBootROMType(long peBootROMType);
242 virtual void setChipSetType(long peChipSetType);
243 virtual void setMachineType(long peMachineType);
244
245 virtual bool CheckSubTree(OSArray * inSubTree, IOService * theNub, IOService * theDevice, OSDictionary * theParent);
246 virtual bool RegisterServiceInTree(IOService * theService, OSDictionary * theTreeNode, OSDictionary * theTreeParentNode, IOService * theProvider);
247
248 virtual void PMInstantiatePowerDomains( void );
249
250public:
251 virtual bool attach( IOService * provider ) APPLE_KEXT_OVERRIDE;
252 virtual bool start( IOService * provider ) APPLE_KEXT_OVERRIDE;
253 virtual bool configure( IOService * provider );
254 virtual IOService * createNub( OSDictionary * from );
255
256 virtual bool compareNubName( const IOService * nub, OSString * name,
257 OSString ** matched = NULL ) const;
258 bool compareNubName( const IOService * nub, OSString * name,
259 OSSharedPtr<OSString>& matched ) const;
260 virtual IOReturn getNubResources( IOService * nub );
261
262 virtual long getBootROMType(void);
263 virtual long getChipSetType(void);
264 virtual long getMachineType(void);
265
266 /*
267 * getModelName() and getMachineName() are deprecated for direct
268 * use. Use getTargetName() and getProductName() instead.
269 */
270 virtual bool getModelName( char * name, int maxLength );
271 virtual bool getMachineName( char * name, int maxLength );
272
273 virtual int haltRestart(unsigned int type);
274 virtual void sleepKernel(void);
275
276 virtual long getGMTTimeOfDay( void );
277 virtual void setGMTTimeOfDay( long secs );
278
279 virtual IOReturn getConsoleInfo( PE_Video * consoleInfo );
280 virtual IOReturn setConsoleInfo( PE_Video * consoleInfo, unsigned int op );
281
282 virtual void registerNVRAMController( IONVRAMController * nvram );
283
284 virtual IOReturn registerInterruptController(OSSymbol *name, IOInterruptController *interruptController);
285 virtual LIBKERN_RETURNS_NOT_RETAINED IOInterruptController *
286 lookUpInterruptController(OSSymbol *name);
287
288 virtual void setCPUInterruptProperties(IOService *service);
289 virtual bool atInterruptLevel(void);
290
291 virtual IOReturn callPlatformFunction(const OSSymbol *functionName,
292 bool waitForFunction,
293 void *param1, void *param2,
294 void *param3, void *param4) APPLE_KEXT_OVERRIDE;
295
296 virtual IORangeAllocator * getPhysicalRangeAllocator(void);
297
298 virtual bool platformAdjustService(IOService *service);
299
300 virtual void PMRegisterDevice(IOService * theNub, IOService * theDevice);
301 virtual void PMLog( const char *, unsigned long, unsigned long, unsigned long );
302
303 virtual bool hasPMFeature(unsigned long featureMask);
304 virtual bool hasPrivPMFeature(unsigned long privFeatureMask);
305 virtual int numBatteriesSupported(void);
306
307 virtual IOByteCount savePanicInfo(UInt8 *buffer, IOByteCount length);
308
309 virtual OSString* createSystemSerialNumberString(OSData* myProperty);
310
311 virtual IOReturn deregisterInterruptController(OSSymbol *name);
312
313 virtual void getUTCTimeOfDay( clock_sec_t * secs, clock_nsec_t * nsecs );
314 virtual void setUTCTimeOfDay( clock_sec_t secs, clock_nsec_t nsecs );
315 void publishPlatformUUIDAndSerial( void );
316 void publishNVRAM( void );
317
318 virtual bool getTargetName( char * name, int maxLength );
319 virtual bool getProductName( char * name, int maxLength );
320
321 OSMetaClassDeclareReservedUsedX86(IOPlatformExpert, 0);
322 OSMetaClassDeclareReservedUsedX86(IOPlatformExpert, 1);
323 OSMetaClassDeclareReservedUsedX86(IOPlatformExpert, 2);
324 OSMetaClassDeclareReservedUsedX86(IOPlatformExpert, 3);
325 OSMetaClassDeclareReservedUsedX86(IOPlatformExpert, 4);
326 OSMetaClassDeclareReservedUsedX86(IOPlatformExpert, 5);
327 OSMetaClassDeclareReservedUsedX86(IOPlatformExpert, 6);
328
329 OSMetaClassDeclareReservedUnused(IOPlatformExpert, 7);
330 OSMetaClassDeclareReservedUnused(IOPlatformExpert, 8);
331 OSMetaClassDeclareReservedUnused(IOPlatformExpert, 9);
332 OSMetaClassDeclareReservedUnused(IOPlatformExpert, 10);
333 OSMetaClassDeclareReservedUnused(IOPlatformExpert, 11);
334};
335
336/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
337
338class IODTNVRAM;
339
340class IODTPlatformExpert : public IOPlatformExpert
341{
342 OSDeclareAbstractStructors(IODTPlatformExpert);
343
344private:
345 IODTNVRAM *dtNVRAM;
346
347 struct ExpansionData { };
348 ExpansionData *iodtpe_reserved;
349
350public:
351 virtual IOService * probe( IOService * provider,
352 SInt32 * score ) APPLE_KEXT_OVERRIDE;
353 virtual bool configure( IOService * provider ) APPLE_KEXT_OVERRIDE;
354
355 virtual void processTopLevel( IORegistryEntry * root );
356 virtual const char * deleteList( void ) = 0;
357 virtual const char * excludeList( void ) = 0;
358 virtual IOService * createNub( IORegistryEntry * from );
359 virtual bool createNubs( IOService * parent, LIBKERN_CONSUMED OSIterator * iter );
360
361 virtual bool compareNubName( const IOService * nub, OSString * name,
362 OSString ** matched = NULL ) const APPLE_KEXT_OVERRIDE;
363
364 virtual IOReturn getNubResources( IOService * nub ) APPLE_KEXT_OVERRIDE;
365
366 /*
367 * getModelName() and getMachineName() are deprecated. Use
368 * getTargetName() and getProductName() instead.
369 */
370 virtual bool getModelName( char * name, int maxLength ) APPLE_KEXT_OVERRIDE;
371 virtual bool getMachineName( char * name, int maxLength ) APPLE_KEXT_OVERRIDE;
372
373 virtual bool getTargetName( char * name, int maxLength ) APPLE_KEXT_OVERRIDE;
374 virtual bool getProductName( char * name, int maxLength ) APPLE_KEXT_OVERRIDE;
375
376 virtual void registerNVRAMController( IONVRAMController * nvram ) APPLE_KEXT_OVERRIDE;
377
378 virtual int haltRestart(unsigned int type) APPLE_KEXT_OVERRIDE;
379
380/* virtual */ IOReturn readXPRAM(IOByteCount offset, UInt8 * buffer,
381 IOByteCount length);
382
383/* virtual */ IOReturn writeXPRAM(IOByteCount offset, UInt8 * buffer,
384 IOByteCount length);
385
386 virtual IOReturn readNVRAMProperty(
387 IORegistryEntry * entry,
388 const OSSymbol ** name, OSData ** value );
389
390 IOReturn readNVRAMProperty(
391 IORegistryEntry * entry,
392 OSSharedPtr<const OSSymbol>& name, OSSharedPtr<OSData>& value );
393
394 virtual IOReturn writeNVRAMProperty(
395 IORegistryEntry * entry,
396 const OSSymbol * name, OSData * value );
397
398// This returns a dictionary describing all the NVRAM partitions.
399// The keys will be the partitionIDs of the form "0x52,nvram".
400// The values will be OSNumbers of the partition's byte count.
401/* virtual */ OSDictionary *getNVRAMPartitions(void);
402
403/* virtual */ IOReturn readNVRAMPartition(const OSSymbol * partitionID,
404 IOByteCount offset, UInt8 * buffer,
405 IOByteCount length);
406
407/* virtual */ IOReturn writeNVRAMPartition(const OSSymbol * partitionID,
408 IOByteCount offset, UInt8 * buffer,
409 IOByteCount length);
410
411 virtual IOByteCount savePanicInfo(UInt8 *buffer, IOByteCount length) APPLE_KEXT_OVERRIDE;
412 virtual OSString* createSystemSerialNumberString(OSData* myProperty) APPLE_KEXT_OVERRIDE;
413
414 OSMetaClassDeclareReservedUnused(IODTPlatformExpert, 0);
415 OSMetaClassDeclareReservedUnused(IODTPlatformExpert, 1);
416 OSMetaClassDeclareReservedUnused(IODTPlatformExpert, 2);
417 OSMetaClassDeclareReservedUnused(IODTPlatformExpert, 3);
418 OSMetaClassDeclareReservedUnused(IODTPlatformExpert, 4);
419 OSMetaClassDeclareReservedUnused(IODTPlatformExpert, 5);
420 OSMetaClassDeclareReservedUnused(IODTPlatformExpert, 6);
421 OSMetaClassDeclareReservedUnused(IODTPlatformExpert, 7);
422};
423
424/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
425
426/* generic root nub of service tree */
427
428class IOPlatformExpertDevice : public IOService
429{
430 OSDeclareDefaultStructors(IOPlatformExpertDevice);
431
432private:
433 IOWorkLoop *workLoop;
434
435 struct ExpansionData { };
436 ExpansionData *ioped_reserved __unused;
437
438public:
439 virtual bool init(void *dtRoot);
440 virtual bool compareName( OSString * name, OSString ** matched = NULL ) const APPLE_KEXT_OVERRIDE;
441
442 virtual IOWorkLoop *getWorkLoop() const APPLE_KEXT_OVERRIDE;
443 virtual IOReturn setProperties( OSObject * properties ) APPLE_KEXT_OVERRIDE;
444
445 virtual void free() APPLE_KEXT_OVERRIDE;
446
447 virtual IOReturn newUserClient( task_t owningTask, void * securityID,
448 UInt32 type, OSDictionary * properties,
449 IOUserClient ** handler) APPLE_KEXT_OVERRIDE;
450
451 bool startIOServiceMatching(void);
452 void createNVRAM(void);
453 void generatePlatformUUID(void);
454 void configureDefaults(void);
455
456 OSMetaClassDeclareReservedUnused(IOPlatformExpertDevice, 0);
457 OSMetaClassDeclareReservedUnused(IOPlatformExpertDevice, 1);
458 OSMetaClassDeclareReservedUnused(IOPlatformExpertDevice, 2);
459 OSMetaClassDeclareReservedUnused(IOPlatformExpertDevice, 3);
460};
461
462/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
463
464/* generic nub for motherboard devices */
465
466class IOPlatformDevice : public IOService
467{
468 OSDeclareDefaultStructors(IOPlatformDevice);
469
470 struct ExpansionData { };
471 ExpansionData *iopd_reserved;
472
473public:
474 virtual bool compareName( OSString * name, OSString ** matched = NULL ) const APPLE_KEXT_OVERRIDE;
475 virtual IOService * matchLocation( IOService * client ) APPLE_KEXT_OVERRIDE;
476 virtual IOReturn getResources( void ) APPLE_KEXT_OVERRIDE;
477
478 OSMetaClassDeclareReservedUnused(IOPlatformDevice, 0);
479 OSMetaClassDeclareReservedUnused(IOPlatformDevice, 1);
480 OSMetaClassDeclareReservedUnused(IOPlatformDevice, 2);
481 OSMetaClassDeclareReservedUnused(IOPlatformDevice, 3);
482};
483
484#endif /* __cplusplus */
485
486#endif /* ! _IOKIT_IOPLATFORMEXPERT_H */
487