Copied from Perforce
 Change: 186667
 ServerID: perforce.ravenbrook.com
This commit is contained in:
Gareth Rees 2014-06-18 15:36:35 +01:00
parent adb0d27e3a
commit 71c820ca54
8 changed files with 60 additions and 43 deletions

View file

@ -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);
}

View file

@ -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) \

View file

@ -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:

View file

@ -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 <http://www.ravenbrook.com/>.

View file

@ -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 */

View file

@ -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;

View file

@ -24,7 +24,7 @@
* a definition of MAP_ANON requires a _BSD_SOURCE to be defined prior
* to <sys/mman.h>; 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;

View file

@ -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;