Eliot Miranda uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-eem.3091.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.3091 Author: eem Time: 15 October 2021, 7:16:26.376829 pm UUID: 264f2183-0530-4514-8a64-3e03a75335fa Ancestors: VMMaker.oscog-eem.3090
ARMv8 8.1: fix generateLowLevelTryLock: so that it answers if vmOwner is set to the desired value (i.e. if already set to the desired value, still answer true).
Comment the cack-handed hack in withProcessorHaltedDo: and have the code not destroy a break pc within ceTryLockVMOwner.
firstMappedPCFor: needs a guard.
Fix a couple of comments.
=============== Diff against VMMaker.oscog-eem.3090 ===============
Item was changed: ----- Method: CogARMCompiler>>hasDoublePrecisionFloatingPointSupport (in category 'testing') ----- hasDoublePrecisionFloatingPointSupport - "might be true, but is for the forseeable future disabled" ^true!
Item was changed: ----- Method: CogARMv8Compiler>>generateLowLevelTryLock: (in category 'multi-threading') ----- generateLowLevelTryLock: vmOwnerLockAddress "Generate a function that attempts to lock the vmOwnerLock to the argument and answers if it succeeded." <inline: true> | lockValueReg vmOwnerLockAddressReg br statusReg ldaxr | vmOwnerLockAddress = 0 ifTrue: [cogit MoveCq: 1 R: ABIResultReg; RetN: 0. ^self].
"spiffy 8.1 version using CASAL..." lockValueReg := CArg1Reg. "Holds the value of lock if unlocked (zero), receives the existing value of the lock" vmOwnerLockAddressReg := CArg2Reg. self hasAtomicInstructions ifTrue: [cogit MoveCq: 0 R: lockValueReg; MoveCq: vmOwnerLockAddress R: vmOwnerLockAddressReg; + gen: CASAL operand: lockValueReg operand: CArg0Reg operand: vmOwnerLockAddressReg. + br := cogit gen: CBNZ operand: 0 operand: lockValueReg. + cogit + MoveCq: 1 R: ABIResultReg; - gen: CASAL operand: lockValueReg operand: CArg0Reg operand: vmOwnerLockAddressReg; - CmpCq: 0 R: lockValueReg; - gen: CCMPNE operand: ABIResultReg operand: lockValueReg operand: 0 "nzcv all false"; "i.e. if NE to 0, then is it already set to the argument?" - gen: CSET operand: ABIResultReg operand: EQ; RetN: 0. + br jmpTarget: (cogit CmpR: ABIResultReg R: lockValueReg). + cogit + gen: CSET operand: ABIResultReg operand: EQ; "i.e. if NE to 0, then is it already set to the argument?" + RetN: 0. ^self].
"frumpy 8.0 version using LDAXR/STLXR" cogit MoveCq: vmOwnerLockAddress R: vmOwnerLockAddressReg. cogit MoveCq: 0 R: (statusReg := CArg3Reg). "STLXR sets a word status register; clearing the top bits means it's a non-issue" ldaxr := cogit gen: LDAXR operand: lockValueReg operand: vmOwnerLockAddressReg. br := cogit gen: CBNZ operand: 0 operand: lockValueReg. cogit gen: STLXR operand: CArg0Reg operand: vmOwnerLockAddressReg operand: statusReg. cogit gen: CBNZ operand: ldaxr asUnsignedInteger operand: statusReg. "Since CArg0Reg is never zero, merely returning answers true" cogit RetN: 0. br jmpTarget: (cogit gen: CLREX). cogit CmpR: ABIResultReg R: lockValueReg. cogit gen: CSET operand: ABIResultReg operand: EQ. "i.e. if NE to 0, then is it already set to the argument?" cogit RetN: 0. ^self!
Item was changed: ----- Method: CogIA32Compiler>>generateLowLevelTryLock: (in category 'multi-threading') ----- generateLowLevelTryLock: vmOwnerLockAddress + "Generate a function that attempts to lock the vmOwnerLock and answers if it succeeded." - "Generate a function that attempts to lock the vmOwnerLock and answers - true if it succeeded." <inline: true> | valueReg | vmOwnerLockAddress = 0 ifTrue: [cogit MoveCq: 1 R: ABIResultReg; RetN: 0. ^self]. valueReg := cogit availableRegisterOrNoneIn: (ABICallerSavedRegisterMask bitClear: 1 << EAX). cogit MoveMw: 4 r: ESP R: valueReg; MoveCq: 0 R: EAX; gen: LOCK; gen: CMPXCHGRAw operand: valueReg operand: vmOwnerLockAddress; gen: SETE operand: ABIResultReg; "a.k.a. EAX" RetN: 0!
Item was changed: ----- Method: Cogit>>firstMappedPCFor: (in category 'method map') ----- firstMappedPCFor: cogMethod <var: #cogMethod type: #'CogMethod *'> <inline: true> + ^(cogMethod cmType < CMClosedPIC and: [cogMethod cmIsFullBlock]) - ^cogMethod cmIsFullBlock ifTrue: [cogMethod asUnsignedInteger + cbNoSwitchEntryOffset] ifFalse: [cogMethod asUnsignedInteger + cmNoCheckEntryOffset]!
Item was changed: ----- Method: Cogit>>withProcessorHaltedDo: (in category 'simulation processor access') ----- withProcessorHaltedDo: aBlock ^processorLock critical: + ["This is a kack-handed attempt at stopping all other threads while this routine is running. + Anyway, don't set breakPC to true if trying to break within ceTryLockVMOwner" + | oldBreakPC oldSingleStep | - [| oldBreakPC oldSingleStep | oldBreakPC := breakPC. oldSingleStep := singleStep. + singleStep := true. + (breakPC isInteger and: [breakPC between: ceTryLockVMOwner and: ceGetFP - 1]) ifFalse: + [breakPC := true]. - breakPC := singleStep := true. aBlock ensure: [singleStep := oldSingleStep. breakPC := oldBreakPC]]!
vm-dev@lists.squeakfoundation.org