*** Variables *** # Make sure mem1-3 are far apart so that they get stored on 3 different pages ${MEM1_NAME} test_mem1 ${MEM2_NAME} test_mem2 ${MEM3_NAME} test_mem3 ${MEM1_ADDR} 0x31000000 ${MEM2_ADDR} 0x32000000 ${MEM3_ADDR} 0x33000000 ${REPL}= SEPARATOR= ... """ ${\n} ... nvic: IRQControllers.NVIC @ sysbus 0xE000E000 ${\n} ... ${SPACE*4}-> cpu@0 ${\n} ... ${\n} ... cpu: CPU.CortexM @ sysbus ${\n} ... ${SPACE*4}cpuType: "cortex-m4" ${\n} ... ${SPACE*4}nvic: nvic ${\n} ... ${\n} ... ram: Memory.MappedMemory @ sysbus 0x800000 ${\n} ... ${SPACE*4}size: 0x40000 ${\n} ... ${\n} ... ${MEM1_NAME}: Memory.MappedMemory @ sysbus ${MEM1_ADDR} ${\n} ... ${SPACE*4}size: 0x1000 ${\n} ... ${\n} ... ${MEM2_NAME}: Memory.MappedMemory @ sysbus ${MEM2_ADDR} ${\n} ... ${SPACE*4}size: 0x1000 ${\n} ... ${\n} ... ${MEM3_NAME}: Memory.MappedMemory @ sysbus ${MEM3_ADDR} ${\n} ... ${SPACE*4}size: 0x1000 ${\n} ... """ ${LOG_TIMEOUT} 1 ${PC_START} 0x800000 *** Keywords *** Write Thumb Opcode To [Arguments] ${dest} ${opcode} Execute Command sysbus WriteWord ${dest} ${opcode} Write Address To [Arguments] ${dest} ${address} Execute Command sysbus WriteDoubleWord ${dest} ${address} Prepare Machine Execute Command mach create Create Log Tester ${LOG_TIMEOUT} Execute Command machine LoadPlatformDescriptionFromString ${REPL} Execute Command emulation SingleStepBlocking false Execute Command sysbus.cpu PC ${PC_START} Execute Command sysbus LogPeripheralAccess sysbus.${MEM1_NAME} Execute Command sysbus LogPeripheralAccess sysbus.${MEM2_NAME} Execute Command sysbus LogPeripheralAccess sysbus.${MEM3_NAME} Trigger Page Access [Arguments] ${MEM} # Set R1 to MEM, then load the value at MEM into R0 Execute Command sysbus.cpu SetRegister 1 ${MEM} Write Thumb Opcode To ${PC_START} 0x6808 # ldr r0, [r1, #0] Execute Command sysbus.cpu PC ${PC_START} Execute Command sysbus.cpu Step 1 Should Access Page Via Io [Arguments] ${MEM_NAME} ${MEM} Trigger Page Access ${MEM} Wait For Log Entry ${MEM_NAME}: [cpu: ${PC_START}] ReadUInt32 from 0x0 (unknown), returned Should Not Access Page Via Io [Arguments] ${MEM_NAME} ${MEM} Trigger Page Access ${MEM} Should Not Be In Log ${MEM_NAME}: [cpu: ${PC_START}] ReadUInt32 from 0x0 (unknown), returned *** Test Cases *** Should Set And Clear Page Access Modes Correctly Prepare Machine Wait For Log Entry cpu: Patching PC ${PC_START} for Thumb mode. Should Not Access Page Via Io ${MEM1_NAME} ${MEM1_ADDR} Should Not Access Page Via Io ${MEM2_NAME} ${MEM2_ADDR} Should Not Access Page Via Io ${MEM3_NAME} ${MEM3_ADDR} Execute Command sysbus SetPageAccessViaIo ${MEM1_ADDR} Should Access Page Via Io ${MEM1_NAME} ${MEM1_ADDR} Should Not Access Page Via Io ${MEM2_NAME} ${MEM2_ADDR} Should Not Access Page Via Io ${MEM3_NAME} ${MEM3_ADDR} Execute Command sysbus SetPageAccessViaIo ${MEM2_ADDR} Should Access Page Via Io ${MEM1_NAME} ${MEM1_ADDR} Should Access Page Via Io ${MEM2_NAME} ${MEM2_ADDR} Should Not Access Page Via Io ${MEM3_NAME} ${MEM3_ADDR} Execute Command sysbus SetPageAccessViaIo ${MEM3_ADDR} Should Access Page Via Io ${MEM1_NAME} ${MEM1_ADDR} Should Access Page Via Io ${MEM2_NAME} ${MEM2_ADDR} Should Access Page Via Io ${MEM3_NAME} ${MEM3_ADDR} Execute Command sysbus ClearPageAccessViaIo ${MEM1_ADDR} Should Not Access Page Via Io ${MEM1_NAME} ${MEM1_ADDR} Should Access Page Via Io ${MEM2_NAME} ${MEM2_ADDR} Should Access Page Via Io ${MEM3_NAME} ${MEM3_ADDR} Execute Command sysbus ClearPageAccessViaIo ${MEM2_ADDR} Should Not Access Page Via Io ${MEM1_NAME} ${MEM1_ADDR} Should Not Access Page Via Io ${MEM2_NAME} ${MEM2_ADDR} Should Access Page Via Io ${MEM3_NAME} ${MEM3_ADDR} Execute Command sysbus ClearPageAccessViaIo ${MEM3_ADDR} Should Not Access Page Via Io ${MEM1_NAME} ${MEM1_ADDR} Should Not Access Page Via Io ${MEM2_NAME} ${MEM2_ADDR} Should Not Access Page Via Io ${MEM3_NAME} ${MEM3_ADDR} Execute Command sysbus SetPageAccessViaIo ${MEM2_ADDR} Should Not Access Page Via Io ${MEM1_NAME} ${MEM1_ADDR} Should Access Page Via Io ${MEM2_NAME} ${MEM2_ADDR} Should Not Access Page Via Io ${MEM3_NAME} ${MEM3_ADDR} Execute Command sysbus SetPageAccessViaIo ${MEM1_ADDR} Execute Command sysbus ClearPageAccessViaIo ${MEM2_ADDR} Execute Command sysbus SetPageAccessViaIo ${MEM3_ADDR} Should Access Page Via Io ${MEM1_NAME} ${MEM1_ADDR} Should Not Access Page Via Io ${MEM2_NAME} ${MEM2_ADDR} Should Access Page Via Io ${MEM3_NAME} ${MEM3_ADDR}