Files
simulation_core/tests/unit-tests/memory-access.robot

74 lines
3.4 KiB
Plaintext

*** Variables ***
${emulation_time} "0.00000005"
${illegal_address_64} 0x8000000000000000
${illegal_address_32} 0x100000000
${starting_pc} 0x1000
${trap_vector_addr} 0x2000
# Exception ID
${RISCV_MCAUSE_LOAD_BUS_FAULT} 0x5
# Platform definition
${PLAT_RISCV64} 'cpu: CPU.RiscV64 @ sysbus { cpuType: "rv64g"; privilegedArchitecture: PrivilegedArchitecture.Priv1_10}'
${PLAT_RISCV32} 'cpu: CPU.RiscV32 @ sysbus { cpuType: "rv32i"; privilegedArchitecture: PrivilegedArchitecture.Priv1_10}'
# Test programs
# RISCV tests only written for RV64 as it's not possible to address >32bit memory on RV32 due to addres arithmetic
${PROG_RISCV_INSN_FETCH} SEPARATOR=\n
... li x1, 0x8000000000000000
... jr x1
${PROG_RISCV_LOAD} SEPARATOR=\n
... li x1, 0x8000000000000000
... lw x2, 0(x1)
*** Keywords ***
Create Machine
[Arguments] ${PLAT}
Execute Command using sysbus
Execute Command mach create
Execute Command machine LoadPlatformDescriptionFromString ${PLAT}
Execute Command machine LoadPlatformDescriptionFromString 'mem: Memory.MappedMemory @ sysbus 0x0 { size: 0x3000 }'
Configure Machine
[Arguments] ${PROG}
Execute Command cpu LogTranslationBlockFetch True
Execute Command cpu AssembleBlock ${starting_pc} "${PROG}"
Execute Command cpu AddHook ${trap_vector_addr} "self.DebugLog('TRAP: '+ str(self.MCAUSE))"
Execute Command cpu PC ${starting_pc}
Execute Command cpu MTVEC ${trap_vector_addr}
Create Log Tester 0.01 defaultPauseEmulation=true
Execute Command logLevel -1 cpu
Monitor Exception Template
[Arguments] ${PLAT} ${ADDR}
Create Machine ${PLAT}
Run Keyword And Expect Error
... *Failed to translate address*
... Execute Command cpu TranslateAddress ${ADDR} 0
*** Test Cases ***
Should Report Illegal Address For Instruction Fetch
Create Machine ${PLAT_RISCV64}
Configure Machine ${PROG_RISCV_INSN_FETCH}
Execute Command emulation RunFor ${emulation_time}
Wait For Log Entry Trying to execute code from an illegal address outside of the physical memory address space: ${illegal_address_64} timeout=0
# Trap value not checked as instruction fetch from illegal address triggers an abort
Should Report Illegal Address For Store
Create Machine ${PLAT_RISCV64}
Configure Machine ${PROG_RISCV_LOAD}
Execute Command emulation RunFor ${emulation_time}
Wait For Log Entry Trying to access memory from an illegal address outside of the physical memory address space: ${illegal_address_64} timeout=0
Wait For Log Entry TRAP: ${RISCV_MCAUSE_LOAD_BUS_FAULT} timeout=0
Should Throw Monitor Exception
[Template] Monitor Exception Template
${PLAT_RISCV32} ${illegal_address_32}
${PLAT_RISCV64} ${illegal_address_64}