Eliot Miranda uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-eem.558.mcz ==================== Summary ==================== Name: VMMaker.oscog-eem.558 Author: eem Time: 11 December 2013, 2:58:59.198 pm UUID: ef7afd3b-c404-472c-a05a-9d9c6d905052 Ancestors: VMMaker.oscog-eem.557 Fix freeChunk swizzling on load (next address link's value is transitory, being valid only during fullGC. Fix SpurMemoryManager>>defaultEdenBytes. Fix setting of scavengeThreshold in simulation (avoid fractions). Make CogVMSimulator>>openOn:extraMemory: more like StackInterpreterSimulator>>openOn:extraMemory:. Spur snapshot now functional, at least in simulation. =============== Diff against VMMaker.oscog-eem.557 =============== Item was changed: ----- Method: CogVMSimulator>>openOn:extraMemory: (in category 'initialization') ----- openOn: fileName extraMemory: extraBytes "CogVMSimulator new openOn: 'clone.im' extraMemory: 100000" + | f version headerSize dataSize count oldBaseAddr bytesToShift swapBytes + headerFlags firstSegSize heapSize + hdrNumStackPages hdrEdenBytes hdrMaxExtSemTabSize + hdrCogCodeSize stackZoneSize methodCacheSize primTraceLogSize | - | f version headerSize count heapSize oldBaseAddr bytesToShift swapBytes hdrNumStackPages - hdrEdenBytes hdrCogCodeSize stackZoneSize methodCacheSize headerFlags primTraceLogSize firstSegSize hdrMaxExtSemTabSize | "open image file and read the header" ["begin ensure block..." f := FileStream readOnlyFileNamed: fileName. imageName := f fullName. f binary. version := self nextLongFrom: f. "current version: 16r1968 (=6504) vive la revolucion!!" (self readableFormat: version) ifTrue: [swapBytes := false] ifFalse: [(version := objectMemory byteSwapped: version) = self imageFormatVersion ifTrue: [swapBytes := true] ifFalse: [self error: 'incomaptible image format']]. headerSize := self getLongFromFile: f swap: swapBytes. + dataSize := self getLongFromFile: f swap: swapBytes. "length of heap in file" - heapSize := self getLongFromFile: f swap: swapBytes. "length of heap in file" oldBaseAddr := self getLongFromFile: f swap: swapBytes. "object memory base address of image" objectMemory specialObjectsOop: (self getLongFromFile: f swap: swapBytes). objectMemory lastHash: (self getLongFromFile: f swap: swapBytes). "Should be loaded from, and saved to the image header" savedWindowSize := self getLongFromFile: f swap: swapBytes. headerFlags := self getLongFromFile: f swap: swapBytes. self setImageHeaderFlagsFrom: headerFlags. extraVMMemory := self getLongFromFile: f swap: swapBytes. hdrNumStackPages := self getShortFromFile: f swap: swapBytes. "4 stack pages is small. Should be able to run with as few as three. 4 should be comfortable but slow. 8 is a reasonable default. Can be changed via vmParameterAt: 43 put: n" numStackPages := desiredNumStackPages ~= 0 ifTrue: [desiredNumStackPages] ifFalse: [hdrNumStackPages = 0 ifTrue: [self defaultNumStackPages] ifFalse: [hdrNumStackPages]]. desiredNumStackPages := hdrNumStackPages. stackZoneSize := self computeStackZoneSize. "This slot holds the size of the native method zone in 1k units. (pad to word boundary)." hdrCogCodeSize := (self getShortFromFile: f swap: swapBytes) * 1024. cogCodeSize := desiredCogCodeSize ~= 0 ifTrue: [desiredCogCodeSize] ifFalse: [hdrCogCodeSize = 0 ifTrue: [self defaultCogCodeSize] ifFalse: [hdrCogCodeSize]]. desiredCogCodeSize := hdrCogCodeSize. self assert: f position = 40. hdrEdenBytes := self getLongFromFile: f swap: swapBytes. objectMemory edenBytes: (desiredEdenBytes ~= 0 ifTrue: [desiredEdenBytes] ifFalse: [hdrEdenBytes = 0 ifTrue: [objectMemory defaultEdenBytes] ifFalse: [hdrEdenBytes]]). desiredEdenBytes := hdrEdenBytes. hdrMaxExtSemTabSize := self getShortFromFile: f swap: swapBytes. hdrMaxExtSemTabSize ~= 0 ifTrue: [self setMaxExtSemSizeTo: hdrMaxExtSemTabSize]. "pad to word boundary. This slot can be used for anything else that will fit in 16 bits. Preserve it to be polite to other VMs." the2ndUnknownShort := self getShortFromFile: f swap: swapBytes. self assert: f position = 48. firstSegSize := self getLongFromFile: f swap: swapBytes. objectMemory firstSegmentSize: firstSegSize. "For Open PICs to be able to probe the method cache during simulation the methodCache must be relocated to memory." methodCacheSize := methodCache size * BytesPerWord. primTraceLogSize := primTraceLog size * BytesPerWord. "allocate interpreter memory. This list is in address order, low to high. In the actual VM the stack zone exists on the C stack." heapBase := (Cogit guardPageSize + cogCodeSize + stackZoneSize + methodCacheSize + primTraceLogSize + self rumpCStackSize) roundUpTo: objectMemory allocationUnit. + heapSize := dataSize + + extraBytes + + objectMemory newSpaceBytes + + self interpreterAllocationReserveBytes + + (objectMemory hasSpurMemoryManagerAPI + ifTrue: [headerSize] + ifFalse: [0]). heapBase := objectMemory setHeapBase: heapBase + memoryLimit: heapBase + heapSize + endOfMemory: heapBase + dataSize. - memoryLimit: heapBase - + heapSize - + objectMemory newSpaceBytes - + self interpreterAllocationReserveBytes - + extraBytes - endOfMemory: heapBase + heapSize. self assert: cogCodeSize \\ 4 = 0. self assert: objectMemory memoryLimit \\ 4 = 0. self assert: self rumpCStackSize \\ 4 = 0. "read in the image in bulk, then swap the bytes if necessary" f position: headerSize. objectMemory memory: ((cogit processor endianness == #little ifTrue: [LittleEndianBitmap] ifFalse: [Bitmap]) new: objectMemory memoryLimit // 4). + count := objectMemory readHeapFromImageFile: f dataBytes: dataSize. + count ~= dataSize ifTrue: [self halt]. - count := objectMemory readHeapFromImageFile: f dataBytes: heapSize. - count ~= heapSize ifTrue: [self halt]. ] ensure: [f close]. self moveMethodCacheToMemoryAt: objectMemory cogCodeBase + cogCodeSize + stackZoneSize. self movePrimTraceLogToMemoryAt: objectMemory cogCodeBase + cogCodeSize + stackZoneSize + methodCacheSize. self ensureImageFormatIsUpToDate: swapBytes. bytesToShift := objectMemory memoryBaseForImageRead - oldBaseAddr. "adjust pointers for zero base address" Utilities informUser: 'Relocating object pointers...' during: [self initializeInterpreter: bytesToShift]. self initializeCodeGenerator! Item was changed: ----- Method: SpurMemoryManager>>defaultEdenBytes (in category 'snapshot') ----- defaultEdenBytes + "Return the default amount of memory to allocate for the eden space. + The actual value can be set via vmParameterAt: and/or a preference in the ini file." + <inline: false> + ^2 * 1024 * 1024! - ^2 * 1024 * 1024 - + (coInterpreter interpreterAllocationReserveBytes - * self scavengerDenominator + self numSurvivorSpaces // self scavengerDenominator)! Item was changed: ----- Method: SpurMemoryManager>>initializeNewSpaceVariables (in category 'gc - scavenging') ----- initializeNewSpaceVariables freeStart := scavenger eden start. pastSpaceStart := scavenger pastSpace start. scavengeThreshold := scavenger eden limit + - (scavenger edenBytes // 64) - - (scavenger edenBytes / 64) - coInterpreter interpreterAllocationReserveBytes. newSpaceStart := scavenger pastSpace start min: scavenger futureSpace start. self assert: newSpaceStart < scavenger eden start. self initSpaceForAllocationCheck: (self addressOf: scavenger eden)! Item was changed: ----- Method: SpurMemoryManager>>initializePostBootstrap (in category 'spur bootstrap') ----- initializePostBootstrap "The heap has just been bootstrapped into a modified newSpace occupying all of memory above newSpace (and the codeZone). Put things back to some kind of normalcy." freeOldSpaceStart := freeStart. freeStart := scavenger eden start. pastSpaceStart := scavenger pastSpace start. + scavengeThreshold := scavenger eden limit - (scavenger edenBytes // 64)! - scavengeThreshold := scavenger eden limit - (scavenger edenBytes / 64)! Item was changed: ----- Method: SpurMemoryManager>>swizzleFieldsOfFreeChunk: (in category 'snapshot') ----- swizzleFieldsOfFreeChunk: chunk <inline: true> + | field | + field := self fetchPointer: self freeChunkNextIndex ofFreeChunk: chunk. + field ~= 0 ifTrue: + [self storePointerNoAssert: self freeChunkNextIndex + ofFreeChunk: chunk + withValue: (segmentManager swizzleObj: field)]. + (self bytesInObject: chunk) / self allocationUnit >= self numFreeLists ifTrue: + [self freeChunkParentIndex to: self freeChunkLargerIndex do: + [:index| + field := self fetchPointer: index ofFreeChunk: chunk. + field ~= 0 ifTrue: + [self storePointerNoAssert: index + ofFreeChunk: chunk + withValue: (segmentManager swizzleObj: field)]]]! - 0 to: ((self bytesInObject: chunk) / self allocationUnit > self numFreeLists - ifTrue: [self freeChunkLargerIndex] - ifFalse: [self freeChunkNextIndex]) - do: [:index| | field | - field := self fetchPointer: index ofFreeChunk: chunk. - field ~= 0 ifTrue: - [self storePointerNoAssert: index - ofFreeChunk: chunk - withValue: (segmentManager swizzleObj: field)]]! |
Free forum by Nabble | Edit this page |