[Vm-dev] VM Maker: Cog-eem.422.mcz

commits at source.squeak.org commits at source.squeak.org
Fri Oct 30 01:07:29 UTC 2020


Eliot Miranda uploaded a new version of Cog to project VM Maker:
http://source.squeak.org/VMMaker/Cog-eem.422.mcz

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

Name: Cog-eem.422
Author: eem
Time: 29 October 2020, 6:07:26.875213 pm
UUID: 85b1cd7f-c753-4a65-9100-9f2408ba0f5c
Ancestors: Cog-eem.421

Compare-and-swap support for BochsX64Alien

=============== Diff against Cog-eem.421 ===============

Item was added:
+ ----- Method: BochsIA32Alien>>abiMarshallArg0: (in category 'accessing-abstract') -----
+ abiMarshallArg0: arg0
+ 	"Marshall one integral argument according to the ABI.
+ 	 Currently used in the COGMTVM to tryLockVMOwner:"
+ 	self push: arg0!

Item was changed:
  ----- Method: BochsX64Alien class>>initialize (in category 'class initialization') -----
  initialize
  	"BochsX64Alien initialize"
  	| it |
  	it := self basicNew.
  	OpcodeExceptionMap := Array new: 256 withAll: #handleExecutionPrimitiveFailureAt:in:rex:.
  	OpcodeExceptionMap
  		at: 1 + it twoByteEscape				put: #handleTwoByteEscapeFailureAt:in:rex:;
  		at: 1 + it operandSizeOverridePrefix	put: #handleOperandSizeOverridePrefixFailureAt:in:rex:;
  		at: 1 + it callOpcode		put: #handleCallFailureAt:in:rex:;
  		at: 1 + it jmpOpcode		put: #handleJmpFailureAt:in:rex:;
  		at: 1 + it retOpcode		put: #handleRetFailureAt:in:rex:;
  		at: 1 + it movALObOpcode	put: #handleMovALObFailureAt:in:rex:;
  		at: 1 + it movAXOvOpcode	put: #handleMovAXOvFailureAt:in:rex:;
  		at: 1 + it movObALOpcode	put: #handleMovObALFailureAt:in:rex:;
  		at: 1 + it movOvAXOpcode	put: #handleMovOvAXFailureAt:in:rex:;
  		at: 1 + it movGvEvOpcode	put: #handleMovGvEvFailureAt:in:rex:;
  		at: 1 + it movEvGvOpcode	put: #handleMovEvGvFailureAt:in:rex:;
  		at: 1 + it movGbEbOpcode	put: #handleMovGbEbFailureAt:in:rex:;
  		at: 1 + it movEbGbOpcode	put: #handleMovEbGbFailureAt:in:rex:;
+ 		at: 1 + 16rF0				put: #handleGroup6through10FailureAt:in:rex:; "Table A6 One-Byte and Two-Byte Opcode ModRM Extensions"
  		at: 1 + 16rFE				put: #handleGroup4FailureAt:in:rex:; "Table A6 One-Byte and Two-Byte Opcode ModRM Extensions"
  		at: 1 + 16rFF				put: #handleGroup5FailureAt:in:rex:. "Table A6 One-Byte and Two-Byte Opcode ModRM Extensions"
  	ExtendedOpcodeExceptionMap := Array new: 256 withAll: #handleExecutionPrimitiveFailureAt:in:rex:.
  	ExtendedOpcodeExceptionMap
  		at: 1 + it movGvEbOpcode put: #handleMovGvEbFailureAt:in:rex:!

