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

commits at source.squeak.org commits at source.squeak.org
Sat Nov 20 02:30:30 UTC 2021


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

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

Name: Cog-eem.446
Author: eem
Time: 19 November 2021, 6:30:28.466804 pm
UUID: 4c92e983-68fe-49a9-9f05-bfc74d3b1a79
Ancestors: Cog-eem.445

Add a memoryOffset variable to the ProcessorSimulatorPlugin(s).  Hence the SpurMemoryManager/ObjectMemory simulators are free to discard the first work in their memory array to implement a null pointer trap.

Correct an infelicity in the simulation of the ProcessorSimulatorPlugin(s) by passing the size of the argument, not the size of the simulator's memory, through to the real plugin, i.e. refactor rawPrimitive[Run|SingleStep]InMemory:offsetBy:minimumAddress:readOnlyBelow: to rawPrimitive[Run|SingleStep]InMemory:size:offsetBy:minimumAddress:readOnlyBelow:

=============== Diff against Cog-eem.444 ===============

Item was removed:
- ----- Method: BochsIA32Alien>>rawPrimitiveRunInMemory:offsetBy:minimumAddress:readOnlyBelow: (in category 'primitives-simulation') -----
- rawPrimitiveRunInMemory: memoryArray offsetBy: offset minimumAddress: minimumAddress readOnlyBelow: minimumWritableAddress
- 	"A version of primitiveRunInMemory:offsetBy:minimumAddress:readOnlyBelow: for simulation"
- 	<primitive: 'primitiveRunInMemoryOffsetMinimumAddressReadWrite' module: 'BochsIA32Plugin' error: ec>
- 	^ec!

Item was added:
+ ----- Method: BochsIA32Alien>>rawPrimitiveRunInMemory:size:offsetBy:minimumAddress:readOnlyBelow: (in category 'primitives-simulation') -----
+ rawPrimitiveRunInMemory: memoryArray size: size offsetBy: offset minimumAddress: minimumAddress readOnlyBelow: minimumWritableAddress
+ 	"A version of primitiveRunInMemory:offsetBy:minimumAddress:readOnlyBelow: for simulation"
+ 	<primitive: 'primitiveRunInMemorySizeOffsetMinimumAddressReadWrite' module: 'BochsIA32Plugin' error: ec>
+ 	^ec!

Item was removed:
- ----- Method: BochsIA32Alien>>rawPrimitiveSingleStepInMemory:offsetBy:minimumAddress:readOnlyBelow: (in category 'primitives-simulation') -----
- rawPrimitiveSingleStepInMemory: memoryArray offsetBy: offset minimumAddress: minimumAddress readOnlyBelow: minimumWritableAddress
- 	"A version of primitiveSingleStepInMemory:offsetBy:minimumAddress:readOnlyBelow: for simulation"
- 	<primitive: 'primitiveSingleStepInMemoryOffsetMinimumAddressReadWrite' module: 'BochsIA32Plugin' error: ec>
- 	^ec!

Item was added:
+ ----- Method: BochsIA32Alien>>rawPrimitiveSingleStepInMemory:size:offsetBy:minimumAddress:readOnlyBelow: (in category 'primitives-simulation') -----
+ rawPrimitiveSingleStepInMemory: memoryArray size: size offsetBy: offset minimumAddress: minimumAddress readOnlyBelow: minimumWritableAddress
+ 	"A version of primitiveSingleStepInMemory:offsetBy:minimumAddress:readOnlyBelow: for simulation"
+ 	<primitive: 'primitiveSingleStepInMemorySizeOffsetMinimumAddressReadWrite' module: 'BochsIA32Plugin' error: ec>
+ 	^ec!

Item was added:
+ ----- Method: BochsIA32Alien>>registerStateFPIndex (in category 'accessing-abstract') -----
+ registerStateFPIndex
+ 	"Answer the index of the FP register in the Array answered by integerRegisterState"
+ 	^6!

Item was added:
+ ----- Method: BochsIA32Alien>>registerStateSPIndex (in category 'accessing-abstract') -----
+ registerStateSPIndex
+ 	"Answer the index of the SP register in the Array answered by integerRegisterState"
+ 	^5!

