1*** Variables ***
2${riscv_start_pc}                   0x2000
3${armv8_start_pc}                   0x40000000
4
5*** Keywords ***
6Create RiscV Machine
7    [Arguments]                     ${bitness}
8    Execute Command                 using sysbus
9    Execute Command                 mach create "risc-v"
10
11    Execute Command                 machine LoadPlatformDescriptionFromString "clint: IRQControllers.CoreLevelInterruptor @ sysbus 0x44000000 { frequency: 66000000 }"
12    Execute Command                 machine LoadPlatformDescriptionFromString "cpu: CPU.RiscV${bitness} @ sysbus { timeProvider: clint; cpuType: \\"rv${bitness}g\\"; interruptMode: 1 }"
13    Execute Command                 machine LoadPlatformDescriptionFromString "mem: Memory.MappedMemory @ sysbus 0x1000 { size: 0x40000 }"
14
15    Execute Command                 cpu PC ${riscv_start_pc}
16
17Write One Plus One Program RiscV32
18    Execute Command                 sysbus WriteDoubleWord ${riscv_start_pc} 0x00150513  # addi a0, a0, #1
19    Execute Command                 sysbus WriteDoubleWord ${ ${riscv_start_pc} + 4 } 0x00150513
20
21Write Store Load Program RiscV32
22    # Does not work yet, missing op_qemu_st32
23    # Program: li a0, 0xdead; auipc a1 0x40; sw a0, 0(a1); lw a2, 0(a1)
24    Execute Command                 sysbus WriteDoubleWord ${riscv_start_pc} 0x0000e537
25    Execute Command                 sysbus WriteDoubleWord ${ ${riscv_start_pc} + 4 } 0xead50513
26    Execute Command                 sysbus WriteDoubleWord ${ ${riscv_start_pc} + 8 } 0x00040597
27    Execute Command                 sysbus WriteDoubleWord ${ ${riscv_start_pc} + 12 } 0x00a5a023
28    Execute Command                 sysbus WriteDoubleWord ${ ${riscv_start_pc} + 16 } 0x0005a603
29
30Create ARMv8A Machine
31    Execute Command                 using sysbus
32    Execute Command                 mach create "armv8"
33    Execute Command                 machine LoadPlatformDescription @platforms/cpus/cortex-a53-gicv2.repl
34    Execute Command                 cpu PC ${armv8_start_pc}
35
36Write One Plus One Program ARMv8
37    Execute Command                 sysbus WriteDoubleWord ${armv8_start_pc} 0x91000400  # add x0, x0, #0x1
38    Execute Command                 sysbus WriteDoubleWord ${ ${armv8_start_pc} + 4 } 0x91000400
39
40*** Test Cases ***
41Should Calculate One Plus One RiscV32
42    Create RiscV Machine            bitness=32
43    Write One Plus One Program RiscV32
44    Execute Command                 cpu Step
45    Register Should Be Equal        10       0x1
46    Execute Command                 cpu Step
47    Register Should Be Equal        10       0x2
48
49Should Calculate One Plus One ARMv8
50    Create ARMv8A Machine
51    Write One Plus One Program ARMv8
52    Execute Command                 cpu Step
53    Register Should Be Equal        0       0x1
54    Execute Command                 cpu Step
55    Register Should Be Equal        0       0x2
56