Eliot Miranda uploaded a new version of Cog to project VM Maker: http://source.squeak.org/VMMaker/Cog-eem.421.mcz ==================== Summary ==================== Name: Cog-eem.421 Author: eem Time: 28 October 2020, 11:53:43.385785 pm UUID: 0ace52a2-3ab3-4b9f-bdc5-890dba71fbaa Ancestors: Cog-eem.420 Modify dispatch of ProcessorSimulationTraps to doiuble dispatching (ProcessorSimulationTrap>>applyTo:). Extent the set of traps with CompareAndSwapSimulationTrap. Support MultiProcessor in goig with the flow by having CompareAndSwapSimulationTrap resume always with teh nonVirtualProcessor. =============== Diff against Cog-eem.420 =============== Item was added: + ProcessorSimulationTrap subclass: #CompareAndSwapSimulationTrap + instanceVariableNames: 'expectedValue storedValue' + classVariableNames: '' + poolDictionaries: '' + category: 'Cog-Processors'! Item was added: + ----- Method: CompareAndSwapSimulationTrap>>applyTo: (in category 'double dispatching') ----- + applyTo: aCogit + ^aCogit handleCompareAndSwapSimulationTrap: self! Item was added: + ----- Method: CompareAndSwapSimulationTrap>>expectedValue (in category 'accessing') ----- + expectedValue + + ^expectedValue! Item was added: + ----- Method: CompareAndSwapSimulationTrap>>expectedValue: (in category 'accessing') ----- + expectedValue: anObject + + expectedValue := anObject! Item was added: + ----- Method: CompareAndSwapSimulationTrap>>storedValue (in category 'accessing') ----- + storedValue + + ^storedValue! Item was added: + ----- Method: CompareAndSwapSimulationTrap>>storedValue: (in category 'accessing') ----- + storedValue: anObject + + storedValue := anObject! Item was added: + ----- Method: Exception>>isProcessorSimulationTrap (in category '*Cog-Processors-testing') ----- + isProcessorSimulationTrap + ^false! Item was changed: ----- Method: GdbARMv8AlienTests>>testNfib1 (in category 'tests') ----- testNfib1 "self new testNfib1" self should: [self runNFib: 1 disassemble: false printRegisters: false] raise: Error withExceptionDo: [:err| + self assert: err isProcessorSimulationTrap. - self assert: err class = ProcessorSimulationTrap. self assert: #return = err type. self assert: 16r1000 equals: err address]. self deny: (self processor pc between: 0 and: self nfib size). self assert: self processor r0 = 1 benchFib! Item was changed: ----- Method: MultiProcessor>>doesNotUnderstand: (in category 'message forwarding') ----- doesNotUnderstand: aMessage "Forward a message to the actual processor, managing a thread-switch if necessary. Catch ProcessorSimulationTraps and raise them outside of the critical section to avoid deadlock when reentering the VM from a trap and switching threads in the run-time." | selector result trap contextInCritical | selector := aMessage selector. (guardedProcessorProtocol includes: selector) ifFalse: [^(unguardedProcessorProtocol includes: selector) ifTrue: [processor perform: selector withArguments: aMessage arguments] ifFalse: [super doesNotUnderstand: aMessage]]. result := [mutex critical: [contextInCritical := thisContext. owner ~~ mutex owningProcess ifTrue: [owner ifNotNil: [registerState at: owner put: processor registerState]. (registerState at: (owner := mutex owningProcess) ifAbsent: nil) ifNil: [coInterpreter initializeProcessorForThreadIndex: (threadIndex := threadIndex + 1)] ifNotNil: [:newState| processor setRegisterState: newState]]. processor perform: selector withArguments: aMessage arguments]] on: ProcessorSimulationTrap, Error, AssertionFailure do: [:ex| + ex isProcessorSimulationTrap ifFalse: - ex class == ProcessorSimulationTrap ifFalse: [ex pass]. "Alas things are not so simple with ARMv8 ldp/stp... The comments in these two methods explain..." (self isAboutToReturn: ex signalerContext) ifFalse: [self saveStackFor: ex signalerContext above: contextInCritical homeContext: thisContext home]. trap := ex]. ^trap ifNil: [result] ifNotNil: [trap signal ifNotNil: [:resultOfSignal| resultOfSignal == self ifTrue: [processor] ifFalse: [resultOfSignal]]]! Item was added: + ----- Method: ProcessorSimulationTrap>>applyTo: (in category 'double dispatching') ----- + applyTo: aCogit + type == #read ifTrue: + [^aCogit handleReadSimulationTrap: self]. + (type == #call or: [type == #jump]) ifTrue: + [^aCogit handleCallOrJumpSimulationTrap: self]. + type == #write ifTrue: + [^aCogit handleWriteSimulationTrap: self]. + self assert: type == #return. + ^aCogit handleReturnSimulationTrap: self! Item was added: + ----- Method: ProcessorSimulationTrap>>isProcessorSimulationTrap (in category 'testing') ----- + isProcessorSimulationTrap + ^true! Item was added: + ----- Method: ProcessorSimulationTrap>>resume: (in category 'handling') ----- + resume: aProcessorSimulator + ^super resume: aProcessorSimulator nonVirtualProcessor! |
Free forum by Nabble | Edit this page |