| *** Variables *** |
| ${riscv_start_pc} 0x2000 |
| ${armv8_start_pc} 0x40000000 |
| |
| *** Keywords *** |
| Create RiscV Machine |
| [Arguments] ${bitness} |
| 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.RiscV${bitness} @ sysbus { timeProvider: clint; cpuType: \\"rv${bitness}g\\"; interruptMode: 1 }" |
| Execute Command machine LoadPlatformDescriptionFromString "mem: Memory.MappedMemory @ sysbus 0x1000 { size: 0x40000 }" |
| |
| Execute Command cpu PC ${riscv_start_pc} |
| |
| Write One Plus One Program RiscV32 |
| Execute Command sysbus WriteDoubleWord ${riscv_start_pc} 0x00150513 # addi a0, a0, #1 |
| Execute Command sysbus WriteDoubleWord ${ ${riscv_start_pc} + 4 } 0x00150513 |
| |
| Write Store Load Program RiscV32 |
| # Does not work yet, missing op_qemu_st32 |
| # Program: li a0, 0xdead; auipc a1 0x40; sw a0, 0(a1); lw a2, 0(a1) |
| Execute Command sysbus WriteDoubleWord ${riscv_start_pc} 0x0000e537 |
| Execute Command sysbus WriteDoubleWord ${ ${riscv_start_pc} + 4 } 0xead50513 |
| Execute Command sysbus WriteDoubleWord ${ ${riscv_start_pc} + 8 } 0x00040597 |
| Execute Command sysbus WriteDoubleWord ${ ${riscv_start_pc} + 12 } 0x00a5a023 |
| Execute Command sysbus WriteDoubleWord ${ ${riscv_start_pc} + 16 } 0x0005a603 |
| |
| Create ARMv8A Machine |
| Execute Command using sysbus |
| Execute Command mach create "armv8" |
| Execute Command machine LoadPlatformDescription @platforms/cpus/cortex-a53-gicv2.repl |
| Execute Command cpu PC ${armv8_start_pc} |
| |
| Write One Plus One Program ARMv8 |
| Execute Command sysbus WriteDoubleWord ${armv8_start_pc} 0x91000400 # add x0, x0, #0x1 |
| Execute Command sysbus WriteDoubleWord ${ ${armv8_start_pc} + 4 } 0x91000400 |
| |
| *** Test Cases *** |
| Should Calculate One Plus One RiscV32 |
| Create RiscV Machine bitness=32 |
| Write One Plus One Program RiscV32 |
| Execute Command cpu Step |
| Register Should Be Equal 10 0x1 |
| Execute Command cpu Step |
| Register Should Be Equal 10 0x2 |
| |
| Should Calculate One Plus One ARMv8 |
| Create ARMv8A Machine |
| Write One Plus One Program ARMv8 |
| Execute Command cpu Step |
| Register Should Be Equal 0 0x1 |
| Execute Command cpu Step |
| Register Should Be Equal 0 0x2 |