blob: a3e2718be594974c493d1b144a5aa20a91ae506c [file] [log] [blame]
*** Variables ***
${ADDRESS_REG} 0
${VALUE_REG} 1
${STATUS_REG} 2
*** Keywords ***
Write Opcode
[Arguments] ${address} ${opcode}
Execute Command sysbus WriteDoubleWord ${address} ${opcode}
Compare Store Status
[Arguments] ${expected} ${cpu}=0
${value}= Execute Command cpu${cpu} GetRegisterUnsafe ${STATUS_REG}
Should Be Equal As Integers ${value} ${expected} Unexpected store status on cpu${cpu}
Compare Memory Content
[Arguments] ${expected} ${cpu}=0
${addr}= Execute Command cpu${cpu} GetRegisterUnsafe ${ADDRESS_REG}
${value}= Execute Command sysbus ReadDoubleWord ${addr}
Should Be Equal As Integers ${value} ${expected} Unexpected memory value on cpu${cpu}
Step
[Arguments] ${steps}=1 ${cpu}=0
Execute Command cpu${cpu} Step ${steps}
Set Value
[Arguments] ${value} ${cpu}=0
Execute Command cpu${cpu} SetRegisterUnsafe ${VALUE_REG} ${value}
Set Address
[Arguments] ${value} ${cpu}=0
Execute Command cpu${cpu} SetRegisterUnsafe ${ADDRESS_REG} ${value}
Create Machine
[Arguments] ${cpu_count}=1
Execute Command using sysbus
Execute Command mach create
FOR ${i} IN RANGE ${cpu_count}
Execute Command machine LoadPlatformDescriptionFromString "cpu${i}: CPU.ARMv7R @ sysbus { cpuType: \\"cortex-r8\\"; cpuId: ${i} }"
Execute Command cpu${i} ExecutionMode SingleStep
Execute Command cpu${i} SetRegisterUnsafe ${ADDRESS_REG} 0x1000
Execute Command cpu${i} PC 0x0
Execute Command cpu${i} SetRegisterUnsafe ${STATUS_REG} 0x100
END
Execute Command machine LoadPlatformDescriptionFromString "mem: Memory.MappedMemory @ sysbus 0x0 { size: 0x8000000 }"
*** Test Cases ***
Should Store Exclusive Correctly
Create Machine
Write Opcode 0x0 0xE1901F9F # ldrex r1, [r0]
Write Opcode 0x4 0xE3A0100A # mov r1, #0xA
Write Opcode 0x8 0xE1802F91 # strex r2, r1, [r0]
Step steps=3
Compare Store Status 0
Compare Memory Content 0xA
Should Not Store Before Load Exclusive
Create Machine
Write Opcode 0x0 0xE3A0100A # mov r1, #0xA
Write Opcode 0x4 0xE1802F91 # strex r2, r1, [r0]
Step steps=2
Compare Store Status 1
Compare Memory Content 0x0
Should Not Store If Value Changed
Create Machine
Write Opcode 0x0 0xE1901F9F # ldrex r1, [r0]
Write Opcode 0x4 0xE3A0100A # mov r1, #0xA
Write Opcode 0x8 0xE5801000 # str r1, [r0]
Write Opcode 0xC 0xE3A0100B # mov r1, #0xB
Write Opcode 0x10 0xE1802F91 # strex r2, r1, [r0]
Step steps=5
Compare Store Status 1
# Storing 0xA with normal store and 0xB with the exclusive store. Check if the value was not overriden
Compare Memory Content 0xA
Both CPUs Should Store
Create Machine cpu_count=2
Write Opcode 0x0 0xE1901F9F # ldrex r1, [r0]
Write Opcode 0x4 0xE1802F91 # strex r2, r1, [r0]
Set Address 0xAA cpu=0
Set Address 0xBB cpu=1
Step cpu=0
Step cpu=1
Set Value 0xA cpu=0
Set Value 0xB cpu=1
Step cpu=0
Step cpu=1
Compare Store Status 0 cpu=0
Compare Memory Content 0xA cpu=0
Compare Store Status 0 cpu=1
Compare Memory Content 0xB cpu=1
Second CPU Should Not Store
Create Machine cpu_count=2
Write Opcode 0x0 0xE1901F9F # ldrex r1, [r0]
Write Opcode 0x4 0xE1802F91 # strex r2, r1, [r0]
Step cpu=0
Step cpu=1
Set Value 0xA cpu=0
Set Value 0xB cpu=1
Step cpu=0
Step cpu=1
Compare Store Status 0 cpu=0
Compare Memory Content 0xA cpu=0
Compare Store Status 1 cpu=1
Compare Memory Content 0xA cpu=1
First CPU Should Not Store
Create Machine cpu_count=2
Write Opcode 0x0 0xE1901F9F # ldrex r1, [r0]
Write Opcode 0x4 0xE1802F91 # strex r2, r1, [r0]
Step cpu=0
Step cpu=1
Set Value 0xA cpu=0
Set Value 0xB cpu=1
Step cpu=1
Step cpu=0
Compare Store Status 1 cpu=0
Compare Memory Content 0xB cpu=0
Compare Store Status 0 cpu=1
Compare Memory Content 0xB cpu=1
Should Serialize Atomic State
Create Machine cpu_count=2
Write Opcode 0x0 0xE1901F9F # ldrex r1, [r0]
Write Opcode 0x4 0xE1802F91 # strex r2, r1, [r0]
Set Address 0xAA cpu=0
Set Address 0xBB cpu=1
Step cpu=0
Step cpu=1
Provides registration-pass
Should Use Serialized Atomic State And Store Succesfully
Requires registration-pass
Execute Command cpu0 ExecutionMode SingleStep
Execute Command cpu1 ExecutionMode SingleStep
Set Value 0xA cpu=0
Set Value 0xB cpu=1
Step cpu=0
Step cpu=1
Compare Store Status 0 cpu=0
Compare Memory Content 0xA cpu=0
Compare Store Status 0 cpu=1
Compare Memory Content 0xB cpu=1