diff --git a/bsp_q7s/core/CoreController.cpp b/bsp_q7s/core/CoreController.cpp index 03ec86ee..098124ac 100644 --- a/bsp_q7s/core/CoreController.cpp +++ b/bsp_q7s/core/CoreController.cpp @@ -1254,7 +1254,9 @@ void CoreController::performRebootFileHandling(bool recreateFile) { rebootFile.bootFlag = false; } - if (*rebootFile.relevantBootCnt >= rebootFile.maxCount) { + // Only reboot if the reboot functionality is enabled. + // The handler will still increment the boot counts + if (rebootFile.enabled and (*rebootFile.relevantBootCnt >= rebootFile.maxCount)) { // Reboot to other image bool doReboot = false; xsc::Chip tgtChip = xsc::NO_CHIP; @@ -1296,8 +1298,8 @@ void CoreController::determineAndExecuteReboot(RebootFile &rf, bool &needsReboot tgtCopy = xsc::COPY_1; } } else { - tgtChip = xsc::CHIP_0; - tgtCopy = xsc::COPY_1; + tgtChip = xsc::CHIP_1; + tgtCopy = xsc::COPY_0; } } else { tgtCopy = xsc::COPY_1; diff --git a/unittest/rebootLogic/CoreController.cpp b/unittest/rebootLogic/CoreController.cpp index fd479fd6..3a6b2e52 100644 --- a/unittest/rebootLogic/CoreController.cpp +++ b/unittest/rebootLogic/CoreController.cpp @@ -87,7 +87,9 @@ void CoreController::performRebootFileHandling(bool recreateFile) { rebootFile.bootFlag = false; } - if (*rebootFile.relevantBootCnt >= rebootFile.maxCount) { + // Only reboot if the reboot functionality is enabled. + // The handler will still increment the boot counts + if (rebootFile.enabled and (*rebootFile.relevantBootCnt >= rebootFile.maxCount)) { // Reboot to other image bool doReboot = false; xsc::Chip tgtChip = xsc::NO_CHIP; @@ -131,8 +133,8 @@ void CoreController::determineAndExecuteReboot(RebootFile &rf, bool &needsReboot tgtCopy = xsc::COPY_1; } } else { - tgtChip = xsc::CHIP_0; - tgtCopy = xsc::COPY_1; + tgtChip = xsc::CHIP_1; + tgtCopy = xsc::COPY_0; } } else { tgtCopy = xsc::COPY_1; diff --git a/unittest/rebootLogic/main.cpp b/unittest/rebootLogic/main.cpp index 515b9750..817bffe6 100644 --- a/unittest/rebootLogic/main.cpp +++ b/unittest/rebootLogic/main.cpp @@ -72,6 +72,8 @@ TEST_CASE( "Core Controller Reboot File Handling", "[reboot-file]" ) { REQUIRE(copy == XSC_LIBNOR_COPY_GOLD); EventInfo info = {}; uint32_t numEvents = 0; + + // We are now on image 0 1 and an event will be triggered ctrl.performRebootFileHandling(false); eventWasCalled(info, numEvents); CHECK(numEvents == 1); @@ -100,6 +102,136 @@ TEST_CASE( "Core Controller Reboot File Handling", "[reboot-file]" ) { REQUIRE(rf.img01Cnt == 3); REQUIRE(rf.img10Cnt == 0); REQUIRE(rf.img11Cnt == 0); + + // We are now on image 1 0 and an event will be triggered + ctrl.performRebootFileHandling(false); + eventWasCalled(info, numEvents); + CHECK(numEvents == 1); + CHECK(info.event == CoreController::REBOOT_MECHANISM_TRIGGERED); + CHECK(static_cast((info.p1 >> 16) & 0xFFFF) == xsc::CHIP_0); + CHECK(static_cast(info.p1 & 0xFFFF) == xsc::COPY_1); + CHECK(((info.p2 >> 24) & 0xFF) == 3); + CHECK(((info.p2 >> 16) & 0xFF) == 3); + CHECK(((info.p2 >> 8) & 0xFF) == 1); + CHECK((info.p2 & 0xFF) == 0); + ctrl.parseRebootFile(REBOOT_FILE, rf); + REQUIRE(rf.enabled == 1); + REQUIRE(rf.img00Cnt == 3); + REQUIRE(rf.img01Cnt == 3); + REQUIRE(rf.img10Cnt == 1); + REQUIRE(rf.img11Cnt == 0); + ctrl.performRebootFileHandling(false); + ctrl.performRebootFileHandling(false); + ctrl.parseRebootFile(REBOOT_FILE, rf); + REQUIRE(rf.enabled == 1); + REQUIRE(rf.img00Cnt == 3); + REQUIRE(rf.img01Cnt == 3); + REQUIRE(rf.img10Cnt == 3); + REQUIRE(rf.img11Cnt == 0); + eventWasCalled(info, numEvents); + + // On image 1 1 now + ctrl.performRebootFileHandling(false); + eventWasCalled(info, numEvents); + CHECK(numEvents == 1); + CHECK(info.event == CoreController::REBOOT_MECHANISM_TRIGGERED); + CHECK(static_cast((info.p1 >> 16) & 0xFFFF) == xsc::CHIP_1); + CHECK(static_cast(info.p1 & 0xFFFF) == xsc::COPY_0); + CHECK(((info.p2 >> 24) & 0xFF) == 3); + CHECK(((info.p2 >> 16) & 0xFF) == 3); + CHECK(((info.p2 >> 8) & 0xFF) == 3); + CHECK((info.p2 & 0xFF) == 1); + + ctrl.performRebootFileHandling(false); + ctrl.performRebootFileHandling(false); + // Now it should fall back to 0 0 because all are invalid + ctrl.parseRebootFile(REBOOT_FILE, rf); + REQUIRE(rf.enabled == 1); + REQUIRE(rf.img00Cnt == 3); + REQUIRE(rf.img01Cnt == 3); + REQUIRE(rf.img10Cnt == 3); + REQUIRE(rf.img11Cnt == 3); + + // Should remain on image now + ctrl.performRebootFileHandling(false); + eventWasCalled(info, numEvents); + CHECK(numEvents == 1); + CHECK(info.event == CoreController::REBOOT_MECHANISM_TRIGGERED); + CHECK(static_cast((info.p1 >> 16) & 0xFFFF) == xsc::CHIP_1); + CHECK(static_cast(info.p1 & 0xFFFF) == xsc::COPY_1); + CHECK(((info.p2 >> 24) & 0xFF) == 4); + CHECK(((info.p2 >> 16) & 0xFF) == 3); + CHECK(((info.p2 >> 8) & 0xFF) == 3); + CHECK((info.p2 & 0xFF) == 3); + ctrl.parseRebootFile(REBOOT_FILE, rf); + REQUIRE(rf.img00Cnt == 4); + REQUIRE(rf.img01Cnt == 3); + REQUIRE(rf.img10Cnt == 3); + REQUIRE(rf.img11Cnt == 3); + + // Reset a specific reboot counter + ctrl.executeAction(CoreController::RESET_REBOOT_COUNTER_01, 0, nullptr, 0); + // Reboot to 0 0 again + ctrl.performRebootFileHandling(false); + ctrl.parseRebootFile(REBOOT_FILE, rf); + REQUIRE(rf.enabled == 1); + REQUIRE(rf.img00Cnt == 5); + REQUIRE(rf.img01Cnt == 0); + REQUIRE(rf.img10Cnt == 3); + REQUIRE(rf.img11Cnt == 3); + CHECK(CoreController::CURRENT_CHIP == xsc::CHIP_0); + CHECK(CoreController::CURRENT_COPY == xsc::COPY_1); + ctrl.executeAction(CoreController::RESET_ALL_REBOOT_COUNTERS, 0, nullptr, 0); + ctrl.parseRebootFile(REBOOT_FILE, rf); + REQUIRE(rf.enabled == 1); + REQUIRE(rf.img00Cnt == 0); + REQUIRE(rf.img01Cnt == 0); + REQUIRE(rf.img10Cnt == 0); + REQUIRE(rf.img11Cnt == 0); + uint8_t enable = 0; + ctrl.executeAction(CoreController::SWITCH_REBOOT_FILE_HANDLING, 0, &enable, 1); + ctrl.parseRebootFile(REBOOT_FILE, rf); + REQUIRE(rf.enabled == 0); + REQUIRE(rf.img00Cnt == 0); + REQUIRE(rf.img01Cnt == 0); + REQUIRE(rf.img10Cnt == 0); + REQUIRE(rf.img11Cnt == 0); + + // Reboot to 1 0 explicitely + CoreController::setCurrentBootCopy(xsc::CHIP_1, xsc::COPY_0); + // Reboot three times and verify that no reboot is performed + ctrl.performRebootFileHandling(false); + ctrl.performRebootFileHandling(false); + ctrl.performRebootFileHandling(false); + ctrl.performRebootFileHandling(false); + ctrl.parseRebootFile(REBOOT_FILE, rf); + REQUIRE(rf.enabled == 0); + REQUIRE(rf.img00Cnt == 0); + REQUIRE(rf.img01Cnt == 0); + REQUIRE(rf.img10Cnt == 4); + REQUIRE(rf.img11Cnt == 0); + // Now enable the functionality again and verify it reboots to 1 1 + enable = 1; + ctrl.executeAction(CoreController::SWITCH_REBOOT_FILE_HANDLING, 0, &enable, 1); + ctrl.performRebootFileHandling(false); + ctrl.parseRebootFile(REBOOT_FILE, rf); + REQUIRE(rf.enabled == 1); + REQUIRE(rf.img00Cnt == 0); + REQUIRE(rf.img01Cnt == 0); + REQUIRE(rf.img10Cnt == 5); + REQUIRE(rf.img11Cnt == 0); + ctrl.performRebootFileHandling(false); + ctrl.parseRebootFile(REBOOT_FILE, rf); + REQUIRE(rf.enabled == 1); + REQUIRE(rf.img00Cnt == 0); + REQUIRE(rf.img01Cnt == 0); + REQUIRE(rf.img10Cnt == 5); + REQUIRE(rf.img11Cnt == 1); + ctrl.performRebootFileHandling(false); + ctrl.performRebootFileHandling(false); + // Should be on 0 0 now + CHECK(CoreController::CURRENT_CHIP == xsc::CHIP_0); + CHECK(CoreController::CURRENT_COPY == xsc::COPY_0); } if(std::filesystem::exists(CONF_PATH)) { std::uintmax_t n = std::filesystem::remove_all(CONF_PATH);