xref: /xnu-8019.80.24/bsd/sys/malloc.h (revision a325d9c4a84054e40bbe985afedcb50ab80993ea)
1 /*
2  * Copyright (c) 2000-2013 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 /* Copyright (c) 1998, 1999 Apple Computer, Inc. All Rights Reserved */
29 /* Copyright (c) 1995, 1997 Apple Computer, Inc. All Rights Reserved */
30 /*
31  * Copyright (c) 1987, 1993
32  *	The Regents of the University of California.  All rights reserved.
33  *
34  * Redistribution and use in source and binary forms, with or without
35  * modification, are permitted provided that the following conditions
36  * are met:
37  * 1. Redistributions of source code must retain the above copyright
38  *    notice, this list of conditions and the following disclaimer.
39  * 2. Redistributions in binary form must reproduce the above copyright
40  *    notice, this list of conditions and the following disclaimer in the
41  *    documentation and/or other materials provided with the distribution.
42  * 3. All advertising materials mentioning features or use of this software
43  *    must display the following acknowledgement:
44  *	This product includes software developed by the University of
45  *	California, Berkeley and its contributors.
46  * 4. Neither the name of the University nor the names of its contributors
47  *    may be used to endorse or promote products derived from this software
48  *    without specific prior written permission.
49  *
50  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
51  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
52  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
53  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
54  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
55  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
56  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
57  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
58  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
59  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
60  * SUCH DAMAGE.
61  *
62  *	@(#)malloc.h	8.5 (Berkeley) 5/3/95
63  */
64 /*
65  * NOTICE: This file was modified by SPARTA, Inc. in 2005 to introduce
66  * support for mandatory and extensible security protections.  This notice
67  * is included in support of clause 2.2 (b) of the Apple Public License,
68  * Version 2.0.
69  */
70 
71 #ifndef _SYS_MALLOC_H_
72 #define _SYS_MALLOC_H_
73 
74 #include <sys/appleapiopts.h>
75 
76 
77 #ifdef KERNEL
78 /*
79  * flags to malloc
80  */
81 #define M_WAITOK        0x0000
82 #define M_NOWAIT        0x0001
83 #define M_ZERO          0x0004          /* bzero the allocation */
84 #define M_NULL          0x0008          /* return NULL if space is unavailable*/
85 
86 #ifdef XNU_KERNEL_PRIVATE
87 
88 #include <mach/vm_types.h>
89 #include <kern/kalloc.h>
90 
91 ZONE_VIEW_DECLARE(ZV_NAMEI);
92 
93 /*
94  * Types of memory to be allocated (not all are used by us)
95  */
96 #define M_DEVBUF        2       /* device driver memory */
97 #define M_PCB           4       /* protocol control block */
98 #define M_RTABLE        5       /* routing tables */
99 #define M_IFADDR        9       /* interface address */
100 #define M_SONAME        11      /* socket name */
101 #define M_PGRP          17      /* process group header */
102 #define M_FHANDLE       21      /* network file handle */
103 #define M_NFSNODE       24      /* NFS vnode private part */
104 #define M_VNODE         25      /* Dynamically allocated vnodes */
105 #define M_CACHE         26      /* Dynamically allocated cache entries */
106 #define M_DQUOT         27      /* UFS quota entries */
107 #define M_PROC_UUID_POLICY      28      /* proc UUID policy entries */
108 #define M_SHM           29      /* SVID compatible shared memory segments */
109 #define M_LOCKF         40      /* Byte-range locking structures */
110 #define M_PROC          41      /* Proc structures */
111 #define M_NETADDR       49      /* Export host address structure */
112 #define M_NFSSVC        50      /* NFS server structure */
113 #define M_NFSD          52      /* NFS server daemon structure */
114 #define M_IPMOPTS       53      /* internet multicast options */
115 #define M_IFMADDR       55      /* link-level multicast address */
116 #define M_NFSBIO        58      /* NFS client I/O buffers */
117 #define M_NFSBIGFH      61      /* NFS version 3 file handle */
118 #define M_TTYS          65      /* allocated tty structures */
119 #define M_OFILETABL     73      /* Open file descriptor table */
120 #define M_TEMP          80      /* misc temporary data buffers */
121 #define M_SECA          81      /* security associations, key management */
122 #define M_DEVFS         82
123 #define M_UDFNODE       84      /* UDF inodes */
124 #define M_UDFMNT        85      /* UDF mount structures */
125 #define M_KQUEUE        94      /* kqueue system */
126 #define M_KAUTH         100     /* kauth subsystem */
127 #define M_DUMMYNET      101     /* dummynet */
128 #define M_MACTEMP       104     /* MAC framework */
129 #define M_SBUF          105     /* string buffers */
130 #define M_SELECT        107     /* per-thread select memory */
131 #define M_INMFILTER     110     /* IPv4 multicast PCB-layer source filter */
132 #define M_IN6MFILTER    112     /* IPv6 multicast PCB-layer source filter */
133 #define M_IP6MOPTS      113     /* IPv6 multicast options */
134 #define M_IP6CGA        117
135 #define M_NECP          118     /* General NECP policy data */
136 #define M_FD_VN_DATA    122     /* Per fd vnode data */
137 #define M_FD_DIRBUF     123     /* Directory entries' buffer */
138 #define M_EVENTHANDLER  125     /* Eventhandler */
139 #define M_LLTABLE       126     /* Link layer table */
140 #define M_NWKWQ         127     /* Network work queue */
141 #define M_CFIL          128     /* Content Filter */
142 #define M_TRACKER       129     /* Tracker socket management */
143 
144 #define M_LAST          130     /* Must be last type + 1 */
145 
146 #define MALLOC(space, cast, size, type, flags)                      \
147 	({ VM_ALLOC_SITE_STATIC(0, 0);                              \
148 	(space) = (cast)__MALLOC(size, type, flags, &site); })
149 
150 #define REALLOC(space, cast, addr, size, type, flags)               \
151 	({ VM_ALLOC_SITE_STATIC(0, 0);                              \
152 	(space) = (cast)__REALLOC(addr, size, type, flags, &site); })
153 
154 #define _MALLOC(size, type, flags)                                  \
155 	({ VM_ALLOC_SITE_STATIC(0, 0);                              \
156 	__MALLOC(size, type, flags, &site); })
157 
158 #define _REALLOC(addr, size, type, flags)                           \
159 	({ VM_ALLOC_SITE_STATIC(0, 0);                              \
160 	__REALLOC(addr, size, type, flags, &site); })
161 
162 #define _FREE(addr, type)                                           \
163 	(kheap_free_addr)(KHEAP_DEFAULT, addr)
164 
165 #define FREE(addr, type)                                            \
166 	kheap_free_addr(KHEAP_DEFAULT, addr)
167 
168 #pragma GCC visibility push(hidden)
169 
170 extern void     *__MALLOC(
171 	size_t                size,
172 	int                   type,
173 	int                   flags,
174 	vm_allocation_site_t *site)  __attribute__((alloc_size(1)));
175 
176 extern void     *__REALLOC(
177 	void                 *addr,
178 	size_t                size,
179 	int                   type,
180 	int                   flags,
181 	vm_allocation_site_t *site)  __attribute__((alloc_size(2)));
182 
183 #pragma GCC visibility pop
184 #else /* XNU_KERNEL_PRIVATE */
185 
186 #define M_PCB           4       /* protocol control block (smb) */
187 #define M_RTABLE        5       /* routing tables */
188 #define M_IFADDR        9       /* interface address (IOFireWireIP)*/
189 #define M_SONAME        11      /* socket name (smb) */
190 #define M_LOCKF         40      /* Byte-range locking structures (msdos) */
191 #define M_TEMP          80      /* misc temporary data buffers */
192 #define M_UDFNODE       84      /* UDF inodes (udf)*/
193 #define M_UDFMNT        85      /* UDF mount structures (udf)*/
194 #define M_KAUTH         100     /* kauth subsystem (smb) */
195 
196 #define MALLOC(space, cast, size, type, flags) \
197 	(space) = (cast)_MALLOC(size, type, flags)
198 
199 #define FREE(addr, type) \
200 	_FREE((void *)addr, type)
201 
202 #define MALLOC_ZONE(space, cast, size, type, flags) \
203 	(space) = (cast)_MALLOC_ZONE(size, type, flags)
204 
205 #define FREE_ZONE(addr, size, type) \
206 	_FREE_ZONE((void *)addr, size, type)
207 
208 extern void     *_MALLOC(
209 	size_t          size,
210 	int             type,
211 	int             flags);
212 
213 extern void     _FREE(
214 	void            *addr,
215 	int             type);
216 
217 extern void     *_MALLOC_ZONE(
218 	size_t          size,
219 	int             type,
220 	int             flags);
221 
222 extern void     _FREE_ZONE(
223 	void            *elem,
224 	size_t          size,
225 	int             type);
226 
227 #endif /* !XNU_KERNEL_PRIVATE */
228 
229 #endif  /* KERNEL */
230 
231 #endif  /* _SYS_MALLOC_H_ */
232