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 struct m_tag *t; 88 89 t = m_tag_alloc(KERNEL_MODULE_TAG_ID, KERNEL_TAG_TYPE_MAC_POLICY_LABEL, 90 len, wait); 91 if (t == NULL) 92 return (NULL); 93 94 return ((void *)(t + 1)); 95} 96 97void 98mac_mbuf_free(void *data) 99{ 100 struct m_tag *t; 101 102 t = (struct m_tag *)((char *)data - sizeof(struct m_tag)); 103 m_tag_free(t); 104} 105 106/* 107 * VM functions 108 */ 109 110extern vm_map_t kalloc_map; 111 112int 113mac_wire(void *start, void *end) 114{ 115 116 return (vm_map_wire(kalloc_map, CAST_USER_ADDR_T(start), 117 CAST_USER_ADDR_T(end), VM_PROT_READ|VM_PROT_WRITE, FALSE)); 118} 119 120int 121mac_unwire(void *start, void *end) 122{ 123 124 return (vm_map_unwire(kalloc_map, CAST_USER_ADDR_T(start), 125 CAST_USER_ADDR_T(end), FALSE)); 126} 127 128/* 129 * Zone allocator 130 */ 131zone_t 132mac_zinit(vm_size_t size, vm_size_t maxmem, vm_size_t alloc, const char *name) 133{ 134 135 return zinit(size, maxmem, alloc, name); 136} 137 138void 139mac_zone_change(zone_t zone, unsigned int item, boolean_t value) 140{ 141 142 zone_change(zone, item, value); 143} 144 145void * 146mac_zalloc(zone_t zone, int how) 147{ 148 149 if (how == M_WAITOK) 150 return zalloc(zone); 151 else 152 return zalloc_noblock(zone); 153} 154 155void 156mac_zfree(zone_t zone, void *elem) 157{ 158 159 zfree(zone, elem); 160} 161