xref: /xnu-10002.61.3/osfmk/kern/exc_guard.h (revision 0f4c859e951fba394238ab619495c4e1d54d0f34)
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] port name|
75  * +-----------------------------+----------------+-----------------+
76  *
77  * subcode:
78  * +----------------------------------------------------------------+
79  * |[63:0] guard identifier                                         |
80  * +----------------------------------------------------------------+
81  */
82 
83 #define GUARD_TYPE_MACH_PORT    0x1      /* guarded mach port */
84 
85 /*
86  * File descriptor guards use the exception codes this:
87  *
88  * code:
89  * +-----------------------------+----------------+-----------------+
90  * |[63:61] GUARD_TYPE_FD        | [60:32] flavor | [31:0] fd       |
91  * +-----------------------------+----------------+-----------------+
92  *
93  * subcode:
94  * +----------------------------------------------------------------+
95  * |[63:0] guard identifier                                         |
96  * +----------------------------------------------------------------+
97  */
98 
99 #define GUARD_TYPE_FD           0x2     /* guarded file descriptor */
100 
101 /*
102  * User generated guards use the exception codes this:
103  *
104  * code:
105  * +-----------------------------+----------------+-----------------+
106  * |[63:61] GUARD_TYPE_USER      | [60:32] unused | [31:0] namespc  |
107  * +-----------------------------+----------------+-----------------+
108  *
109  * subcode:
110  * +----------------------------------------------------------------+
111  * |[63:0] reason_code                                              |
112  * +----------------------------------------------------------------+
113  */
114 
115 #define GUARD_TYPE_USER         0x3     /* Userland assertions */
116 
117 /*
118  * Vnode guards use the exception codes like this:
119  *
120  * code:
121  * +-----------------------------+----------------+-----------------+
122  * |[63:61] GUARD_TYPE_VN        | [60:32] flavor | [31:0] pid      |
123  * +-----------------------------+----------------+-----------------+
124  *
125  * subcode:
126  * +----------------------------------------------------------------+
127  * |[63:0] guard identifier                                         |
128  * +----------------------------------------------------------------+
129  */
130 
131 #define GUARD_TYPE_VN           0x4     /* guarded vnode */
132 
133 /*
134  * VM guards use the exception codes like this:
135  *
136  * code:
137  * +-------------------------------+----------------+-----------------+
138  * |[63:61] GUARD_TYPE_VIRT_MEMORY | [60:32] flavor | [31:0] unused   |
139  * +-------------------------------+----------------+-----------------+
140  *
141  * subcode:
142  * +----------------------------------------------------------------+
143  * |[63:0] offset                                                   |
144  * +----------------------------------------------------------------+
145  */
146 
147 #define GUARD_TYPE_VIRT_MEMORY  0x5     /* VM operation violating guard */
148 
149 /*
150  * Rejected syscalls use the exception codes like this:
151  *
152  * code:
153  * +-------------------------------+----------------+------------------+
154  * |[63:61] GUARD_TYPE_REJECTED_SC | [60:32] unused | [31:0] mach_trap |
155  * +-------------------------------+----------------+------------------+
156  *
157  * subcode:
158  * +----------------------------------------------------------------+
159  * |[63:0] syscall (if mach_trap field is 0), or mach trap number   |
160  * +----------------------------------------------------------------+
161  */
162 
163 #define GUARD_TYPE_REJECTED_SC  0x6     /* rejected system call trap */
164 
165 #ifdef KERNEL
166 
167 #define EXC_GUARD_ENCODE_TYPE(code, type) \
168 	((code) |= (((uint64_t)(type) & 0x7ull) << 61))
169 #define EXC_GUARD_ENCODE_FLAVOR(code, flavor) \
170 	((code) |= (((uint64_t)(flavor) & 0x1fffffffull) << 32))
171 #define EXC_GUARD_ENCODE_TARGET(code, target) \
172 	((code) |= (((uint64_t)(target) & 0xffffffffull)))
173 
174 #endif /* KERNEL */
175 
176 #endif /* _EXC_GUARD_H_ */
177