1/* 2 * Copyright (c) 2007 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 * 30 */ 31 32#include <kern/kalloc.h> 33#include <kern/zalloc.h> 34 35#include <sys/param.h> 36#include <sys/queue.h> 37#include <sys/systm.h> 38#include <sys/mbuf.h> 39 40#include <vm/vm_map.h> 41 42#include "mac_alloc.h" 43 44/* 45 * XXXMAC: We should probably make sure only registered policies can 46 * call these, otherwise we're effectively changing Apple's plan wrt 47 * exported allocators. 48 */ 49 50/* 51 * Kernel allocator 52 */ 53void * 54mac_kalloc(vm_size_t size, int how) 55{ 56 57 if (how == M_WAITOK) 58 return kalloc(size); 59 else 60 return kalloc_noblock(size); 61} 62 63/* 64 * for temporary binary compatibility 65 */ 66void * mac_kalloc_noblock (vm_size_t size); 67void * 68mac_kalloc_noblock(vm_size_t size) 69{ 70 return kalloc_noblock(size); 71} 72 73void 74mac_kfree(void * data, vm_size_t size) 75{ 76 77 return kfree(data, size); 78} 79 80/* 81 * MBuf tag allocator. 82 */ 83 84void * 85mac_mbuf_alloc(int len, int wait) 86{ 87#if CONFIG_MACF_SOCKET_SUBSET 88 struct m_tag *t; 89 90 t = m_tag_alloc(KERNEL_MODULE_TAG_ID, KERNEL_TAG_TYPE_MAC_POLICY_LABEL, 91 len, wait); 92 if (t == NULL) 93 return (NULL); 94 95 return ((void *)(t + 1)); 96#else 97#pragma unused(len, wait) 98 return NULL; 99#endif 100} 101 102void 103mac_mbuf_free(void *data) 104{ 105#if CONFIG_MACF_SOCKET_SUBSET 106 struct m_tag *t; 107 108 t = (struct m_tag *)((char *)data - sizeof(struct m_tag)); 109 m_tag_free(t); 110#else 111#pragma unused(data) 112#endif 113} 114 115/* 116 * VM functions 117 */ 118 119extern vm_map_t kalloc_map; 120 121int 122mac_wire(void *start, void *end) 123{ 124 125 return (vm_map_wire(kalloc_map, CAST_USER_ADDR_T(start), 126 CAST_USER_ADDR_T(end), VM_PROT_READ|VM_PROT_WRITE, FALSE)); 127} 128 129int 130mac_unwire(void *start, void *end) 131{ 132 133 return (vm_map_unwire(kalloc_map, CAST_USER_ADDR_T(start), 134 CAST_USER_ADDR_T(end), FALSE)); 135} 136 137/* 138 * Zone allocator 139 */ 140zone_t 141mac_zinit(vm_size_t size, vm_size_t maxmem, vm_size_t alloc, const char *name) 142{ 143 144 return zinit(size, maxmem, alloc, name); 145} 146 147void 148mac_zone_change(zone_t zone, unsigned int item, boolean_t value) 149{ 150 151 zone_change(zone, item, value); 152} 153 154void * 155mac_zalloc(zone_t zone, int how) 156{ 157 158 if (how == M_WAITOK) 159 return zalloc(zone); 160 else 161 return zalloc_noblock(zone); 162} 163 164void 165mac_zfree(zone_t zone, void *elem) 166{ 167 168 zfree(zone, elem); 169} 170