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]]!
vm-dev@lists.squeakfoundation.org