Item was removed:
- ----- Method: BochsX64Alien>>rawPrimitiveRunInMemory:offsetBy:minimumAddress:readOnlyBelow: (in category 'primitives-simulation') -----
- rawPrimitiveRunInMemory: memoryArray offsetBy: offset minimumAddress: minimumAddress readOnlyBelow: minimumWritableAddress
- 	"A version of primitiveRunInMemory:offsetBy:minimumAddress:readOnlyBelow: for simulation"
- 	<primitive: 'primitiveRunInMemoryOffsetMinimumAddressReadWrite' module: 'BochsX64Plugin' error: ec>
- 	^ec!

Item was added:
+ ----- Method: BochsX64Alien>>rawPrimitiveRunInMemory:size:offsetBy:minimumAddress:readOnlyBelow: (in category 'primitives-simulation') -----
+ rawPrimitiveRunInMemory: memoryArray size: size offsetBy: offset minimumAddress: minimumAddress readOnlyBelow: minimumWritableAddress
+ 	"A version of primitiveRunInMemory:offsetBy:minimumAddress:readOnlyBelow: for simulation"
+ 	<primitive: 'primitiveRunInMemorySizeOffsetMinimumAddressReadWrite' module: 'BochsX64Plugin' error: ec>
+ 	^ec!

Item was removed:
- ----- Method: BochsX64Alien>>rawPrimitiveSingleStepInMemory:offsetBy:minimumAddress:readOnlyBelow: (in category 'primitives-simulation') -----
- rawPrimitiveSingleStepInMemory: memoryArray offsetBy: offset minimumAddress: minimumAddress readOnlyBelow: minimumWritableAddress
- 	"A version of primitiveSingleStepInMemory:offsetBy:minimumAddress:readOnlyBelow: for simulation"
- 	<primitive: 'primitiveSingleStepInMemoryOffsetMinimumAddressReadWrite' module: 'BochsX64Plugin' error: ec>
- 	^ec!

Item was added:
+ ----- Method: BochsX64Alien>>rawPrimitiveSingleStepInMemory:size:offsetBy:minimumAddress:readOnlyBelow: (in category 'primitives-simulation') -----
+ rawPrimitiveSingleStepInMemory: memoryArray size: size offsetBy: offset minimumAddress: minimumAddress readOnlyBelow: minimumWritableAddress
+ 	"A version of primitiveSingleStepInMemory:offsetBy:minimumAddress:readOnlyBelow: for simulation"
+ 	<primitive: 'primitiveSingleStepInMemorySizeOffsetMinimumAddressReadWrite' module: 'BochsX64Plugin' error: ec>
+ 	^ec!

Item was added:
+ ----- Method: BochsX64Alien>>registerStateFPIndex (in category 'accessing-abstract') -----
+ registerStateFPIndex
+ 	"Answer the index of the FP register in the Array answered by integerRegisterState"
+ 	^6!

Item was added:
+ ----- Method: BochsX64Alien>>registerStateSPIndex (in category 'accessing-abstract') -----
+ registerStateSPIndex
+ 	"Answer the index of the SP register in the Array answered by integerRegisterState"
+ 	^5!

Item was added:
+ ----- Method: CogProcessorAlien>>registerStateFPIndex (in category 'accessing-abstract') -----
+ registerStateFPIndex
+ 	"Answer the index of the FP register in the Array answered by integerRegisterState"
+ 	^self subclassResponsibility!

Item was added:
+ ----- Method: CogProcessorAlien>>registerStateSPIndex (in category 'accessing-abstract') -----
+ registerStateSPIndex
+ 	"Answer the index of the SP register in the Array answered by integerRegisterState"
+ 	^self subclassResponsibility!

