]> git.saurik.com Git - apple/xnu.git/blobdiff - osfmk/default_pager/default_pager.c
xnu-792.21.3.tar.gz
[apple/xnu.git] / osfmk / default_pager / default_pager.c
index cbd50979ea4298900de54b22ca4b464e6f55f013..40b91d9dec53197cea14e789838ea9ded84fca01 100644 (file)
 /*
- * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2000-2004 Apple Computer, Inc. All rights reserved.
  *
- * @APPLE_LICENSE_HEADER_START@
- * 
- * The contents of this file constitute Original Code as defined in and
- * are subject to the Apple Public Source License Version 1.1 (the
- * "License").  You may not use this file except in compliance with the
- * License.  Please obtain a copy of the License at
- * http://www.apple.com/publicsource and read it before using this file.
- * 
- * This Original Code and all software distributed under the License are
- * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * @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. 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
  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
- * License for the specific language governing rights and limitations
- * under the License.
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * 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@
  */
-/*
- * HISTORY
- * $Log: default_pager.c,v $
- * Revision 1.7  2001/01/15 20:03:32  lindak
- * Merged PR-2523198-116-3 into Cheetah from magee which fixes all of the
- * following:
- * 2430517 2445360 2511207 2513779 2523198 2581705 2585290 2595323 2596060
- * 2597427 2601360
- *
- * Revision 1.6.260.1  2001/01/14 10:02:17  jmagee
- * A conglomeration of fixes related to races in the termination of processes
- *
- * Bug #2430517 - Race condition between port death and BSD causes wait4() to fail
- * Bug #2445360 - Process hung in sigsuspend waiting for SIGCHLD
- * Bug #2511207 - IPC thread_act disable too "loose"
- * Bug #2513779 - thread_continue is NOT a continuation routine
- * Bug #2523198 - shuttleless activation during thread creation
- * Bug #2581705 - 4F8: panic in task_info
- * Bug #2585290 - PANIC: thread_deallocate: released last reference on map
- * Bug #2595323 - Cheetah4K9: Lost user context
- * Bug #2596060 - can't get mutex interlock in vm_map_deallocate / load_machfile
- * Bug #2601360 - killing CrashReporter causes process hangs
- * Submitted by: jmagee
- * Reviewed by: Youngworth Umesh Ramesh
- *
- * Revision 1.6  2000/10/13 06:21:06  lindak
- * Merged PR-2425995-2 into Cheetah (youngworth Need Pager and VM support for
- * 64 bit address space)
- *
- * Revision 1.5.804.1  2000/10/12 17:29:25  youngwor
- * Changes for base 64 bit data path support
- *
- * Revision 1.5.782.1  2000/10/12 14:02:32  youngwor
- * Changes to support 64 bit data path throughout the kernel.
- * Bug #: 2425995
- * Submitted by: Chris Youngworth
- * Reviewed by:
- *
- * Revision 1.5  2000/01/26 05:56:22  wsanchez
- * Add APSL
- *
- * Revision 1.4  1999/07/20 02:55:34  lindak
- * Merged PR-2291281-1 into Beaker (magee Kernel Components kobject groupings)
- *
- * Revision 1.3.674.1  1999/07/20 00:33:02  jmagee
- * Workaround for partial EMMI components work
- *
- * Revision 1.3  1999/02/24 16:55:12  wsanchez
- * PR-2308031
- *
- * Revision 1.2.168.1  1999/02/23 20:43:52  semeria
- * Component Header files phase 1
- *
- * Revision 1.2  1998/12/01 00:24:41  wsanchez
- * Merged in CDY_DP1 (chris: default pager)
- *
- * Revision 1.1.2.2  1998/11/25 21:32:17  youngwor
- * fix errant comment format
- *
- * Revision 1.1.2.1  1998/11/24 22:39:57  youngwor
- * Check-in of support for the in-kernel default pager
- *
- * Revision 1.1.1.1  1998/03/07 02:26:31  wsanchez
- * Import of OSF Mach kernel (~mburg)
- *
- * Revision 1.2.84.2  1997/03/27  18:45:15  barbou
- *     submit adidtional picco changes
- *     [1996/09/12  22:09:29  robert]
- *     AXP pool merge.
- *     [97/02/25            barbou]
- *
- * Revision 1.2.84.1  1996/11/29  16:54:38  stephen
- *     nmklinux_1.0b3_shared into pmk1.1
- *     Added -v option (verbose flag) and tests before warning printfs
- *     [1996/07/29  12:25:54  stephen]
- * 
- * Revision 1.2.34.16  1996/07/31  06:41:45  paire
- *     Merged with nmk20b7_shared (1.2.77.1)
- *     [96/05/30            paire]
- * 
- * Revision 1.2.77.1  1996/04/12  06:30:58  paire
- *     Changed signature of default_pager_thread to (void ()(void *)).
- *     Replaced bzero() by memset().
- *     [96/01/30            paire]
- * 
- * Revision 1.2.34.15  1995/08/21  20:52:09  devrcs
- *     Initialize dpt_initialized_p element of
- *     default_pager_thread_tb and set it to true after thread starts
- *     up.  Wait until all threads have signalled ready before
- *     telling the bootstrap process that it's ok to go ahead.
- *     [95/07/10            randys]
- * 
- * Revision 1.2.34.14  1995/06/12  18:44:00  dwm
- *     ri-osc CR1394 - allow argument from bootstrap to set cluster size,
- *     Usage: default_pager clsize=4 sd0b, for example
- *     [1995/06/12  18:40:21  dwm]
- * 
- * Revision 1.2.34.13  1995/05/31  07:55:10  emcmanus
- *     Use mach_msg instead of mach_msg_overwrite_trap so that message
- *     operations can be interrupted without provoking a default-pager
- *     panic.  Remote gdb does this.
- *     [1995/05/31  07:54:21  emcmanus]
- * 
- * Revision 1.2.34.12  1995/05/25  20:36:39  mmp
- *     Removed TEMPORARILY_USE_OLD_INIT and the !TEMPORARILY_USE_OLD_INIT
- *     code.  The change to use m_o_init was not temporary.
- *     [1995/05/25  19:59:17  mmp]
- * 
- * Revision 1.2.34.11  1995/04/07  18:50:57  barbou
- *     Merged into mainline:
- *     Revision 1.2.34.10  1995/02/27  18:24:08  mmp
- *        Replaced m_o_notify with m_o_init; used m_o_change_attributes
- *        instead of m_o_establish; removed m_o_rejected.
- *        [1995/02/27  18:22:40  mmp]
- *     Revision 1.2.34.9  1995/02/23  21:15:48  alanl
- *        Use system_priority instead of server_priority.  Fix locking
- *        with regards to pager_extend!
- *        Merged with DIPC2_SHARED.
- *        [1995/02/23  21:14:55  alanl]
- *     [95/03/08            barbou]
- * 
- *     VM-MK6 Merge.
- *     Started from the modified b26 file.
- *     Integrated the following MK6 changes:
- * 
- *     Fix ri-osc CR846:  Avoid use of fixed BASEPRI_SYSTEM; use new
- *     host_info() interface to determine priority dynamically.
- *     [1994/12/23  15:39:32  bolinger]
- *     mk6 CR668 - 1.3b26 merge
- *     Correct local btodb() def; change port_to_ds() et al. to work
- *     with port names returned by current merged kernel.
- *     [1994/12/03  02:10:30  bolinger]
- *     mk6 CR668 - 1.3b26 merge
- *     Did not bring forward PAGING_MEMORY support.  Did bring forward
- *     NORMA support -- can be deleted when proven no longer needed.
- *     [1994/11/10  15:32:12  bolinger]
- *     [95/01/10            barbou]
- *     [95/03/08            barbou]
- * 
- * Revision 1.2.56.2  1995/02/13  14:40:41  barbou
- *     VM-MK6 Merge.
- *     Started from the modified b26 file.
- *     Integrated the following MK6 changes:
- * 
- *     Fix ri-osc CR846:  Avoid use of fixed BASEPRI_SYSTEM; use new
- *     host_info() interface to determine priority dynamically.
- *     [1994/12/23  15:39:32  bolinger]
- *     mk6 CR668 - 1.3b26 merge
- *     Correct local btodb() def; change port_to_ds() et al. to work
- *     with port names returned by current merged kernel.
- *     [1994/12/03  02:10:30  bolinger]
- *     mk6 CR668 - 1.3b26 merge
- *     Did not bring forward PAGING_MEMORY support.  Did bring forward
- *     NORMA support -- can be deleted when proven no longer needed.
- *     [1994/11/10  15:32:12  bolinger]
- *     [95/01/10            barbou]
- * 
- * Revision 1.2.46.3  1994/11/02  14:57:23  barbou
- *     Use new task_swappable() interface to make our task unswappable.
- *     [94/11/02            barbou]
- * 
- * Revision 1.2.46.2  1994/10/10  15:28:48  barbou
- *     VM Merge - Default Pager Clustering.
- * 
- *     Also split this file in three:
- *             default_pager.c contains code that deals with threads and
- *                     incoming messages.
- *             dp_memory_object.c contains memory object management code.
- *             dp_backing_store.c contains backing store management code.
- *     [94/10/10            barbou]
- * 
- * Revision 1.2.6.23  1994/05/16  16:43:50  jph
- *     CR8809 -- Fix messages when paging space is exhausted.
- *     CR10905 -- Disallow overlapped paging areas.
- *     [1994/05/16  16:43:04  jph]
- * 
- * Revision 1.2.6.22  1994/04/01  18:42:34  jph
- *     CR10550 -- Add backing store info interfaces.
- *     CR10718 -- Fix pagein error path.
- *     [1994/04/01  18:40:13  jph]
- * 
- * Revision 1.2.6.21  1994/03/04  18:34:49  jeffc
- *     CR10636 -- delete all NMK15_COMPAT support.
- *     [1994/03/04  14:50:44  jeffc]
- * 
- * Revision 1.2.6.20  1994/02/16  14:22:24  jph
- *     CR10554 -- Multi-page requests now handled, albeit crudely.
- *     Fixed leak in data_request for partial page reads.
- *     Tidied up code to be at least consistent.
- *     Fixed ASSERTIONS option and bad assert (name_refs in terminate).
- *     [1994/02/16  14:20:47  jph]
- * 
- * Revision 1.2.6.19  1994/02/07  22:41:25  jph
- *     Merged with changes from 1.2.6.18
- *     [1994/02/07  22:40:25  jph]
- * 
- *     CR10433 -- Upgrade default pager.
- *     Add device argument capability.
- *     Removed defunct file_io.h reference.
- *     Replaced pager_{lock_init,lock,unlock,lock_try} macros.
- *     Moved cthreads globals to top of file from middle.
- *     Removed "id" field of "partition_t" - not needed.
- *     Added "device", "offset", "count" and "record_shift" fields
- *      to "partition_t" to record backing store device info.
- *     Removed "p_read", "p_write" and "p_private" fields from
- *      "partition_t" - Unneeded filesystem abstraction.
- *     Merge "struct dstruct" fields into the "struct dpager",
- *      delete "struct dstruct" and "default_pager_t".
- *     Added "struct bstruct" and "all_backing_store" to hold list
- *      of all backing store ports.
- *     Simplify arguments to create_paging_partition().
- *     Delete part_id(), add_paging_file() and default_pager_setup() routines.
- *     Added backing_store_port_alloc(), log2() routine.
- *     Added vm_page_mask and vm_page_shift to augment vm_page_size.
- *     [1994/02/07  22:28:15  jph]
- * 
- * Revision 1.2.6.18  1994/02/01  19:44:38  collins
- *     CR9926: Set the default pager scheduling policy to round-robin with
- *     a priority of BASEPRI_SYSTEM.
- *     [1994/02/01  14:56:05  collins]
- * 
- * Revision 1.2.6.17  1994/01/27  17:04:21  chasb
- *     Expand Copyright markers
- *     [1994/01/27  16:32:40  chasb]
- * 
- * Revision 1.2.6.16  1994/01/26  18:42:03  collins
- *     CR10474: Change any_t to void *.
- *     [1994/01/26  18:39:47  collins]
- * 
- * Revision 1.2.6.15  1994/01/25  17:02:40  jeffc
- *     CR10107 -- Mach spec compliance - eliminate copy_call
- *     [1994/01/24  21:23:43  jeffc]
- * 
- * Revision 1.2.6.14  1994/01/20  16:58:18  meissner
- *     CR 10468 - Make initialization have proper number of {}'s.
- *     [1994/01/19  19:02:57  meissner]
- * 
- * Revision 1.2.6.13  1993/12/03  20:53:51  jvs
- *     Trusted pager throttling changes.  CR 10108
- *     [1993/12/03  20:53:09  jvs]
- * 
- * Revision 1.2.6.12  1993/12/02  17:22:34  jph
- *     CR10254 -- Fix warning about unused ledger/ security ports.
- *     [1993/12/02  15:59:30  jph]
- * 
- * Revision 1.2.6.11  1993/11/24  20:30:31  jph
- *     CR9801 brezak merge, ledgers, security and NMK15_COMPAT
- *     [1993/11/23  22:52:33  jph]
- * 
- *     New bootstrap_ports() signature.
- *     [1993/11/23  20:58:25  jph]
- * 
- * Revision 1.2.6.10  1993/11/23  18:05:47  watkins
- *     Increment send right for object in mo_notify.
- *     [1993/11/23  18:04:35  watkins]
- * 
- * Revision 1.2.6.9  1993/11/16  21:49:42  watkins
- *     Remove pager_name argument from memory_object_terminate
- *     and memory_object_create, as per spec.  Remove mo_init
- *     and flesh out mo_notify. Extend maps for reads beyond the
- *     end. Add xpr traces.
- *     [1993/11/16  21:29:43  watkins]
- * 
- * Revision 1.2.6.8  1993/10/20  18:50:13  gm
- *     CR9928: Remove bootstrap_port lookup.
- *     CR9990: Remove code that deletes initial stack.
- *     [1993/10/20  12:34:40  gm]
- * 
- * Revision 1.2.6.7  1993/10/08  17:32:08  jeffc
- *     CR9508 - Delete typed IPC code
- *     [1993/09/28  17:27:02  jeffc]
- * 
- * Revision 1.2.6.6  1993/10/08  16:08:14  jeffc
- *     CR9792 - delete obsolete memory_object_data_write message.
- *     [1993/10/08  15:59:49  jeffc]
- * 
- * Revision 1.2.6.5  1993/10/05  21:57:08  watkins
- *     New memory object attribute interfaces comply with spec.
- *     [1993/10/05  21:53:27  watkins]
- * 
- * Revision 1.2.6.4  1993/09/16  18:38:39  jeffc
- *     CR9792 - delete defunct EMMI interfaces
- *     [1993/09/15  20:02:07  jeffc]
- * 
- * Revision 1.2.6.3  1993/08/05  17:57:08  gm
- *     CR9627: Moved def_pager_setup and bootstrap code here.  Removed
- *     EXT_PAGER code.  Fixed up code problems with more agressive warning
- *     in gcc.  Added full prototype support.  Changed internal interfaces
- *     that had unions as return values to take pointer arguments instead.
- *     Delete bootstrap code since their is now a separate bootstrap task.
- *     Removed set_ras_address() since it should be provided by a machine
- *     dependent file on machines that need it.  Changed to get priv
- *     ports using mach interfaces instead of argv.
- *     [1993/07/09  19:11:36  gm]
- * 
- * Revision 1.2.6.2  1993/06/09  02:08:56  gm
- *     Conditionalize no_senders_check for untyped IPC.  CR #9058.
- *     [1993/05/11  18:19:30  rod]
- * 
- *     Add header files to pick up definitions of Mach traps and
- *     wiring interfaces.
- *     [1993/05/14  15:37:15  jeffc]
- * 
- *     Fix ANSI C violations and warnings.
- *     [1993/05/13  21:05:22  jeffc]
- * 
- *     Remove dependency on own pathname.
- *     [1993/05/12  17:53:18  jeffc]
- * 
- * Revision 1.2  1993/04/19  15:07:02  devrcs
- *     Added trailer support to untyped ipc.   [travos@osf.org, fdr@osf.org]
- *     [1993/04/06  18:14:54  travos]
- * 
- *     Merge untyped ipc:
- *     Added untyped support to bootstrap_compat().
- *     [1993/04/02  17:37:59  rod]
- * 
- *     Share more code when building the in kernel version
- *     of the pager.
- *     [93/03/19            bernadat]
- * 
- *     Fix memory_object_synchronize hang.
- *     [1993/03/15  13:21:59  david]
- * 
- *     memory_object_synchronize define twice
- *     [1993/03/03  15:09:30  david]
- * 
- *     remerge with 1.1.2.3
- *     [1993/03/03  14:26:14  david]
- * 
- *     Add memory_object_synchronize stub
- *     [1993/03/03  11:04:05  david]
- * 
- *     Fixed a deadlock bug in internal pager configuration.
- *     [93/02/25            bernadat]
- * 
- *     moved out of mach_kernel directory
- *     [1993/02/27  13:56:35  david]
- * 
- *     Modified to use the same new interface (default_pager_object.defs) for both
- *     configurations.
- *     [1993/02/17  13:40:18  bruel]
- * 
- *     Added stubs for new exception interface.
- *     [93/02/11            bruel]
- * 
- *     Modified from mk78.
- *     Added the ufs_pager_option.
- *     [93/01/29            bruel]
- * 
- *     Yup, it works. Undefine CHECKSUM, debug and
- *     DEBUG_READER_CONFLICTS again.
- *     [92/12/03            ian]
- * 
- *     Update CHECKSUM to work with current dp_map union.
- *     [92/12/03            ian]
- * 
- *     Define debug CHECKSUM and DEBUG_READER_CONFLICTS.
- *     [92/11/28            ian]
- * 
- *     Eliminated use of old memory object calls (set_attributes, data_write, data_provided).
- *     [92/09/25            jsb]
- * 
- * $EndLog$
- */
-/* CMU_HIST */
-/*
- * Revision 2.12  92/07/20  13:32:18  cmaeda
- *     Added private version of set_ras_address for fast_tas support.
- *     [92/05/11  14:31:52  cmaeda]
- * 
- * Revision 2.11  92/05/05  10:03:46  danner
- *     For merge purposes, backed-out the unstable stuff.
- *     [92/05/04  11:12:01  af]
- * 
- *     Now we can page an object across partitions.
- *     Initial rough ideas about automatically extending
- *     paging space.
- *     [92/03/11  02:23:58  af]
- * 
- * Revision 2.10  92/03/06  13:58:48  rpd
- *     Fixed pager_dealloc_page calls in pager_dealloc (from af).
- *     Removed chatty printfs.
- *     [92/03/06            rpd]
- * 
- * Revision 2.9  92/03/05  15:58:35  rpd
- *     Changed PAGEMAP_ENTRIES from 128 to 64.  From af.
- *     [92/03/05            rpd]
- * 
- * Revision 2.8  92/03/03  12:12:04  rpd
- *     Changed to catch exception messages and handle bootstrap requests.
- *     Added partition_init.
- *     [92/03/03            rpd]
- * 
- * Revision 2.7  92/02/25  11:22:38  elf
- *     Accept creation of objects bigger than any one partition, in
- *     anticipation of the code that will page across partitions.
- *     Since we are at it, also proceed with no paging partitions:
- *     rely on killing unlucky objects on pageouts.
- *     [92/02/25            af]
- * 
- * Revision 2.6  92/02/23  23:00:31  elf
- *     Copyright updated, corrected history.
- *     [92/02/23            elf]
- * 
- * Revision 2.5  92/02/23  22:25:35  elf
- *     Improved handling of big objects, fixed a deadlock in
- *     object relocation, improved printouts.
- *     Now only crash if out of memory, otherwise use the old
- *     code that just marked the object as in-error.
- *     [92/02/23  13:25:49  af]
- * 
- *     As per jsb instructions, removed all NORMA conditionals.
- *     Rename port names to odd values, a trivial heuristic that
- *     makes name conflicts even more unlikely.
- *     [92/02/22            af]
- * 
- *     Refined the port name conflict problem.  Instead of renaming
- *     ports that we send to, just set aside the memory that we cannot
- *     use.  When objects get deleted put back the memory in the system.
- *     [92/02/21            af]
- * 
- *     Added renaming of request and name ports (from af).
- *     [92/02/21            danner]
- * 
- *     Many changes. Now supports adding/removing paging files, it does
- *     not immediately panic if a paging file fills up but relocates the
- *     object elsewhere, it uses the precious attribute in data_supply
- *     to reduce paging space usage (under USE_PRECIOUS conditional,
- *     enabled).
- *     [92/02/19  17:29:54  af]
- * 
- *     Two mods: changed bitmap ops to work one int at a time rather
- *     than one byte at a time.  This helps under load, e.g. when the
- *     paging file is large and busy. Second mod to use port-to-pointer
- *     casting in lookups, rather than hash+list searching.  This not
- *     only helps under load (I see >600 objects on my pmax) but also
- *     increases parallelism a little.
- *     Shrunk the code size by one page in the process.
- *     [92/02/14  01:44:23  af]
- * 
- * Revision 2.4  92/01/23  15:19:41  rpd
- *     Changed to not include mig server interfaces.
- *     [92/01/23            rpd]
- * 
- * Revision 2.3  92/01/14  16:43:14  rpd
- *     Moved mach/default_pager_object.defs to mach/default_pager.defs.
- *     Revised default_pager_info etc. for their new definitions.
- *     Removed (now) unnecessary #define's to rename kernel functions.
- *     [92/01/13            rpd]
- *     Added page_size to default_pager_info.
- *     Added default_pager_object_pages.
- *     [92/01/03            rpd]
- * 
- *     Updated to handle name ports from memory_object_create.
- *     Changed to remember the name ports associated with objects.
- *     Changed default_pager_objects to return the name ports.
- *     [91/12/28            rpd]
- * 
- *     Added default_pager_objects.
- *     [91/12/15            rpd]
- * 
- * Revision 2.2  92/01/03  19:56:21  dbg
- *     Simplify locking.
- *     [91/10/02            dbg]
- * 
- *     Convert to run outside of kernel.
- *     [91/09/04            dbg]
- * 
- * Revision 2.17  91/08/29  13:44:27  jsb
- *     A couple quick changes for NORMA_VM. Will be fixed later.
- * 
- * Revision 2.16  91/08/28  16:59:29  jsb
- *     Fixed the default values of default_pager_internal_count and
- *     default_pager_external_count.
- *     [91/08/28            rpd]
- * 
- * Revision 2.15  91/08/28  11:09:32  jsb
- *     Added seqnos_memory_object_change_completed.
- *     From dlb: use memory_object_data_supply for pagein when buffer is
- *     going to be deallocated.
- *     From me: don't use data_supply under NORMA_VM (will be fixed).
- *     [91/08/26  14:30:07  jsb]
- * 
- *     Changed to process requests in parallel when possible.
- * 
- *     Don't bother keeping track of mscount.
- *     [91/08/16            rpd]
- *     Added default_pager_info.
- *     [91/08/15            rpd]
- * 
- *     Added sequence numbers to the memory object interface.
- *     Changed to use no-senders notifications.
- *     Changed to keep track of port rights and not use mach_port_destroy.
- *     Added dummy supply-completed and data-return stubs.
- *     [91/08/13            rpd]
- * 
- * Revision 2.14  91/05/18  14:28:32  rpd
- *     Don't give privileges to threads handling external objects.
- *     [91/04/06            rpd]
- *     Enhanced to use multiple threads, for performance and to avoid
- *     a deadlock caused by default_pager_object_create.
- *     Added locking to partitions.
- *     Added locking to pager_port_hashtable.
- *     Changed pager_port_hash to something reasonable.
- *     [91/04/03            rpd]
- * 
- * Revision 2.13  91/05/14  15:21:41  mrt
- *     Correcting copyright
- * 
- * Revision 2.12  91/03/16  14:41:26  rpd
- *     Updated for new kmem_alloc interface.
- *     Fixed memory_object_create to zero the new pager structure.
- *     [91/03/03            rpd]
- *     Removed thread_swappable.
- *     [91/01/18            rpd]
- * 
- * Revision 2.11  91/02/05  17:00:49  mrt
- *     Changed to new copyright
- *     [91/01/28  14:54:31  mrt]
- * 
- * Revision 2.10  90/09/09  14:31:01  rpd
- *     Use decl_simple_lock_data.
- *     [90/08/30            rpd]
- * 
- * Revision 2.9  90/08/27  21:44:51  dbg
- *     Add definitions of NBBY, howmany.
- *     [90/07/16            dbg]
- * 
- * Revision 2.8  90/06/02  14:45:22  rpd
- *     Changed default_pager_object_create so the out argument
- *     is a poly send right.
- *     [90/05/03            rpd]
- *     Removed references to keep_wired_memory.
- *     [90/04/29            rpd]
- *     Converted to new IPC.
- *     Removed data-request queue.
- *     [90/03/26  21:30:57  rpd]
- * 
- * Revision 2.7  90/03/14  21:09:58  rwd
- *     Call default_pager_object_server and add
- *     default_pager_object_create
- *     [90/01/22            rwd]
- * 
- * Revision 2.6  90/01/11  11:41:08  dbg
- *     Use bootstrap-task print routines.
- *     [89/12/20            dbg]
- * 
- *     De-lint.
- *     [89/12/06            dbg]
- * 
- * Revision 2.5  89/12/08  19:52:03  rwd
- *     Turn off CHECKSUM
- *     [89/12/06            rwd]
- * 
- * Revision 2.4  89/10/23  12:01:54  dbg
- *     Change pager_read_offset and pager_write_offset to return block
- *     number as function result.  default_read()'s caller must now
- *     deallocate data if not the same as the data buffer passed in.
- *     Add register declarations and clean up loops a bit.
- *     [89/10/19            dbg]
- * 
- *     Oops - nothing like having your debugging code introduce bugs...
- *     [89/10/17            dbg]
- * 
- * Revision 2.3  89/10/16  15:21:59  rwd
- *     debugging: checksum pages in each object.
- *     [89/10/04            dbg]
- * 
- * Revision 2.2  89/09/08  11:22:06  dbg
- *     Wait for default_partition to be set.
- *     [89/09/01            dbg]
- * 
- *     Modified to call outside routines for read and write.
- *     Removed disk structure.  Added part_create.
- *     Reorganized code.
- *     [89/07/11            dbg]
- * 
- */
-/* CMU_ENDHIST */
 /* 
  * Mach Operating System
  * Copyright (c) 1991,1990,1989 Carnegie Mellon University
  */
 
 #include "default_pager_internal.h"
