commit-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gnumach] 01/02: New upstream version 1.7+git20161023


From: Samuel Thibault
Subject: [gnumach] 01/02: New upstream version 1.7+git20161023
Date: Mon, 24 Oct 2016 00:16:21 +0000

This is an automated email from the git hooks/post-receive script.

sthibault pushed a commit to branch master
in repository gnumach.

commit 430e37a2a0816925af6b36697a822a894501fac2
Author: Samuel Thibault <address@hidden>
Date:   Sun Oct 23 22:04:40 2016 +0000

    New upstream version 1.7+git20161023
---
 ChangeLog                               | 102 ++++++++++
 NEWS                                    |   4 +
 configure                               |  20 +-
 device/dev_pager.c                      | 171 +----------------
 device/dev_pager.h                      |   2 -
 device/device_pager.srv                 |   1 -
 doc/mach.info                           | 240 +++++++++++------------
 doc/mach.info-1                         | 327 +++++++++++++++++++-------------
 doc/mach.info-2                         | 177 +----------------
 doc/mach.texi                           | 114 ++---------
 doc/stamp-vti                           |   8 +-
 doc/version.texi                        |   8 +-
 i386/i386/seg.h                         |   2 +-
 i386/i386/xen.h                         |   4 +-
 i386/i386at/biosmem.c                   |  12 +-
 i386/intel/pmap.c                       |  39 ++--
 include/mach/mach.defs                  |  28 +--
 include/mach/memory_object.defs         |  60 ++----
 include/mach/memory_object_default.defs |   4 +-
 include/mach/task_notify.defs           |  22 ++-
 include/mach_debug/vm_info.h            |   1 -
 kern/assert.h                           |   5 +-
 kern/debug.c                            |  18 +-
 kern/debug.h                            |   6 +-
 kern/sched_prim.c                       |  23 ++-
 kern/task.c                             |  17 +-
 linux/dev/glue/kmem.c                   |   7 +-
 linux/dev/include/linux/kernel.h        |   6 +-
 version.m4                              |   2 +-
 vm/memory_object.c                      |  75 ++------
 vm/vm_debug.c                           |   2 -
 vm/vm_kern.c                            |  12 +-
 vm/vm_map.c                             |   3 +
 vm/vm_object.c                          |   1 -
 vm/vm_object.h                          |   3 -
 vm/vm_pageout.c                         |  13 +-
 36 files changed, 628 insertions(+), 911 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 74da3e8..e1f233d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,105 @@
+2016-10-24  Samuel Thibault  <address@hidden>
+
+       Fix warnings
+       * i386/i386/seg.h (fill_descriptor): Fix format for vm_offset_t.
+       * i386/i386/xen.h (hyp_free_mfn, hyp_free_page): Fix format for unsigned
+       long.
+
+2016-10-22  Justus Winter  <address@hidden>
+
+       i386: Allocate page directories using the slab allocator.
+       * i386/intel/pmap.c (pd_cache): New variable.
+       (pdp_cache): Likewise.
+       (pmap_init): Initialize new caches.
+       (pmap_create): Use the caches.
+       (pmap_destroy): Free to the caches.
+
+2016-10-21  Justus Winter  <address@hidden>
+
+       Gracefully handle pmap allocation failures.
+       * kern/task.c (task_create): Gracefully handle pmap allocation
+       failures.
+       * vm/vm_map.c (vm_map_fork): Likewise.
+
+       vm: Print map names in case of failures.
+       * vm/vm_kern.c (kmem_alloc): Print map names in case of failures.
+       (kmem_alloc_wired): Likewise.
+       (kmem_alloc_aligned): Likewise.
+       (kmem_alloc_pageable): Likewise.
+
+2016-10-13  Justus Winter  <address@hidden>
+
+       Make task notification ports mutable.
+       * include/mach/task_notify.defs (task_notify_port_t): New type.
+       (mach_notify_new_task): Use the specialized type.
+
+2016-10-12  Justus Winter  <address@hidden>
+
+       linux: Remove incompatible local prototype.
+       * linux/dev/glue/kmem.c (vremap): Remove prototype, include the right
+       header instead.
+
+2016-10-03  Justus Winter  <address@hidden>
+
+       Remove deprecated external memory management interface.
+       * NEWS: Update.
+       * device/dev_pager.c (device_pager_data_request): Prune unused branch.
+       (device_pager_data_request_done): Remove function.
+       (device_pager_data_write): Likewise.
+       (device_pager_data_write_done): Likewise.
+       (device_pager_copy): Use 'memory_object_ready'.
+       * device/dev_pager.h (device_pager_data_write_done): Remove prototype.
+       * device/device_pager.srv (memory_object_data_write): Remove macro.
+       * doc/mach.texi: Update documentation.
+       * include/mach/mach.defs (memory_object_data_provided): Drop RPC.
+       (memory_object_set_attributes): Likewise.
+       * include/mach/memory_object.defs: Update comments.
+       (memory_object_data_write): Drop RPC.
+       * include/mach/memory_object_default.defs: Update comments.
+       * include/mach_debug/vm_info.h (VOI_STATE_USE_OLD_PAGEOUT): Drop
+       macro.
+       * vm/memory_object.c (memory_object_data_provided): Remove function.
+       (memory_object_data_error): Simplify.
+       (memory_object_set_attributes_common): Make static, remove unused
+       parameters, simplify.
+       (memory_object_change_attributes): Update callsite.
+       (memory_object_set_attributes): Remove function.
+       (memory_object_ready): Update callsite.
+       * vm/vm_debug.c (mach_vm_object_info): Adapt to the changes.
+       * vm/vm_object.c (vm_object_bootstrap): Likewise.
+       * vm/vm_object.h (struct vm_object): Drop flag 'use_old_pageout'.
+       * vm/vm_pageout.c: Update comments.
+       (vm_pageout_page): Simplify.
+
+2016-10-02  David Michael  <address@hidden>
+
+       Fix format security
+       * i386/i386at/biosmem.c (boot_panic): Use %s format instead of passing
+       the string directly to `panic'.
+       (biosmem_unregister_boot_data): Use %s format instead of passing
+       `biosmem_panic_inval_boot_data' directly to `panic'.
+
+2016-10-01  Justus Winter  <address@hidden>
+
+       kern: Improve panic messages from the scheduler.
+       * kern/sched_prim.c (state_panic): Turn into macro, print symbolic
+       values of thread state.
+
+       kern: Improve assertions and panics.
+       * kern/assert.h (Assert): Add function argument.
+       (assert): Supply function argument.
+       * kern/debug.c (Assert): Add function argument.  Unify message format.
+       (panic): Rename to 'Panic', add location information.
+       * kern/debug.h (panic): Rename, and add a macro version that supplies
+       the location.
+       * linux/dev/include/linux/kernel.h: Use the new panic macro.
+
+2016-09-22  Samuel Thibault  <address@hidden>
+
+       biosmem: show memory map at boot
+       * i386/i386at/biosmem.c (biosmem_type_desc, biosmem_map_show): Define
+       even if DEBUG is 0.  But show biosmem heap addresses only if DEBUG is 1.
+
 2016-09-21  Richard Braun  <address@hidden>
 
        Enable high memory
diff --git a/NEWS b/NEWS
index 7626e40..a14ac2b 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,7 @@
+Version 1.8 (2016-10-XX)
+
+The deprecated external memory management interface has been removed.
+
 Version 1.7 (2016-05-18)
 
 The code has been updated to work with newer versions of GCC, and numerous bugs
diff --git a/configure b/configure
index 282252c..6e6153d 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for GNU Mach 1.7+git20160921.
+# Generated by GNU Autoconf 2.69 for GNU Mach 1.7+git20161023.
 #
 # Report bugs to <address@hidden>.
 #
@@ -579,8 +579,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='GNU Mach'
 PACKAGE_TARNAME='gnumach'
-PACKAGE_VERSION='1.7+git20160921'
-PACKAGE_STRING='GNU Mach 1.7+git20160921'
+PACKAGE_VERSION='1.7+git20161023'
+PACKAGE_STRING='GNU Mach 1.7+git20161023'
 PACKAGE_BUGREPORT='address@hidden'
 PACKAGE_URL=''
 
