1/* 2 * Copyright (c) 2007 Apple Inc. All rights reserved. 3 * 4 * @APPLE_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. Please obtain a copy of the License at 10 * http://www.opensource.apple.com/apsl/ and read it before using this 11 * file. 12 * 13 * The Original Code and all software distributed under the License are 14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 18 * Please see the License for the specific language governing rights and 19 * limitations under the License. 20 * 21 * @APPLE_LICENSE_HEADER_END@ 22 */ 23/* 24 * 25 * File: vm/vm_shared_region.h 26 * 27 * protos and struct definitions for shared region 28 */ 29 30#ifndef _VM_SHARED_REGION_H_ 31#define _VM_SHARED_REGION_H_ 32 33#ifdef KERNEL_PRIVATE 34 35#include <mach/vm_prot.h> 36#include <mach/mach_types.h> 37#include <mach/shared_region.h> 38 39#include <kern/kern_types.h> 40#include <kern/macro_help.h> 41 42#include <vm/vm_map.h> 43 44extern int shared_region_version; 45extern int shared_region_persistence; 46extern boolean_t shared_region_completed_slide; 47 48extern int shared_region_debug; 49 50#define SHARED_REGION_DEBUG(args) \ 51 MACRO_BEGIN \ 52 kprintf args; \ 53 MACRO_END 54 55extern int shared_region_trace_level; 56#define SHARED_REGION_TRACE_NONE_LVL 0 /* no trace */ 57#define SHARED_REGION_TRACE_ERROR_LVL 1 /* trace abnormal events */ 58#define SHARED_REGION_TRACE_INFO_LVL 2 /* trace all events */ 59#define SHARED_REGION_TRACE_DEBUG_LVL 3 /* extra traces for debug */ 60#define SHARED_REGION_TRACE(level, args) \ 61 MACRO_BEGIN \ 62 MACRO_END 63#define SHARED_REGION_TRACE_NONE(args) \ 64MACRO_BEGIN \ 65MACRO_END 66#define SHARED_REGION_TRACE_ERROR(args) \ 67MACRO_BEGIN \ 68MACRO_END 69#define SHARED_REGION_TRACE_INFO(args) \ 70MACRO_BEGIN \ 71MACRO_END 72#define SHARED_REGION_TRACE_DEBUG(args) \ 73MACRO_BEGIN \ 74MACRO_END 75 76typedef struct vm_shared_region *vm_shared_region_t; 77 78#ifdef MACH_KERNEL_PRIVATE 79 80#include <kern/queue.h> 81#include <vm/vm_object.h> 82#include <vm/memory_object.h> 83 84/* address space shared region descriptor */ 85struct vm_shared_region { 86 uint32_t sr_ref_count; 87 queue_chain_t sr_q; 88 void *sr_root_dir; 89 cpu_type_t sr_cpu_type; 90 boolean_t sr_64bit; 91 boolean_t sr_mapping_in_progress; 92 boolean_t sr_persists; 93 ipc_port_t sr_mem_entry; 94 mach_vm_offset_t sr_first_mapping; 95 mach_vm_offset_t sr_base_address; 96 mach_vm_size_t sr_size; 97 mach_vm_offset_t sr_pmap_nesting_start; 98 mach_vm_size_t sr_pmap_nesting_size; 99 thread_call_t sr_timer_call; 100}; 101 102typedef struct vm_shared_region_slide_info_entry *vm_shared_region_slide_info_entry_t; 103struct vm_shared_region_slide_info_entry { 104 uint32_t version; 105 uint32_t toc_offset; // offset from start of header to table-of-contents 106 uint32_t toc_count; // number of entries in toc (same as number of pages in r/w mapping) 107 uint32_t entry_offset; 108 uint32_t entry_count; 109}; 110 111#define NBBY 8 112#define NUM_SLIDING_BITMAPS_PER_PAGE (PAGE_SIZE/sizeof(int)/NBBY) /*128*/ 113typedef struct slide_info_entry_toc *slide_info_entry_toc_t; 114struct slide_info_entry_toc { 115 uint8_t entry[NUM_SLIDING_BITMAPS_PER_PAGE]; 116}; 117 118typedef struct vm_shared_region_slide_info vm_shared_region_slide_info_t; 119struct vm_shared_region_slide_info { 120 mach_vm_offset_t start; 121 mach_vm_offset_t end; 122 uint32_t slide; 123 vm_object_t slide_object; 124 mach_vm_size_t slide_info_size; 125 vm_shared_region_slide_info_entry_t slide_info_entry; 126 vm_shared_region_t sr; 127}; 128 129extern struct vm_shared_region_slide_info slide_info; 130 131#else /* !MACH_KERNEL_PRIVATE */ 132 133struct vm_shared_region; 134struct vm_shared_region_slide_info; 135struct vm_shared_region_slide_info_entry; 136struct slide_info_entry_toc; 137 138#endif /* MACH_KERNEL_PRIVATE */ 139 140extern void vm_shared_region_init(void); 141extern kern_return_t vm_shared_region_enter( 142 struct _vm_map *map, 143 struct task *task, 144 void *fsroot, 145 cpu_type_t cpu); 146extern kern_return_t vm_shared_region_remove( 147 struct _vm_map *map, 148 struct task *task); 149extern vm_shared_region_t vm_shared_region_get( 150 struct task *task); 151extern void vm_shared_region_deallocate( 152 struct vm_shared_region *shared_region); 153extern mach_vm_offset_t vm_shared_region_base_address( 154 struct vm_shared_region *shared_region); 155extern mach_vm_size_t vm_shared_region_size( 156 struct vm_shared_region *shared_region); 157extern ipc_port_t vm_shared_region_mem_entry( 158 struct vm_shared_region *shared_region); 159extern void vm_shared_region_set( 160 struct task *task, 161 struct vm_shared_region *new_shared_region); 162extern vm_shared_region_t vm_shared_region_lookup( 163 void *root_dir, 164 cpu_type_t cpu, 165 boolean_t is_64bit); 166extern kern_return_t vm_shared_region_start_address( 167 struct vm_shared_region *shared_region, 168 mach_vm_offset_t *start_address); 169extern void vm_shared_region_undo_mappings( 170 vm_map_t sr_map, 171 mach_vm_offset_t sr_base_address, 172 struct shared_file_mapping_np *mappings, 173 unsigned int mappings_count); 174extern kern_return_t vm_shared_region_map_file( 175 struct vm_shared_region *shared_region, 176 unsigned int mappings_count, 177 struct shared_file_mapping_np *mappings, 178 memory_object_control_t file_control, 179 memory_object_size_t file_size, 180 void *root_dir, 181 struct shared_file_mapping_np *mapping_to_slide); 182extern kern_return_t vm_shared_region_sliding_valid(uint32_t slide); 183extern kern_return_t vm_shared_region_slide_sanity_check(void); 184extern kern_return_t vm_shared_region_slide_init(mach_vm_size_t slide_info_size, 185 mach_vm_offset_t start, 186 mach_vm_size_t size, 187 uint32_t slide, 188 memory_object_control_t); 189extern void* vm_shared_region_get_slide_info(void); 190extern void* vm_shared_region_get_slide_info_entry(void); 191extern kern_return_t vm_shared_region_slide( 192 vm_offset_t vaddr, 193 uint32_t pageIndex); 194extern void vm_commpage_init(void); 195extern void vm_commpage_text_init(void); 196extern kern_return_t vm_commpage_enter( 197 struct _vm_map *map, 198 struct task *task); 199extern kern_return_t vm_commpage_remove( 200 struct _vm_map *map, 201 struct task *task); 202 203#endif /* KERNEL_PRIVATE */ 204 205#endif /* _VM_SHARED_REGION_H_ */ 206