xref: /xnu-12377.41.6/osfmk/kern/upsi.h (revision bbb1b6f9e71b8cdde6e5cd6f4841f207dee3d828)
1 /*
2  * Copyright (c) 2024 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 #pragma once
30 
31 #if !XNU_KERNEL_PRIVATE
32 #error upsi.h is XNU private
33 #endif
34 
35 #if (DEVELOPMENT || DEBUG)
36 #define HAS_UPSI_FAILURE_INJECTION 1
37 #endif
38 
39 #if HAS_UPSI_FAILURE_INJECTION
40 /* Enumeration of the injectable failure locations/stages - Must be kept in sync with iBoot's "power_boot_stages.h"
41  * The "stage" macros specify points where failure injection is possible
42  */
43 __enum_decl(failure_injection_stage_t, uint64_t, {
44 	XNU_STAGE_ARM_INIT              = 0x31,
45 	XNU_STAGE_BOOTSTRAP_START       = 0x32,
46 	XNU_STAGE_SCHEDULER_START       = 0x33,
47 	XNU_STAGE_BSD_INIT_START        = 0x34,
48 	XNU_STAGE_BSD_INIT_END          = 0x35,
49 	XNU_STAGE_HIBERNATE_ENTRY       = 0x37,
50 });
51 
52 /* Enumeration of the injectable failure actions
53  *
54  *  ACTION_WATCHDOG_TIMEOUT and ACTION_DEADLOOP look functionally equivalent.
55  * However they are different in the way iBoot configures the system watchdog.
56  *
57  * ACTION_WATCHDOG_TIMEOUT -> Deadloops with the system watchdog enabled
58  * ACTION_DEADLOOP         -> Deadloops with the system watchdog disabled
59  * The watchdog behavior is configured by iBoot. Convey'd to XNU through the wdt=-1 boot-arg
60  */
61 __enum_decl(failure_injection_action_t, uint64_t, {
62 	INJECTION_ACTION_PANIC                    = 0x01,
63 	INJECTION_ACTION_WATCHDOG_TIMEOUT         = 0x02,
64 	INJECTION_ACTION_DEADLOOP                 = 0x03,
65 });
66 
67 extern uint64_t xnu_upsi_injection_stage;
68 extern uint64_t xnu_upsi_injection_action;
69 
70 #ifdef __cplusplus
71 extern "C" {
72 #endif
73 void check_for_failure_injection(failure_injection_stage_t req);
74 #ifdef __cplusplus
75 }
76 #endif
77 #endif // HAS_UPSI_FAILURE_INJECTION
78