@@ -1599,7 +1599,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures GNU Mach 1.7+git20160921 to adapt to many kinds of 
systems.
+\`configure' configures GNU Mach 1.7+git20161023 to adapt to many kinds of 
systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1670,7 +1670,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of GNU Mach 1.7+git20160921:";;
+     short | recursive ) echo "Configuration of GNU Mach 1.7+git20161023:";;
    esac
   cat <<\_ACEOF
 
@@ -2026,7 +2026,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-GNU Mach configure 1.7+git20160921
+GNU Mach configure 1.7+git20161023
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2118,7 +2118,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by GNU Mach $as_me 1.7+git20160921, which was
+It was created by GNU Mach $as_me 1.7+git20161023, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -2984,7 +2984,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='gnumach'
- VERSION='1.7+git20160921'
+ VERSION='1.7+git20161023'
 
 
 # Some tools Automake needs.
@@ -12189,7 +12189,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by GNU Mach $as_me 1.7+git20160921, which was
+This file was extended by GNU Mach $as_me 1.7+git20161023, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -12260,7 +12260,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; 
s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-GNU Mach config.status 1.7+git20160921
+GNU Mach config.status 1.7+git20161023
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
diff --git a/device/dev_pager.c b/device/dev_pager.c
index 4033170..7130229 100644
--- a/device/dev_pager.c
+++ b/device/dev_pager.c
@@ -356,45 +356,7 @@ kern_return_t      device_pager_data_request(
            vm_object_deallocate(object);
        }
        else {
-           io_req_t                    ior;
-           mach_device_t               device;
-           io_return_t                 result;
-
            panic("(device_pager)data_request: dev pager");
-
-           device = ds->device;
-           mach_device_reference(device);
-           dev_pager_deallocate(ds);
-
-           /*
-            * Package the read for the device driver.
-            */
-           io_req_alloc(ior, 0);
-
-           ior->io_device      = device;
-           ior->io_unit        = device->dev_number;
-           ior->io_op          = IO_READ | IO_CALL;
-           ior->io_mode        = 0;
-           ior->io_recnum      = offset / device->bsize;
-           ior->io_data        = 0;            /* driver must allocate */
-           ior->io_count       = length;
-           ior->io_alloc_size  = 0;            /* no data allocated yet */
-           ior->io_residual    = 0;
-           ior->io_error       = 0;
-           ior->io_done        = device_pager_data_request_done;
-           ior->io_reply_port  = pager_request;
-           ior->io_reply_port_type = MACH_MSG_TYPE_PORT_SEND;
-
-           result = (*device->dev_ops->d_read)(device->dev_number, ior);
-           if (result == D_IO_QUEUED)
-               return (KERN_SUCCESS);
-
-           /*
-            * Return by queuing IOR for io_done thread, to reply in
-            * correct environment (kernel).
-            */
-           ior->io_error = result;
-           iodone(ior);
        }
 
        dev_pager_deallocate(ds);
@@ -402,125 +364,6 @@ kern_return_t     device_pager_data_request(
        return (KERN_SUCCESS);
 }
 
-/*
- * Always called by io_done thread.
- */
-boolean_t device_pager_data_request_done(io_req_t      ior)
-{
-       vm_offset_t     start_alloc, end_alloc;
-       vm_size_t       size_read;
-
-       if (ior->io_error == D_SUCCESS) {
-           size_read = ior->io_count;
-           if (ior->io_residual) {
-               if (device_pager_debug)
-                   printf("(device_pager)data_request_done: r: 0x%lx\n", 
ior->io_residual);
-               memset((&ior->io_data[ior->io_count - ior->io_residual]), 0, 
-                     (size_t) ior->io_residual);
-           }
-       } else {
-           size_read = ior->io_count - ior->io_residual;
-       }
-
-       start_alloc = trunc_page(ior->io_data);
-       end_alloc   = start_alloc + round_page(ior->io_alloc_size);
-
-       if (ior->io_error == D_SUCCESS) {
-           vm_map_copy_t copy;
-           kern_return_t kr;
-
-           kr = vm_map_copyin(kernel_map, (vm_offset_t)ior->io_data,
-                               size_read, TRUE, &copy);
-           if (kr != KERN_SUCCESS)
-               panic("device_pager_data_request_done");
-
-           (void) r_memory_object_data_provided(
-                                       ior->io_reply_port,
-                                       ior->io_recnum * ior->io_device->bsize,
-                                       (vm_offset_t)copy,
-                                       size_read,
-                                       VM_PROT_NONE);
-       }
-       else {
-           (void) r_memory_object_data_error(
-                                       ior->io_reply_port,
-                                       ior->io_recnum * ior->io_device->bsize,
-                                       (vm_size_t)ior->io_count,
-                                       ior->io_error);
-       }
-
-       (void)vm_deallocate(kernel_map,
-                           start_alloc,
-                           end_alloc - start_alloc);
-       mach_device_deallocate(ior->io_device);
-       return (TRUE);
-}
-
-kern_return_t device_pager_data_write(
-       const ipc_port_t        pager,
-       const ipc_port_t        pager_request,
-       vm_offset_t             offset,
-       pointer_t               addr,
-       vm_size_t               data_count)
-{
-       dev_pager_t             ds;
-       mach_device_t           device;
-       io_req_t                ior;
-       kern_return_t           result;
-
-       panic("(device_pager)data_write: called");
-
-       ds = dev_pager_hash_lookup(pager);
-       if (ds == DEV_PAGER_NULL)
-               panic("(device_pager)data_write: lookup failed");
-
-       if (ds->pager_request != pager_request)
-               panic("(device_pager)data_write: bad pager_request");
-
-       if (ds->type == CHAR_PAGER_TYPE)
-               panic("(device_pager)data_write: char pager");
-
-       device = ds->device;
-       mach_device_reference(device);
-       dev_pager_deallocate(ds);
-
-       /*
-        * Package the write request for the device driver.
-        */
-       io_req_alloc(ior, data_count);
-
-       ior->io_device          = device;
-       ior->io_unit            = device->dev_number;
-       ior->io_op              = IO_WRITE | IO_CALL;
-       ior->io_mode            = 0;
-       ior->io_recnum          = offset / device->bsize;
-       ior->io_data            = (io_buf_ptr_t)addr;
-       ior->io_count           = data_count;
-       ior->io_alloc_size      = data_count;   /* amount to deallocate */
-       ior->io_residual        = 0;
-       ior->io_error           = 0;
-       ior->io_done            = device_pager_data_write_done;
-       ior->io_reply_port      = IP_NULL;
-
-       result = (*device->dev_ops->d_write)(device->dev_number, ior);
-
-       if (result != D_IO_QUEUED) {
-           device_write_dealloc(ior);
-           io_req_free((vm_offset_t)ior);
-           mach_device_deallocate(device);
-       }
-
-       return (KERN_SUCCESS);
-}
-
-boolean_t device_pager_data_write_done(io_req_t ior)
-{
-       device_write_dealloc(ior);
-       mach_device_deallocate(ior->io_device);
-
-       return (TRUE);
-}
-
 kern_return_t device_pager_copy(
        const ipc_port_t        pager,
        const ipc_port_t        pager_request,
@@ -618,15 +461,13 @@ kern_return_t device_pager_init_pager(
            /*
             * Reply that the object is ready
             */
-           (void) r_memory_object_set_attributes(pager_request,
-                                               TRUE,   /* ready */
-                                               FALSE,  /* do not cache */
-                                               MEMORY_OBJECT_COPY_NONE);
+           (void) r_memory_object_ready(pager_request,
+                                        FALSE, /* do not cache */
+                                        MEMORY_OBJECT_COPY_NONE);
        } else {
-           (void) r_memory_object_set_attributes(pager_request,
-                                               TRUE,   /* ready */
-                                               TRUE,   /* cache */
-                                               MEMORY_OBJECT_COPY_DELAY);
+           (void) r_memory_object_ready(pager_request,
+                                        TRUE,  /* cache */
+                                        MEMORY_OBJECT_COPY_DELAY);
        }
 
        dev_pager_deallocate(ds);
diff --git a/device/dev_pager.h b/device/dev_pager.h
index 7f97ee7..7cced94 100644
--- a/device/dev_pager.h
+++ b/device/dev_pager.h
@@ -23,6 +23,4 @@ vm_offset_t device_map_page(void *dsp, vm_offset_t offset);
 
 boolean_t device_pager_data_request_done(io_req_t ior);
 
-boolean_t device_pager_data_write_done(io_req_t ior);
-
 #endif /* _DEVICE_DEV_PAGER_H_ */
diff --git a/device/device_pager.srv b/device/device_pager.srv
index e4e52ea..410323d 100644
--- a/device/device_pager.srv
+++ b/device/device_pager.srv
@@ -35,7 +35,6 @@
 #define        memory_object_copy              device_pager_copy
 #define        memory_object_data_request      device_pager_data_request
 #define        memory_object_data_unlock       device_pager_data_unlock
-#define        memory_object_data_write        device_pager_data_write
 #define        memory_object_lock_completed    device_pager_lock_completed
 #define        memory_object_supply_completed  device_pager_supply_completed
 #define        memory_object_data_return       device_pager_data_return
diff --git a/doc/mach.info b/doc/mach.info
index dc3faa6..88a8d26 100644
--- a/doc/mach.info
+++ b/doc/mach.info
@@ -2,8 +2,8 @@ This is mach.info, produced by makeinfo version 6.3 from 
mach.texi.
 
 This file documents the GNU Mach microkernel.
 
-   This is edition 0.4, last updated on 31 August 2016, of 'The GNU Mach
-Reference Manual', for version 1.7+git20160921.
+   This is edition 0.4, last updated on 16 October 2016, of 'The GNU
+Mach Reference Manual', for version 1.7+git20161023.
 
    Copyright (C) 2001, 2002, 2006, 2007, 2008 Free Software Foundation,
 Inc.
@@ -39,126 +39,126 @@ END-INFO-DIR-ENTRY
 
 
 Indirect:
-mach.info-1: 1640
-mach.info-2: 302586
+mach.info-1: 1641
+mach.info-2: 302874
 
 Tag Table:
 (Indirect)
-Node: Top1640
-Node: Introduction11278
-Node: Audience12109
-Node: Features13144
-Node: Overview14971
-Node: History16164
-Node: Installing16309
-Node: Binary Distributions17534
-Node: Compilation18342
-Node: Configuration19575
-Node: Cross-Compilation35986
-Node: Bootstrap36767
-Ref: Bootstrap-Footnote-137210
-Node: Bootloader37447
-Ref: Bootloader-Footnote-138727
-Node: Modules38813
-Node: Inter Process Communication39640
-Node: Major Concepts40263
-Node: Messaging Interface44068
-Node: Mach Message Call44798
-Node: Message Format48113
-Node: Exchanging Port Rights59305
-Ref: Exchanging Port Rights-Footnote-164867
-Node: Memory65039
-Ref: Memory-Footnote-168133
-Node: Message Send68475
-Ref: Message Send-Footnote-175497
-Node: Message Receive75780
-Ref: Message Receive-Footnote-185432
-Node: Atomicity85713
-Node: Port Manipulation Interface88487
-Node: Port Creation90042
-Node: Port Destruction94831
-Node: Port Names97974
-Node: Port Rights102221
-Node: Ports and other Tasks106010
-Node: Receive Rights110103
-Node: Port Sets117034
-Node: Request Notifications119437
-Node: Inherited Ports124241
-Node: Virtual Memory Interface127925
-Node: Memory Allocation129178
-Node: Memory Deallocation131703
-Node: Data Transfer133167
-Node: Memory Attributes136693
-Node: Mapping Memory Objects146132
-Node: Memory Statistics149424
-Node: External Memory Management150998
-Node: Memory Object Server151703
-Node: Memory Object Creation154412
-Node: Memory Object Termination158460
-Node: Memory Objects and Data161399
-Node: Memory Object Locking178545
-Node: Memory Object Attributes184440
-Node: Default Memory Manager190277
-Node: Threads and Tasks195999
-Node: Thread Interface196336
-Node: Thread Creation197332
-Node: Thread Termination198449
-Node: Thread Information198920
-Node: Thread Settings205019
-Node: Thread Execution206253
-Node: Scheduling213546
-Node: Thread Priority213901
-Node: Hand-Off Scheduling216535
-Node: Scheduling Policy221660
-Node: Thread Special Ports222992
-Node: Exceptions225438
-Node: Task Interface226308
-Node: Task Creation227320
-Node: Task Termination228655
-Node: Task Information229257
-Node: Task Execution236159
-Node: Task Special Ports240572
-Node: Syscall Emulation244426
-Node: Profiling245657
-Node: Host Interface249420
-Node: Host Ports250405
-Node: Host Information252478
-Node: Host Time257861
-Node: Host Reboot260528
-Node: Processors and Processor Sets261080
-Node: Processor Set Interface262058
-Node: Processor Set Ports262825
-Node: Processor Set Access263655
-Node: Processor Set Creation265915
-Node: Processor Set Destruction266942
-Node: Tasks and Threads on Sets267863
-Node: Processor Set Priority273030
-Node: Processor Set Policy274320
-Node: Processor Set Info275934
-Node: Processor Interface279747
-Node: Hosted Processors280472
-Node: Processor Control281463
-Node: Processors and Sets282929
-Node: Processor Info284807
-Node: Device Interface287549
-Node: Device Reply Server289164
-Node: Device Open290456
-Node: Device Close292579
-Node: Device Read293158
-Node: Device Write296077
-Node: Device Map298882
-Node: Device Status299773
-Node: Device Filter302586
-Node: Kernel Debugger308333
-Node: Operation309060
-Node: Commands312037
-Node: Variables325822
-Node: Expressions327210
-Node: Copying328559
-Node: Documentation License347788
-Node: GNU Free Documentation License348377
-Node: CMU License370776
-Node: Concept Index372011
-Node: Function and Data Index375857
+Node: Top1641
+Node: Introduction11280
+Node: Audience12111
+Node: Features13146
+Node: Overview14973
+Node: History16166
+Node: Installing16311
+Node: Binary Distributions17536
+Node: Compilation18344
+Node: Configuration19577
+Node: Cross-Compilation35988
+Node: Bootstrap36769
+Ref: Bootstrap-Footnote-137212
+Node: Bootloader37449
+Ref: Bootloader-Footnote-138729
+Node: Modules38815
+Node: Inter Process Communication39642
+Node: Major Concepts40265
+Node: Messaging Interface44070
+Node: Mach Message Call44800
+Node: Message Format48115
+Node: Exchanging Port Rights59307
+Ref: Exchanging Port Rights-Footnote-164869
+Node: Memory65041
+Ref: Memory-Footnote-168135
+Node: Message Send68477
+Ref: Message Send-Footnote-175499
+Node: Message Receive75782
+Ref: Message Receive-Footnote-185434
+Node: Atomicity85715
+Node: Port Manipulation Interface88489
+Node: Port Creation90044
+Node: Port Destruction94833
+Node: Port Names97976
+Node: Port Rights102223
+Node: Ports and other Tasks106012
+Node: Receive Rights110105
+Node: Port Sets117036
+Node: Request Notifications119439
+Node: Inherited Ports124243
+Node: Virtual Memory Interface127927
+Node: Memory Allocation129180
+Node: Memory Deallocation131705
+Node: Data Transfer133169
+Node: Memory Attributes136695
+Node: Mapping Memory Objects146134
+Node: Memory Statistics149426
+Node: External Memory Management151000
+Node: Memory Object Server151705
+Node: Memory Object Creation154386
+Node: Memory Object Termination158374
+Node: Memory Objects and Data161313
+Node: Memory Object Locking175218
+Node: Memory Object Attributes181082
+Node: Default Memory Manager184857
+Node: Threads and Tasks190539
+Node: Thread Interface190876
+Node: Thread Creation191872
+Node: Thread Termination192989
+Node: Thread Information193460
+Node: Thread Settings199559
+Node: Thread Execution200793
+Node: Scheduling208086
+Node: Thread Priority208441
+Node: Hand-Off Scheduling211075
+Node: Scheduling Policy216200
+Node: Thread Special Ports217532
+Node: Exceptions219978
+Node: Task Interface220848
+Node: Task Creation221860
+Node: Task Termination223195
+Node: Task Information223797
+Node: Task Execution230699
+Node: Task Special Ports235112
+Node: Syscall Emulation238966
+Node: Profiling240197
+Node: Host Interface243960
+Node: Host Ports244945
+Node: Host Information247018
+Node: Host Time252401
+Node: Host Reboot255068
+Node: Processors and Processor Sets255620
+Node: Processor Set Interface256598
+Node: Processor Set Ports257365
+Node: Processor Set Access258195
+Node: Processor Set Creation260455
+Node: Processor Set Destruction261482
+Node: Tasks and Threads on Sets262403
+Node: Processor Set Priority267570
+Node: Processor Set Policy268860
+Node: Processor Set Info270474
+Node: Processor Interface274287
+Node: Hosted Processors275012
+Node: Processor Control276003
+Node: Processors and Sets277469
+Node: Processor Info279347
+Node: Device Interface282089
+Node: Device Reply Server283704
+Node: Device Open284996
+Node: Device Close287119
+Node: Device Read287698
+Node: Device Write290617
+Node: Device Map293422
+Node: Device Status294313
+Node: Device Filter295486
+Node: Kernel Debugger302874
+Node: Operation303601
+Node: Commands306578
+Node: Variables320363
+Node: Expressions321751
+Node: Copying323100
+Node: Documentation License342329
+Node: GNU Free Documentation License342918
+Node: CMU License365317
+Node: Concept Index366552
+Node: Function and Data Index370398
 
 End Tag Table
diff --git a/doc/mach.info-1 b/doc/mach.info-1
index 32bc7c3..34d5ab0 100644
--- a/doc/mach.info-1
+++ b/doc/mach.info-1
@@ -2,8 +2,8 @@ This is mach.info, produced by makeinfo version 6.3 from 
mach.texi.
 
 This file documents the GNU Mach microkernel.
 
-   This is edition 0.4, last updated on 31 August 2016, of 'The GNU Mach
-Reference Manual', for version 1.7+git20160921.
+   This is edition 0.4, last updated on 16 October 2016, of 'The GNU
+Mach Reference Manual', for version 1.7+git20161023.
 
    Copyright (C) 2001, 2002, 2006, 2007, 2008 Free Software Foundation,
 Inc.
@@ -45,8 +45,8 @@ Main Menu
 
 This file documents the GNU Mach microkernel.
 
-   This is edition 0.4, last updated on 31 August 2016, of 'The GNU Mach
-Reference Manual', for version 1.7+git20160921.
+   This is edition 0.4, last updated on 16 October 2016, of 'The GNU
+Mach Reference Manual', for version 1.7+git20161023.
 
    Copyright (C) 2001, 2002, 2006, 2007, 2008 Free Software Foundation,
 Inc.
@@ -3467,14 +3467,14 @@ File: mach.info,  Node: Memory Object Server,  Next: 
Memory Object Creation,  Up
      procedure, 'memory_object_server', to handle a received message.
      This function does all necessary argument handling, and actually
      calls one of the following functions: 'memory_object_init',
-     'memory_object_data_write', 'memory_object_data_return',
-     'memory_object_data_request', 'memory_object_data_unlock',
-     'memory_object_lock_completed', 'memory_object_copy',
-     'memory_object_terminate'.  The *default memory manager* may get
-     two additional requests from the kernel: 'memory_object_create' and
-     'memory_object_data_initialize'.  The remote procedure call
-     generator produces a procedure 'memory_object_default_server' to
-     handle those functions specific to the default memory manager.
+     'memory_object_data_return', 'memory_object_data_request',
+     'memory_object_data_unlock', 'memory_object_lock_completed',
+     'memory_object_copy', 'memory_object_terminate'.  The *default
+     memory manager* may get two additional requests from the kernel:
+     'memory_object_create' and 'memory_object_data_initialize'.  The
+     remote procedure call generator produces a procedure
+     'memory_object_default_server' to handle those functions specific
+     to the default memory manager.
 
      The 'seqnos_memory_object_server' and
      'seqnos_memory_object_default_server' differ from
@@ -3524,10 +3524,10 @@ File: mach.info,  Node: Memory Object Creation,  Next: 
Memory Object Termination
      the calling kernel is included for planning purposes.
 
      When the memory manager is prepared to accept requests for data for
-     this object, it must call 'memory_object_ready', or set the ready
-     flag using 'memory_object_set_attributes'.  Otherwise the kernel
-     will not process requests on this object.  To reject all mappings
-     of this object, the memory manager may use 'memory_object_destroy'.
+     this object, it must call 'memory_object_ready'.  Otherwise the
+     kernel will not process requests on this object.  To reject all
+     mappings of this object, the memory manager may use
+     'memory_object_destroy'.
 
      The argument MEMORY_OBJECT is the port that represents the memory
      object data, as supplied to the kernel in a 'vm_map' call.
@@ -3811,8 +3811,8 @@ File: mach.info,  Node: Memory Objects and Data,  Next: 
Memory Object Locking,
 
        1. The object was created by 'memory_object_create' and the
           kernel has not yet provided data for this range (either via a
-          'memory_object_data_initialize', 'memory_object_data_write' or
-          a 'memory_object_data_return' for the object.
+          'memory_object_data_initialize', or a
+          'memory_object_data_return' for the object.
 
        2. The object was created by an 'memory_object_data_copy' and the
           kernel should copy this region from the original memory
@@ -3881,63 +3881,6 @@ File: mach.info,  Node: Memory Objects and Data,  Next: 
Memory Object Locking,
      is called by the kernel, which does not wait for a reply message,
      this value is ignored.
 
-   The remaining interfaces in this section are obsolete.
-
- -- Function: kern_return_t memory_object_data_write
-          (memory_object_t MEMORY_OBJECT,
-          memory_object_control_t MEMORY_CONTROL, vm_offset_t OFFSET,
-          vm_offset_t DATA, vm_size_t DATA_COUNT)
- -- Function: kern_return_t seqnos_memory_object_data_write
-          (memory_object_t MEMORY_OBJECT, mach_port_seqno_t SEQNO,
-          memory_object_control_t MEMORY_CONTROL, vm_offset_t OFFSET,
-          vm_offset_t DATA, vm_size_t DATA_COUNT)
-     The function 'memory_object_data_write' provides the memory manager
-     with data that has been modified while cached in physical memory.
-     It is the old form of 'memory_object_data_return'.  Once the memory
-     manager no longer needs this data (e.g., it has been written to
-     another storage medium), it should be deallocated using
-     'vm_deallocate'.
-
-     The argument MEMORY_OBJECT is the port that represents the memory
-     object data, as supplied to the kernel in a 'vm_map' call.
-     MEMORY_CONTROL is the request port to which a response is
-     requested.  (In the event that a memory object has been supplied to
-     more than one the kernel that has made the request.)  OFFSET is the
-     offset within a memory object to which this call refers.  This will
-     be page aligned.  DATA is the data which has been modified while
-     cached in physical memory.  DATA_COUNT is the amount of data to be
-     written, in bytes.  This will be an integral number of memory
-     object pages.
-
-     The function should return 'KERN_SUCCESS', but since this routine
-     is called by the kernel, which does not wait for a reply message,
-     this value is ignored.
-
- -- Function: kern_return_t memory_object_data_provided
-          (memory_object_control_t MEMORY_CONTROL, vm_offset_t OFFSET,
-          vm_offset_t DATA, vm_size_t DATA_COUNT, vm_prot_t LOCK_VALUE)
-     The function 'memory_object_data_provided' supplies the kernel with
-     data for the specified memory object.  It is the old form of
-     'memory_object_data_supply'.  Ordinarily, memory managers should
-     only provide data in response to 'memory_object_data_request' calls
-     from the kernel.  The LOCK_VALUE specifies what type of access will
-     not be allowed to the data range.  The lock values must be one or
-     more of the set: 'VM_PROT_NONE', 'VM_PROT_READ', 'VM_PROT_WRITE',
-     'VM_PROT_EXECUTE' and 'VM_PROT_ALL' as defined in 'mach/vm_prot.h'.
-
-     The argument MEMORY_CONTROL is the port, provided by the kernel in
-     a 'memory_object_init' call, to which cache management requests may
-     be issued.  OFFSET is an offset within a memory object in bytes.
-     This must be page aligned.  DATA is the data that is being provided
-     to the kernel.  This is a pointer to the data.  DATA_COUNT is the
-     amount of data to be provided.  This must be an integral number of
-     memory object pages.  LOCK_VALUE is a protection value indicating
-     those forms of access that should *not* be permitted to the
-     specified cached data.
-
-     This routine does not receive a reply message (and consequently has
-     no return value), so only message transmission errors apply.
-
 
 File: mach.info,  Node: Memory Object Locking,  Next: Memory Object 
Attributes,  Prev: Memory Objects and Data,  Up: External Memory Management
 
@@ -3952,9 +3895,9 @@ File: mach.info,  Node: Memory Object Locking,  Next: 
Memory Object Attributes,
      The function 'memory_object_lock_request' allows a memory manager
      to make cache management requests.  As specified in arguments to
      the call, the kernel will:
-        * clean (i.e., write back using 'memory_object_data_supply' or
-          'memory_object_data_write') any cached data which has been
-          modified since the last time it was written
+        * clean (i.e., write back using 'memory_object_data_supply' any
+          cached data which has been modified since the last time it was
+          written
 
         * flush (i.e., remove any uses of) that data from memory
 
@@ -4079,11 +4022,13 @@ File: mach.info,  Node: Memory Object Attributes,  
Next: Default Memory Manager,
           boolean_t MAY_CACHE_OBJECT,
           memory_object_copy_strategy_t COPY_STRATEGY,
           mach_port_t REPLY_TO)
-     The function 'memory_object_change_attribute' sets
-     performance-related attributes for the specified memory object.  If
-     the caching attribute is asserted, the kernel is permitted (and
-     encouraged) to maintain cached data for this memory object even
-     after no virtual address space contains this data.
+     The function 'memory_object_change_attribute' informs the kernel
+     that the memory manager is ready to receive data or unlock requests
+     on behalf of the clients and sets performance-related attributes
+     for the specified memory object.  If the caching attribute is
+     asserted, the kernel is permitted (and encouraged) to maintain
+     cached data for this memory object even after no virtual address
+     space contains this data.
 
      There are three possible caching strategies:
      'MEMORY_OBJECT_COPY_NONE' which specifies that nothing special
@@ -4119,46 +4064,6 @@ File: mach.info,  Node: Memory Object Attributes,  Next: 
Default Memory Manager,
      The function 'memory_object_change_completed' indicates the
      completion of an attribute change call.
 
-   The following interface is obsoleted by 'memory_object_ready' and
-'memory_object_change_attributes'.  If the old form
-'memory_object_set_attributes' is used to make a memory object ready,
-the kernel will write back data using the old 'memory_object_data_write'
-interface rather than 'memory_object_data_return'..
-
- -- Function: kern_return_t memory_object_set_attributes
-          (memory_object_control_t MEMORY_CONTROL, boolean OBJECT_READY,
-          boolean_t MAY_CACHE_OBJECT,
-          memory_object_copy_strategy_t COPY_STRATEGY)
-     The function 'memory_object_set_attribute' controls how the memory
-     object.  The kernel will only make data or unlock requests when the
-     ready attribute is asserted.  If the caching attribute is asserted,
-     the kernel is permitted (and encouraged) to maintain cached data
-     for this memory object even after no virtual address space contains
-     this data.
-
-     There are three possible caching strategies:
-     'MEMORY_OBJECT_COPY_NONE' which specifies that nothing special
-     should be done when data in the object is copied;
-     'MEMORY_OBJECT_COPY_CALL' which specifies that the memory manager
-     should be notified via a 'memory_object_copy' call before any part
-     of the object is copied; and 'MEMORY_OBJECT_COPY_DELAY' which
-     guarantees that the memory manager does not externally modify the
-     data so that the kernel can use its normal copy-on-write
-     algorithms.  'MEMORY_OBJECT_COPY_DELAY' is the strategy most
-     commonly used.
-
-     The argument MEMORY_CONTROL is the port, provided by the kernel in
-     a 'memory_object_init' call, to which cache management requests may
-     be issued.  If OBJECT_READY is set, the kernel may issue new data
-     and unlock requests on the associated memory object.  If
-     MAY_CACHE_OBJECT is set, the kernel may keep data associated with
-     this memory object, even after virtual memory references to it are
-     gone.  COPY_STRATEGY tells how the kernel should copy regions of
-     the associated memory object.
-
-     This routine does not receive a reply message (and consequently has
-     no return value), so only message transmission errors apply.
-
 
 File: mach.info,  Node: Default Memory Manager,  Prev: Memory Object 
Attributes,  Up: External Memory Management
 
@@ -4207,7 +4112,7 @@ File: mach.info,  Node: Default Memory Manager,  Prev: 
Memory Object Attributes,
      No reply is expected after this call.  Since this call is directed
      to the default memory manager, the kernel assumes that it will be
      ready to handle data requests to this object and does not need the
-     confirmation of a 'memory_object_set_attributes' call.
+     confirmation of a 'memory_object_ready' call.
 
      The argument OLD_MEMORY_OBJECT is a memory object provided by the
      default memory manager on which the kernel can make
@@ -4239,13 +4144,12 @@ File: mach.info,  Node: Default Memory Manager,  Prev: 
Memory Object Attributes,
      The function 'memory_object_data_initialize' provides the memory
      manager with initial data for a kernel-created memory object.  If
      the memory manager already has been supplied data (by a previous
-     'memory_object_data_initialize', 'memory_object_data_write' or
-     'memory_object_data_return'), then this data should be ignored.
-     Otherwise, this call behaves exactly as does
-     'memory_object_data_return' on memory objects created by the kernel
-     via 'memory_object_create' and thus will only be made to default
-     memory managers.  This call will not be made on objects created via
-     'memory_object_copy'.
+     'memory_object_data_initialize', or 'memory_object_data_return'),
+     then this data should be ignored.  Otherwise, this call behaves
+     exactly as does 'memory_object_data_return' on memory objects
+     created by the kernel via 'memory_object_create' and thus will only
+     be made to default memory managers.  This call will not be made on
+     objects created via 'memory_object_copy'.
 
      The argument MEMORY_OBJECT the port that represents the memory
      object data, as supplied by the kernel in a 'memory_object_create'
@@ -6632,3 +6536,164 @@ File: mach.info,  Node: Device Status,  Next: Device 
Filter,  Prev: Device Map,
      written and 'D_NO_SUCH_DEVICE' if DEVICE does not denote a device
      port or the device is dead or not completely open.
 
+
+File: mach.info,  Node: Device Filter,  Prev: Device Status,  Up: Device 
Interface
+
+10.8 Device Filter
+==================
+
+ -- Function: kern_return_t device_set_filter (device_t DEVICE,
+          mach_port_t RECEIVE_PORT,
+          mach_msg_type_name_t RECEIVE_PORT_TYPE, int PRIORITY,
+          filter_array_t FILTER, mach_msg_type_number_t FILTER_COUNT)
+     The function 'device_set_filter' makes it possible to filter out
+     selected data arriving at or leaving the device and forward it to a
+     port.  FILTER is a list of filter commands, which are applied to
+     incoming data to determine if the data should be sent to
+     RECEIVE_PORT.  The IPC type of the send right is specified by
+     RECEIVE_PORT_RIGHT, it is either 'MACH_MSG_TYPE_MAKE_SEND' or
+     'MACH_MSG_TYPE_MOVE_SEND'.  The PRIORITY value is used to order
+     multiple filters.
+
+     There can be up to 'NET_MAX_FILTER' commands in FILTER.  The actual
+     number of commands is passed in FILTER_COUNT.  For the purpose of
+     the filter test, an internal stack is provided.  After all commands
+     have been processed, the value on the top of the stack determines
+     if the data is forwarded or the next filter is tried.
+
+     The first command is a header which contains two fields: one for
+     flags and the other for the type of interpreter used to run the
+     rest of the commands.
+
+     Any combination of the following flags is allowed but at least one
+     of them must be specified.
+
+     'NETF_IN'
+          The filter will be applied to data received by the device.
+
+     'NETF_OUT'
+          The filter will be applied to data transmitted by the device.
+
+     Unless the type is given explicitly the native NETF interpreter
+     will be used.  To select an alternative implementation use one of
+     the following types:
+
+     'NETF_BPF'
+          Use Berkeley Packet Filter.
+
+     For the listener to know what kind of packet is being received,
+     when the filter code accepts a packet the message sent to
+     RECEIVE_PORT is tagged with either NETF_IN or NETF_OUT.
+
+     Each word of the command list specifies a data (push) operation
+     (high order NETF_NBPO bits) as well as a binary operator (low order
+     NETF_NBPA bits).  The value to be pushed onto the stack is chosen
+     as follows.
+
+     'NETF_PUSHLIT'
+          Use the next short word of the filter as the value.
+
+     'NETF_PUSHZERO'
+          Use 0 as the value.
+
+     'NETF_PUSHWORD+N'
+          Use short word N of the "data" portion of the message as the
+          value.
+
+     'NETF_PUSHHDR+N'
+          Use short word N of the "header" portion of the message as the
+          value.
+
+     'NETF_PUSHIND+N'
+          Pops the top long word from the stack and then uses short word
+          N of the "data" portion of the message as the value.
+
+     'NETF_PUSHHDRIND+N'
+          Pops the top long word from the stack and then uses short word
+          N of the "header" portion of the message as the value.
+
+     'NETF_PUSHSTK+N'
+          Use long word N of the stack (where the top of stack is long
+          word 0) as the value.
+
+     'NETF_NOPUSH'
+          Don't push a value.
+
+     The unsigned value so chosen is promoted to a long word before
+     being pushed.  Once a value is pushed (except for the case of
+     'NETF_NOPUSH'), the top two long words of the stack are popped and
+     a binary operator applied to them (with the old top of stack as the
+     second operand).  The result of the operator is pushed on the
+     stack.  These operators are:
+
+     'NETF_NOP'
+          Don't pop off any values and do no operation.
+
+     'NETF_EQ'
+          Perform an equal comparison.
+
+     'NETF_LT'
+          Perform a less than comparison.
+
+     'NETF_LE'
+          Perform a less than or equal comparison.
+
+     'NETF_GT'
+          Perform a greater than comparison.
+
+     'NETF_GE'
+          Perform a greater than or equal comparison.
+
+     'NETF_AND'
+          Perform a bitise boolean AND operation.
+
+     'NETF_OR'
+          Perform a bitise boolean inclusive OR operation.
+
+     'NETF_XOR'
+          Perform a bitise boolean exclusive OR operation.
+
+     'NETF_NEQ'
+          Perform a not equal comparison.
+
+     'NETF_LSH'
+          Perform a left shift operation.
+
+     'NETF_RSH'
+          Perform a right shift operation.
+
+     'NETF_ADD'
+          Perform an addition.
+
+     'NETF_SUB'
+          Perform a subtraction.
+
+     'NETF_COR'
+          Perform an equal comparison.  If the comparison is 'TRUE',
+          terminate the filter list.  Otherwise, pop the result of the
+          comparison off the stack.
+
+     'NETF_CAND'
+          Perform an equal comparison.  If the comparison is 'FALSE',
+          terminate the filter list.  Otherwise, pop the result of the
+          comparison off the stack.
+
+     'NETF_CNOR'
+          Perform a not equal comparison.  If the comparison is 'FALSE',
+          terminate the filter list.  Otherwise, pop the result of the
+          comparison off the stack.
+
+     'NETF_CNAND'
+          Perform a not equal comparison.  If the comparison is 'TRUE',
+          terminate the filter list.  Otherwise, pop the result of the
+          comparison off the stack.  The scan of the filter list
+          terminates when the filter list is emptied, or a 'NETF_C...'
+          operation terminates the list.  At this time, if the final
+          value of the top of the stack is 'TRUE', then the message is
+          accepted for the filter.
+
+     The function returns 'D_SUCCESS' if some data was successfully
+     written, 'D_INVALID_OPERATION' if RECEIVE_PORT is not a valid send
+     right, and 'D_NO_SUCH_DEVICE' if DEVICE does not denote a device
+     port or the device is dead or not completely open.
+
diff --git a/doc/mach.info-2 b/doc/mach.info-2
index 78d8dd1..caae658 100644
--- a/doc/mach.info-2
+++ b/doc/mach.info-2
@@ -2,8 +2,8 @@ This is mach.info, produced by makeinfo version 6.3 from 
mach.texi.
 
 This file documents the GNU Mach microkernel.
 
-   This is edition 0.4, last updated on 31 August 2016, of 'The GNU Mach
-Reference Manual', for version 1.7+git20160921.
+   This is edition 0.4, last updated on 16 October 2016, of 'The GNU
+Mach Reference Manual', for version 1.7+git20161023.
 
    Copyright (C) 2001, 2002, 2006, 2007, 2008 Free Software Foundation,
 Inc.
@@ -38,167 +38,6 @@ START-INFO-DIR-ENTRY
 END-INFO-DIR-ENTRY
 
 
-File: mach.info,  Node: Device Filter,  Prev: Device Status,  Up: Device 
Interface
-
-10.8 Device Filter
-==================
-
- -- Function: kern_return_t device_set_filter (device_t DEVICE,
-          mach_port_t RECEIVE_PORT,
-          mach_msg_type_name_t RECEIVE_PORT_TYPE, int PRIORITY,
-          filter_array_t FILTER, mach_msg_type_number_t FILTER_COUNT)
-     The function 'device_set_filter' makes it possible to filter out
-     selected data arriving at or leaving the device and forward it to a
-     port.  FILTER is a list of filter commands, which are applied to
-     incoming data to determine if the data should be sent to
-     RECEIVE_PORT.  The IPC type of the send right is specified by
-     RECEIVE_PORT_RIGHT, it is either 'MACH_MSG_TYPE_MAKE_SEND' or
-     'MACH_MSG_TYPE_MOVE_SEND'.  The PRIORITY value is used to order
-     multiple filters.
-
-     There can be up to 'NET_MAX_FILTER' commands in FILTER.  The actual
-     number of commands is passed in FILTER_COUNT.  For the purpose of
-     the filter test, an internal stack is provided.  After all commands
-     have been processed, the value on the top of the stack determines
-     if the data is forwarded or the next filter is tried.
-
-     The first command is a header which contains two fields: one for
-     flags and the other for the type of interpreter used to run the
-     rest of the commands.
-
-     Any combination of the following flags is allowed but at least one
-     of them must be specified.
-
-     'NETF_IN'
-          The filter will be applied to data received by the device.
-
-     'NETF_OUT'
-          The filter will be applied to data transmitted by the device.
-
-     Unless the type is given explicitly the native NETF interpreter
-     will be used.  To select an alternative implementation use one of
-     the following types:
-
-     'NETF_BPF'
-          Use Berkeley Packet Filter.
-
-     For the listener to know what kind of packet is being received,
-     when the filter code accepts a packet the message sent to
-     RECEIVE_PORT is tagged with either NETF_IN or NETF_OUT.
-
-     Each word of the command list specifies a data (push) operation
-     (high order NETF_NBPO bits) as well as a binary operator (low order
-     NETF_NBPA bits).  The value to be pushed onto the stack is chosen
-     as follows.
-
-     'NETF_PUSHLIT'
-          Use the next short word of the filter as the value.
-
-     'NETF_PUSHZERO'
-          Use 0 as the value.
-
-     'NETF_PUSHWORD+N'
-          Use short word N of the "data" portion of the message as the
-          value.
-
-     'NETF_PUSHHDR+N'
-          Use short word N of the "header" portion of the message as the
-          value.
-
-     'NETF_PUSHIND+N'
-          Pops the top long word from the stack and then uses short word
-          N of the "data" portion of the message as the value.
-
-     'NETF_PUSHHDRIND+N'
-          Pops the top long word from the stack and then uses short word
-          N of the "header" portion of the message as the value.
-
-     'NETF_PUSHSTK+N'
-          Use long word N of the stack (where the top of stack is long
-          word 0) as the value.
-
-     'NETF_NOPUSH'
-          Don't push a value.
-
-     The unsigned value so chosen is promoted to a long word before
-     being pushed.  Once a value is pushed (except for the case of
-     'NETF_NOPUSH'), the top two long words of the stack are popped and
-     a binary operator applied to them (with the old top of stack as the
-     second operand).  The result of the operator is pushed on the
-     stack.  These operators are:
-
-     'NETF_NOP'
-          Don't pop off any values and do no operation.
-
-     'NETF_EQ'
-          Perform an equal comparison.
-
-     'NETF_LT'
-          Perform a less than comparison.
-
-     'NETF_LE'
-          Perform a less than or equal comparison.
-
-     'NETF_GT'
-          Perform a greater than comparison.
-
-     'NETF_GE'
-          Perform a greater than or equal comparison.
-
-     'NETF_AND'
-          Perform a bitise boolean AND operation.
-
-     'NETF_OR'
-          Perform a bitise boolean inclusive OR operation.
-
-     'NETF_XOR'
-          Perform a bitise boolean exclusive OR operation.
-
-     'NETF_NEQ'
-          Perform a not equal comparison.
-
-     'NETF_LSH'
-          Perform a left shift operation.
-
-     'NETF_RSH'
-          Perform a right shift operation.
-
-     'NETF_ADD'
-          Perform an addition.
-
-     'NETF_SUB'
-          Perform a subtraction.
-
-     'NETF_COR'
-          Perform an equal comparison.  If the comparison is 'TRUE',
-          terminate the filter list.  Otherwise, pop the result of the
-          comparison off the stack.
-
-     'NETF_CAND'
-          Perform an equal comparison.  If the comparison is 'FALSE',
-          terminate the filter list.  Otherwise, pop the result of the
-          comparison off the stack.
-
-     'NETF_CNOR'
-          Perform a not equal comparison.  If the comparison is 'FALSE',
-          terminate the filter list.  Otherwise, pop the result of the
-          comparison off the stack.
-
-     'NETF_CNAND'
-          Perform a not equal comparison.  If the comparison is 'TRUE',
-          terminate the filter list.  Otherwise, pop the result of the
-          comparison off the stack.  The scan of the filter list
-          terminates when the filter list is emptied, or a 'NETF_C...'
-          operation terminates the list.  At this time, if the final
-          value of the top of the stack is 'TRUE', then the message is
-          accepted for the filter.
-
-     The function returns 'D_SUCCESS' if some data was successfully
-     written, 'D_INVALID_OPERATION' if RECEIVE_PORT is not a valid send
-     right, and 'D_NO_SUCH_DEVICE' if DEVICE does not denote a device
-     port or the device is dead or not completely open.
-
-
 File: mach.info,  Node: Kernel Debugger,  Next: Copying,  Prev: Device 
Interface,  Up: Top
 
 11 Kernel Debugger
@@ -1746,7 +1585,7 @@ Function and Data Index
 * memory_object_change_attributes:       Memory Object Attributes.
                                                               (line  26)
 * memory_object_change_completed:        Memory Object Attributes.
-                                                              (line  64)
+                                                              (line  66)
 * memory_object_copy:                    Memory Objects and Data.
                                                               (line 209)
 * memory_object_create:                  Default Memory Manager.
@@ -1755,8 +1594,6 @@ Function and Data Index
                                                               (line 159)
 * memory_object_data_initialize:         Default Memory Manager.
                                                               (line  73)
-* memory_object_data_provided:           Memory Objects and Data.
-                                                              (line 298)
 * memory_object_data_request:            Memory Objects and Data.
                                                               (line  47)
 * memory_object_data_return:             Memory Objects and Data.
@@ -1767,8 +1604,6 @@ Function and Data Index
                                                               (line 179)
 * memory_object_data_unlock:             Memory Object Locking.
                                                               (line  83)
-* memory_object_data_write:              Memory Objects and Data.
-                                                              (line 266)
 * memory_object_default_server:          Memory Object Server.
                                                               (line   8)
 * memory_object_destroy:                 Memory Object Termination.
@@ -1785,8 +1620,6 @@ Function and Data Index
                                                               (line  55)
 * memory_object_server:                  Memory Object Server.
                                                               (line   6)
-* memory_object_set_attributes:          Memory Object Attributes.
-                                                              (line  81)
 * memory_object_supply_completed:        Memory Objects and Data.
                                                               (line 125)
 * memory_object_terminate:               Memory Object Termination.
@@ -1823,7 +1656,7 @@ Function and Data Index
 * sampled_pc_flavor_t:                   Profiling.           (line  69)
 * sampled_pc_t:                          Profiling.           (line  54)
 * seqnos_memory_object_change_completed: Memory Object Attributes.
-                                                              (line  67)
+                                                              (line  69)
 * seqnos_memory_object_copy:             Memory Objects and Data.
                                                               (line 217)
 * seqnos_memory_object_create:           Default Memory Manager.
@@ -1836,8 +1669,6 @@ Function and Data Index
                                                               (line  13)
 * seqnos_memory_object_data_unlock:      Memory Object Locking.
                                                               (line  89)
-* seqnos_memory_object_data_write:       Memory Objects and Data.
-                                                              (line 272)
 * seqnos_memory_object_default_server:   Memory Object Server.
                                                               (line  14)
 * seqnos_memory_object_init:             Memory Object Creation.
diff --git a/doc/mach.texi b/doc/mach.texi
index 98f72fa..99ee854 100644
--- a/doc/mach.texi
+++ b/doc/mach.texi
@@ -3479,7 +3479,7 @@ formatting, the remote procedure call generator produces 
a procedure,
 @code{memory_object_server}, to handle a received message.  This
 function does all necessary argument handling, and actually calls one of
 the following functions: @code{memory_object_init},
address@hidden, @code{memory_object_data_return},
address@hidden,
 @code{memory_object_data_request}, @code{memory_object_data_unlock},
 @code{memory_object_lock_completed}, @code{memory_object_copy},
 @code{memory_object_terminate}.  The @strong{default memory manager} may
@@ -3527,8 +3527,7 @@ name ports.  The virtual page size that is used by the 
calling kernel is
 included for planning purposes.
 
 When the memory manager is prepared to accept requests for data for
-this object, it must call @code{memory_object_ready}, or set the ready
-flag using @code{memory_object_set_attributes}.
+this object, it must call @code{memory_object_ready}.
 Otherwise the kernel will not process requests on this object.  To
 reject all mappings of this object, the memory manager may use
 @code{memory_object_destroy}.
@@ -3785,7 +3784,7 @@ use this call in three different situations.
 @item
 The object was created by @code{memory_object_create} and the kernel has
 not yet provided data for this range (either via a
address@hidden, @code{memory_object_data_write} or
address@hidden, or
 a @code{memory_object_data_return} for the object.
 
 @item
@@ -3851,57 +3850,6 @@ is called by the kernel, which does not wait for a reply 
message, this
 value is ignored.
 @end deftypefun
 
-The remaining interfaces in this section are obsolete.
-
address@hidden kern_return_t memory_object_data_write (@w{memory_object_t 
@var{memory_object}}, @w{memory_object_control_t @var{memory_control}}, 
@w{vm_offset_t @var{offset}}, @w{vm_offset_t @var{data}}, @w{vm_size_t 
@var{data_count}})
address@hidden kern_return_t seqnos_memory_object_data_write 
(@w{memory_object_t @var{memory_object}}, @w{mach_port_seqno_t @var{seqno}}, 
@w{memory_object_control_t @var{memory_control}}, @w{vm_offset_t @var{offset}}, 
@w{vm_offset_t @var{data}}, @w{vm_size_t @var{data_count}})
-The function @code{memory_object_data_write} provides the memory manager
-with data that has been modified while cached in physical memory.  It is the 
old form of @code{memory_object_data_return}.  Once
-the memory manager no longer needs this data (e.g., it has been written
-to another storage medium), it should be deallocated using
address@hidden
-
-The argument @var{memory_object} is the port that represents the memory
-object data, as supplied to the kernel in a @code{vm_map} call.
address@hidden is the request port to which a response is
-requested.  (In the event that a memory object has been supplied to more
-than one the kernel that has made the request.)  @var{offset} is the
-offset within a memory object to which this call refers.  This will be
-page aligned.  @var{data} is the data which has been modified while
-cached in physical memory.  @var{data_count} is the amount of data to be
-written, in bytes.  This will be an integral number of memory object
-pages.
-
-The function should return @code{KERN_SUCCESS}, but since this routine
-is called by the kernel, which does not wait for a reply message, this
-value is ignored.
address@hidden deftypefun
-
address@hidden kern_return_t memory_object_data_provided 
(@w{memory_object_control_t @var{memory_control}}, @w{vm_offset_t 
@var{offset}}, @w{vm_offset_t @var{data}}, @w{vm_size_t @var{data_count}}, 
@w{vm_prot_t @var{lock_value}})
-The function @code{memory_object_data_provided} supplies the kernel with
-data for the specified memory object.  It is the old form of
address@hidden  Ordinarily, memory managers should
-only provide data in response to @code{memory_object_data_request} calls
-from the kernel.  The @var{lock_value} specifies what type of access
-will not be allowed to the data range.  The lock values must be one or
-more of the set: @code{VM_PROT_NONE}, @code{VM_PROT_READ},
address@hidden, @code{VM_PROT_EXECUTE} and @code{VM_PROT_ALL} as
-defined in @file{mach/vm_prot.h}.
-
-The argument @var{memory_control} is the port, provided by the kernel in
-a @code{memory_object_init} call, to which cache management requests may
-be issued.  @var{offset} is an offset within a memory object in bytes.
-This must be page aligned.  @var{data} is the data that is being
-provided to the kernel.  This is a pointer to the data.
address@hidden is the amount of data to be provided.  This must be an
-integral number of memory object pages.  @var{lock_value} is a
-protection value indicating those forms of access that should
address@hidden be permitted to the specified cached data.
-
-This routine does not receive a reply message (and consequently has no
-return value), so only message transmission errors apply.
address@hidden deftypefun
-
 
 @node Memory Object Locking
 @section Memory Object Locking
@@ -3912,8 +3860,7 @@ to make cache management requests.  As specified in 
arguments to the
 call, the kernel will:
 @itemize
 @item
-clean (i.e., write back using @code{memory_object_data_supply} or
address@hidden) any cached data which has been modified
+clean (i.e., write back using @code{memory_object_data_supply} any cached data 
which has been modified
 since the last time it was written
 
 @item
@@ -4026,11 +3973,12 @@ return value), so only message transmission errors 
apply.
 @end deftypefun
 
 @deftypefun kern_return_t memory_object_change_attributes 
(@w{memory_object_control_t @var{memory_control}}, @w{boolean_t 
@var{may_cache_object}}, @w{memory_object_copy_strategy_t @var{copy_strategy}}, 
@w{mach_port_t @var{reply_to}})
-The function @code{memory_object_change_attribute} sets
-performance-related attributes for the specified memory object.  If the
-caching attribute is asserted, the kernel is permitted (and encouraged)
-to maintain cached data for this memory object even after no virtual
-address space contains this data.
+The function @code{memory_object_change_attribute} informs the kernel
+that the memory manager is ready to receive data or unlock requests on
+behalf of the clients and sets performance-related attributes for the
+specified memory object.  If the caching attribute is asserted, the
+kernel is permitted (and encouraged) to maintain cached data for this
+memory object even after no virtual address space contains this data.
 
 There are three possible caching strategies:
 @code{MEMORY_OBJECT_COPY_NONE} which specifies that nothing special
@@ -4067,44 +4015,6 @@ completion of an attribute change call.
 @c  port.
 @end deftypefun
 
-The following interface is obsoleted by @code{memory_object_ready} and
address@hidden  If the old form
address@hidden is used to make a memory object
-ready, the kernel will write back data using the old
address@hidden interface rather than
address@hidden
-
address@hidden kern_return_t memory_object_set_attributes 
(@w{memory_object_control_t @var{memory_control}}, @w{boolean 
@var{object_ready}}, @w{boolean_t @var{may_cache_object}}, 
@w{memory_object_copy_strategy_t @var{copy_strategy}})
-The function @code{memory_object_set_attribute} controls how the
-memory object.  The kernel will only make data or unlock requests when
-the ready attribute is asserted.  If the caching attribute is asserted,
-the kernel is permitted (and encouraged) to maintain cached data for
-this memory object even after no virtual address space contains this
-data.
-
-There are three possible caching strategies:
address@hidden which specifies that nothing special
-should be done when data in the object is copied;
address@hidden which specifies that the memory manager
-should be notified via a @code{memory_object_copy} call before any part
-of the object is copied; and @code{MEMORY_OBJECT_COPY_DELAY} which
-guarantees that the memory manager does not externally modify the data
-so that the kernel can use its normal copy-on-write algorithms.
address@hidden is the strategy most commonly used.
-
-The argument @var{memory_control} is the port, provided by the kernel in
-a @code{memory_object_init} call, to which cache management requests may
-be issued.  If @var{object_ready} is set, the kernel may issue new data
-and unlock requests on the associated memory object.  If
address@hidden is set, the kernel may keep data associated with
-this memory object, even after virtual memory references to it are gone.
address@hidden tells how the kernel should copy regions of the
-associated memory object.
-
-This routine does not receive a reply message (and consequently has no
-return value), so only message transmission errors apply.
address@hidden deftypefun
-
 
 @node Default Memory Manager
 @section Default Memory Manager
@@ -4143,7 +4053,7 @@ previously been written.
 No reply is expected after this call.  Since this call is directed to
 the default memory manager, the kernel assumes that it will be ready to
 handle data requests to this object and does not need the confirmation
-of a @code{memory_object_set_attributes} call.
+of a @code{memory_object_ready} call.
 
 The argument @var{old_memory_object} is a memory object provided by the
 default memory manager on which the kernel can make
@@ -4170,7 +4080,7 @@ value is ignored.
 The function @code{memory_object_data_initialize} provides the memory
 manager with initial data for a kernel-created memory object.  If the
 memory manager already has been supplied data (by a previous
address@hidden, @code{memory_object_data_write} or
address@hidden, or
 @code{memory_object_data_return}), then this data should be ignored.
 Otherwise, this call behaves exactly as does
 @code{memory_object_data_return} on memory objects created by the kernel
diff --git a/doc/stamp-vti b/doc/stamp-vti
index 165f9b3..f04a6fe 100644
--- a/doc/stamp-vti
+++ b/doc/stamp-vti
@@ -1,4 +1,4 @@
address@hidden UPDATED 31 August 2016
address@hidden UPDATED-MONTH August 2016
address@hidden EDITION 1.7+git20160921
address@hidden VERSION 1.7+git20160921
address@hidden UPDATED 16 October 2016
address@hidden UPDATED-MONTH October 2016
address@hidden EDITION 1.7+git20161023
address@hidden VERSION 1.7+git20161023
diff --git a/doc/version.texi b/doc/version.texi
index 165f9b3..f04a6fe 100644
--- a/doc/version.texi
+++ b/doc/version.texi
@@ -1,4 +1,4 @@
address@hidden UPDATED 31 August 2016
address@hidden UPDATED-MONTH August 2016
address@hidden EDITION 1.7+git20160921
address@hidden VERSION 1.7+git20160921
address@hidden UPDATED 16 October 2016
address@hidden UPDATED-MONTH October 2016
address@hidden EDITION 1.7+git20161023
address@hidden VERSION 1.7+git20161023
diff --git a/i386/i386/seg.h b/i386/i386/seg.h
index 163a1c5..6f3d5af 100644
--- a/i386/i386/seg.h
+++ b/i386/i386/seg.h
@@ -181,7 +181,7 @@ fill_descriptor(struct real_descriptor *_desc, unsigned 
base, unsigned limit,
        desc->base_high = base >> 24;
 #ifdef MACH_PV_DESCRIPTORS
        if (hyp_do_update_descriptor(kv_to_ma(_desc), *(uint64_t*)desc))
-               panic("couldn't update descriptor(%p to %08lx%08lx)\n", 
(vm_offset_t) kv_to_ma(_desc), *(((unsigned long*)desc)+1), *(unsigned long 
*)desc);
+               panic("couldn't update descriptor(%lu to %08lx%08lx)\n", 
(vm_offset_t) kv_to_ma(_desc), *(((unsigned long*)desc)+1), *(unsigned long 
*)desc);
 #endif /* MACH_PV_DESCRIPTORS */
 }
 
diff --git a/i386/i386/xen.h b/i386/i386/xen.h
index b434dda..40d8f17 100644
--- a/i386/i386/xen.h
+++ b/i386/i386/xen.h
@@ -204,7 +204,7 @@ MACH_INLINE void hyp_free_mfn(unsigned long mfn)
        reservation.address_bits = 0;
        reservation.domid = DOMID_SELF;
        if (hyp_memory_op(XENMEM_decrease_reservation, kvtolin(&reservation)) 
!= 1)
-               panic("couldn't free page %d\n", mfn);
+               panic("couldn't free page %lu\n", mfn);
 }
 
 _hypcall4(int, update_va_mapping, unsigned long, va, unsigned long, val_lo, 
unsigned long, val_hi, unsigned long, flags);
@@ -221,7 +221,7 @@ MACH_INLINE void hyp_free_page(unsigned long pfn, void *va)
 #ifdef MACH_PV_PAGETABLES
     /* remove from mappings */
     if (hyp_do_update_va_mapping(kvtolin(va), 0, UVMF_INVLPG|UVMF_ALL))
-        panic("couldn't clear page %d at %p\n", pfn, va);
+           panic("couldn't clear page %lu at %p\n", pfn, va);
 
 #ifdef  MACH_PSEUDO_PHYS
     /* drop machine page */
diff --git a/i386/i386at/biosmem.c b/i386/i386at/biosmem.c
index a104020..28b6fb8 100644
--- a/i386/i386at/biosmem.c
+++ b/i386/i386at/biosmem.c
@@ -35,7 +35,7 @@
 #define __init
 
 #define boot_memmove    memmove
-#define boot_panic      panic
+#define boot_panic(s)   panic("%s", s)
 #define boot_strlen     strlen
 
 #define BOOT_CGAMEM     phystokv(0xb8000)
@@ -216,7 +216,7 @@ biosmem_unregister_boot_data(phys_addr_t start, phys_addr_t 
end)
     unsigned int i;
 
     if (start >= end) {
-        panic(biosmem_panic_inval_boot_data);
+        panic("%s", biosmem_panic_inval_boot_data);
     }
 
     assert(biosmem_nr_boot_data != 0);
@@ -800,8 +800,6 @@ biosmem_directmap_end(void)
         return biosmem_segment_end(VM_PAGE_SEG_DMA);
 }
 
-#if DEBUG
-
 static const char * __init
 biosmem_type_desc(unsigned int type)
 {
@@ -835,15 +833,13 @@ biosmem_map_show(void)
                entry->base_addr + entry->length,
                biosmem_type_desc(entry->type));
 
+#if DEBUG
     printf("biosmem: heap: %llx:%llx\n",
            (unsigned long long)biosmem_heap_start,
            (unsigned long long)biosmem_heap_end);
+#endif
 }
 
-#else /* DEBUG */
-#define biosmem_map_show()
-#endif /* DEBUG */
-
 static void __init
 biosmem_load_segment(struct biosmem_segment *seg, uint64_t max_phys_end)
 {
diff --git a/i386/intel/pmap.c b/i386/intel/pmap.c
index 096e6fd..b143dd7 100644
--- a/i386/intel/pmap.c
+++ b/i386/intel/pmap.c
@@ -388,6 +388,12 @@ struct pmap        kernel_pmap_store;
 pmap_t         kernel_pmap;
 
 struct kmem_cache      pmap_cache;             /* cache of pmap structures */
+struct kmem_cache      pd_cache;               /* cache of page directories */
+#if PAE
+struct kmem_cache      pdpt_cache;             /* cache of page
+                                                  directory pointer
+                                                  tables */
+#endif
 
 boolean_t              pmap_debug = FALSE;     /* flag for debugging prints */
 
@@ -976,6 +982,13 @@ void pmap_init(void)
         */
        s = (vm_size_t) sizeof(struct pmap);
        kmem_cache_init(&pmap_cache, "pmap", s, 0, NULL, 0);
+       kmem_cache_init(&pd_cache, "pd",
+                       PDPNUM * INTEL_PGBYTES, INTEL_PGBYTES, NULL, 0);
+#if PAE
+       kmem_cache_init(&pdpt_cache, "pdpt",
+                       PDPNUM * sizeof(pt_entry_t),
+                       PDPNUM * sizeof(pt_entry_t), NULL, 0);
+#endif
        s = (vm_size_t) sizeof(struct pv_entry);
        kmem_cache_init(&pv_list_cache, "pv_entry", s, 0, NULL, 0);
 
@@ -1152,12 +1165,13 @@ pmap_t pmap_create(vm_size_t size)
 
        p = (pmap_t) kmem_cache_alloc(&pmap_cache);
        if (p == PMAP_NULL)
-               panic("pmap_create");
+               return PMAP_NULL;
 
-       if (kmem_alloc_wired(kernel_map,
-                            (vm_offset_t *)&p->dirbase, PDPNUM * INTEL_PGBYTES)
-                                                       != KERN_SUCCESS)
-               panic("pmap_create");
+       p->dirbase = (pt_entry_t *) kmem_cache_alloc(&pd_cache);
+       if (p->dirbase == NULL) {
+               kmem_cache_free(&pmap_cache, (vm_address_t) p);
+               return PMAP_NULL;
+       }
 
        memcpy(p->dirbase, kernel_page_dir, PDPNUM * INTEL_PGBYTES);
 #ifdef LINUX_DEV
@@ -1175,10 +1189,13 @@ pmap_t pmap_create(vm_size_t size)
 #endif /* MACH_PV_PAGETABLES */
 
 #if PAE
-       if (kmem_alloc_wired(kernel_map,
-                            (vm_offset_t *)&p->pdpbase, INTEL_PGBYTES)
-                                                       != KERN_SUCCESS)
-               panic("pmap_create");
+       p->pdpbase = (pt_entry_t *) kmem_cache_alloc(&pdpt_cache);
+       if (p->pdpbase == NULL) {
+               kmem_cache_free(&pd_cache, (vm_address_t) p->dirbase);
+               kmem_cache_free(&pmap_cache, (vm_address_t) p);
+               return PMAP_NULL;
+       }
+
        {
                int i;
                for (i = 0; i < PDPNUM; i++)
@@ -1263,12 +1280,12 @@ void pmap_destroy(pmap_t p)
                        pmap_set_page_readwrite((void*) p->dirbase + i * 
INTEL_PGBYTES);
        }
 #endif /* MACH_PV_PAGETABLES */
-       kmem_free(kernel_map, (vm_offset_t)p->dirbase, PDPNUM * INTEL_PGBYTES);
+       kmem_cache_free(&pd_cache, (vm_offset_t) p->dirbase);
 #if PAE
 #ifdef MACH_PV_PAGETABLES
        pmap_set_page_readwrite(p->pdpbase);
 #endif /* MACH_PV_PAGETABLES */
-       kmem_free(kernel_map, (vm_offset_t)p->pdpbase, INTEL_PGBYTES);
+       kmem_cache_free(&pdpt_cache, (vm_offset_t) p->pdpbase);
 #endif /* PAE */
        kmem_cache_free(&pmap_cache, (vm_offset_t) p);
 }
diff --git a/include/mach/mach.defs b/include/mach/mach.defs
index 20dc863..c6ad077 100644
--- a/include/mach/mach.defs
+++ b/include/mach/mach.defs
@@ -325,23 +325,7 @@ skip;
 
 #endif /* ! KERNEL_USER */
 
-/*
- *     Provide the data contents of a range of the given memory
- *     object, with the access restriction specified.  [Only
- *     whole virtual pages of data can be accepted; partial pages
- *     will be discarded.  Data should be provided on request, but
- *     may be provided in advance as desired.  When data already
- *     held by this kernel is provided again, the new data is ignored.
- *     The access restriction is the subset of {read, write, execute}
- *     which are prohibited.  The kernel may not provide any data (or
- *     protection) consistency among pages with different virtual page
- *     alignments within the same object.]
- */
-simpleroutine memory_object_data_provided(
-               memory_control  : memory_object_control_t;
-               offset          : vm_offset_t;
-               data            : pointer_t;
-               lock_value      : vm_prot_t);
+skip;  /* was: memory_object_data_provided */
 
 /*
  *     Indicate that a range of the given temporary memory object does
@@ -662,15 +646,7 @@ simpleroutine memory_object_data_error(
                size            : vm_size_t;
                error_value     : kern_return_t);
 
-/*
- *     Make decisions regarding the use of the specified
- *     memory object.
- */
-simpleroutine memory_object_set_attributes(
-               memory_control  : memory_object_control_t;
-               object_ready    : boolean_t;
-               may_cache       : boolean_t;
-               copy_strategy   : memory_object_copy_strategy_t);
+skip;  /* was: memory_object_set_attributes */
 
 /*
  */
diff --git a/include/mach/memory_object.defs b/include/mach/memory_object.defs
index 6372ded..0d3c278 100644
--- a/include/mach/memory_object.defs
+++ b/include/mach/memory_object.defs
@@ -57,10 +57,10 @@ serverdemux seqnos_memory_object_server;
  *     a name port that identifies this object to callers of
  *     vm_regions.
  *     [To allow the mapping of this object to be used, the
- *     memory manager must call memory_object_set_attributes,
- *     specifying the "ready" parameter as TRUE.  To reject
- *     all mappings of this object, the memory manager may
- *     use memory_object_destroy.]
+ *     memory manager must call memory_object_ready or
+ *     memory_object_change_attributes.  To reject all mappings of
+ *     this object, the memory manager may use
+ *     memory_object_destroy.]
  */
 simpleroutine  memory_object_init(
                memory_object           : memory_object_t;
@@ -76,11 +76,12 @@ simpleroutine       memory_object_init(
                memory_object_page_size : vm_size_t);
 
 /*
- *     Indicates that the specified memory object is no longer
- *     mapped (or cached -- see memory_object_set_attributes),
- *     and that further mappings will cause another memory_object_init
- *     call to be made.  No further calls will be made on
- *     the memory object by this kernel.
+ *     Indicates that the specified memory object is no longer mapped
+ *     (or cached -- see memory_object_ready or
+ *     memory_object_change_attributes), and that further mappings
+ *     will cause another memory_object_init call to be made.  No
+ *     further calls will be made on the memory object by this
+ *     kernel.
  *
  *     [All rights to the control and name ports are included
  *     in this call.  The memory manager should use port_deallocate
@@ -144,8 +145,9 @@ simpleroutine       memory_object_terminate(
  *     call to indicate that the appropriate page of the original
  *     memory object may be used to fulfill a data request.
  *
- *     [Reply should be memory_object_set_attributes on the
- *     new memory object control port to indicate readiness.]
+ *     [Reply should be memory_object_ready or
+ *     memory_object_change_attributes on the new memory object control
+ *     port to indicate readiness.]
  */
 simpleroutine  memory_object_copy(
                old_memory_object       : memory_object_t;
@@ -171,7 +173,7 @@ simpleroutine       memory_object_copy(
  *     the specified data should be returned with at
  *     least the specified access permitted.
  *
- *     [Reply should be memory_object_data_provided.]
+ *     [Reply should be memory_object_data_supply.]
  */
 simpleroutine  memory_object_data_request(
                memory_object           : memory_object_t;
@@ -204,26 +206,7 @@ simpleroutine      memory_object_data_unlock(
                length                  : vm_size_t;
                desired_access          : vm_prot_t);
 
-/*
- *     Write back modifications made to this portion of
- *     the memory object while in memory.
- *
- *     Unless explicitly requested by a memory_object_lock_request
- *     (clean, but not flush), the kernel will not retain
- *     the data.
- *
- *     [Reply should be vm_deallocate to release the data.]
- */
-simpleroutine  memory_object_data_write(
-               memory_object           : memory_object_t;
-#if    SEQNOS
-       msgseqno seqno                  : mach_port_seqno_t;
-#endif /* SEQNOS */
-               memory_control          : memory_object_control_t =
-                                               MACH_MSG_TYPE_MAKE_SEND
-                                               ctype: mach_port_t;
-               offset                  : vm_offset_t;
-               data                    : pointer_t);
+skip;  /* was: memory_object_data_write */
 
 /*
  *     Indicate that a previous memory_object_lock_reqeust has been
@@ -300,13 +283,12 @@ simpleroutine     memory_object_supply_completed(
                error_offset            : vm_offset_t);
 
 /*
- *     Return data to manager.  This call is used in place of data_write
- *     for objects initialized by object_ready instead of set_attributes.
- *     This call indicates whether the returned data is dirty and whether
- *     the kernel kept a copy.  Precious data remains precious if the
- *     kernel keeps a copy.  The indication that the kernel kept a copy
- *     is only a hint if the data is not precious; the cleaned copy may
- *     be discarded without further notifying the manager.
+ *     Return data to manager.  This call indicates whether the
+ *     returned data is dirty and whether the kernel kept a copy.
+ *     Precious data remains precious if the kernel keeps a copy.
+ *     The indication that the kernel kept a copy is only a hint if
+ *     the data is not precious; the cleaned copy may be discarded
+ *     without further notifying the manager.
  *
  *     [Reply should be vm_deallocate to release the data.]
  */
diff --git a/include/mach/memory_object_default.defs 
b/include/mach/memory_object_default.defs
index cfd54a4..e62f14d 100644
--- a/include/mach/memory_object_default.defs
+++ b/include/mach/memory_object_default.defs
@@ -84,7 +84,7 @@ simpleroutine memory_object_create(
  *     Provide initial data contents for this region of
  *     the memory object.  If data has already been written
  *     to the object, this value must be discarded; otherwise,
- *     this call acts identically to memory_object_data_write.
+ *     this call acts identically to memory_object_data_return.
  */
 simpleroutine  memory_object_data_initialize(
                memory_object           : memory_object_t;
@@ -101,7 +101,7 @@ simpleroutine       memory_object_data_initialize(
 /*
  *     Indicate that the specified range of data in this memory object
  *     will not be requested again until it is reinitialized with
- *     memory_object_data_write or memory_object_data_initialize.
+ *     memory_object_data_return or memory_object_data_initialize.
  */
 simpleroutine  memory_object_data_terminate(
                memory_object           : memory_object_t;
diff --git a/include/mach/task_notify.defs b/include/mach/task_notify.defs
index 5485d4e..53b3da4 100644
--- a/include/mach/task_notify.defs
+++ b/include/mach/task_notify.defs
@@ -27,10 +27,30 @@ subsystem
 #include <mach/std_types.defs>
 #include <mach/mach_types.defs>
 
+type task_notify_port_t = mach_port_t
+       ctype: mach_port_t
+#ifdef TASK_NOTIFY_INTRAN
+       intran: TASK_NOTIFY_INTRAN
+#endif
+#ifdef TASK_NOTIFY_INTRAN_PAYLOAD
+       intranpayload: TASK_NOTIFY_INTRAN_PAYLOAD
+#endif
+#ifdef TASK_NOTIFY_OUTTRAN
+       outtran: TASK_NOTIFY_OUTTRAN
+#endif
+#ifdef TASK_NOTIFY_DESTRUCTOR
+       destructor: TASK_NOTIFY_DESTRUCTOR
+#endif
+;
+
+#ifdef TASK_NOTIFY_IMPORTS
+TASK_NOTIFY_IMPORTS
+#endif
+
 /* These notifications are sent to the port registered via
    `register_new_task_notification' and provide a robust parental
    relation between tasks.  */
 simpleroutine mach_notify_new_task(
-               notify  : mach_port_t;
+               notify  : task_notify_port_t;
                task    : task_t;
                parent  : task_t);