Item was removed:
- ----- Method: GdbARMAlien>>rawPrimitiveRunInMemory:offsetBy:minimumAddress:readOnlyBelow: (in category 'primitives-simulation') -----
- rawPrimitiveRunInMemory: memoryArray offsetBy: offset minimumAddress: minimumAddress readOnlyBelow: minimumWritableAddress
- 	"A version of primitiveRunInMemory:offsetBy:minimumAddress:readOnlyBelow: for simulation"
- 	<primitive: 'primitiveRunInMemoryOffsetMinimumAddressReadWrite' module: 'GdbARMPlugin' error: ec>
- 	^ec!

Item was added:
+ ----- Method: GdbARMAlien>>rawPrimitiveRunInMemory:size:offsetBy:minimumAddress:readOnlyBelow: (in category 'primitives-simulation') -----
+ rawPrimitiveRunInMemory: memoryArray size: size offsetBy: offset minimumAddress: minimumAddress readOnlyBelow: minimumWritableAddress
+ 	"A version of primitiveRunInMemory:offsetBy:minimumAddress:readOnlyBelow: for simulation"
+ 	<primitive: 'primitiveRunInMemorySizeOffsetMinimumAddressReadWrite' module: 'GdbARMPlugin' error: ec>
+ 	^ec!

Item was removed:
- ----- Method: GdbARMAlien>>rawPrimitiveSingleStepInMemory:offsetBy:minimumAddress:readOnlyBelow: (in category 'primitives-simulation') -----
- rawPrimitiveSingleStepInMemory: memoryArray offsetBy: offset minimumAddress: minimumAddress readOnlyBelow: minimumWritableAddress
- 	"A version of primitiveSingleStepInMemory:offsetBy:minimumAddress:readOnlyBelow: for simulation"
- 	<primitive: 'primitiveSingleStepInMemoryOffsetMinimumAddressReadWrite' module: 'GdbARMPlugin' error: ec>
- 	^ec!

Item was added:
+ ----- Method: GdbARMAlien>>rawPrimitiveSingleStepInMemory:size:offsetBy:minimumAddress:readOnlyBelow: (in category 'primitives-simulation') -----
+ rawPrimitiveSingleStepInMemory: memoryArray size: size offsetBy: offset minimumAddress: minimumAddress readOnlyBelow: minimumWritableAddress
+ 	"A version of primitiveSingleStepInMemory:offsetBy:minimumAddress:readOnlyBelow: for simulation"
+ 	<primitive: 'primitiveSingleStepInMemorySizeOffsetMinimumAddressReadWrite' module: 'GdbARMPlugin' error: ec>
+ 	^ec!

Item was added:
+ ----- Method: GdbARMAlien>>registerStateFPIndex (in category 'accessing-abstract') -----
+ registerStateFPIndex
+ 	"Answer the index of the FP register in the Array answered by integerRegisterState"
+ 	^12!

Item was added:
+ ----- Method: GdbARMAlien>>registerStateSPIndex (in category 'accessing-abstract') -----
+ registerStateSPIndex
+ 	"Answer the index of the SP register in the Array answered by integerRegisterState"
+ 	^14!

Item was removed:
- ----- Method: GdbARMv8Alien>>rawPrimitiveRunInMemory:offsetBy:minimumAddress:readOnlyBelow: (in category 'primitives-simulation') -----
- rawPrimitiveRunInMemory: memoryArray offsetBy: offset minimumAddress: minimumAddress readOnlyBelow: minimumWritableAddress
- 	"A version of primitiveRunInMemory:offsetBy:minimumAddress:readOnlyBelow: for simulation"
- 	<primitive: 'primitiveRunInMemoryOffsetMinimumAddressReadWrite' module: 'GdbARMv8Plugin' error: ec>
- 	^ec!

Item was added:
+ ----- Method: GdbARMv8Alien>>rawPrimitiveRunInMemory:size:offsetBy:minimumAddress:readOnlyBelow: (in category 'primitives-simulation') -----
+ rawPrimitiveRunInMemory: memoryArray size: size offsetBy: offset minimumAddress: minimumAddress readOnlyBelow: minimumWritableAddress
+ 	"A version of primitiveRunInMemory:offsetBy:minimumAddress:readOnlyBelow: for simulation"
+ 	<primitive: 'primitiveRunInMemorySizeOffsetMinimumAddressReadWrite' module: 'GdbARMv8Plugin' error: ec>
+ 	^ec!

