From 71c820ca54e4accbfeb5d5cfa2451f4f5bf4bf19 Mon Sep 17 00:00:00 2001 From: Gareth Rees Date: Wed, 18 Jun 2014 15:36:35 +0100 Subject: [PATCH] Fix problems noted by rb in review Copied from Perforce Change: 186667 ServerID: perforce.ravenbrook.com --- mps/code/arenavm.c | 30 +++++++++++++++--------------- mps/code/eventdef.h | 10 +++++----- mps/code/eventrep.c | 2 +- mps/code/vm.c | 11 +++++++++++ mps/code/vm.h | 12 +++++++++--- mps/code/vman.c | 12 ++++++------ mps/code/vmix.c | 14 +++++++------- mps/code/vmw3.c | 12 ++++++------ 8 files changed, 60 insertions(+), 43 deletions(-) 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;