+#include <default_pager/default_pager_object_server.h>
 #include <kern/host.h>
 #include <kern/ledger.h>
 #include <mach/host_info.h>
+#include <mach/host_priv.h>
+#include <mach/vm_map.h>
 #include <ipc/ipc_space.h>
 #include <vm/vm_kern.h>
+#include <vm/vm_map.h>
+#include <vm/vm_protos.h>
 
 char   my_name[] = "(default pager): ";
 
@@ -666,8 +97,9 @@ boolean_t    verbose;
 mutex_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. */
+
 MACH_PORT_FACE default_pager_default_set; /* Port set for "default" thread. */
-MACH_PORT_FACE default_pager_default_port;/* Port for memory_object_create. */
 MACH_PORT_FACE default_pager_internal_set; /* Port set for internal objects. */
 MACH_PORT_FACE default_pager_external_set; /* Port set for external objects. */
 
@@ -677,9 +109,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. */
 
 /*
@@ -695,9 +127,9 @@ 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; */
+boolean_t       strprefix(register const char *s1, register const char *s2);
 
 
 extern int vstruct_def_clshift;
@@ -710,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;
 
@@ -743,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, 
@@ -812,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 */
 
@@ -843,19 +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          security_port;
        MACH_PORT_FACE          root_ledger_wired;
        MACH_PORT_FACE          root_ledger_paged;
 */