Item was removed:
- ----- Method: GdbARMv8Alien>>rawPrimitiveSingleStepInMemory:offsetBy:minimumAddress:readOnlyBelow: (in category 'primitives-simulation') -----
- rawPrimitiveSingleStepInMemory: memoryArray offsetBy: offset minimumAddress: minimumAddress readOnlyBelow: minimumWritableAddress
- 	"A version of primitiveSingleStepInMemory:offsetBy:minimumAddress:readOnlyBelow: for simulation"
- 	<primitive: 'primitiveSingleStepInMemoryOffsetMinimumAddressReadWrite' module: 'GdbARMv8Plugin' error: ec>
- 	^ec!

Item was added:
+ ----- Method: GdbARMv8Alien>>rawPrimitiveSingleStepInMemory:size:offsetBy:minimumAddress:readOnlyBelow: (in category 'primitives-simulation') -----
+ rawPrimitiveSingleStepInMemory: memoryArray size: size offsetBy: offset minimumAddress: minimumAddress readOnlyBelow: minimumWritableAddress
+ 	"A version of primitiveSingleStepInMemory:offsetBy:minimumAddress:readOnlyBelow: for simulation"
+ 	<primitive: 'primitiveSingleStepInMemorySizeOffsetMinimumAddressReadWrite' module: 'GdbARMv8Plugin' error: ec>
+ 	^ec!

Item was added:
+ ----- Method: GdbARMv8Alien>>registerStateFPIndex (in category 'accessing-abstract') -----
+ registerStateFPIndex
+ 	"Answer the index of the FP register in the Array answered by integerRegisterState"
+ 	^30!

Item was added:
+ ----- Method: GdbARMv8Alien>>registerStateSPIndex (in category 'accessing-abstract') -----
+ registerStateSPIndex
+ 	"Answer the index of the SP register in the Array answered by integerRegisterState"
+ 	^32!

Item was changed:
  SmartSyntaxInterpreterPlugin subclass: #ProcessorSimulatorPlugin
+ 	instanceVariableNames: 'prevInterruptCheckChain memoryOffset mySimulatorAlien'
- 	instanceVariableNames: 'prevInterruptCheckChain mySimulatorAlien'
  	classVariableNames: 'NumIntegerRegisterStateFields'
  	poolDictionaries: 'VMBasicConstants'
  	category: 'Cog-ProcessorPlugins'!
  
  !ProcessorSimulatorPlugin commentStamp: 'eem 11/19/2019 09:32' prior: 0!
  ProcessorSimulatorPlugin is the abstract superclass for plugins that interface to a processor simulator that executes the machine code for some processor the Cog JIT generates code for.  These include the Bochs C++ IA32/x64 processor emulator, and the GDB simulator for the ARMv6 and ARMv8 architectures.
  
  Instance Variables
  	prevInterruptCheckChain:		<Symbol/function pointer>
  
  prevInterruptCheckChain
  	- the previous value of the interruptCheckChain function pointer
  !