Item was added:
+ ----- Method: BochsX64Alien>>abiMarshallArg0: (in category 'accessing-abstract') -----
+ abiMarshallArg0: arg0
+ 	"Marshall one integral argument according to the ABI.
+ 	 Currently used in the COGMTVM to tryLockVMOwner:"
+ 	(CogX64Compiler classPool at: #CArg0Reg) = 1
+ 		ifTrue: [self rcx: arg0] "Hack; Win64"
+ 		ifFalse: [self rdi: arg0] "Hack; SysV"!

Item was changed:
  ----- Method: BochsX64Alien>>decorateDisassembly:for:fromAddress: (in category 'disassembly') -----
  decorateDisassembly: anInstructionString for: aSymbolManager "<Cogit>" fromAddress: address
  	| string i1 i2 v o extra |
  	string := PrintCodeBytes
  				ifTrue: [anInstructionString]
  				ifFalse: [anInstructionString copyFrom: 1 to: (anInstructionString lastIndexOf: $:) - 1]. "trailing space useful for parsing numbers"
  	aSymbolManager relativeBaseForDisassemblyInto:
  		[:baseAddress :baseName|
  		string := baseName, '+', (address - baseAddress printStringBase: 16 length: 4 padded: true), (string copyFrom: (string indexOf: $:) + 1 to: string size)].
  	((i1 := string indexOfSubCollection: '%ds:(') > 0
  	or: [(i1 := string indexOfSubCollection: '%ss:(') > 0]) ifTrue:
+ 		[string := string copyReplaceFrom: i1
+ 						to: i1 + 3
+ 						with: ((string copyFrom: i1 to: i1 + 9) = '%ds:(%rbx)'
+ 									ifTrue: ['%ds:0x0']"So the next clause finds it..."
+ 									ifFalse: [''])].
- 		[string := string copyReplaceFrom: i1 to: i1 + 3 with: ''].
  	(i1 := string indexOfSubCollection: '%ds:0x') > 0 ifTrue:
  		[i2 := i1 + 6.
  		 ['0123456789abcdef' includes: (string at: i2)] whileTrue: [i2 := i2 + 1].
  		 (v := string copyFrom: i2 to: (i2 + 5 min: string size)) = '(%rbx)' ifTrue:
+ 			[| i3 |
+ 			 o := Integer readFrom: (ReadStream on: string from: i1 + 6 to: i2 - 1) base: 16.
- 			[o := Integer readFrom: (ReadStream on: string from: i1 + 6 to: i2 - 1) base: 16.
  		 	 (aSymbolManager lookupAddress: aSymbolManager varBaseAddress + o) ifNotNil:
+ 				[:varName| extra := ' = ', varName].
+ 			 (i3 := string indexOfSubCollection: '%ds:0x0(%rbx)' startingAt: i1) > 0 ifTrue:
+ 				[string := string copyReplaceFrom: i3 to: i3 + 6 with: ''.
+ 				 i2 := 0]].
- 				[:varName| extra := ' = ', varName]].
  		 v = '(%rip)' ifTrue:
  			[o := anInstructionString size - (anInstructionString lastIndexOf: $:) - 1 / 3. "Count number of instruction bytes to find size of instruction"
  			 o := o + address. "Add address of instruction"
  			 o := o + (Integer readFrom: (ReadStream on: string from: i1 + 6 to: i2 - 1) base: 16) signedIntFromLong64. "Add offset to yield pc-relative address"
  		 	 (aSymbolManager lookupAddress: o) ifNotNil:
  				[:methodName| extra := ' = ', methodName]].
  		 v = ReceiverResultRegDereference ifTrue:
  			[o := Integer readFrom: (ReadStream on: string from: i1 + 6 to: i2 - 1) base: 16.
  		 	 (aSymbolManager lookupInstVarOffset: o) ifNotNil:
  				[:varName| string := string copyReplaceFrom: i1 to: i2 - 1 with: varName,'@',o printString. i2 := 0]].
  		 i2 ~= 0 ifTrue:
  			[string := string
  				copyReplaceFrom: i1
  				to: i2 - 1
  				with: (aSymbolManager lookupCHexString: (string copyFrom: i1 + 4 to: i2 - 1))]].
  	(i1 := string indexOfSubCollection: '%ss:0x') > 0 ifTrue:
  		[i2 := i1 + 6.
  		 ['0123456789abcdef' includes: (string at: i2)] whileTrue: [i2 := i2 + 1].
  		 ((string at: i2) = $(
  		  and: [(string at: i2 + 1) = $%]) ifTrue:
  			[o := Integer readFrom: (ReadStream on: string from: i1 + 6 to: i2 - 1) base: 16.
  			 o := (o bitAnd: (1 bitShift: 31) - 1) - (o bitAnd: (1 bitShift: 31)).
  			 ((string copyFrom: i2 to: (i2 + 5 min: string size)) = '(%rbp)' and: [PrintTempNames]) ifTrue:
  				[(aSymbolManager lookupFrameOffset: o) ifNotNil:
  					[:varName| string := string copyReplaceFrom: i1 to: i2 - 1 with: varName,'@',o printString. i2 := 0]].
  			i2 ~= 0 ifTrue: [string := string copyReplaceFrom: i1 to: i2 - 1 with: o printString]]].
  	(i1 := string indexOfSubCollection: '$0x') > 0 ifTrue:
  		[i2 := i1 + 3.
  		 ['0123456789abcdef' includes: (string at: i2)] whileTrue: [i2 := i2 + 1].
  		 string := string
  					copyReplaceFrom: i1 + 1
  					to: i2 - 1
  					with: (aSymbolManager lookupCHexString: (string copyFrom: i1 + 1 to: i2 - 1))].
  	((i1 := string indexOf: $() > 1
  	 and: [(string at: i1 + 1) isDigit
  	 and: [i1 < (i2 := string indexOf: $))]]) ifTrue:
  		[string := string
  					copyReplaceFrom: i1 + 1
  					to: i2 - 1
  					with: (aSymbolManager lookupCHexString: (string copyFrom: i1 + 1 to: i2 - 1)).
  		 i1 := string indexOfSubCollection: '+0x'. "calls & jumps"
  		 i1 > 0 ifTrue:
  			[o := Integer readFrom: (i2 := ReadStream on: string from: i1 + 3 to: string size) base: 16.
  			 o := ((o bitAnd: (1 bitShift: 63) - 1) - (o bitAnd: (1 bitShift: 63))) printStringRadix: 16.
  			 o := o first = $1
  					ifTrue: [o copyReplaceFrom: 1 to: 3 with: '+0x']
  					ifFalse: [o copyReplaceFrom: 2 to: 4 with: '0x'].
  			 string := string copyReplaceFrom: i1 to: i2 position with: o]].
  	^extra
  		ifNil: [string]
  		ifNotNil:
  			[PrintCodeBytes
  				ifTrue: [i1 := string lastIndexOf: $:.
  						string copyReplaceFrom: i1 - 1 to: i1 - 2 with: extra]
  				ifFalse: [string, ';', extra]]!

Item was added:
+ ----- Method: BochsX64Alien>>handleGroup6through10FailureAt:in:rex: (in category 'error handling') -----
+ handleGroup6through10FailureAt: pc "<Integer>" in: memoryArray "<Bitmap|ByteArray>" rex: rexByteOrNil "<Integer|nil>"
+ 	"Convert an execution primitive failure for a group 5 instruction into the relevant ProcessorSimulationTrap signal."
+ 	| rexByte modrmByte baseReg srcReg |
+ 	(((rexByte := memoryArray byteAt: pc + 2) bitAnd: 16rF8) = self rexPrefix
+ 	and: [(memoryArray byteAt: pc + 3) = 16r0F
+ 	and: [(memoryArray byteAt: pc + 4) = 16rB1]]) ifTrue:
+ 		[modrmByte := memoryArray byteAt: pc + 5.
+ 		 modrmByte >> 6 = 0 ifTrue: "ModRegInd"
+ 			[srcReg := (modrmByte >> 3 bitAnd: 7) + ((rexByte bitAnd: 4) bitShift: 1).
+ 			 baseReg := (modrmByte bitAnd: 7) + ((rexByte bitAnd: 1) bitShift: 3).
+ 			^(CompareAndSwapSimulationTrap
+ 						pc: pc
+ 						nextpc: pc + 5
+ 						address: (self perform: (self registerStateGetters at: baseReg + 1))
+ 						type: #write
+ 						accessor: (self registerStateSetters at: srcReg + 1))
+ 					expectedValue: self rax;
+ 					storedValue: (self perform: (self registerStateGetters at: srcReg + 1));
+ 					signal]]!

Item was changed:
  ----- Method: BochsX64Alien>>handleMovEvGvFailureAt:in:rex: (in category 'error handling') -----
  handleMovEvGvFailureAt: pc "<Integer>" in: memoryArray "<Bitmap|ByteArray>" rex: rexByteOrNil "<Integer|nil>"
  	"Convert an execution primitive failure for a register write into a ProcessorSimulationTrap signal."
  	| modrmByte getter base offset |
  	self assert: rexByteOrNil notNil.
  	modrmByte := memoryArray byteAt: pc + 3.
+ 	getter := self registerStateGetters at: (modrmByte >> 3 bitAnd: 7) + ((rexByteOrNil bitAnd: 4) << 1) + 1.
- 	getter := self registerStateGetters at: ((modrmByte >> 3 bitAnd: 7) + ((rexByteOrNil bitAnd: 4) << 1) + 1).
  	(modrmByte bitAnd: 16rC7) = 16r5 ifTrue: "ModRegInd & disp32"
  		[^(ProcessorSimulationTrap
  				pc: pc
  				nextpc: pc + 7
  				address: (memoryArray unsignedLongAt: pc + 4 bigEndian: false)
  				type: #write
  				accessor: getter)
  			signal].
+ 	(modrmByte bitAnd: 16rC0) = 0 ifTrue: "ModRegInd"
+ 		[base := self registerStateGetters at: (modrmByte bitAnd: 7) + ((rexByteOrNil bitAnd: 1) << 3) + 1.
+ 		 ^(ProcessorSimulationTrap
+ 				pc: pc
+ 				nextpc: pc + 3
+ 				address: (self perform: base)
+ 				type: #write
+ 				accessor: getter)
+ 			signal].
  	(modrmByte bitAnd: 16rC0) = 16r80 ifTrue: "ModRegRegDisp32"
  		[offset := memoryArray longAt: pc + 4 bigEndian: false.
+ 		 base := self registerStateGetters at: (modrmByte bitAnd: 7) + ((rexByteOrNil bitAnd: 1) << 3) + 1.
- 		 base := self registerStateGetters at: ((modrmByte bitAnd: 7) + ((rexByteOrNil bitAnd: 1) << 3) + 1).
  		 ^(ProcessorSimulationTrap
  				pc: pc
  				nextpc: pc + 7
  				address: (self perform: base) + offset
  				type: #write
  				accessor: getter)
  			signal].
  	(modrmByte bitAnd: 16rC0) = 16r40 ifTrue: "ModRegRegDisp8"
  		[offset := memoryArray unsignedByteAt: pc + 4.
  		 offset > 127 ifTrue: [offset := offset - 256].
+ 		 base := self registerStateGetters at: (modrmByte bitAnd: 7) + ((rexByteOrNil bitAnd: 1) << 3) + 1.
- 		 base := self registerStateGetters at: ((modrmByte bitAnd: 7) + ((rexByteOrNil bitAnd: 1) << 3) + 1).
  		 ^(ProcessorSimulationTrap
  				pc: pc
  				nextpc: pc + 4
  				address: (self perform: base) + offset
  				type: #write
  				accessor: getter)
  			signal].
  	^self reportPrimitiveFailure!

Item was changed:
  ----- Method: BochsX64Alien>>printFields:inRegisterState:on: (in category 'printing') -----
  printFields: fields inRegisterState: registerStateVector on: aStream
  	| rsvs |
  	aStream ensureCr.
  	rsvs := registerStateVector readStream.
  	fields withIndexDo:
  		[:sym :index| | val |
  		sym = #cr
  			ifTrue: [aStream cr]
  			ifFalse:
  				[(val := rsvs next) isNil ifTrue: [^self].
  				(sym beginsWith: 'xmm')
  					ifTrue:
  						[aStream nextPutAll: sym; nextPut: $:; space.
  						 val printOn: aStream base: 16 length: 16 padded: true.
  						 aStream space; nextPut: $(.
  						 "At the image level Float is apparently in big-endian format"
  						 ((Float basicNew: 2)
  						 	at: 2 put: (val bitAnd: 16rFFFFFFFF);
  							at: 1 put: (val bitShift: -32);
  							yourself)
  								printOn: aStream.
  						 aStream nextPut: $)]
  					ifFalse:
  						[aStream nextPutAll: sym; nextPut: $:; space.
  						 val printOn: aStream base: 16 length: 8 padded: true.
+ 						 #rflags == sym
- 						 #eflags == sym
  							ifTrue:
  								[aStream space.
  								 'C-P-A-ZS---O' withIndexDo:
  									[:flag :bitIndex|
  									flag ~= $- ifTrue:
  										[aStream nextPut: flag; nextPutAll: 'F='; print: (val bitAnd: 1 << (bitIndex - 1)) >> (bitIndex - 1); space]]]
  							ifFalse:
  								[val > 16 ifTrue:
  									[aStream space; nextPut: $(.
  									 val printOn: aStream base: 10 length: 1 padded: false.
  									 aStream nextPut: $)]]].
  						(fields at: index + 1) ~~ #cr ifTrue:
  							[aStream tab]]]!

Item was changed:
  ----- Method: BochsX64Alien>>rflags (in category 'accessing') -----
  rflags
+ 	^self unsignedLongAt: 621!
- 	^self unsignedLongLongAt: 621!

Item was changed:
  ----- Method: BochsX64Alien>>rflags: (in category 'accessing') -----
  rflags: anUnsignedInteger
+ 	^self unsignedLongAt: 621 put: anUnsignedInteger!
- 	^self unsignedLongLongAt: 621 put: anUnsignedInteger!

Item was added:
+ ----- Method: BochsX64Alien>>setFlagsForCompareAndSwap: (in category 'execution') -----
+ setFlagsForCompareAndSwap: aBoolean
+ 	"Set ZF to aBoolean"
+ 	| flags |
+ 	flags := self rflags bitClear: 64.
+ 	self rflags: (aBoolean ifTrue: [flags + 64] ifFalse: [flags])!

Item was added:
+ ----- Method: BochsX64Alien64>>prevRip (in category 'accessing') -----
+ prevRip
+ 	^self unsignedLongLongAt: 673!

Item was added:
+ ----- Method: BochsX64Alien64>>prevRip: (in category 'accessing') -----
+ prevRip: anUnsignedInteger
+ 	^self unsignedLongLongAt: 673 put: anUnsignedInteger!

Item was changed:
  ----- Method: BochsX64Alien64>>rflags (in category 'accessing') -----
  rflags
+ 	^self unsignedLongAt: 633!
- 	^self unsignedLongLongAt: 633!

Item was added:
+ ----- Method: BochsX64Alien64>>rflags: (in category 'accessing') -----
+ rflags: anUnsignedInteger
+ 	^self unsignedLongAt: 633 put: anUnsignedInteger!

Item was added:
+ ----- Method: CogProcessorAlien>>setFlagsForCompareAndSwap: (in category 'execution') -----
+ setFlagsForCompareAndSwap: aBoolean
+ 	"If the processor sets flags in a compare-and-swap instruction, set its flags
+ 	 according to aBoolean which is true if the compare-and-swap succeeded."
+ 	self subclassResponsibility!



More information about the Vm-dev mailing list