-       static char             here[] = "main";
-       int                     need_dp_init = 1;
+       __unused static char here[] = "main";
 
 
 
@@ -864,8 +293,8 @@ start_def_pager(char *bs_device)
        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
@@ -878,6 +307,13 @@ start_def_pager(char *bs_device)
        /* setup read buffers, etc */
        default_pager_initialize();
        default_pager();
+       
+       /* 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);
 }
 
 /*
@@ -898,35 +334,79 @@ strprefix(register const char *s1, register const char *s2)
 
 kern_return_t
 default_pager_info(
-       MACH_PORT_FACE          pager,
+       memory_object_default_t pager,
        default_pager_info_t    *infop)
 {
        vm_size_t       pages_total, pages_free;
 
-       if (pager != default_pager_default_port)
+       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 = ptoa_32(pages_total);
+       infop->dpi_free_space = ptoa_32(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)
+{
+       vm_size_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;
+}
+
+
 void
 default_pager_initialize()
 {
        kern_return_t           kr;
-       static char             here[] = "default_pager_initialize";
+       __unused static char    here[] = "default_pager_initialize";
+
 
+       /*
+        * Vm variables.
+        */
+       vm_page_mask = vm_page_size - 1;
+       vm_page_shift = local_log2(vm_page_size);
+
+       /*
+        * List of all vstructs.
+        */
+       vstruct_zone = zinit(sizeof(struct vstruct),
+                            10000 * sizeof(struct vstruct),
+                            8192, "vstruct zone");
+       VSL_LOCK_INIT();
+       queue_init(&vstruct_list.vsl_queue);
+       vstruct_list.vsl_count = 0;
+
+       VSTATS_LOCK_INIT(&global_stats.gs_lock);
+
+       bs_initialize();
 
        /*
         * Exported DMM port.
         */
