xref: /xnu-12377.61.12/osfmk/kern/exc_guard.h (revision 4d495c6e23c53686cf65f45067f79024cf5dcee8)
1 /*
2  * Copyright (c) 2016 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  * 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_GUARD related macros, namespace etc.
39  */
40 
41 #ifndef _EXC_GUARD_H_
42 #define _EXC_GUARD_H_
43 
44 /*
45  * EXC_GUARD exception code namespace.
46  *
47  * code:
48  * +-------------------+----------------+--------------+
49  * |[63:61] guard type | [60:32] flavor | [31:0] target|
50  * +-------------------+----------------+--------------+
51  *
52  * subcode:
53  * +---------------------------------------------------+
54  * |[63:0] guard identifier                            |
55  * +---------------------------------------------------+
56  */
57 
58 #define EXC_GUARD_DECODE_GUARD_TYPE(code) \
59 	((((uint64_t)(code)) >> 61) & 0x7ull)
60 #define EXC_GUARD_DECODE_GUARD_FLAVOR(code) \
61 	((((uint64_t)(code)) >> 32) & 0x1fffffff)
62 #define EXC_GUARD_DECODE_GUARD_TARGET(code) \
63 	((uint32_t)(code))
64 
65 /* EXC_GUARD types */
66 
67 #define GUARD_TYPE_NONE         0x0
68 
69 /*
70  * Mach port guards use the exception codes like this:
71  *
72  * code:
73  * +-----------------------------+----------------+-----------------+
74  * |[63:61] GUARD_TYPE_MACH_PORT | [60:32] flavor | [31:0] target   |
75  * +-----------------------------+----------------+-----------------+
76  *
77  * subcode:
78  * +----------------------------------------------------------------+
79  * |[63:0] payload                                                  |
80  * +----------------------------------------------------------------+
81  *
82  * - flavors are defined in <mach/port.h>
83  * - meaning of target and payload is described
84  *   in doc/mach_ipc/guard_exceptions.md
85  */
86 
87 #define GUARD_TYPE_MACH_PORT    0x1      /* guarded mach port */
88 
89 /*
90  * File descriptor guards use the exception codes this:
91  *
92  * code:
93  * +-----------------------------+----------------+-----------------+
94  * |[63:61] GUARD_TYPE_FD        | [60:32] flavor | [31:0] fd       |
95  * +-----------------------------+----------------+-----------------+
96  *
97  * subcode:
98  * +----------------------------------------------------------------+
99  * |[63:0] guard identifier                                         |
100  * +----------------------------------------------------------------+
101  */
102 
103 #define GUARD_TYPE_FD           0x2     /* guarded file descriptor */
104 
105 /*
106  * User generated guards use the exception codes this:
107  *
108  * code:
109  * +-----------------------------+----------------+-----------------+
110  * |[63:61] GUARD_TYPE_USER      | [60:32] unused | [31:0] namespc  |
111  * +-----------------------------+----------------+-----------------+
112  *
113  * subcode:
114  * +----------------------------------------------------------------+
115  * |[63:0] reason_code                                              |
116  * +----------------------------------------------------------------+
117  */
118 
119 #define GUARD_TYPE_USER         0x3     /* Userland assertions */
120 
121 /*
122  * Vnode guards use the exception codes like this:
123  *
124  * code:
125  * +-----------------------------+----------------+-----------------+
126  * |[63:61] GUARD_TYPE_VN        | [60:32] flavor | [31:0] pid      |
127  * +-----------------------------+----------------+-----------------+
128  *
129  * subcode:
130  * +----------------------------------------------------------------+
131  * |[63:0] guard identifier                                         |
132  * +----------------------------------------------------------------+
133  */
134 
135 #define GUARD_TYPE_VN           0x4     /* guarded vnode */
136 
137 /*
138  * VM guards use the exception codes like this:
139  *
140  * code:
141  * +-------------------------------+----------------+-----------------+
142  * |[63:61] GUARD_TYPE_VIRT_MEMORY | [60:32] flavor | [31:0] unused   |
143  * +-------------------------------+----------------+-----------------+
144  *
145  * subcode:
146  * +----------------------------------------------------------------+
147  * |[63:0] offset                                                   |
148  * +----------------------------------------------------------------+
149  */
150 
151 #define GUARD_TYPE_VIRT_MEMORY  0x5     /* VM operation violating guard */
152 
153 /*
154  * Rejected syscalls use the exception codes like this:
155  *
156  * code:
157  * +-------------------------------+----------------+------------------+
158  * |[63:61] GUARD_TYPE_REJECTED_SC | [60:32] unused | [31:0] mach_trap |
159  * +-------------------------------+----------------+------------------+
160  *
161  * subcode:
162  * +----------------------------------------------------------------+
163  * |[63:0] syscall (if mach_trap field is 0), or mach trap number   |
164  * +----------------------------------------------------------------+
165  */
166 
167 #define GUARD_TYPE_REJECTED_SC  0x6     /* rejected system call trap */
168 
169 #ifdef KERNEL
170 
171 #define EXC_GUARD_ENCODE_TYPE(code, type) \
172 	((code) |= (((uint64_t)(type) & 0x7ull) << 61))
173 #define EXC_GUARD_ENCODE_FLAVOR(code, flavor) \
174 	((code) |= (((uint64_t)(flavor) & 0x1fffffffull) << 32))
175 #define EXC_GUARD_ENCODE_TARGET(code, target) \
176 	((code) |= (((uint64_t)(target) & 0xffffffffull)))
177 
178 #endif /* KERNEL */
179 
180 #endif /* _EXC_GUARD_H_ */
181