X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/43866e378188c25dd1e2208016ab3cbeb086ae6c..db6096698656d32db7df630594bd9617ee54f828:/osfmk/default_pager/default_pager.c diff --git a/osfmk/default_pager/default_pager.c b/osfmk/default_pager/default_pager.c index 50e0f7969..21d3667eb 100644 --- a/osfmk/default_pager/default_pager.c +++ b/osfmk/default_pager/default_pager.c @@ -1,16 +1,19 @@ /* - * Copyright (c) 2001, 2000 Apple Computer, Inc. All rights reserved. + * Copyright (c) 2000-2010 Apple Computer, Inc. All rights reserved. * - * @APPLE_LICENSE_HEADER_START@ - * - * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved. + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. * * The Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER @@ -20,7 +23,7 @@ * Please see the License for the specific language governing rights and * limitations under the License. * - * @APPLE_LICENSE_HEADER_END@ + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ */ /* * @OSF_COPYRIGHT@ @@ -58,11 +61,15 @@ */ #include "default_pager_internal.h" +#include #include -#include #include +#include +#include #include #include +#include +#include char my_name[] = "(default pager): "; @@ -78,15 +85,17 @@ int debug_mask = 0; vm_size_t cthread_stack_size = 16 *1024; extern vm_size_t cthread_wait_stack_size; +#ifndef MACH_KERNEL unsigned long long vm_page_mask; int vm_page_shift; +#endif int norma_mk; boolean_t verbose; /* task_t default_pager_self; */ /* Our task port. */ -mutex_t dpt_lock; /* lock for the dpt array struct */ +lck_mtx_t dpt_lock; /* lock for the dpt array struct */ default_pager_thread_t **dpt_array; memory_object_default_t default_pager_object; /* for memory_object_create. */ @@ -101,9 +110,9 @@ MACH_PORT_FACE default_pager_external_set; /* Port set for external objects. */ /* Memory created by default_pager_object_create should mostly be resident. */ #define DEFAULT_PAGER_EXTERNAL_COUNT (2) -unsigned int default_pager_internal_count = DEFAULT_PAGER_INTERNAL_COUNT; +int default_pager_internal_count = DEFAULT_PAGER_INTERNAL_COUNT; /* Number of "internal" threads. */ -unsigned int default_pager_external_count = DEFAULT_PAGER_EXTERNAL_COUNT; +int default_pager_external_count = DEFAULT_PAGER_EXTERNAL_COUNT; /* Number of "external" threads. */ /* @@ -119,13 +128,12 @@ default_pager_thread_t *start_default_pager_thread(int, boolean_t); void default_pager(void); void default_pager_thread(void *); void default_pager_initialize(void); -void default_pager_set_policy(MACH_PORT_FACE); boolean_t dp_parse_argument(char *); /* forward; */ unsigned int d_to_i(char *); /* forward; */ - extern int vstruct_def_clshift; +struct global_stats global_stats; /* * Initialize and Run the default pager @@ -134,8 +142,7 @@ void default_pager(void) { int i, id; - static char here[] = "default_pager"; - mach_msg_options_t server_options; + __unused static char here[] = "default_pager"; default_pager_thread_t dpt; kern_return_t kr; @@ -167,7 +174,7 @@ default_pager(void) if (dpt_array[id] == NULL) Panic("alloc pager thread"); kr = vm_allocate(kernel_map, &((dpt_array[id])->dpt_buffer), - vm_page_size << vstruct_def_clshift, TRUE); + vm_page_size << vstruct_def_clshift, VM_FLAGS_ANYWHERE); if (kr != KERN_SUCCESS) Panic("alloc thread buffer"); kr = vm_map_wire(kernel_map, (dpt_array[id])->dpt_buffer, @@ -236,7 +243,7 @@ d_to_i(char * arg) boolean_t dp_parse_argument(char *av) { char *rhs = av; - static char here[] = "dp_parse_argument"; + __unused static char here[] = "dp_parse_argument"; /* Check for '-v' flag */ @@ -267,30 +274,17 @@ boolean_t dp_parse_argument(char *av) } int -start_def_pager(char *bs_device) +start_def_pager( __unused char *bs_device ) { - int my_node; /* MACH_PORT_FACE master_device_port; */ - MACH_PORT_FACE security_port; /* - MACH_PORT_FACE root_ledger_wired; - MACH_PORT_FACE root_ledger_paged; + MACH_PORT_FACE security_port; */ - static char here[] = "main"; - int need_dp_init = 1; - + __unused static char here[] = "main"; -/* - default_pager_host_port = ipc_port_make_send(realhost.host_priv_self); - master_device_port = ipc_port_make_send(master_device_port); - root_ledger_wired = ipc_port_make_send(root_wired_ledger_port); - root_ledger_paged = ipc_port_make_send(root_paged_ledger_port); -*/ - security_port = ipc_port_make_send(realhost.host_security_self); - #if NORMA_VM norma_mk = 1; @@ -301,57 +295,88 @@ start_def_pager(char *bs_device) /* setup read buffers, etc */ default_pager_initialize(); + +#ifndef MACH_KERNEL default_pager(); -} +#endif -/* - * Return TRUE if string 2 is a prefix of string 1. - */ -boolean_t -strprefix(register const char *s1, register const char *s2) -{ - register int c; - - while ((c = *s2++) != '\0') { - if (c != *s1++) - return (FALSE); - } - return (TRUE); + /* start the backing store monitor, it runs on a callout thread */ + default_pager_backing_store_monitor_callout = + thread_call_allocate(default_pager_backing_store_monitor, NULL); + if (!default_pager_backing_store_monitor_callout) + panic("can't start backing store monitor thread"); + thread_call_enter(default_pager_backing_store_monitor_callout); + + return (0); } - kern_return_t default_pager_info( memory_object_default_t pager, default_pager_info_t *infop) { - vm_size_t pages_total, pages_free; + uint64_t pages_total, pages_free; if (pager != default_pager_object) return KERN_INVALID_ARGUMENT; bs_global_info(&pages_total, &pages_free); - infop->dpi_total_space = ptoa(pages_total); - infop->dpi_free_space = ptoa(pages_free); + infop->dpi_total_space = (vm_size_t) ptoa_64(pages_total); + infop->dpi_free_space = (vm_size_t) ptoa_64(pages_free); infop->dpi_page_size = vm_page_size; return KERN_SUCCESS; } +kern_return_t +default_pager_info_64( + memory_object_default_t pager, + default_pager_info_64_t *infop) +{ + uint64_t pages_total, pages_free; + + if (pager != default_pager_object) + return KERN_INVALID_ARGUMENT; + + bs_global_info(&pages_total, &pages_free); + + infop->dpi_total_space = ptoa_64(pages_total); + infop->dpi_free_space = ptoa_64(pages_free); + infop->dpi_page_size = vm_page_size; + infop->dpi_flags = 0; + if (dp_encryption_inited && dp_encryption == TRUE) { + infop->dpi_flags |= DPI_ENCRYPTED; + } + + return KERN_SUCCESS; +} + +lck_grp_t default_pager_lck_grp; +lck_grp_attr_t default_pager_lck_grp_attr; +lck_attr_t default_pager_lck_attr; + + + void -default_pager_initialize() +default_pager_initialize(void) { kern_return_t kr; - static char here[] = "default_pager_initialize"; + __unused static char here[] = "default_pager_initialize"; + lck_grp_attr_setdefault(&default_pager_lck_grp_attr); + lck_grp_init(&default_pager_lck_grp, "default_pager", &default_pager_lck_grp_attr); + lck_attr_setdefault(&default_pager_lck_attr); /* * Vm variables. */ +#ifndef MACH_KERNEL vm_page_mask = vm_page_size - 1; - vm_page_shift = local_log2(vm_page_size); + assert((unsigned int) vm_page_size == vm_page_size); + vm_page_shift = local_log2((unsigned int) vm_page_size); +#endif /* * List of all vstructs. @@ -359,6 +384,9 @@ default_pager_initialize() vstruct_zone = zinit(sizeof(struct vstruct), 10000 * sizeof(struct vstruct), 8192, "vstruct zone"); + zone_change(vstruct_zone, Z_CALLERACCT, FALSE); + zone_change(vstruct_zone, Z_NOENCRYPT, TRUE); + VSL_LOCK_INIT(); queue_init(&vstruct_list.vsl_queue); vstruct_list.vsl_count = 0; @@ -386,11 +414,12 @@ default_pager_initialize() } #else /* USER_PAGER */ { - int clsize; + unsigned int clsize; memory_object_default_t dmm; dmm = default_pager_object; - clsize = (vm_page_size << vstruct_def_clshift); + assert((unsigned int) vm_page_size == vm_page_size); + clsize = ((unsigned int) vm_page_size << vstruct_def_clshift); kr = host_default_memory_manager(host_priv_self(), &dmm, clsize); if ((kr != KERN_SUCCESS) || (dmm != MEMORY_OBJECT_DEFAULT_NULL))