vm_shared_region.h [plain text]
#ifndef _VM_SHARED_REGION_H_
#define _VM_SHARED_REGION_H_
#ifdef KERNEL_PRIVATE
#include <mach/vm_prot.h>
#include <mach/mach_types.h>
#include <mach/shared_region.h>
#include <kern/kern_types.h>
#include <kern/macro_help.h>
#include <vm/vm_map.h>
extern int shared_region_version;
extern int shared_region_persistence;
#if DEBUG
extern int shared_region_debug;
#define SHARED_REGION_DEBUG(args) \
MACRO_BEGIN \
if (shared_region_debug) { \
kprintf args; \
} \
MACRO_END
#else
#define SHARED_REGION_DEBUG(args)
#endif
extern int shared_region_trace_level;
extern struct vm_shared_region *init_task_shared_region;
#define SHARED_REGION_TRACE_NONE_LVL 0
#define SHARED_REGION_TRACE_ERROR_LVL 1
#define SHARED_REGION_TRACE_INFO_LVL 2
#define SHARED_REGION_TRACE_DEBUG_LVL 3
#define SHARED_REGION_TRACE(level, args) \
MACRO_BEGIN \
if (shared_region_trace_level >= level) { \
printf args; \
} \
MACRO_END
#define SHARED_REGION_TRACE_NONE(args)
#define SHARED_REGION_TRACE_ERROR(args) \
MACRO_BEGIN \
SHARED_REGION_TRACE(SHARED_REGION_TRACE_ERROR_LVL, \
args); \
MACRO_END
#define SHARED_REGION_TRACE_INFO(args) \
MACRO_BEGIN \
SHARED_REGION_TRACE(SHARED_REGION_TRACE_INFO_LVL, \
args); \
MACRO_END
#define SHARED_REGION_TRACE_DEBUG(args) \
MACRO_BEGIN \
SHARED_REGION_TRACE(SHARED_REGION_TRACE_DEBUG_LVL, \
args); \
MACRO_END
typedef struct vm_shared_region *vm_shared_region_t;
#ifdef MACH_KERNEL_PRIVATE
#include <kern/queue.h>
#include <vm/vm_object.h>
#include <vm/memory_object.h>
#define PAGE_SIZE_FOR_SR_SLIDE 4096
typedef struct vm_shared_region_slide_info_entry_v1 *vm_shared_region_slide_info_entry_v1_t;
struct vm_shared_region_slide_info_entry_v1 {
uint32_t version;
uint32_t toc_offset; uint32_t toc_count; uint32_t entry_offset;
uint32_t entry_count;
};
#define NBBY 8
#define NUM_SLIDING_BITMAPS_PER_PAGE (0x1000/sizeof(int)/NBBY)
typedef struct slide_info_entry_toc *slide_info_entry_toc_t;
struct slide_info_entry_toc {
uint8_t entry[NUM_SLIDING_BITMAPS_PER_PAGE];
};
typedef struct vm_shared_region_slide_info_entry_v2 *vm_shared_region_slide_info_entry_v2_t;
struct vm_shared_region_slide_info_entry_v2 {
uint32_t version;
uint32_t page_size;
uint32_t page_starts_offset;
uint32_t page_starts_count;
uint32_t page_extras_offset;
uint32_t page_extras_count;
uint64_t delta_mask; uint64_t value_add;
};
#define DYLD_CACHE_SLIDE_PAGE_ATTRS 0xC000 // high bits of uint16_t are flags
#define DYLD_CACHE_SLIDE_PAGE_ATTR_EXTRA 0x8000 // index is into extras array (not starts array)
#define DYLD_CACHE_SLIDE_PAGE_ATTR_NO_REBASE 0x4000 // page has no rebasing
#define DYLD_CACHE_SLIDE_PAGE_ATTR_END 0x8000 // last chain entry for page
#define DYLD_CACHE_SLIDE_PAGE_VALUE 0x3FFF // bitwise negation of DYLD_CACHE_SLIDE_PAGE_ATTRS
#define DYLD_CACHE_SLIDE_PAGE_OFFSET_SHIFT 2
typedef struct vm_shared_region_slide_info_entry_v3 *vm_shared_region_slide_info_entry_v3_t;
struct vm_shared_region_slide_info_entry_v3 {
uint32_t version; uint32_t page_size; uint32_t page_starts_count;
uint64_t value_add;
uint16_t page_starts[] ;
};
#define DYLD_CACHE_SLIDE_V3_PAGE_ATTR_NO_REBASE 0xFFFF // page has no rebasing
typedef struct vm_shared_region_slide_info_entry_v4 *vm_shared_region_slide_info_entry_v4_t;
struct vm_shared_region_slide_info_entry_v4 {
uint32_t version; uint32_t page_size; uint32_t page_starts_offset;
uint32_t page_starts_count;
uint32_t page_extras_offset;
uint32_t page_extras_count;
uint64_t delta_mask; uint64_t value_add; };
#define DYLD_CACHE_SLIDE4_PAGE_NO_REBASE 0xFFFF // page has no rebasing
#define DYLD_CACHE_SLIDE4_PAGE_INDEX 0x7FFF // index into starts or extras
#define DYLD_CACHE_SLIDE4_PAGE_USE_EXTRA 0x8000 // index is into extras array (not starts array)
#define DYLD_CACHE_SLIDE4_PAGE_EXTRA_END 0x8000 // last chain entry for page
typedef union vm_shared_region_slide_info_entry *vm_shared_region_slide_info_entry_t;
union vm_shared_region_slide_info_entry {
uint32_t version;
struct vm_shared_region_slide_info_entry_v1 v1;
struct vm_shared_region_slide_info_entry_v2 v2;
struct vm_shared_region_slide_info_entry_v3 v3;
struct vm_shared_region_slide_info_entry_v4 v4;
};
typedef struct vm_shared_region_slide_info *vm_shared_region_slide_info_t;
struct vm_shared_region_slide_info {
mach_vm_address_t slid_address;
mach_vm_offset_t start;
mach_vm_offset_t end;
uint32_t slide;
vm_object_t slide_object;
mach_vm_size_t slide_info_size;
vm_shared_region_slide_info_entry_t slide_info_entry;
};
struct vm_shared_region {
uint32_t sr_ref_count;
queue_chain_t sr_q;
void *sr_root_dir;
cpu_type_t sr_cpu_type;
cpu_subtype_t sr_cpu_subtype;
boolean_t sr_64bit;
boolean_t sr_mapping_in_progress;
boolean_t sr_slide_in_progress;
boolean_t sr_persists;
boolean_t sr_slid;
ipc_port_t sr_mem_entry;
mach_vm_offset_t sr_first_mapping;
mach_vm_offset_t sr_base_address;
mach_vm_size_t sr_size;
mach_vm_offset_t sr_pmap_nesting_start;
mach_vm_size_t sr_pmap_nesting_size;
thread_call_t sr_timer_call;
struct vm_shared_region_slide_info sr_slide_info;
uuid_t sr_uuid;
boolean_t sr_uuid_copied;
uint32_t sr_images_count;
struct dyld_uuid_info_64 *sr_images;
};
extern kern_return_t vm_shared_region_slide_page(vm_shared_region_slide_info_t si,
vm_offset_t vaddr,
mach_vm_offset_t uservaddr,
uint32_t pageIndex);
extern vm_shared_region_slide_info_t vm_shared_region_get_slide_info(vm_shared_region_t sr);
#else
struct vm_shared_region;
struct vm_shared_region_slide_info;
struct vm_shared_region_slide_info_entry;
struct slide_info_entry_toc;
#endif
extern void vm_shared_region_init(void);
extern kern_return_t vm_shared_region_enter(
struct _vm_map *map,
struct task *task,
boolean_t is_64bit,
void *fsroot,
cpu_type_t cpu,
cpu_subtype_t cpu_subtype);
extern kern_return_t vm_shared_region_remove(
struct _vm_map *map,
struct task *task);
extern vm_shared_region_t vm_shared_region_get(
struct task *task);
extern vm_shared_region_t vm_shared_region_trim_and_get(
struct task *task);
extern void vm_shared_region_deallocate(
struct vm_shared_region *shared_region);
extern mach_vm_offset_t vm_shared_region_base_address(
struct vm_shared_region *shared_region);
extern mach_vm_size_t vm_shared_region_size(
struct vm_shared_region *shared_region);
extern ipc_port_t vm_shared_region_mem_entry(
struct vm_shared_region *shared_region);
extern vm_map_t vm_shared_region_vm_map(
struct vm_shared_region *shared_region);
extern uint32_t vm_shared_region_get_slide(
vm_shared_region_t shared_region);
extern void vm_shared_region_set(
struct task *task,
struct vm_shared_region *new_shared_region);
extern vm_shared_region_t vm_shared_region_lookup(
void *root_dir,
cpu_type_t cpu,
cpu_subtype_t cpu_subtype,
boolean_t is_64bit);
extern kern_return_t vm_shared_region_start_address(
struct vm_shared_region *shared_region,
mach_vm_offset_t *start_address);
extern void vm_shared_region_undo_mappings(
vm_map_t sr_map,
mach_vm_offset_t sr_base_address,
struct shared_file_mapping_np *mappings,
unsigned int mappings_count);
extern kern_return_t vm_shared_region_map_file(
struct vm_shared_region *shared_region,
unsigned int mappings_count,
struct shared_file_mapping_np *mappings,
memory_object_control_t file_control,
memory_object_size_t file_size,
void *root_dir,
uint32_t slide,
user_addr_t slide_start,
user_addr_t slide_size);
extern kern_return_t vm_shared_region_sliding_valid(uint32_t slide);
extern kern_return_t vm_shared_region_slide_sanity_check(vm_shared_region_t sr);
extern void* vm_shared_region_get_slide_info_entry(vm_shared_region_t sr);
extern void vm_commpage_init(void);
extern void vm_commpage_text_init(void);
extern kern_return_t vm_commpage_enter(
struct _vm_map *map,
struct task *task,
boolean_t is64bit);
extern kern_return_t vm_commpage_remove(
struct _vm_map *map,
struct task *task);
int vm_shared_region_slide(uint32_t,
mach_vm_offset_t,
mach_vm_size_t,
mach_vm_offset_t,
mach_vm_size_t,
mach_vm_offset_t,
memory_object_control_t);
#endif
#endif