*** Variables *** ${initial_pc} 0x1000 ${initial_sp} 0x3000 *** Keywords *** Create Machine Execute Command using sysbus Execute Command mach create "risc-v" Execute Command machine LoadPlatformDescriptionFromString "clint: IRQControllers.CoreLevelInterruptor @ sysbus 0x44000000 { frequency: 66000000 }" Execute Command machine LoadPlatformDescriptionFromString "cpu: CPU.RiscV64 @ sysbus { timeProvider: clint; cpuType: \\"rv64gc_V\\" }" Execute Command machine LoadPlatformDescriptionFromString "mem: Memory.MappedMemory @ sysbus 0x1000 { size: 0x40000 }" Execute Command cpu PC ${initial_pc} Execute Command cpu SP ${initial_sp} Execute Command cpu AddPreStackAccessHook 'cpu.Log(LogLevel.Info, "StackAccess: 0x{0:X}, {1}, {2}", address, width, is_write)' Create Log Tester 0 Read Hook Should Have Fired At [Arguments] ${address} ${width} ${address}= Convert To Hex ${address} prefix=0x Wait For Log Entry cpu: StackAccess: ${address}, ${width}, False Write Hook Should Have Fired At [Arguments] ${address} ${width} ${address}= Convert To Hex ${address} prefix=0x Wait For Log Entry cpu: StackAccess: ${address}, ${width}, True Execute Instruction [Arguments] ${instruction} Execute Command cpu AssembleBlock ${initial_pc} "${instruction}" Execute Command cpu Step *** Test Cases *** Should Trigger Stack Access Hook On Lb Create Machine Execute Instruction lb a0, 0(sp) Read Hook Should Have Fired At ${initial_sp} 8 Should Trigger Stack Access Hook At Correct Offset Create Machine Execute Instruction lb a0, 64(sp) Read Hook Should Have Fired At ${${initial_sp} + 64} 8 Should Trigger Stack Access Hook On Lh Create Machine Execute Instruction lh a0, 0(sp) Read Hook Should Have Fired At ${initial_sp} 16 Should Trigger Stack Access Hook On Lw Create Machine Execute Instruction lw a0, 0(sp) Read Hook Should Have Fired At ${initial_sp} 32 Should Trigger Stack Access Hook On Ld Create Machine Execute Instruction ld a0, 0(sp) Read Hook Should Have Fired At ${initial_sp} 64 Should Trigger Stack Access Hook On Sb Create Machine Execute Instruction sb a0, 0(sp) Write Hook Should Have Fired At ${initial_sp} 8 Should Trigger Stack Access Hook On Sh Create Machine Execute Instruction sh a0, 0(sp) Write Hook Should Have Fired At ${initial_sp} 16 Should Trigger Stack Access Hook On Sw Create Machine Execute Instruction sw a0, 0(sp) Write Hook Should Have Fired At ${initial_sp} 32 Should Trigger Stack Access Hook On Sd Create Machine Execute Instruction sd a0, 0(sp) Write Hook Should Have Fired At ${initial_sp} 64 Should Trigger Stack Access Hook On Lr Create Machine Execute Instruction lr.w a0, 0(sp) Read Hook Should Have Fired At ${initial_sp} 32 Should Trigger Stack Access Hook On Sc Create Machine Execute Instruction sc.w a1, a0, 0(sp) Write Hook Should Have Fired At ${initial_sp} 32 Should Trigger Stack Access Hook On Fld Create Machine Execute Instruction fld f0, 0(sp) Read Hook Should Have Fired At ${initial_sp} 64 Should Trigger Stack Access Hook On Fsd Create Machine Execute Instruction fsd f0, 0(sp) Write Hook Should Have Fired At ${initial_sp} 64 # Unit strided Should Trigger Stack Access Hook On Vle8 Create Machine Execute Command cpu AssembleBlock ${initial_pc} "vsetivli t0, 8, e8,m1,ta,ma; vle8.v v0, 0(sp)" Execute Command cpu Step 2 FOR ${counter} IN RANGE 0 7 Read Hook Should Have Fired At ${${initial_sp}+${counter}} 8 END Should Trigger Stack Access Hook On Vle64 Create Machine Execute Command cpu AssembleBlock ${initial_pc} "vsetivli t0, 8, e64,m1,ta,ma; vle64.v v0, 0(sp)" Execute Command cpu Step 2 FOR ${counter} IN RANGE 0 7 Read Hook Should Have Fired At ${${initial_sp}+(${counter}*8)} 64 END Should Trigger Stack Access Hook On Vse8 Create Machine Execute Command cpu AssembleBlock ${initial_pc} "vsetivli t0, 8, e8,m1,ta,ma; vse8.v v0, 0(sp)" Execute Command cpu Step 2 FOR ${counter} IN RANGE 0 7 Write Hook Should Have Fired At ${${initial_sp}+${counter}} 8 END Should Trigger Stack Access Hook On Vse64 Create Machine Execute Command cpu AssembleBlock ${initial_pc} "vsetivli t0, 8, e64,m1,ta,ma; vse64.v v0, 0(sp)" Execute Command cpu Step 2 FOR ${counter} IN RANGE 0 7 Write Hook Should Have Fired At ${${initial_sp}+${counter}*8} 64 END # strided Should Trigger Stack Access Hook On Vlse8 Create Machine Execute Command cpu AssembleBlock ${initial_pc} "vsetivli t0, 8, e8,m1,ta,ma; li a0, 16; vlse8.v v0, 0(sp), a0" Execute Command cpu Step 3 FOR ${counter} IN RANGE 0 7 Read Hook Should Have Fired At ${${initial_sp}+${counter}*16} 8 END Should Trigger Stack Access Hook On Vlse64 Create Machine Execute Command cpu AssembleBlock ${initial_pc} "vsetivli t0, 8, e64,m1,ta,ma; li a0, 128; vlse64.v v0, 0(sp), a0" Execute Command cpu Step 3 FOR ${counter} IN RANGE 0 7 Read Hook Should Have Fired At ${${initial_sp}+${counter}*128} 64 END Should Trigger Stack Access Hook On Vsse8 Create Machine Execute Command cpu AssembleBlock ${initial_pc} "vsetivli t0, 8, e8,m1,ta,ma; li a0, 16; vsse8.v v0, 0(sp), a0" Execute Command cpu Step 3 FOR ${counter} IN RANGE 0 7 Write Hook Should Have Fired At ${${initial_sp}+${counter}*16} 8 END Should Trigger Stack Access Hook On Vsse64 Create Machine Execute Command cpu AssembleBlock ${initial_pc} "vsetivli t0, 8, e64,m1,ta,ma; li a0, 128; vsse64.v v0, 0(sp), a0" Execute Command cpu Step 3 FOR ${counter} IN RANGE 0 7 Write Hook Should Have Fired At ${${initial_sp}+${counter}*128} 64 END