diff --git a/mps/code/arenavm.c b/mps/code/arenavm.c
index 65872d64bc3..9c50750ab1d 100644
--- a/mps/code/arenavm.c
+++ b/mps/code/arenavm.c
@@ -293,9 +293,9 @@ static Res VMChunkCreate(Chunk *chunkReturn, VMArena vmArena, Size size)
arena = VMArena2Arena(vmArena);
AVER(size > 0);
- res = VMCreate(vm, size, ArenaGrainSize(arena), vmArena->vmParams);
+ res = VMInit(vm, size, ArenaGrainSize(arena), vmArena->vmParams);
if (res != ResOK)
- goto failVMCreate;
+ goto failVMInit;
base = VMBase(vm);
limit = VMLimit(vm);
@@ -318,7 +318,7 @@ static Res VMChunkCreate(Chunk *chunkReturn, VMArena vmArena, Size size)
vmChunk->overheadMappedLimit = chunkStructLimit;
/* Copy VM descriptor into its place in the chunk. */
- (void)mps_lib_memcpy(VMChunkVM(vmChunk), vm, sizeof vmStruct);
+ VMCopy(VMChunkVM(vmChunk), vm);
res = ChunkInit(VMChunk2Chunk(vmChunk), arena, base, limit, boot);
if (res != ResOK)
goto failChunkInit;
@@ -336,8 +336,8 @@ static Res VMChunkCreate(Chunk *chunkReturn, VMArena vmArena, Size size)
failChunkMap:
failChunkAlloc:
failBootInit:
- VMDestroy(vm);
-failVMCreate:
+ VMFinish(vm);
+failVMInit:
return res;
}
@@ -441,14 +441,14 @@ static void VMChunkFinish(Chunk chunk)
/* Copy VM descriptor to stack-local storage so that we can continue
* using the descriptor after the VM has been unmapped. */
- (void)mps_lib_memcpy(vm, VMChunkVM(vmChunk), sizeof *vm);
+ VMCopy(vm, VMChunkVM(vmChunk));
vmArenaUnmap(VMChunkVMArena(vmChunk), vm,
VMBase(vm), vmChunk->overheadMappedLimit);
/* No point in finishing the other fields, since they are unmapped. */
- VMDestroy(vm);
+ VMFinish(vm);
}
@@ -532,14 +532,14 @@ static Res VMArenaInit(Arena *arenaReturn, ArenaClass class, ArgList args)
don't have anywhere else to put it. It gets copied later. */
res = VMParamFromArgs(vmParams, sizeof(vmParams), args);
if (res != ResOK)
- goto failVMCreate;
+ goto failVMInit;
/* Create a VM to hold the arena and map it. Store descriptor on the
stack until we have the arena to put it in. */
vmArenaSize = SizeAlignUp(sizeof(VMArenaStruct), MPS_PF_ALIGN);
- res = VMCreate(vm, vmArenaSize, grainSize, vmParams);
+ res = VMInit(vm, vmArenaSize, grainSize, vmParams);
if (res != ResOK)
- goto failVMCreate;
+ goto failVMInit;
res = VMMap(vm, VMBase(vm), VMLimit(vm));
if (res != ResOK)
goto failVMMap;
@@ -553,7 +553,7 @@ static Res VMArenaInit(Arena *arenaReturn, ArenaClass class, ArgList args)
arena->committed = VMMapped(vm);
/* Copy VM descriptor into its place in the arena. */
- (void)mps_lib_memcpy(VMArenaVM(vmArena), vm, sizeof *vm);
+ VMCopy(VMArenaVM(vmArena), vm);
vmArena->spareSize = 0;
RingInit(&vmArena->spareRing);
@@ -601,8 +601,8 @@ static Res VMArenaInit(Arena *arenaReturn, ArenaClass class, ArgList args)
failArenaInit:
VMUnmap(vm, VMBase(vm), VMLimit(vm));
failVMMap:
- VMDestroy(vm);
-failVMCreate:
+ VMFinish(vm);
+failVMInit:
return res;
}
@@ -638,9 +638,9 @@ static void VMArenaFinish(Arena arena)
/* Copy VM descriptor to stack-local storage so that we can continue
* using the descriptor after the VM has been unmapped. */
- (void)mps_lib_memcpy(vm, VMArenaVM(vmArena), sizeof *vm);
+ VMCopy(vm, VMArenaVM(vmArena));
VMUnmap(vm, VMBase(vm), VMLimit(vm));
- VMDestroy(vm);
+ VMFinish(vm);
}
diff --git a/mps/code/eventdef.h b/mps/code/eventdef.h
index 7cf06e19401..081b45de7c2 100644
--- a/mps/code/eventdef.h
+++ b/mps/code/eventdef.h
@@ -36,7 +36,7 @@
*/
#define EVENT_VERSION_MAJOR ((unsigned)1)
-#define EVENT_VERSION_MEDIAN ((unsigned)3)
+#define EVENT_VERSION_MEDIAN ((unsigned)4)
#define EVENT_VERSION_MINOR ((unsigned)0)
@@ -115,8 +115,8 @@
/* TraceScanArea{Tagged} abuses kind, see .kind.abuse */ \
EVENT(X, TraceScanArea , 0x0029, TRUE, Seg) \
EVENT(X, TraceScanAreaTagged, 0x002a, TRUE, Seg) \
- EVENT(X, VMCreate , 0x002b, TRUE, Arena) \
- EVENT(X, VMDestroy , 0x002c, TRUE, Arena) \
+ EVENT(X, VMInit , 0x002b, TRUE, Arena) \
+ EVENT(X, VMFinish , 0x002c, TRUE, Arena) \
EVENT(X, VMMap , 0x002d, TRUE, Seg) \
EVENT(X, VMUnmap , 0x002e, TRUE, Seg) \
EVENT(X, ArenaExtend , 0x002f, TRUE, Arena) \
@@ -368,12 +368,12 @@
PARAM(X, 1, P, base) \
PARAM(X, 2, P, limit)
-#define EVENT_VMCreate_PARAMS(PARAM, X) \
+#define EVENT_VMInit_PARAMS(PARAM, X) \
PARAM(X, 0, P, vm) \
PARAM(X, 1, A, base) \
PARAM(X, 2, A, limit)
-#define EVENT_VMDestroy_PARAMS(PARAM, X) \
+#define EVENT_VMFinish_PARAMS(PARAM, X) \
PARAM(X, 0, P, vm)
#define EVENT_VMMap_PARAMS(PARAM, X) \
diff --git a/mps/code/eventrep.c b/mps/code/eventrep.c
index 969d8adcb67..e60d81334dc 100644
--- a/mps/code/eventrep.c
+++ b/mps/code/eventrep.c
@@ -565,7 +565,7 @@ void EventReplay(Event event, Word etime)
mps_reservoir_limit_set((mps_arena_t)entry, (size_t)event->pw.w1);
} break;
case EventVMMap: case EventVMUnmap:
- case EventVMCreate: case EventVMDestroy:
+ case EventVMInit: case EventVMFinish:
case EventArenaWriteFaults:
case EventArenaAlloc: case EventArenaAllocFail: case EventArenaFree:
case EventSegAlloc: case EventSegAllocFail: case EventSegFree:
diff --git a/mps/code/vm.c b/mps/code/vm.c
index 2cbd24e9428..867db9e74ff 100644
--- a/mps/code/vm.c
+++ b/mps/code/vm.c
@@ -80,6 +80,17 @@ Size (VMMapped)(VM vm)
}
+/* VMCopy -- copy VM descriptor */
+
+void VMCopy(VM dest, VM src)
+{
+ AVER(dest != NULL);
+ AVERT(VM, src);
+
+ (void)mps_lib_memcpy(dest, src, sizeof(VMStruct));
+}
+
+
/* C. COPYRIGHT AND LICENSE
*
* Copyright (C) 2014 Ravenbrook Limited .
diff --git a/mps/code/vm.h b/mps/code/vm.h
index 5a44dd3bb98..992c318298b 100644
--- a/mps/code/vm.h
+++ b/mps/code/vm.h
@@ -10,7 +10,12 @@
#include "mpmtypes.h"
-/* VMStruct -- virtual memory structure */
+/* VMStruct -- virtual memory structure
+ *
+ * Unlike most other datatypes we permit this structure to be moved
+ * around in memory, and in particular, allocated temporarily on the
+ * stack, to help with bootstrapping. Look for uses of VMCopy.
+ */
#define VMSig ((Sig)0x519B3999) /* SIGnature VM */
@@ -34,14 +39,15 @@ extern Size PageSize(void);
extern Size (VMPageSize)(VM vm);
extern Bool VMCheck(VM vm);
extern Res VMParamFromArgs(void *params, size_t paramSize, ArgList args);
-extern Res VMCreate(VM vmReturn, Size size, Size grainSize, void *params);
-extern void VMDestroy(VM vm);
+extern Res VMInit(VM vmReturn, Size size, Size grainSize, void *params);
+extern void VMFinish(VM vm);
extern Addr (VMBase)(VM vm);
extern Addr (VMLimit)(VM vm);
extern Res VMMap(VM vm, Addr base, Addr limit);
extern void VMUnmap(VM vm, Addr base, Addr limit);
extern Size (VMReserved)(VM vm);
extern Size (VMMapped)(VM vm);
+extern void VMCopy(VM dest, VM src);
#endif /* vm_h */
diff --git a/mps/code/vman.c b/mps/code/vman.c
index c04ced10358..7fe30609763 100644
--- a/mps/code/vman.c
+++ b/mps/code/vman.c
@@ -29,9 +29,9 @@ Res VMParamFromArgs(void *params, size_t paramSize, ArgList args)
}
-/* VMCreate -- reserve some virtual address space, and create a VM structure */
+/* VMInit -- reserve some virtual address space, and create a VM structure */
-Res VMCreate(VM vm, Size size, Size grainSize, void *params)
+Res VMInit(VM vm, Size size, Size grainSize, void *params)
{
void *vbase;
Size pageSize, reserved;
@@ -75,14 +75,14 @@ Res VMCreate(VM vm, Size size, Size grainSize, void *params)
vm->sig = VMSig;
AVERT(VM, vm);
- EVENT3(VMCreate, vm, VMBase(vm), VMLimit(vm));
+ EVENT3(VMInit, vm, VMBase(vm), VMLimit(vm));
return ResOK;
}
-/* VMDestroy -- release all address space and finish VM structure */
+/* VMFinish -- release all address space and finish VM structure */
-void VMDestroy(VM vm)
+void VMFinish(VM vm)
{
AVERT(VM, vm);
/* Descriptor must not be stored inside its own VM at this point. */
@@ -91,7 +91,7 @@ void VMDestroy(VM vm)
/* All address space must have been unmapped. */
AVER(VMMapped(vm) == (Size)0);
- EVENT1(VMDestroy, vm);
+ EVENT1(VMFinish, vm);
vm->sig = SigInvalid;
diff --git a/mps/code/vmix.c b/mps/code/vmix.c
index 5ec355a74bc..61e093a02e8 100644
--- a/mps/code/vmix.c
+++ b/mps/code/vmix.c
@@ -24,7 +24,7 @@
* a definition of MAP_ANON requires a _BSD_SOURCE to be defined prior
* to ; see config.h.
*
- * .assume.not-last: The implementation of VMCreate assumes that
+ * .assume.not-last: The implementation of VMInit 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.
@@ -84,9 +84,9 @@ Res VMParamFromArgs(void *params, size_t paramSize, ArgList args)
}
-/* VMCreate -- reserve some virtual address space, and create a VM structure */
+/* VMInit -- reserve some virtual address space, and create a VM structure */
-Res VMCreate(VM vm, Size size, Size grainSize, void *params)
+Res VMInit(VM vm, Size size, Size grainSize, void *params)
{
Size pageSize, reserved;
void *vbase;
@@ -134,14 +134,14 @@ Res VMCreate(VM vm, Size size, Size grainSize, void *params)
vm->sig = VMSig;
AVERT(VM, vm);
- EVENT3(VMCreate, vm, VMBase(vm), VMLimit(vm));
+ EVENT3(VMInit, vm, VMBase(vm), VMLimit(vm));
return ResOK;
}
-/* VMDestroy -- release all address space and finish VM structure */
+/* VMFinish -- release all address space and finish VM structure */
-void VMDestroy(VM vm)
+void VMFinish(VM vm)
{
int r;
@@ -152,7 +152,7 @@ void VMDestroy(VM vm)
/* All address space must have been unmapped. */
AVER(VMMapped(vm) == (Size)0);
- EVENT1(VMDestroy, vm);
+ EVENT1(VMFinish, vm);
vm->sig = SigInvalid;
diff --git a/mps/code/vmw3.c b/mps/code/vmw3.c
index d79661bd3be..13c62b17c7e 100644
--- a/mps/code/vmw3.c
+++ b/mps/code/vmw3.c
@@ -90,9 +90,9 @@ Res VMParamFromArgs(void *params, size_t paramSize, ArgList args)
}
-/* VMCreate -- reserve some virtual address space, and create a VM structure */
+/* VMInit -- reserve some virtual address space, and create a VM structure */
-Res VMCreate(VM vm, Size size, Size grainSize, void *params)
+Res VMInit(VM vm, Size size, Size grainSize, void *params)
{
LPVOID vbase;
Size pageSize, reserved;
@@ -144,14 +144,14 @@ Res VMCreate(VM vm, Size size, Size grainSize, void *params)
vm->sig = VMSig;
AVERT(VM, vm);
- EVENT3(VMCreate, vm, VMBase(vm), VMLimit(vm));
+ EVENT3(VMInit, vm, VMBase(vm), VMLimit(vm));
return ResOK;
}
-/* VMDestroy -- release address space and finish the VM structure */
+/* VMFinish -- release address space and finish the VM structure */
-void VMDestroy(VM vm)
+void VMFinish(VM vm)
{
BOOL b;
@@ -162,7 +162,7 @@ void VMDestroy(VM vm)
/* All address space must have been unmapped. */
AVER(VMMapped(vm) == (Size)0);
- EVENT1(VMDestroy, vm);
+ EVENT1(VMFinish, vm);
vm->sig = SigInvalid;