1 /* 2 * Copyright (c) 2011-2012 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 * Mach Operating System 30 * Copyright (c) 1989 Carnegie-Mellon University 31 * Copyright (c) 1988 Carnegie-Mellon University 32 * Copyright (c) 1987 Carnegie-Mellon University 33 * All rights reserved. The CMU software License Agreement specifies 34 * the terms and conditions for use and redistribution. 35 */ 36 37 /* 38 * EXC_RESOURCE related macros, namespace etc. 39 */ 40 41 #ifndef _EXC_RESOURCE_H_ 42 #define _EXC_RESOURCE_H_ 43 44 /* 45 * Generic exception code format: 46 * 47 * code: 48 * +----------------------------------------------------------+ 49 * |[63:61] type | [60:58] flavor | [57:0] type-specific data | 50 * +----------------------------------------------------------+ 51 */ 52 53 54 /* EXC_RESOURCE type and flavor decoding routines */ 55 #define EXC_RESOURCE_DECODE_RESOURCE_TYPE(code) \ 56 (((code) >> 61) & 0x7ULL) 57 #define EXC_RESOURCE_DECODE_FLAVOR(code) \ 58 (((code) >> 58) & 0x7ULL) 59 60 /* EXC_RESOURCE Types */ 61 #define RESOURCE_TYPE_CPU 1 62 #define RESOURCE_TYPE_WAKEUPS 2 63 #define RESOURCE_TYPE_MEMORY 3 64 #define RESOURCE_TYPE_IO 4 65 #define RESOURCE_TYPE_THREADS 5 66 #define RESOURCE_TYPE_PORTS 6 67 68 /* RESOURCE_TYPE_CPU flavors */ 69 #define FLAVOR_CPU_MONITOR 1 70 #define FLAVOR_CPU_MONITOR_FATAL 2 71 72 /* 73 * RESOURCE_TYPE_CPU exception code & subcode. 74 * 75 * This is sent by the kernel when the CPU usage monitor 76 * is tripped. [See proc_set_cpumon_params()] 77 * 78 * code: 79 * +-----------------------------------------------+ 80 * |[63:61] RESOURCE |[60:58] FLAVOR_CPU_ |[57:32] | 81 * |_TYPE_CPU |MONITOR[_FATAL] |Unused | 82 * +-----------------------------------------------+ 83 * |[31:7] Interval (sec) | [6:0] CPU limit (%)| 84 * +-----------------------------------------------+ 85 * 86 * subcode: 87 * +-----------------------------------------------+ 88 * | | [6:0] % of CPU | 89 * | | actually consumed | 90 * +-----------------------------------------------+ 91 * 92 */ 93 94 /* RESOURCE_TYPE_CPU decoding macros */ 95 #define EXC_RESOURCE_CPUMONITOR_DECODE_INTERVAL(code) \ 96 (((code) >> 7) & 0x1FFFFFFULL) 97 #define EXC_RESOURCE_CPUMONITOR_DECODE_PERCENTAGE(code) \ 98 ((code) & 0x7FULL) 99 #define EXC_RESOURCE_CPUMONITOR_DECODE_PERCENTAGE_OBSERVED(subcode) \ 100 ((subcode) & 0x7FULL) 101 102 103 /* RESOURCE_TYPE_WAKEUPS flavors */ 104 #define FLAVOR_WAKEUPS_MONITOR 1 105 106 /* 107 * RESOURCE_TYPE_WAKEUPS exception code & subcode. 108 * 109 * This is sent by the kernel when the platform idle 110 * wakeups monitor is tripped. 111 * [See proc_set_wakeupsmon_params()] 112 * 113 * code: 114 * +-----------------------------------------------+ 115 * |[63:61] RESOURCE |[60:58] FLAVOR_ |[57:32] | 116 * |_TYPE_WAKEUPS |WAKEUPS_MONITOR |Unused | 117 * +-----------------------------------------------+ 118 * | [31:20] Observation | [19:0] # of wakeups | 119 * | interval (sec) | permitted (per sec) | 120 * +-----------------------------------------------+ 121 * 122 * subcode: 123 * +-----------------------------------------------+ 124 * | | [19:0] # of wakeups | 125 * | | observed (per sec) | 126 * +-----------------------------------------------+ 127 * 128 */ 129 130 #define EXC_RESOURCE_CPUMONITOR_DECODE_WAKEUPS_PERMITTED(code) \ 131 ((code) & 0xFFFULL) 132 #define EXC_RESOURCE_CPUMONITOR_DECODE_OBSERVATION_INTERVAL(code) \ 133 (((code) >> 20) & 0xFFFFFULL) 134 #define EXC_RESOURCE_CPUMONITOR_DECODE_WAKEUPS_OBSERVED(subcode) \ 135 ((subcode) & 0xFFFFFULL) 136 137 /* RESOURCE_TYPE_MEMORY flavors */ 138 #define FLAVOR_HIGH_WATERMARK 1 /* Indicates that the exception is due to memory limit warning */ 139 #define FLAVOR_DIAG_MEMLIMIT 2 /* Indicates that the exception is due to a preset diagnostics memory consumption threshold */ 140 141 /* 142 * RESOURCE_TYPE_MEMORY / FLAVOR_HIGH_WATERMARK 143 * exception code & subcode. 144 * 145 * This is sent by the kernel when a task crosses its high 146 * watermark memory limit or when a preset memory consumption 147 * threshold is crossed. 148 * 149 * code: 150 * +------------------------------------------------+ 151 * |[63:61] RESOURCE |[60:58] FLAVOR_HIGH_ |[57:32] | 152 * |_TYPE_MEMORY |WATERMARK |Unused | 153 * +------------------------------------------------+ 154 * | | [12:0] HWM limit (MB)| 155 * +------------------------------------------------+ 156 * 157 * subcode: 158 * +------------------------------------------------+ 159 * | unused | 160 * +------------------------------------------------+ 161 * 162 */ 163 164 #define EXC_RESOURCE_HWM_DECODE_LIMIT(code) \ 165 ((code) & 0x1FFFULL) 166 167 /* RESOURCE_TYPE_IO flavors */ 168 #define FLAVOR_IO_PHYSICAL_WRITES 1 169 #define FLAVOR_IO_LOGICAL_WRITES 2 170 171 /* 172 * RESOURCE_TYPE_IO exception code & subcode. 173 * 174 * This is sent by the kernel when a task crosses its 175 * I/O limits. 176 * 177 * code: 178 * +-----------------------------------------------+ 179 * |[63:61] RESOURCE |[60:58] FLAVOR_IO_ |[57:32] | 180 * |_TYPE_IO |PHYSICAL/LOGICAL |Unused | 181 * +-----------------------------------------------+ 182 * |[31:15] Interval (sec) | [14:0] Limit (MB) | 183 * +-----------------------------------------------+ 184 * 185 * subcode: 186 * +-----------------------------------------------+ 187 * | | [14:0] I/O Count | 188 * | | (in MB) | 189 * +-----------------------------------------------+ 190 * 191 */ 192 193 /* RESOURCE_TYPE_IO decoding macros */ 194 #define EXC_RESOURCE_IO_DECODE_INTERVAL(code) \ 195 (((code) >> 15) & 0x1FFFFULL) 196 #define EXC_RESOURCE_IO_DECODE_LIMIT(code) \ 197 ((code) & 0x7FFFULL) 198 #define EXC_RESOURCE_IO_OBSERVED(subcode) \ 199 ((subcode) & 0x7FFFULL) 200 201 202 /* 203 * RESOURCE_TYPE_THREADS exception code & subcode 204 * 205 * This is sent by the kernel when a task crosses its 206 * thread limit. 207 */ 208 209 #define EXC_RESOURCE_THREADS_DECODE_THREADS(code) \ 210 ((code) & 0x7FFFULL) 211 212 /* RESOURCE_TYPE_THREADS flavors */ 213 #define FLAVOR_THREADS_HIGH_WATERMARK 1 214 215 /* RESOURCE_TYPE_PORTS flavors */ 216 #define FLAVOR_PORT_SPACE_FULL 1 217 218 /* 219 * RESOURCE_TYPE_PORTS exception code & subcode. 220 * 221 * This is sent by the kernel when the process is 222 * leaking ipc ports and has filled its port space 223 * 224 * code: 225 * +-----------------------------------------------+ 226 * |[63:61] RESOURCE |[60:58] FLAVOR_ |[57:32] | 227 * |_TYPE_PORTS |PORT_SPACE_FULL |Unused | 228 * +-----------------------------------------------+ 229 * | [31:24] Unused | [23:0] # of ports | 230 * | | allocated | 231 * +-----------------------------------------------+ 232 * 233 * subcode: 234 * +-----------------------------------------------+ 235 * | | Unused | 236 * | | | 237 * +-----------------------------------------------+ 238 * 239 */ 240 #define EXC_RESOURCE_THREADS_DECODE_PORTS(code) \ 241 ((code) & 0xFFFFFFULL) 242 243 #ifdef KERNEL 244 245 /* EXC_RESOURCE type and flavor encoding macros */ 246 #define EXC_RESOURCE_ENCODE_TYPE(code, type) \ 247 ((code) |= (((uint64_t)(type) & 0x7ULL) << 61)) 248 #define EXC_RESOURCE_ENCODE_FLAVOR(code, flavor) \ 249 ((code) |= (((uint64_t)(flavor) & 0x7ULL) << 58)) 250 251 /* RESOURCE_TYPE_CPU::FLAVOR_CPU_MONITOR specific encoding macros */ 252 #define EXC_RESOURCE_CPUMONITOR_ENCODE_INTERVAL(code, interval) \ 253 ((code) |= (((uint64_t)(interval) & 0x1FFFFFFULL) << 7)) 254 #define EXC_RESOURCE_CPUMONITOR_ENCODE_PERCENTAGE(code, percentage) \ 255 ((code) |= (((uint64_t)(percentage) & 0x7FULL))) 256 257 /* RESOURCE_TYPE_WAKEUPS::FLAVOR_WAKEUPS_MONITOR specific encoding macros */ 258 #define EXC_RESOURCE_CPUMONITOR_ENCODE_WAKEUPS_PERMITTED(code, num) \ 259 ((code) |= ((uint64_t)(num) & 0xFFFFFULL)) 260 #define EXC_RESOURCE_CPUMONITOR_ENCODE_OBSERVATION_INTERVAL(code, num) \ 261 ((code) |= (((uint64_t)(num) & 0xFFFULL) << 20)) 262 #define EXC_RESOURCE_CPUMONITOR_ENCODE_WAKEUPS_OBSERVED(subcode, num) \ 263 ((subcode) |= ((uint64_t)(num) & 0xFFFFFULL)) 264 265 /* RESOURCE_TYPE_MEMORY::FLAVOR_HIGH_WATERMARK specific encoding macros */ 266 #define EXC_RESOURCE_HWM_ENCODE_LIMIT(code, num) \ 267 ((code) |= ((uint64_t)(num) & 0x1FFFULL)) 268 269 /* RESOURCE_TYPE_IO::FLAVOR_IO_PHYSICAL_WRITES/FLAVOR_IO_LOGICAL_WRITES specific encoding macros */ 270 #define EXC_RESOURCE_IO_ENCODE_INTERVAL(code, interval) \ 271 ((code) |= (((uint64_t)(interval) & 0x1FFFFULL) << 15)) 272 #define EXC_RESOURCE_IO_ENCODE_LIMIT(code, limit) \ 273 ((code) |= (((uint64_t)(limit) & 0x7FFFULL))) 274 #define EXC_RESOURCE_IO_ENCODE_OBSERVED(subcode, num) \ 275 ((subcode) |= (((uint64_t)(num) & 0x7FFFULL))) 276 277 /* RESOURCE_TYPE_THREADS specific encoding macros */ 278 #define EXC_RESOURCE_THREADS_ENCODE_THREADS(code, threads) \ 279 ((code) |= (((uint64_t)(threads) & 0x7FFFULL))) 280 281 /* RESOURCE_TYPE_PORTS::FLAVOR_PORT_SPACE_FULL specific encoding macros */ 282 #define EXC_RESOURCE_PORTS_ENCODE_PORTS(code, num) \ 283 ((code) |= ((uint64_t)(num) & 0xFFFFFFULL)) 284 285 #endif /* KERNEL */ 286 287 288 #endif /* _EXC_RESOURCE_H_ */ 289