diff --git a/mps/code/fri4gc.gmk b/mps/code/fri4gc.gmk
index 086f097a76a..1184a0bc4f4 100644
--- a/mps/code/fri4gc.gmk
+++ b/mps/code/fri4gc.gmk
@@ -7,7 +7,7 @@ PFM = fri4gc
PFMDEFS = -D_REENTRANT
-MPMPF = lockix.c thfri4.c pthrdext.c vmfr.c \
+MPMPF = lockix.c thfri4.c pthrdext.c vmix.c \
protix.c protsgix.c prmcan.c ssixi3.c span.c
SWPF = than.c vmfr.c protsw.c prmcan.c ssan.c
diff --git a/mps/code/vmfr.c b/mps/code/vmfr.c
deleted file mode 100644
index 0b2b5d4563e..00000000000
--- a/mps/code/vmfr.c
+++ /dev/null
@@ -1,320 +0,0 @@
-/* vmfr.c: VIRTUAL MEMORY MAPPING FOR FreeBSD
- *
- * $Id$
- * Copyright (c) 2001 Ravenbrook Limited. See end of file for license.
- *
- * .purpose: This is the implementation of the virtual memory mapping
- * interface (vm.h) for FreeBSD. It was created by copying vmli.c (the
- * DIGITAL UNIX implementation) as that seemed to be closest.
- *
- * .design: See . .design.freebsd: mmap(2) is used to
- * reserve address space by creating a mapping with page access none.
- * mmap(2) is used to map pages onto store by creating a copy-on-write
- * (MAP_PRIVATE) mapping with the flag MAP_ANON.
- *
- * .assume.not-last: The implementation of VMCreate assumes that
- * mmap() will not choose a region which contains the last page
- * in the address space, so that the limit of the mapped area
- * is representable.
- *
- * .assume.mmap.err: ENOMEM is the only error we really expect to
- * get from mmap. The others are either caused by invalid params
- * or features we don't use. See mmap(2) for details.
- *
- * .remap: Possibly this should use mremap to reduce the number of
- * distinct mappings. According to our current testing, it doesn't
- * seem to be a problem.
- */
-
-/* for mmap(2), munmap(2) */
-#include
-#include
-
-/* for errno(2) */
-#include
-
-/* for getpagesize(3) */
-#include
-
-#include "mpm.h"
-
-
-#ifndef MPS_OS_FR
-#error "vmfr.c is FreeBSD specific, but MPS_OS_FR is not set"
-#endif
-
-SRCID(vmfr, "$Id$");
-
-
-/* VMStruct -- virtual memory structure */
-
-#define VMSig ((Sig)0x519B3999) /* SIGnature VM */
-
-typedef struct VMStruct {
- Sig sig; /* */
- Align align; /* page size */
- Addr base, limit; /* boundaries of reserved space */
- Size reserved; /* total reserved address space */
- Size mapped; /* total mapped memory */
-} VMStruct;
-
-
-/* VMAlign -- return page size */
-
-Align VMAlign(VM vm)
-{
- return vm->align;
-}
-
-
-/* VMCheck -- check a VM */
-
-Bool VMCheck(VM vm)
-{
- CHECKS(VM, vm);
- CHECKL(vm->base != 0);
- CHECKL(vm->limit != 0);
- CHECKL(vm->base < vm->limit);
- CHECKL(vm->mapped <= vm->reserved);
- CHECKL(SizeIsP2(vm->align));
- CHECKL(AddrIsAligned(vm->base, vm->align));
- CHECKL(AddrIsAligned(vm->limit, vm->align));
- return TRUE;
-}
-
-
-/* VMCreate -- reserve some virtual address space, and create a VM structure */
-
-Res VMCreate(VM *vmReturn, Size size)
-{
- Align align;
- VM vm;
- int pagesize;
- void *addr;
- Res res;
-
- AVER(vmReturn != NULL);
-
- /* Find out the page size from the OS */
- pagesize = getpagesize();
- /* check the actual returned pagesize will fit in an object of */
- /* type Align. */
- AVER(pagesize > 0);
- AVER((unsigned long)pagesize <= (unsigned long)(Align)-1);
- /* Note implicit conversion from "int" to "Align". */
- align = pagesize;
- AVER(SizeIsP2(align));
- size = SizeAlignUp(size, align);
- if((size == 0) || (size > (Size)(size_t)-1))
- return ResRESOURCE;
-
- /* Map in a page to store the descriptor on. */
- addr = mmap(0, (size_t)SizeAlignUp(sizeof(VMStruct), align),
- PROT_READ | PROT_WRITE,
- MAP_ANON | MAP_PRIVATE,
- -1, 0);
- if(addr == MAP_FAILED) {
- int e = errno;
- AVER(e == ENOMEM); /* .assume.mmap.err */
- return ResMEMORY;
- }
- vm = (VM)addr;
-
- vm->align = align;
-
- /* See .assume.not-last. */
- addr = mmap(0, (size_t)size,
- PROT_NONE, MAP_ANON | MAP_PRIVATE,
- -1, 0);
- if(addr == MAP_FAILED) {
- int e = errno;
- AVER(e == ENOMEM); /* .assume.mmap.err */
- res = ResRESOURCE;
- goto failReserve;
- }
-
- vm->base = (Addr)addr;
- vm->limit = AddrAdd(vm->base, size);
- vm->reserved = size;
- vm->mapped = (Size)0;
-
- vm->sig = VMSig;
-
- AVERT(VM, vm);
-
- EVENT_PAA(VMCreate, vm, vm->base, vm->limit);
-
- *vmReturn = vm;
- return ResOK;
-
-failReserve:
- (void)munmap((void *)vm, (size_t)SizeAlignUp(sizeof(VMStruct), align));
- return res;
-}
-
-
-/* VMDestroy -- release all address space and destroy VM structure */
-
-void VMDestroy(VM vm)
-{
- int r;
-
- AVERT(VM, vm);
- AVER(vm->mapped == (Size)0);
-
- /* This appears to be pretty pointless, since the descriptor */
- /* page is about to vanish completely. However, munmap might fail */
- /* for some reason, and this would ensure that it was still */
- /* discovered if sigs were being checked. */
- vm->sig = SigInvalid;
-
- r = munmap((void *)vm->base, (size_t)AddrOffset(vm->base, vm->limit));
- AVER(r == 0);
- r = munmap((void *)vm,
- (size_t)SizeAlignUp(sizeof(VMStruct), vm->align));
- AVER(r == 0);
-
- EVENT_P(VMDestroy, vm);
-}
-
-
-/* VMBase -- return the base address of the memory reserved */
-
-Addr VMBase(VM vm)
-{
- AVERT(VM, vm);
-
- return vm->base;
-}
-
-
-/* VMLimit -- return the limit address of the memory reserved */
-
-Addr VMLimit(VM vm)
-{
- AVERT(VM, vm);
-
- return vm->limit;
-}
-
-
-/* VMReserved -- return the amount of memory reserved */
-
-Size VMReserved(VM vm)
-{
- AVERT(VM, vm);
-
- return vm->reserved;
-}
-
-
-/* VMMapped -- return the amount of memory actually mapped */
-
-Size VMMapped(VM vm)
-{
- AVERT(VM, vm);
-
- return vm->mapped;
-}
-
-
-/* VMMap -- map the given range of memory */
-
-Res VMMap(VM vm, Addr base, Addr limit)
-{
- Size size;
-
- AVERT(VM, vm);
- AVER(sizeof(void *) == sizeof(Addr));
- AVER(base < limit);
- AVER(base >= vm->base);
- AVER(limit <= vm->limit);
- AVER(AddrIsAligned(base, vm->align));
- AVER(AddrIsAligned(limit, vm->align));
-
- size = AddrOffset(base, limit);
-
- if(mmap((void *)base, (size_t)size,
- PROT_READ | PROT_WRITE | PROT_EXEC,
- MAP_ANON | MAP_PRIVATE | MAP_FIXED,
- -1, 0)
- == MAP_FAILED) {
- AVER(errno == ENOMEM); /* .assume.mmap.err */
- return ResMEMORY;
- }
-
- vm->mapped += size;
-
- EVENT_PAA(VMMap, vm, base, limit);
- return ResOK;
-}
-
-
-/* VMUnmap -- unmap the given range of memory */
-
-void VMUnmap(VM vm, Addr base, Addr limit)
-{
- Size size;
- void *addr;
-
- AVERT(VM, vm);
- AVER(base < limit);
- AVER(base >= vm->base);
- AVER(limit <= vm->limit);
- AVER(AddrIsAligned(base, vm->align));
- AVER(AddrIsAligned(limit, vm->align));
-
- size = AddrOffset(base, limit);
-
- /* see */
- addr = mmap((void *)base, (size_t)size,
- PROT_NONE, MAP_ANON | MAP_PRIVATE | MAP_FIXED,
- -1, 0);
- AVER(addr == (void *)base);
-
- vm->mapped -= size;
-
- EVENT_PAA(VMUnmap, vm, base, limit);
-}
-
-
-/* C. COPYRIGHT AND LICENSE
- *
- * Copyright (C) 2001-2002 Ravenbrook Limited .
- * All rights reserved. This is an open source license. Contact
- * Ravenbrook for commercial licensing options.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * 3. Redistributions in any form must be accompanied by information on how
- * to obtain complete source code for this software and any accompanying
- * software that uses this software. The source code must either be
- * included in the distribution or be available for no more than the cost
- * of distribution plus a nominal fee, and must be freely redistributable
- * under reasonable conditions. For an executable file, complete source
- * code means the source code for all modules it contains. It does not
- * include source code for modules or files that typically accompany the
- * major components of the operating system on which the executable file
- * runs.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
- * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
- * PURPOSE, OR NON-INFRINGEMENT, ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */