VM Maker: VMMaker.oscog-eem.2691.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.2691.mcz

Eliot Miranda uploaded a new version of VMMaker to project VM Maker:

==================== Summary ====================

Name: VMMaker.oscog-eem.2691
Author: eem
Time: 30 January 2020, 3:51:09.421807 pm
UUID: d6b8b9b3-701f-47a6-a62b-6f95bfd498c3
Ancestors: VMMaker.oscog-nice.2690

CoInterpreter: eliminate all but one compiler warning.
Cogit: hey ho, initializeCodeZoneFrom:upTo:writableCodeZone: has got to go.

=============== Diff against VMMaker.oscog-nice.2690 ===============

Item was changed:
  ----- Method: CoInterpreter>>callbackEnter: (in category 'callback support') -----
  callbackEnter: callbackID
  "Re-enter the interpreter for executing a callback"
  | currentCStackPointer currentCFramePointer savedReenterInterpreter
   wasInMachineCode calledFromMachineCode |
  <export: true>
+ <var: #currentCStackPointer type: #usqIntptr_t>
+ <var: #currentCFramePointer type: #usqIntptr_t>
- <var: #currentCStackPointer type: #'void *'>
- <var: #currentCFramePointer type: #'void *'>
  <var: #callbackID type: #'sqInt *'>
  <var: #savedReenterInterpreter type: #'jmp_buf'>
  "For now, do not allow a callback unless we're in a primitiveResponse"
  (self asserta: primitiveFunctionPointer ~= 0) ifFalse:
  self assert: primFailCode = 0.
  "Check if we've exceeded the callback depth"
  (self asserta: jmpDepth < MaxJumpBuf) ifFalse:
  jmpDepth := jmpDepth + 1.
  wasInMachineCode := self isMachineCodeFrame: framePointer.
  calledFromMachineCode := instructionPointer <= objectMemory startOfMemory.
  "Suspend the currently active process"
  suspendedCallbacks at: jmpDepth put: self activeProcess.
  "We need to preserve newMethod explicitly since it is not activated yet
  and therefore no context has been created for it. If the caller primitive
  for any reason decides to fail we need to make sure we execute the correct
  method and not the one 'last used' in the call back"
  suspendedMethods at: jmpDepth put: newMethod.
  self flag: 'need to debug this properly.  Conceptually it is the right thing to do but it crashes in practice'.
  ["Signal external semaphores since a signalSemaphoreWithIndex: request may
   have been issued immediately prior to this callback before the VM has any
   chance to do a signalExternalSemaphores in checkForEventsMayContextSwitch:"
  self signalExternalSemaphores.
  "If no process is awakened by signalExternalSemaphores then transfer
   to the highest priority runnable one."
  (suspendedCallbacks at: jmpDepth) = self activeProcess ifTrue:
  [self transferTo: self wakeHighestPriority from: CSCallbackLeave]]
  [self transferTo: self wakeHighestPriority from: CSCallbackLeave].
  "Typically, invoking the callback means that some semaphore has been
  signaled to indicate the callback. Force an interrupt check as soon as possible."
  self forceInterruptCheck.
  "Save the previous CStackPointers and interpreter entry jmp_buf."
  currentCStackPointer := CStackPointer.
  currentCFramePointer := CFramePointer.
  self memcpy: savedReenterInterpreter asVoidPointer
  _: reenterInterpreter
  _: (self sizeof: #'jmp_buf').
  cogit assertCStackWellAligned.
  (self setjmp: (jmpBuf at: jmpDepth)) = 0 ifTrue: "Fill in callbackID"
  [callbackID at: 0 put: jmpDepth.
  self enterSmalltalkExecutive.
  self assert: false "NOTREACHED"].
  "Restore the previous CStackPointers and interpreter entry jmp_buf."
  self setCFramePointer: currentCFramePointer setCStackPointer: currentCStackPointer.
  self memcpy: reenterInterpreter
  _: (self cCoerceSimple: savedReenterInterpreter to: #'void *')
  _: (self sizeof: #'jmp_buf').
  "Transfer back to the previous process so that caller can push result"
  self putToSleep: self activeProcess yieldingIf: preemptionYields.
  self transferTo: (suspendedCallbacks at: jmpDepth) from: CSCallbackLeave.
  newMethod := suspendedMethods at: jmpDepth. "see comment above"
  argumentCount := self argumentCountOf: newMethod.
  self assert: wasInMachineCode = (self isMachineCodeFrame: framePointer).
  [instructionPointer asUnsignedInteger >= objectMemory startOfMemory ifTrue:
  [self iframeSavedIP: framePointer put: instructionPointer.
  instructionPointer := cogit ceReturnToInterpreterPC]]
  ["Even if the context was flushed to the heap and rebuilt in transferTo:from:
   above it will remain an interpreted frame because the context's pc would
   remain a bytecode pc.  So the instructionPointer must also be a bytecode pc."
  self assert: (self isMachineCodeFrame: framePointer) not.
  self assert: instructionPointer > objectMemory startOfMemory].
  self assert: primFailCode = 0.
  jmpDepth := jmpDepth-1.

Item was changed:
  ----- Method: CoInterpreter>>mcprimFunctionForPrimitiveIndex: (in category 'cog jit support') -----
  mcprimFunctionForPrimitiveIndex: primIndex
  primIndex = PrimNumberHashMultiply ifTrue:
+ [^self cCoerceSimple: #mcprimHashMultiply: to: #sqInt].
- [^#mcprimHashMultiply:].
  self error: 'unknown mcprim'.

Item was changed:
  ----- Method: CoInterpreter>>saveCStackStateForCallbackContext: (in category 'callback support') -----
  saveCStackStateForCallbackContext: vmCallbackContext
  <var: #vmCallbackContext type: #'VMCallbackContext *'>
+ savedCStackPointer: CStackPointer asVoidPointer;
+ savedCFramePointer: CFramePointer asVoidPointer.
- savedCStackPointer: CStackPointer;
- savedCFramePointer: CFramePointer.
  super saveCStackStateForCallbackContext: vmCallbackContext!

Item was removed:
- ----- Method: Cogit>>initializeCodeZoneFrom:upTo:writableCodeZone: (in category 'initialization') -----
- initializeCodeZoneFrom: startAddress upTo: endAddress writableCodeZone: writableCodeZone
- <api>
- <var: 'startAddress' type: #usqInt>
- <var: 'endAddress' type: #usqInt>
- <var: 'writableCodeZone' type: #usqInt>
- "If the OS platform requires dual mapping to achieve a writable code zone
- then startAddress will be the non-zero address of the read/write zone and
- executableCodeZone will be the non-zero address of the read/execute zone.
- If the OS platform does not require dual mapping then startAddress will be
- the first address of the read/write/executable zone and executableCodeZone
- will be zero."
- self initializeBackend.
- codeToDataDelta := writableCodeZone = 0 ifTrue: [0] ifFalse: [writableCodeZone - startAddress].
- backEnd stopsFrom: startAddress to: endAddress - 1.
- self cCode:
- [writableCodeZone = 0 ifTrue:
- [self sqMakeMemoryExecutableFrom: startAddress To: endAddress]]
- inSmalltalk:
- [startAddress = self class guardPageSize ifTrue:
- [backEnd stopsFrom: 0 to: endAddress - 1].
- self initializeProcessor].
- codeBase := methodZoneBase := startAddress.
- minValidCallAddress := (codeBase min: coInterpreter interpretAddress) min: coInterpreter primitiveFailAddress.
- methodZone manageFrom: methodZoneBase to: endAddress.
- self assertValidDualZone.
- self maybeGenerateCheckFeatures.
- self maybeGenerateCheckLZCNT.
- self maybeGenerateICacheFlush.
- self generateVMOwnerLockFunctions.
- self genGetLeafCallStackPointer.
- self generateStackPointerCapture.
- self generateTrampolines.
- self computeEntryOffsets.
- self computeFullBlockEntryOffsets.
- self generateClosedPICPrototype.
- self alignMethodZoneBase.
- "repeat so that now the methodZone ignores the generated run-time"
- methodZone manageFrom: methodZoneBase to: endAddress.
- "N.B. this is assumed to be the last thing done in initialization; see Cogit>>initialized"
- self generateOpenPICPrototype!