-       default_pager_default_port = ipc_port_alloc_kernel();
+       default_pager_object = ipc_port_alloc_kernel();
 
 
        /*
@@ -935,7 +415,7 @@ default_pager_initialize()
 #ifdef USER_PAGER
        if ((kr = netname_check_in(name_server_port, "UserPager",
                                   default_pager_self,
-                                  default_pager_default_port))
+                                  default_pager_object))
            != KERN_SUCCESS) {
                dprintf(("netname_check_in returned 0x%x\n", kr));
                exit(1);
@@ -943,34 +423,18 @@ default_pager_initialize()
 #else  /* USER_PAGER */
        {
                int clsize;
-               ipc_port_t DMM;
+               memory_object_default_t dmm;
 
-               DMM = ipc_port_make_send(default_pager_default_port);
+               dmm = default_pager_object;
                clsize = (vm_page_size << vstruct_def_clshift);
-               kr = host_default_memory_manager(host_priv_self(), &DMM, clsize);
-               if ((kr != KERN_SUCCESS) || (DMM != MACH_PORT_NULL))
+               kr = host_default_memory_manager(host_priv_self(), &dmm, clsize);
+               if ((kr != KERN_SUCCESS) ||
+                   (dmm != MEMORY_OBJECT_DEFAULT_NULL))
                        Panic("default memory manager");
 
        }
 #endif /* USER_PAGER */
 
 
-       /*
-        * Vm variables.
-        */
-       vm_page_mask = vm_page_size - 1;
-       vm_page_shift = local_log2(vm_page_size);
-
-       /*
-        * List of all vstructs.
-        */
-       VSL_LOCK_INIT();
-       queue_init(&vstruct_list.vsl_queue);
-       queue_init(&vstruct_list.vsl_leak_queue);
-       vstruct_list.vsl_count = 0;
-
-       VSTATS_LOCK_INIT(&global_stats.gs_lock);
-
-       bs_initialize();
 }