diff --git a/include/mach_debug/vm_info.h b/include/mach_debug/vm_info.h
index 70ba887..b50fb92 100644
--- a/include/mach_debug/vm_info.h
+++ b/include/mach_debug/vm_info.h
@@ -75,7 +75,6 @@ typedef natural_t vm_object_info_state_t;
 #define VOI_STATE_ALIVE                        0x00000040
 #define VOI_STATE_LOCK_IN_PROGRESS     0x00000080
 #define VOI_STATE_LOCK_RESTART         0x00000100
-#define VOI_STATE_USE_OLD_PAGEOUT      0x00000200
 
 typedef struct vm_object_info {
        vm_offset_t voi_object;         /* this object */
diff --git a/kern/assert.h b/kern/assert.h
index 7b66d1b..73e2a17 100644
--- a/kern/assert.h
+++ b/kern/assert.h
@@ -36,12 +36,13 @@
 #endif
 
 #if    MACH_ASSERT
-extern void Assert(const char *exp, const char *filename, int line) 
__attribute__ ((noreturn));
+extern void Assert(const char *exp, const char *filename, int line,
+                  const char *fun) __attribute__ ((noreturn));
 
 #define assert(ex)                                                     \
        ((ex)                                                           \
         ? (void) (0)                                                   \
-        : Assert (#ex, __FILE__, __LINE__))
+        : Assert (#ex, __FILE__, __LINE__, __FUNCTION__))
 
 #define        assert_static(x)        assert(x)
 
diff --git a/kern/debug.c b/kern/debug.c
index 0d01b84..78c55f8 100644
--- a/kern/debug.c
+++ b/kern/debug.c
@@ -51,16 +51,16 @@ do_cnputc(char c, vm_offset_t offset)
 }
 
 void
-Assert(const char *exp, const char *file, int line)
+Assert(const char *exp, const char *file, int line, const char *fun)
 {
 #if NCPUS > 1
        simple_lock(&Assert_print_lock);
-       printf("{%d} Assertion failed: file \"%s\", line %d\n", 
-              cpu_number(), file, line);
+       printf("{cpu%d} %s:%d: %s: Assertion `%s' failed.",
+              cpu_number(), file, line, fun, exp);
        simple_unlock(&Assert_print_lock);
 #else
-       printf("Assertion `%s' failed in file \"%s\", line %d\n",
-               exp, file, line);
+       printf("%s:%d: %s: Assertion `%s' failed.",
+              file, line, fun, exp);
 #endif
 
        Debugger("assertion failure");
@@ -136,7 +136,7 @@ extern boolean_t reboot_on_panic;
 
 /*VARARGS1*/
 void
-panic(const char *s, ...)
+Panic(const char *file, int line, const char *fun, const char *s, ...)
 {
        va_list listp;
 
@@ -155,11 +155,11 @@ panic(const char *s, ...)
            paniccpu = cpu_number();
        }
        simple_unlock(&panic_lock);
-       printf("panic");
+       printf("panic ");
 #if    NCPUS > 1
-       printf("(cpu %U)", paniccpu);
+       printf("{cpu%d} ", paniccpu);
 #endif
-       printf(": ");
+       printf("%s:%d: %s: ",file, line, fun);
        va_start(listp, s);
        _doprnt(s, listp, do_cnputc, 16, 0);
        va_end(listp);
diff --git a/kern/debug.h b/kern/debug.h
index 6c8977b..1a5cd07 100644
--- a/kern/debug.h
+++ b/kern/debug.h
@@ -60,7 +60,11 @@
 extern void log (int level, const char *fmt, ...);
 
 extern void panic_init(void);
-extern void panic (const char *s, ...) __attribute__ ((noreturn));
+extern void Panic (const char *file, int line, const char *fun,
+                  const char *s, ...)
+       __attribute__ ((noreturn, format (printf, 4, 5)));
+#define panic(s, ...)                                                  \
+       Panic (__FILE__, __LINE__, __FUNCTION__, s, ##__VA_ARGS__)
 
 extern void SoftDebugger (const char *message);
 extern void Debugger (const char *message) __attribute__ ((noreturn));
diff --git a/kern/sched_prim.c b/kern/sched_prim.c
index 0cef160..bb76735 100644
--- a/kern/sched_prim.c
+++ b/kern/sched_prim.c
@@ -357,12 +357,17 @@ void clear_wait(
        splx(s);
 }
 
-static inline void __attribute__((noreturn))
-state_panic(const thread_t thread, const char *caller)
-{
-  panic ("%s: thread %x has unexpected state %x",
-        caller, thread, thread->state);
-}
+#define state_panic(thread)                                            \
+  panic ("thread %p has unexpected state %x (%s%s%s%s%s%s%s%s)",       \
+        thread, thread->state,                                         \
+        thread->state & TH_WAIT ? "TH_WAIT|" : "",                     \
+        thread->state & TH_SUSP ? "TH_SUSP|" : "",                     \
+        thread->state & TH_RUN ? "TH_RUN|" : "",                       \
+        thread->state & TH_UNINT ? "TH_UNINT|" : "",                   \
+        thread->state & TH_HALTED ? "TH_HALTED|" : "",                 \
+        thread->state & TH_IDLE ? "TH_IDLE|" : "",                     \
+        thread->state & TH_SWAPPED ? "TH_SWAPPED|" : "",               \
+        thread->state & TH_SW_COMING_IN ? "TH_SW_COMING_IN|" : "")
 
 /*
  *     thread_wakeup_prim:
@@ -426,7 +431,7 @@ void thread_wakeup_prim(
                                break;
 
                            default:
-                               state_panic(thread, "thread_wakeup");
+                               state_panic(thread);
                                break;
                        }
                        thread_unlock(thread);
@@ -716,7 +721,7 @@ boolean_t thread_invoke(
                            break;
 
                        default:
-                           state_panic(old_thread, "thread_invoke");
+                           state_panic(old_thread);
                    }
                    thread_unlock(old_thread);
                after_old_thread:
@@ -966,7 +971,7 @@ void thread_dispatch(
                break;
 
            default:
-               state_panic(thread, "thread_dispatch");
+               state_panic(thread);
        }
        thread_unlock(thread);
 }
diff --git a/kern/task.c b/kern/task.c
index 7dff124..1874af6 100644
--- a/kern/task.c
+++ b/kern/task.c
@@ -100,13 +100,24 @@ kern_return_t task_create(
                new_task->map = kernel_map;
        } else if (inherit_memory) {
                new_task->map = vm_map_fork(parent_task->map);
-               vm_map_set_name(new_task->map, new_task->name);
        } else {
-               new_task->map = vm_map_create(pmap_create(0),
+               pmap_t new_pmap = pmap_create((vm_size_t) 0);
+               if (new_pmap == PMAP_NULL)
+                       new_task->map = VM_MAP_NULL;
+               else {
+                       new_task->map = vm_map_create(new_pmap,
                                        round_page(VM_MIN_ADDRESS),
                                        trunc_page(VM_MAX_ADDRESS));
-               vm_map_set_name(new_task->map, new_task->name);
+                       if (new_task->map == VM_MAP_NULL)
+                               pmap_destroy(new_pmap);
+               }
        }
+       if (new_task->map == VM_MAP_NULL) {
+               kmem_cache_free(&task_cache, (vm_address_t) new_task);
+               return KERN_RESOURCE_SHORTAGE;
+       }
+       if (child_task != &kernel_task)
+               vm_map_set_name(new_task->map, new_task->name);
 
        simple_lock_init(&new_task->lock);
        queue_init(&new_task->thread_list);
diff --git a/linux/dev/glue/kmem.c b/linux/dev/glue/kmem.c
index ed57610..8e0b542 100644
--- a/linux/dev/glue/kmem.c
+++ b/linux/dev/glue/kmem.c
@@ -566,13 +566,12 @@ vmtophys (void *addr)
 
 /* XXX: Quick hacking. */
 /* Remap physical address into virtual address. */
+
+#include <vm/pmap.h>
+
 void *
 vremap (unsigned long offset, unsigned long size)
 {
-  extern vm_offset_t pmap_map_bd (register vm_offset_t virt,
-                                 register vm_offset_t start,
-                                 register vm_offset_t end,
-                                 vm_prot_t prot);
   vm_offset_t addr;
   kern_return_t ret;
   
diff --git a/linux/dev/include/linux/kernel.h b/linux/dev/include/linux/kernel.h
index 4db76ac..9c60b41 100644
--- a/linux/dev/include/linux/kernel.h
+++ b/linux/dev/include/linux/kernel.h
@@ -32,8 +32,10 @@
 # define NORET_AND     noreturn,
 
 extern void math_error(void);
-NORET_TYPE void panic(const char * fmt, ...)
-       __attribute__ ((NORET_AND format (printf, 1, 2)));
+
+/* Use Mach's panic.  */
+#include <kern/debug.h>
+
 NORET_TYPE void do_exit(long error_code)
        ATTRIB_NORET;
 extern unsigned long simple_strtoul(const char *,char **,unsigned int);
diff --git a/version.m4 b/version.m4
index 330aa15..374d136 100644
--- a/version.m4
+++ b/version.m4
@@ -1,4 +1,4 @@
 m4_define([AC_PACKAGE_NAME],[GNU Mach])
-m4_define([AC_PACKAGE_VERSION],[1.7+git20160921])
+m4_define([AC_PACKAGE_VERSION],[1.7+git20161023])
 m4_define([AC_PACKAGE_BUGREPORT],address@hidden)
 m4_define([AC_PACKAGE_TARNAME],[gnumach])
diff --git a/vm/memory_object.c b/vm/memory_object.c
index 7d33201..ad93f87 100644
--- a/vm/memory_object.c
+++ b/vm/memory_object.c
@@ -302,21 +302,6 @@ retry_lookup:
        return(result);
 }
 
-/*
- *     If successful, destroys the map copy object.
- */
-kern_return_t memory_object_data_provided(
-       vm_object_t     object,
-       vm_offset_t     offset,
-       pointer_t       data,
-       unsigned int    data_cnt,
-       vm_prot_t       lock_value)
-{
-        return memory_object_data_supply(object, offset, (vm_map_copy_t) data,
-                                        data_cnt, lock_value, FALSE, IP_NULL,
-                                        0);
-}
-
 kern_return_t memory_object_data_error(
        vm_object_t     object,
        vm_offset_t     offset,
@@ -711,25 +696,14 @@ MACRO_BEGIN                                               
                \
                                                                        \
        (void) vm_map_copyin_object(new_object, 0, new_offset, &copy);  \
                                                                        \
-       if (object->use_old_pageout) {                                  \
-           assert(pageout_action == MEMORY_OBJECT_LOCK_RESULT_MUST_CLEAN);  \
-               (void) memory_object_data_write(                        \
-                       object->pager,                                  \
-                       object->pager_request,                          \
-                       paging_offset,                                  \
-                       (pointer_t) copy,                               \
-                       new_offset);                                    \
-       }                                                               \
-       else {                                                          \
-               (void) memory_object_data_return(                       \
-                       object->pager,                                  \
-                       object->pager_request,                          \
-                       paging_offset,                                  \
-                       (pointer_t) copy,                               \
-                       new_offset,                                     \
+       (void) memory_object_data_return(                               \
+               object->pager,                                          \
+               object->pager_request,                                  \
+               paging_offset,                                          \
+               (pointer_t) copy,                                       \
+               new_offset,                                             \
             (pageout_action == MEMORY_OBJECT_LOCK_RESULT_MUST_CLEAN),  \
-                       !should_flush);                                 \
-       }                                                               \
+               !should_flush);                                         \
                                                                        \
        vm_object_lock(object);                                         \
                                                                        \
@@ -875,13 +849,11 @@ MACRO_END
        return (KERN_SUCCESS);
 }
 
-kern_return_t
+static kern_return_t
 memory_object_set_attributes_common(
        vm_object_t     object,
-       boolean_t       object_ready,
        boolean_t       may_cache,
-       memory_object_copy_strategy_t copy_strategy,
-       boolean_t use_old_pageout)
+       memory_object_copy_strategy_t copy_strategy)
 {
        if (object == VM_OBJECT_NULL)
                return(KERN_INVALID_ARGUMENT);
@@ -901,8 +873,6 @@ memory_object_set_attributes_common(
                        return(KERN_INVALID_ARGUMENT);
        }
 
-       if (object_ready)
-               object_ready = TRUE;
        if (may_cache)
                may_cache = TRUE;
 
@@ -913,8 +883,7 @@ memory_object_set_attributes_common(
         *      to become asserted.
         */
 
-       if (object_ready && !object->pager_ready) {
-               object->use_old_pageout = use_old_pageout;
+       if (!object->pager_ready) {
                vm_object_wakeup(object, VM_OBJECT_EVENT_PAGER_READY);
        }
 
@@ -923,7 +892,7 @@ memory_object_set_attributes_common(
         */
 
        object->can_persist = may_cache;
-       object->pager_ready = object_ready;
+       object->pager_ready = TRUE;
        if (copy_strategy == MEMORY_OBJECT_COPY_TEMPORARY) {
                object->temporary = TRUE;
        } else {
@@ -961,9 +930,8 @@ kern_return_t       memory_object_change_attributes(
         * XXX  may_cache may become a tri-valued variable to handle
         * XXX  uncache if not in use.
         */
-       result = memory_object_set_attributes_common(object, TRUE,
-                                                    may_cache, copy_strategy,
-                                                    FALSE);
+       result = memory_object_set_attributes_common(object, may_cache,
+                                                    copy_strategy);
 
        if (IP_VALID(reply_to)) {
 
@@ -976,26 +944,13 @@ kern_return_t     memory_object_change_attributes(
        return(result);
 }
 
-kern_return_t
-memory_object_set_attributes(
-       vm_object_t     object,
-       boolean_t       object_ready,
-       boolean_t       may_cache,
-       memory_object_copy_strategy_t copy_strategy)
-{
-       return memory_object_set_attributes_common(object, object_ready,
-                                                  may_cache, copy_strategy,
-                                                  TRUE);
-}
-
 kern_return_t  memory_object_ready(
        vm_object_t     object,
        boolean_t       may_cache,
        memory_object_copy_strategy_t copy_strategy)
 {
-       return memory_object_set_attributes_common(object, TRUE,
-                                                  may_cache, copy_strategy,
-                                                  FALSE);
+       return memory_object_set_attributes_common(object, may_cache,
+                                                  copy_strategy);
 }
 
 kern_return_t  memory_object_get_attributes(
diff --git a/vm/vm_debug.c b/vm/vm_debug.c
index 227090e..47889ad 100644
--- a/vm/vm_debug.c
+++ b/vm/vm_debug.c
@@ -250,8 +250,6 @@ mach_vm_object_info(
                state |= VOI_STATE_LOCK_IN_PROGRESS;
        if (object->lock_restart)
                state |= VOI_STATE_LOCK_RESTART;
-       if (object->use_old_pageout)
-               state |= VOI_STATE_USE_OLD_PAGEOUT;
        info.voi_state = state;
        vm_object_unlock(object);
 
diff --git a/vm/vm_kern.c b/vm/vm_kern.c
index 81bb153..a84553d 100644
--- a/vm/vm_kern.c
+++ b/vm/vm_kern.c
@@ -401,7 +401,8 @@ retry:
                        goto retry;
                }
 
-               printf_once("no more room for kmem_alloc in %p\n", map);
+               printf_once("no more room for kmem_alloc in %p (%s)\n",
+                           map, map->name);
                vm_object_deallocate(object);
                return kr;
        }
@@ -475,7 +476,8 @@ retry:
                        goto retry;
                }
 
-               printf_once("no more room for kmem_alloc_wired in %p\n", map);
+               printf_once("no more room for kmem_alloc_wired in %p (%s)\n",
+                           map, map->name);
                return kr;
        }
 
@@ -561,7 +563,8 @@ retry:
                        goto retry;
                }
 
-               printf_once("no more room for kmem_alloc_aligned in %p\n", map);
+               printf_once("no more room for kmem_alloc_aligned in %p (%s)\n",
+                           map, map->name);
                return kr;
        }
 
@@ -623,7 +626,8 @@ kmem_alloc_pageable(
                          VM_OBJECT_NULL, (vm_offset_t) 0, FALSE,
                          VM_PROT_DEFAULT, VM_PROT_ALL, VM_INHERIT_DEFAULT);
        if (kr != KERN_SUCCESS) {
-               printf_once("no more room for kmem_alloc_pageable in %p\n", 
map);
+               printf_once("no more room for kmem_alloc_pageable in %p (%s)\n",
+                           map, map->name);
                return kr;
        }
 
diff --git a/vm/vm_map.c b/vm/vm_map.c
index 249d18a..b8a3ade 100644
--- a/vm/vm_map.c
+++ b/vm/vm_map.c
@@ -4127,6 +4127,9 @@ vm_map_t vm_map_fork(vm_map_t old_map)
        vm_size_t       entry_size;
        vm_object_t     object;
 
+       if (new_pmap == PMAP_NULL)
+               return VM_MAP_NULL;
+
        vm_map_lock(old_map);
 
        new_map = vm_map_create(new_pmap,
diff --git a/vm/vm_object.c b/vm/vm_object.c
index 1e80bbc..ea81039 100644
--- a/vm/vm_object.c
+++ b/vm/vm_object.c
@@ -309,7 +309,6 @@ void vm_object_bootstrap(void)
        vm_object_template.alive = TRUE;
        vm_object_template.lock_in_progress = FALSE;
        vm_object_template.lock_restart = FALSE;
-       vm_object_template.use_old_pageout = TRUE; /* XXX change later */
        vm_object_template.last_alloc = (vm_offset_t) 0;
 
 #if    MACH_PAGEMAP
diff --git a/vm/vm_object.h b/vm/vm_object.h
index 1914e8e..f8f9bf8 100644
--- a/vm/vm_object.h
+++ b/vm/vm_object.h
@@ -150,9 +150,6 @@ struct vm_object {
                                                /* Should lock request in
                                                 * progress restart search?
                                                 */
-       /* boolean_t */         use_old_pageout : 1,
-                                               /* Use old pageout primitives?
-                                                */
        /* boolean_t */         use_shared_copy : 1,/* Use shared (i.e.,
                                                 * delayed) copy on write */
        /* boolean_t */         shadowed: 1,    /* Shadow may exist */
diff --git a/vm/vm_pageout.c b/vm/vm_pageout.c
index dd0f995..85db021 100644
--- a/vm/vm_pageout.c
+++ b/vm/vm_pageout.c
@@ -72,7 +72,7 @@ static int vm_pageout_continue;
  *
  *             Move or copy the page to a new object, as part
  *             of which it will be sent to its memory manager
- *             in a memory_object_data_write or memory_object_initialize
+ *             in a memory_object_data_return or memory_object_initialize
  *             message.
  *
  *             The "paging_offset" argument specifies the offset
@@ -95,7 +95,7 @@ static int vm_pageout_continue;
  *             this routine returns a pointer to a place-holder page,
  *             inserted at the same offset, to block out-of-order
  *             requests for the page.  The place-holder page must
- *             be freed after the data_write or initialize message
+ *             be freed after the data_return or initialize message
  *             has been sent.  If the page is copied,
  *             the holding page is VM_PAGE_NULL.
  *
@@ -288,7 +288,7 @@ vm_pageout_setup(
  *             The "initial" argument specifies whether this
  *             data is an initialization only, and should use
  *             memory_object_data_initialize instead of
- *             memory_object_data_write.
+ *             memory_object_data_return.
  *
  *             The "flush" argument specifies whether the page
  *             should be flushed from the object.  If not, a
@@ -364,10 +364,9 @@ vm_pageout_page(
        rc = vm_map_copyin_object(new_object, 0, PAGE_SIZE, &copy);
        assert(rc == KERN_SUCCESS);
 
-       if (initial || old_object->use_old_pageout) {
-               rc = (*(initial ? memory_object_data_initialize
-                            : memory_object_data_write))
-                       (old_object->pager,
+       if (initial) {
+               rc = memory_object_data_initialize(
+                        old_object->pager,
                         old_object->pager_request,
                         paging_offset, (pointer_t) copy, PAGE_SIZE);
        }

-- 
Alioth's /usr/local/bin/git-commit-notice on 
/srv/git.debian.org/git/pkg-hurd/gnumach.git



reply via email to

[Prev in Thread] Current Thread [Next in Thread]