*** Variables *** ${PLATFORM} @platforms/cpus/cortex-a53-gicv2.repl ${LOG_WFI_ENTER} WFI_ENTER ${LOG_WFI_END} WFI_EXIT *** Keywords *** Create Platform Execute Command mach create Execute Command machine LoadPlatformDescription ${PLATFORM} Execute Command using sysbus # Create infinite loop with WFI Execute Command sysbus WriteDoubleWord 0x1000 0xD503207F # wfi Execute Command sysbus WriteDoubleWord 0x1004 0xD503201F # nop Execute Command sysbus WriteDoubleWord 0x1008 0xD503201F # nop Execute Command sysbus WriteDoubleWord 0x100C 0xD503201F # nop Execute Command sysbus WriteDoubleWord 0x1010 0x17FFFFFC # b to 0x1000 Execute Command cpu PC 0x1000 Assert SysReg Equals [Arguments] ${name} ${expected} ${pc}= Execute Command cpu GetSystemRegisterValue ${name} Should Be Equal As Integers ${pc} ${expected} Assert Enter In Logs Wait For Log Entry ${LOG_WFI_ENTER} # Should not show duplicate Enter message Should Not Be In Log ${LOG_WFI_ENTER} Assert End In Logs Wait For Log Entry ${LOG_WFI_END} # Should not show duplicate Exit message Should Not Be In Log ${LOG_WFI_END} *** Test Cases *** Should Invoke Interrupt Hooks Create Platform Execute Command cpu AddHookAtWfiStateChange 'self.Log(LogLevel.Info, "${LOG_WFI_ENTER}" if isInWfi else "${LOG_WFI_END}" )' Create Log Tester 1 Start Emulation Assert Enter In Logs # Trigger interrupt in CPU Execute Command cpu OnGPIO 0 true Assert End In Logs # Deactivate interrupt line, so the CPU enters WFI state again Execute Command cpu OnGPIO 0 false Assert Enter In Logs # Ensure that the hook triggers after Reset Execute Command cpu Reset # After reset time doesn't flow Wait For Log Entry ${LOG_WFI_END} Should Reset Cpu From WFI Hook Create Platform # Preload TTBR0 with a nonsensical value, to check if it is cleared after reset Execute Command cpu SetSystemRegisterValue "TTBR0_EL1" 0xDEADBEEF Execute Command cpu AddHookAtWfiStateChange 'self.Log(LogLevel.Info, "${LOG_WFI_ENTER}" if isInWfi else "${LOG_WFI_END}" )' Execute Command cpu AddHookAtWfiStateChange 'self.Reset()' Create Log Tester 1 Start Emulation # Can't use Assert X In Logs, since the Reset happens inside the hook Wait For Log Entry ${LOG_WFI_ENTER} Wait For Log Entry ${LOG_WFI_END} # CPU has been reset, so TTBR0 is set to 0 Assert SysReg Equals "TTBR0_EL1" 0x0