[Vm-dev] VM Maker: Cog-lw.58.mcz
commits at source.squeak.org
commits at source.squeak.org
Wed Jan 30 08:34:35 UTC 2013
Lars Wassermann uploaded a new version of Cog to project VM Maker:
http://source.squeak.org/VMMaker/Cog-lw.58.mcz
==================== Summary ====================
Name: Cog-lw.58
Author: lw
Time: 30 January 2013, 9:34:28.956 am
UUID: c6b730fe-47ba-da41-ab07-5de7090d4064
Ancestors: Cog-lw.56, Cog-IgorStasenko.57
changed the disassemble string generated by the plugin (added address) and subsequently had to change back decoration and some tests
added some abi information, e.g. cResultReg
=============== Diff against Cog-IgorStasenko.57 ===============
Item was added:
+ ----- Method: CogProcessorAlien>>cResultRegister (in category 'accessing-abstract') -----
+ cResultRegister
+ ^self subclassResponsibility!
Item was added:
+ ----- Method: CogProcessorAlien>>cResultRegister: (in category 'accessing-abstract') -----
+ cResultRegister: aValue
+ ^self subclassResponsibility!
Item was changed:
----- Method: CogProcessorAlien>>disassembleNextInstructionIn:for: (in category 'disassembly') -----
disassembleNextInstructionIn: memory for: aSymbolManager "<Cogit|nil>"
| string |
+ string := self pc < memory size
+ ifTrue: [(self primitiveDisassembleAt: self pc inMemory: memory) last.]
+ ifFalse: ['Invalid address (', (self pc hex allButFirst: 3), ')'].
- string := (self primitiveDisassembleAt: self pc inMemory: memory) last.
^aSymbolManager
ifNil: [string]
ifNotNil: [self decorateDisassembly: string for: aSymbolManager]!
Item was added:
+ ----- Method: CogProcessorAlien>>registerStatePCIndex (in category 'accessing-abstract') -----
+ registerStatePCIndex
+ "Return the index of the PC register among all register, assuming they are copied into a Smalltalk array."
+ ^self subclassResponsibility!
Item was added:
+ ----- Method: GdbARMAlien>>cResultRegister (in category 'accessing-abstract') -----
+ cResultRegister
+ self r0!
Item was added:
+ ----- Method: GdbARMAlien>>cResultRegister: (in category 'accessing-abstract') -----
+ cResultRegister: aValue
+ self r0: aValue!
Item was changed:
----- Method: GdbARMAlien>>decorateDisassembly:for:fromAddress: (in category 'disassembly') -----
decorateDisassembly: anInstructionString for: aSymbolManager "<Cogit>" fromAddress: address
+ (anInstructionString endsWith: 'mov r1, r1')
+ ifTrue: [^super decorateDisassembly: 'nop' for: aSymbolManager].
+ ^super decorateDisassembly: anInstructionString for: aSymbolManager!
- "Prepend the address to the decoration string."
- | addressPrefix |
- addressPrefix := ((address storeStringBase: 16 length: 9 padded: true) allButFirst: 3), ' ', String tab.
- anInstructionString = 'mov r1, r1'
- ifTrue: [^super decorateDisassembly: addressPrefix, 'nop' for: aSymbolManager].
- ^super decorateDisassembly: addressPrefix, anInstructionString for: aSymbolManager!
Item was changed:
----- Method: GdbARMAlien>>printRegisterState:on: (in category 'printing') -----
printRegisterState: registerStateVector on: aStream
| rsvs fields|
aStream ensureCr.
rsvs := registerStateVector readStream.
+ fields := #( r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 sp lr pc eflags cr).
- fields := #( r0 r1 r2 r3 r4 r5 r6 cr r7 r8 r9 r10 r11 r12 cr sp lr pc eflags cr).
fields withIndexDo:
[:sym :index| | val |
sym = #cr
ifTrue: [aStream cr]
ifFalse:
[(val := rsvs next) isNil ifTrue: [^self].
aStream nextPutAll: sym; nextPut: $:; space.
val printOn: aStream base: 16 length: 8 padded: true.
#eflags == sym
ifTrue:
[aStream space.
"'FIVCZN'"'--VCZN' 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 added:
+ ----- Method: GdbARMAlien>>registerStatePCIndex (in category 'accessing-abstract') -----
+ registerStatePCIndex
+ ^16!
Item was changed:
----- Method: GdbARMAlien>>smashRegisterAccessors (in category 'accessing-abstract') -----
smashRegisterAccessors
+ ^#(r0: r1: r2: r3: r4: r5: r6: r7: r8: r9: r10:)!
- ^#(r0: r1: r2: r3: r4: r5: r6: r7: r8:)!
Item was changed:
----- Method: GdbARMAlienTests>>testCallTrap (in category 'tests') -----
testCallTrap
"Call a function that is out-of-range. Ensure the call is trapped."
"self new testCallTrap"
| memory |
memory := Bitmap new: 256 withAll: self processor nopOpcode.
+ memory longAt: 5 put: (self processor branchAndLinkOpcodeWithOffset: 1020) bigEndian: false.
- memory longAt: 1 put: (self processor branchAndLinkOpcodeWithOffset: 1024) bigEndian: false.
memory := memory asByteArray.
self processor
+ pc: 4;
- pc: 0;
sp: (memory size - 4); "Room for return address"
singleStepIn: memory.
"We have to step twice, because the first step only changes the pc, but does not fetch anything from the address it points to."
self should: [self processor singleStepIn: memory]
+ raise: ProcessorSimulationTrap
- raise: Error
withExceptionDo:
[:pst|
self assert: self processor pc = 1024.
+ self assert: self processor lr = 8.
+ self assert: pst pc = 4.
+ self assert: pst nextpc = 8.
- self assert: self processor lr = 4.
- self assert: pst pc = 0.
- self assert: pst nextpc = 4.
self assert: pst address = 1024.
self assert: pst type = #call].!
Item was changed:
----- Method: GdbARMAlienTests>>testDisassembling (in category 'tests') -----
testDisassembling
| memory result |
memory := WordArray new: 2.
memory at: 1 put: 16rEF200000.
result := self processor
disassembleInstructionAt: 0
In: memory
into: [:str :len |
self
assert: len = 4;
+ assert: str = '0x00000000: svc 0x00200000'].!
- assert: str = 'svc 0x00200000'].!
Item was changed:
----- Method: GdbARMAlienTests>>testFlags (in category 'tests') -----
testFlags
"self new testFlags"
| memory |
memory := Bitmap new: 3.
memory longAt: 1 put: 16rE3A03001 bigEndian: false. "MOV r3, #1"
memory longAt: 5 put: 16rE3530001 bigEndian: false. "CMP r3, #1"
memory := memory asByteArray.
self processor
disassembleInstructionAt: 0
In: memory
into: [:str :len |
self
assert: len = 4;
+ assert: str equals: '0x00000000: mov r3, #1'].
- assert: str = 'mov r3, #1'].
self processor
disassembleInstructionAt: 4
In: memory
into: [:str :len |
self
assert: len = 4;
+ assert: str equals: '0x00000004: cmp r3, #1'].
- assert: str = 'cmp r3, #1'].
self processor
pc: 0;
singleStepIn: memory;
singleStepIn: memory.
self
assert: self processor pc = 16r8;
assert: self processor r3 = 1;
assert: self processor zflag = 1;
assert: self processor cflag = 1;
assert: self processor vflag = 0;
assert: self processor nflag = 0.
self processor reset.
self assert: self processor eflags = 3. "IFFlags are both set."!
More information about the Vm-dev
mailing list