Item was changed:
  ----- Method: ProcessorSimulatorPlugin class>>declareCVarsIn: (in category 'translation') -----
  declareCVarsIn: aCCodeGenerator
  	self ~~ ProcessorSimulatorPlugin ifTrue:
  		[super declareCVarsIn: aCCodeGenerator.
  		 aCCodeGenerator
+ 			var: 'memoryOffset' declareC: 'static sqInt memoryOffset = 0';
  			removeVariable: 'prevInterruptCheckChain'; "lives in the platform support code."
  			removeConstant: #NumIntegerRegisterStateFields]. "defined by the header file"
  	aCCodeGenerator removeVariable: 'mySimulatorAlien' ifAbsent: nil!

Item was added:
+ ----- Method: ProcessorSimulatorPlugin>>primitiveMemoryOffset (in category 'primitives') -----
+ primitiveMemoryOffset
+ 	"Get or set the memory offset.  If non-zero the memry offset is one word (4 or 8 bytes), to marry with the
+ 	 SuprMemoryManager simulators discarding of the first word of memory as a null pointer trap."
+ 	<export: true flags: #(FastCPrimitiveFlag)>
+ 	| offset previousValue |
+ 	interpreterProxy methodArgumentCount = 0 ifTrue:
+ 		[^interpreterProxy methodReturnInteger: memoryOffset].
+ 	interpreterProxy methodArgumentCount ~= 1 ifTrue:
+ 		[^interpreterProxy primitiveFailFor: PrimErrBadNumArgs].
+ 	offset := interpreterProxy stackValue: 0.
+ 	(interpreterProxy isIntegerObject: offset) ifFalse:
+ 		[^interpreterProxy primitiveFailFor: PrimErrBadArgument].
+ 	previousValue := memoryOffset.
+ 	memoryOffset := interpreterProxy integerValueOf: offset.
+ 	^interpreterProxy methodReturnInteger: previousValue!

Item was changed:
  ----- Method: ProcessorSimulatorPlugin>>primitiveRunInMemory:minimumAddress:maximumAddress:readOnlyBelow: (in category 'primitives-legacy') -----
  "cpuAlien <BochsIA32|X86Alien>" primitiveRunInMemory: memory "<Bitmap|ByteArray|WordArray>" minimumAddress: minAddress "<Integer>" maximumAddress: maxAddress "<Integer>" readOnlyBelow: minWriteMaxExecAddress "<Integer>"
  	"Run the cpu using the first argument as the memory and the following arguments defining valid addresses, running until it halts or hits an exception."
  	<legacy>
  	| cpuAlien cpu memorySize maybeErr |
  	<var: #cpu type: #'void *'>
  	cpuAlien := self primitive: #primitiveRunInMemoryMinAddressMaxAddressReadWrite
  					parameters: #(WordsOrBytes SmallInteger SmallInteger SmallInteger)
  					receiver: #Oop.
  	(cpu := self cCoerceSimple: (self startOfData: cpuAlien) to: #'void *') = 0 ifTrue:
  		[^interpreterProxy primitiveFailFor: PrimErrBadReceiver].
+ 	(minAddress < memoryOffset
+ 	or: [maxAddress < memoryOffset
+ 	or: [minWriteMaxExecAddress < memoryOffset]]) ifTrue:
- 	(minAddress < 0
- 	or: [maxAddress < 0
- 	or: [minWriteMaxExecAddress < 0]]) ifTrue:
  		[^self primitiveFailFor: PrimErrBadArgument].
  	"Add forceStopOnInterrupt to the interrupt check chain.  It is our responsibility to
  	 chain calls, hence we remember any previous client in prevInterruptCheckChain."
  	prevInterruptCheckChain := interpreterProxy setInterruptCheckChain: #forceStopOnInterrupt.
  	prevInterruptCheckChain = #forceStopOnInterrupt ifTrue:
  		[prevInterruptCheckChain := 0].
  	memorySize := interpreterProxy byteSizeOf: memory cPtrAsOop.
  	maybeErr := self runCPU: cpu
+ 					In: memory - memoryOffset
+ 					Size: (memorySize + memoryOffset min: maxAddress)
- 					In: memory
- 					Size: (memorySize min: maxAddress)
  					MinAddressRead: minAddress
  					Write: minWriteMaxExecAddress.
  	interpreterProxy setInterruptCheckChain: prevInterruptCheckChain.
  	maybeErr ~= 0 ifTrue:
  		[^interpreterProxy primitiveFailForOSError: maybeErr].
  	^cpuAlien!

Item was changed:
  ----- Method: ProcessorSimulatorPlugin>>primitiveRunInMemory:minimumAddress:readOnlyBelow: (in category 'primitives') -----
  "cpuAlien <BochsIA32|X86Alien>" primitiveRunInMemory: memory "<Bitmap|ByteArray|WordArray>" minimumAddress: minAddress "<Integer>" readOnlyBelow: minWriteMaxExecAddress "<Integer>"
  	"Run the cpu using the first argument as the memory and the following arguments defining valid addresses, running until it halts or hits an exception."
  	| cpuAlien cpu maybeErr |
  	<var: #cpu type: #'void *'>
  	cpuAlien := self primitive: #primitiveRunInMemoryMinimumAddressReadWrite
  					parameters: #(WordsOrBytes SmallInteger SmallInteger)
  					receiver: #Oop.
  	(cpu := self cCoerceSimple: (self startOfData: cpuAlien) to: #'void *') = 0 ifTrue:
  		[^interpreterProxy primitiveFailFor: PrimErrBadReceiver].
+ 	(minAddress < memoryOffset
+ 	or: [minWriteMaxExecAddress < memoryOffset]) ifTrue:
- 	(minAddress < 0
- 	or: [minWriteMaxExecAddress < 0]) ifTrue:
  		[^self primitiveFailFor: PrimErrBadArgument].
  	prevInterruptCheckChain := interpreterProxy setInterruptCheckChain: #forceStopOnInterrupt.
  	prevInterruptCheckChain = #forceStopOnInterrupt ifTrue:
  		[prevInterruptCheckChain := 0].
  	maybeErr := self runCPU: cpu
+ 					In: memory - memoryOffset
+ 					Size: (interpreterProxy byteSizeOf: memory cPtrAsOop) + memoryOffset
- 					In: memory
- 					Size: (interpreterProxy byteSizeOf: memory cPtrAsOop)
  					MinAddressRead: minAddress
  					Write: minWriteMaxExecAddress.
  	interpreterProxy setInterruptCheckChain: prevInterruptCheckChain.
  	maybeErr ~= 0 ifTrue:
  		[^interpreterProxy primitiveFailForOSError: maybeErr].
  	^cpuAlien!

Item was changed:
  ----- Method: ProcessorSimulatorPlugin>>primitiveRunInMemory:offsetBy:minimumAddress:readOnlyBelow: (in category 'primitives') -----
  "cpuAlien <ProcessorSimulatorAlien>" primitiveRunInMemory: memory "<BitsObject>" offsetBy: offset "<Integer>" minimumAddress: minAddress "<Integer>" readOnlyBelow: minWriteMaxExecAddress "<Integer>"
  	"Run the cpu using the first argument as the memory and the following arguments defining valid addresses, running until it halts or hits an exception."
  	| cpuAlien cpu maybeErr |
  	<var: #cpu type: #'void *'>
  	cpuAlien := self primitive: #primitiveRunInMemoryOffsetMinimumAddressReadWrite
  					parameters: #(WordsOrBytes SmallInteger SmallInteger SmallInteger)
  					receiver: #Oop.
  	(cpu := self cCoerceSimple: (self startOfData: cpuAlien) to: #'void *') = 0 ifTrue:
  		[^interpreterProxy primitiveFailFor: PrimErrBadReceiver].
+ 	(minAddress < memoryOffset
+ 	or: [minWriteMaxExecAddress < memoryOffset]) ifTrue:
- 	(minAddress < 0
- 	 or: [minWriteMaxExecAddress < 0]) ifTrue:
  		[^self primitiveFailFor: PrimErrBadArgument].
  	prevInterruptCheckChain := interpreterProxy setInterruptCheckChain: #forceStopOnInterrupt.
  	prevInterruptCheckChain = #forceStopOnInterrupt ifTrue:
  		[prevInterruptCheckChain := 0].
  	maybeErr := self runCPU: cpu
+ 					In: (self cCoerceSimple: memory to: #'char *') - memoryOffset + offset
+ 					Size: (interpreterProxy byteSizeOf: memory cPtrAsOop) + memoryOffset - offset
- 					In: (self cCoerceSimple: memory to: #'char *') + offset
- 					Size: (interpreterProxy byteSizeOf: memory cPtrAsOop)
  					MinAddressRead: minAddress
  					Write: minWriteMaxExecAddress.
  	interpreterProxy setInterruptCheckChain: prevInterruptCheckChain.
  	maybeErr ~= 0 ifTrue:
  		[^interpreterProxy primitiveFailForOSError: maybeErr].
  	^cpuAlien!

Item was changed:
  ----- Method: ProcessorSimulatorPlugin>>primitiveSingleStepInMemory:minimumAddress:maximumAddress:readOnlyBelow: (in category 'primitives-legacy') -----
  "cpuAlien <BochsIA32|X86Alien>" primitiveSingleStepInMemory: memory "<Bitmap|ByteArray|WordArray>" minimumAddress: minAddress "<Integer>" maximumAddress: maxAddress "<Integer>" readOnlyBelow: minWriteMaxExecAddress "<Integer>"
  	"Single-step the cpu using the first argument as the memory and the following arguments defining valid addresses."
  	<legacy>
  	| cpuAlien cpu memorySize maybeErr |
  	<var: #cpu type: #'void *'>
  	cpuAlien := self primitive: #primitiveSingleStepInMemoryMinAddressMaxAddressReadWrite
  					parameters: #(WordsOrBytes SmallInteger SmallInteger SmallInteger)
  					receiver: #Oop.
  	(cpu := self cCoerceSimple: (self startOfData: cpuAlien) to: #'void *') = 0 ifTrue:
  		[^interpreterProxy primitiveFailFor: PrimErrBadReceiver].
+ 	(minAddress < memoryOffset
+ 	or: [maxAddress < memoryOffset
+ 	or: [minWriteMaxExecAddress < memoryOffset]]) ifTrue:
- 	(minAddress < 0
- 	or: [maxAddress < 0
- 	or: [minWriteMaxExecAddress < 0]]) ifTrue:
  		[^self primitiveFailFor: PrimErrBadArgument].
  	memorySize := interpreterProxy byteSizeOf: memory cPtrAsOop.
  	maybeErr := self singleStepCPU: cpu
+ 					In: memory - memory offset
+ 					Size: (memorySize + memoryOffset min: maxAddress)
- 					In: memory
- 					Size: (memorySize min: maxAddress)
  					MinAddressRead: minAddress
  					Write: minWriteMaxExecAddress.
  	maybeErr ~= 0 ifTrue:
  		[^interpreterProxy primitiveFailForOSError: maybeErr].
  	^cpuAlien!

Item was changed:
  ----- Method: ProcessorSimulatorPlugin>>primitiveSingleStepInMemory:minimumAddress:readOnlyBelow: (in category 'primitives') -----
  "cpuAlien <BochsIA32|X86Alien>" primitiveSingleStepInMemory: memory "<Bitmap|ByteArray|WordArray>" minimumAddress: minAddress "<Integer>"  readOnlyBelow: minWriteMaxExecAddress "<Integer>"
  	"Single-step the cpu using the first argument as the memory and the following arguments defining valid addresses."
  	| cpuAlien cpu maybeErr |
  	<var: #cpu type: #'void *'>
  	cpuAlien := self primitive: #primitiveSingleStepInMemoryMinimumAddressReadWrite
  					parameters: #(WordsOrBytes SmallInteger SmallInteger)
  					receiver: #Oop.
  	(cpu := self cCoerceSimple: (self startOfData: cpuAlien) to: #'void *') = 0 ifTrue:
  		[^interpreterProxy primitiveFailFor: PrimErrBadReceiver].
+ 	(minAddress < memoryOffset
+ 	or: [minWriteMaxExecAddress < memoryOffset]) ifTrue:
- 	(minAddress < 0
- 	or: [minWriteMaxExecAddress < 0]) ifTrue:
  		[^self primitiveFailFor: PrimErrBadArgument].
  	maybeErr := self singleStepCPU: cpu
+ 					In: memory - memoryOffset
+ 					Size: (interpreterProxy byteSizeOf: memory cPtrAsOop) + memoryOffset
- 					In: memory
- 					Size: (interpreterProxy byteSizeOf: memory cPtrAsOop)
  					MinAddressRead: minAddress
  					Write: minWriteMaxExecAddress.
  	maybeErr ~= 0 ifTrue:
  		[^interpreterProxy primitiveFailForOSError: maybeErr].
  	^cpuAlien!

Item was changed:
  ----- Method: ProcessorSimulatorPlugin>>primitiveSingleStepInMemory:offsetBy:minimumAddress:readOnlyBelow: (in category 'primitives') -----
  "cpuAlien <BochsIA32|X86Alien>" primitiveSingleStepInMemory: memory "<Bitmap|ByteArray|WordArray>" offsetBy: offset "<Integer>" minimumAddress: minAddress "<Integer>"  readOnlyBelow: minWriteMaxExecAddress "<Integer>"
  	"Single-step the cpu using the first argument as the memory and the following arguments defining valid addresses."
  	| cpuAlien cpu maybeErr |
  	<var: #cpu type: #'void *'>
  	cpuAlien := self primitive: #primitiveSingleStepInMemoryOffsetMinimumAddressReadWrite
  					parameters: #(WordsOrBytes SmallInteger SmallInteger SmallInteger)
  					receiver: #Oop.
  	(cpu := self cCoerceSimple: (self startOfData: cpuAlien) to: #'void *') = 0 ifTrue:
  		[^interpreterProxy primitiveFailFor: PrimErrBadReceiver].
+ 	(minAddress < memoryOffset
+ 	 or: [minWriteMaxExecAddress < memoryOffset]) ifTrue:
- 	(minAddress < 0
- 	 or: [minWriteMaxExecAddress < 0]) ifTrue:
  		[^self primitiveFailFor: PrimErrBadArgument].
  	maybeErr := self singleStepCPU: cpu
+ 					In: (self cCoerceSimple: memory to: #'char *') - memoryOffset + offset
+ 					Size: (interpreterProxy byteSizeOf: memory cPtrAsOop) - offset + memoryOffset
- 					In: (self cCoerceSimple: memory to: #'char *') + offset
- 					Size: (interpreterProxy byteSizeOf: memory cPtrAsOop)
  					MinAddressRead: minAddress
  					Write: minWriteMaxExecAddress.
  	maybeErr ~= 0 ifTrue:
  		[^interpreterProxy primitiveFailForOSError: maybeErr].
  	^cpuAlien!

Item was changed:
  ----- Method: ProcessorSimulatorPlugin>>runCPU:In:Size:MinAddressRead:Write: (in category 'simulation') -----
  runCPU: cpu In: memoryCArray Size: memorySize MinAddressRead: minAddress Write: minWriteMaxExecAddress
  	<doNotGenerate>
  	"*now* we need derived pointers. Ho hum...
  	 But all we need is one more level of indirection..."
  	| result |
  	result := mySimulatorAlien
  				rawPrimitiveRunInMemory: interpreterProxy memory
+ 				size: memorySize
  				offsetBy: memoryCArray ptrAddress
  				minimumAddress: minAddress
  				readOnlyBelow: minWriteMaxExecAddress.
  	^result == mySimulatorAlien
  		ifTrue: [0]
  		ifFalse:
  			[result isPrimitiveError
  				ifTrue: [result errorCode]
  				ifFalse: [result]]!

Item was changed:
  ----- Method: ProcessorSimulatorPlugin>>singleStepCPU:In:Size:MinAddressRead:Write: (in category 'simulation') -----
  singleStepCPU: cpu In: memoryCArray Size: memorySize MinAddressRead: minAddress Write: minWriteMaxExecAddress
  	<doNotGenerate>
  	"*now* we need derived pointers. Ho hum...
  	 But all we need is one more level of indirection..."
  	| result |
  	result := mySimulatorAlien
  				rawPrimitiveSingleStepInMemory: interpreterProxy memory
+ 				size: memorySize
  				offsetBy: memoryCArray ptrAddress
  				minimumAddress: minAddress
  				readOnlyBelow: minWriteMaxExecAddress.
  	^result == mySimulatorAlien
  		ifTrue: [0]
  		ifFalse:
  			[result isPrimitiveError
  				ifTrue: [result errorCode]
  				ifFalse: [result]]!



More information about the Vm-dev mailing list