VM Maker: VMMaker.oscog-eem.558.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

VM Maker: VMMaker.oscog-eem.558.mcz

commits-2
 
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)]]!