*** Variables *** ${SIMULATION_TIME} "0.001" ${TRACE_SIZE_LIMIT} 100 ${URL} https://dl.antmicro.com/projects/renode ${PLAT_RISCV} SEPARATOR=\n """ ... cpu: CPU.RiscV32 @ sysbus { cpuType: "rv32i"} ... mem: Memory.MappedMemory @ sysbus 0x1000 { size: 0x1000 } ... """ ${PLAT_ARM} SEPARATOR=\n """ ... cpu: CPU.CortexM @ sysbus ... ${SPACE*4}cpuType: "cortex-m4" ... ${SPACE*4}nvic: nvic ... ... nvic: IRQControllers.NVIC @ sysbus 0xe000e000 ... ${SPACE*4}-> cpu@0 ... ... mem: Memory.MappedMemory @ sysbus 0x0 ... ${SPACE*4}size: 0x4000 ... """ # The program is constructed in such a way that will insert stack announcements (jal x1, XX(x)) # but also chain blocks such that we have multiple stack announcements in a single block ${PROG_RISCV} SEPARATOR=\n ... loop: ... jal x1, 4 ... jal x1, 4 ... jal x1, 4 ... jal loop # The code below configures MPU region 0 to <0x3000 0x64> to no priviliges, and then # triggers the PendSV interrupt. In the PendSV handler the MPU fauilt is triggered, resulting # in two execution stacks for one context. ${PROG_ARM} SEPARATOR=\n ... ldr r0, =0xE000ED9C // MPU_RBAR ... ldr r1, [r0] ... orr r1, r1, #0x3000 // Base address 0x3000 ... orr r1, r1, #0x8 // Region enabled ... str r1, [r0] ... ... ldr r0, =0xE000EDA0 // MPU_RASR ... ldr r1, [r0] ... orr r1, r1, #0xB // Size 64, no R/W priv ... str r1, [r0] ... ... ldr r0, =0xE000ED94 // MPU_CTRL ... ldr r1, [r0] ... orr r1, r1, #0x7 // Enable MPU ... str r1, [r0] ... ... ldr r0, =0xE000ED04 // SCB->ICSR ... ldr r1, [r0] ... orr r1, r1, #0x10000000 // Trigger PENDSVSET ... str r1, [r0] ${PROG_ARM_HANDLER} SEPARATOR=\n ... // Trigger MemManageFault ... ldr r0, =0x3000 ... ldr r1, [r0] *** Keywords *** Create Machine Execute Command set bin @${URL}/renode-mbed-pipeline-helloworld.elf-ga2ede71-s_2466384-6e3635e4ed159bc847cf1deb3dc7f24b10d26b41 Execute Command include @scripts/single-node/stm32f746_mbed.resc Create Machine With Chained Stack Announcements Execute Command mach create Execute Command machine LoadPlatformDescriptionFromString ${PLAT_RISCV} Execute Command cpu AssembleBlock 0x1000 "${PROG_RISCV}" *** Test Cases *** Should Stop Writing To File Perfetto Create Machine ${TEST_TRACE_FILE}= Allocate Temporary File Execute Command cpu EnableProfilerPerfetto "${TEST_TRACE_FILE}" true true ${TRACE_SIZE_LIMIT} Execute Command emulation RunFor ${SIMULATION_TIME} ${TRACE_FILE_SIZE}= Get File Size ${TEST_TRACE_FILE} Should Be True ${TRACE_FILE_SIZE} < ${TRACE_SIZE_LIMIT} Should Stop Writing To File Collapsed Stack Create Machine ${TEST_TRACE_FILE}= Allocate Temporary File Execute Command cpu EnableProfilerCollapsedStack "${TEST_TRACE_FILE}" true ${TRACE_SIZE_LIMIT} Execute Command emulation RunFor ${SIMULATION_TIME} ${TRACE_FILE_SIZE}= Get File Size ${TEST_TRACE_FILE} Should Be True ${TRACE_FILE_SIZE} < ${TRACE_SIZE_LIMIT} Should Not Limit File Size Create Machine ${TEST_TRACE_FILE}= Allocate Temporary File Execute Command cpu EnableProfilerCollapsedStack "${TEST_TRACE_FILE}" true Execute Command emulation RunFor ${SIMULATION_TIME} ${TRACE_FILE_SIZE}= Get File Size ${TEST_TRACE_FILE} Should Be True ${TRACE_FILE_SIZE} > ${TRACE_SIZE_LIMIT} Should Disable Profiler Inside Translation Block Create Machine With Chained Stack Announcements # The mechanism that disables profiler can trigger it during the execution of a translation block # which means that it can still trigger a stack announcement even after flushing the translation cache # This test verifies that this case is handled Execute Command cpu EnableProfilerCollapsedStack "profile" true 1000 Execute Command emulation RunFor "0.001" Should Disable Profiler After Reaching Maximum Nested Context Count Create Log Tester 0 Execute Command mach create Execute Command machine LoadPlatformDescriptionFromString ${PLAT_ARM} ${TEST_TRACE_FILE}= Allocate Temporary File Execute Command cpu EnableProfilerCollapsedStack "${TEST_TRACE_FILE}" maximumNestedContexts=1 # This sample will generate a nested interrupt: the first one is triggered by a PendSV, and the second # is caused by a MemManageFault due to accessing memory restricted by the MPU. The `maximumNestedContexts` # parameter is set to one, so it should disable the profiler upon the second interrupt. Execute Command cpu AssembleBlock 0x2000 "${PROG_ARM}" Execute Command cpu AssembleBlock 0x1000 "${PROG_ARM_HANDLER}" Execute Command sysbus WriteDoubleWord 0x00 0x100 # Initial SP Execute Command sysbus WriteDoubleWord 0x04 0x2000 # Initial PC Execute Command sysbus WriteDoubleWord 0x38 0x1001 # PendSV Handler @ 0x1000 Execute Command cpu VectorTableOffset 0x0 Execute Command cpu Step 19 Wait For Log Entry maximum nested contexts exceeded, disabling profiler