static void VMChunkFinish(Chunk chunk) { VMChunk vmChunk = Chunk2VMChunk(chunk); vmArenaUnmap(VMChunkVMArena(vmChunk), vmChunk->vm, VMBase(vmChunk->vm), vmChunk->overheadMappedLimit); /* No point in finishing the other fields, since they are unmapped. */ }
static Res VMChunkInit(Chunk chunk, BootBlock boot) { VMChunk vmChunk; Addr overheadLimit; void *p; Res res; BT saMapped, saPages; /* chunk is supposed to be uninitialized, so don't check it. */ vmChunk = Chunk2VMChunk(chunk); AVERT(BootBlock, boot); res = BootAlloc(&p, boot, BTSize(chunk->pages), MPS_PF_ALIGN); if (res != ResOK) goto failSaMapped; saMapped = p; res = BootAlloc(&p, boot, BTSize(chunk->pageTablePages), MPS_PF_ALIGN); if (res != ResOK) goto failSaPages; saPages = p; overheadLimit = AddrAdd(chunk->base, (Size)BootAllocated(boot)); /* Put the page table as late as possible, as in VM systems we don't want */ /* to map it. */ res = BootAlloc(&p, boot, chunk->pageTablePages << chunk->pageShift, chunk->pageSize); if (res != ResOK) goto failAllocPageTable; chunk->pageTable = p; /* Map memory for the bit tables. */ if (vmChunk->overheadMappedLimit < overheadLimit) { overheadLimit = AddrAlignUp(overheadLimit, ChunkPageSize(chunk)); res = vmArenaMap(VMChunkVMArena(vmChunk), vmChunk->vm, vmChunk->overheadMappedLimit, overheadLimit); if (res != ResOK) goto failTableMap; vmChunk->overheadMappedLimit = overheadLimit; } SparseArrayInit(&vmChunk->pages, chunk->pageTable, sizeof(PageUnion), chunk->pages, saMapped, saPages, vmChunk->vm); return ResOK; /* .no-clean: No clean-ups needed for boot, as we will discard the chunk. */ failTableMap: failSaPages: failAllocPageTable: failSaMapped: return res; }
static void VMChunkFinish(Chunk chunk) { VMStruct vmStruct; VM vm = &vmStruct; VMChunk vmChunk = Chunk2VMChunk(chunk); /* Copy VM descriptor to stack-local storage so that we can continue * using the descriptor after the VM has been unmapped. */ VMCopy(vm, VMChunkVM(vmChunk)); vmArenaUnmap(VMChunkVMArena(vmChunk), vm, VMBase(vm), vmChunk->overheadMappedLimit); /* No point in finishing the other fields, since they are unmapped. */ VMFinish(vm); }