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