From 0c4287b961aedc1d20a3728db13a67a0913e6e53 Mon Sep 17 00:00:00 2001 From: Sid Hsu Date: Thu, 23 May 2024 23:31:48 +0800 Subject: [PATCH] [Infineon] Add a test trigger for CYW30739 to fill up event logging buffers. (#33382) * [Infineon] Add a test trigger for CYW30739 to fill up event logging buffers. * Implement the TestEventTriggerDelegate class to provide a vendor trigger kFillUpEventLoggingBuffer as 0xffffffff00000000 (-4294967296) to fill up event logging buffers with HardwareFaultChange and SoftwareFault events. * Implement the OnSoftwareFaultEventHandler method to build and log a SoftwareFault event. * Fix string literals and the vendor event trigger value. Change the vendor trigger kFillUpEventLoggingBuffer from 0xffffffff00000000 (-4294967296) to 0xffffffff13880000 (-3967287296). * Move common trigger logics to GenericEventManagementTestEventTriggerHandler class. --- examples/platform/infineon/cyw30739/BUILD.gn | 2 + ...EventManagementTestEventTriggerHandler.cpp | 47 ++++++++++++ .../EventManagementTestEventTriggerHandler.h | 42 +++++++++++ .../infineon/cyw30739/SoftwareDiagnostics.cpp | 62 ++++++++++++++++ .../infineon/cyw30739/SoftwareDiagnostics.h | 29 ++++++++ .../infineon/cyw30739/cyw30739_example.gni | 2 + .../infineon/cyw30739/matter_config.cpp | 3 + src/app/BUILD.gn | 2 + ...EventManagementTestEventTriggerHandler.cpp | 72 +++++++++++++++++++ ...icEventManagementTestEventTriggerHandler.h | 37 ++++++++++ 10 files changed, 298 insertions(+) create mode 100644 examples/platform/infineon/cyw30739/EventManagementTestEventTriggerHandler.cpp create mode 100644 examples/platform/infineon/cyw30739/EventManagementTestEventTriggerHandler.h create mode 100644 examples/platform/infineon/cyw30739/SoftwareDiagnostics.cpp create mode 100644 examples/platform/infineon/cyw30739/SoftwareDiagnostics.h create mode 100644 src/app/GenericEventManagementTestEventTriggerHandler.cpp create mode 100644 src/app/GenericEventManagementTestEventTriggerHandler.h diff --git a/examples/platform/infineon/cyw30739/BUILD.gn b/examples/platform/infineon/cyw30739/BUILD.gn index 0673c55c351de3..8ec7003633cd40 100644 --- a/examples/platform/infineon/cyw30739/BUILD.gn +++ b/examples/platform/infineon/cyw30739/BUILD.gn @@ -20,8 +20,10 @@ import("${cyw30739_sdk_build_root}/cyw30739_sdk.gni") static_library("platform") { sources = [ + "EventManagementTestEventTriggerHandler.h", "LEDWidget.h", "OTAConfig.h", + "SoftwareDiagnostics.h", "main.cpp", ] diff --git a/examples/platform/infineon/cyw30739/EventManagementTestEventTriggerHandler.cpp b/examples/platform/infineon/cyw30739/EventManagementTestEventTriggerHandler.cpp new file mode 100644 index 00000000000000..c5320f17f64bc4 --- /dev/null +++ b/examples/platform/infineon/cyw30739/EventManagementTestEventTriggerHandler.cpp @@ -0,0 +1,47 @@ +/* + * + * Copyright (c) 2024 Project CHIP Authors + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "EventManagementTestEventTriggerHandler.h" + +#include "SoftwareDiagnostics.h" + +namespace chip { +namespace DeviceLayer { +namespace Infineon { +namespace CYW30739 { + +CHIP_ERROR EventManagementTestEventTriggerHandler::HandleEventTrigger(uint64_t eventTrigger) +{ + switch (eventTrigger) + { + case kFillUpEventLoggingBuffer: + return HandleFillUpEventLoggingBufferEventTriger(); + default: + return CHIP_ERROR_INVALID_ARGUMENT; + } +} + +void EventManagementTestEventTriggerHandler::TriggerSoftwareFaultEvent(const char * faultRecordString) +{ + OnSoftwareFaultEventHandler(faultRecordString); +} + +} // namespace CYW30739 +} // namespace Infineon +} // namespace DeviceLayer +} // namespace chip diff --git a/examples/platform/infineon/cyw30739/EventManagementTestEventTriggerHandler.h b/examples/platform/infineon/cyw30739/EventManagementTestEventTriggerHandler.h new file mode 100644 index 00000000000000..b93109dae03dfa --- /dev/null +++ b/examples/platform/infineon/cyw30739/EventManagementTestEventTriggerHandler.h @@ -0,0 +1,42 @@ +/* + * + * Copyright (c) 2024 Project CHIP Authors + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include + +namespace chip { +namespace DeviceLayer { +namespace Infineon { +namespace CYW30739 { + +class EventManagementTestEventTriggerHandler : public app::GenericEventManagementTestEventTriggerHandler +{ +public: + static constexpr uint64_t kFillUpEventLoggingBuffer = 0xffff'ffff'1388'0000; + + CHIP_ERROR HandleEventTrigger(uint64_t eventTrigger) override; + +private: + virtual void TriggerSoftwareFaultEvent(const char * faultRecordString) override; +}; + +} // namespace CYW30739 +} // namespace Infineon +} // namespace DeviceLayer +} // namespace chip diff --git a/examples/platform/infineon/cyw30739/SoftwareDiagnostics.cpp b/examples/platform/infineon/cyw30739/SoftwareDiagnostics.cpp new file mode 100644 index 00000000000000..ae41f82d14d526 --- /dev/null +++ b/examples/platform/infineon/cyw30739/SoftwareDiagnostics.cpp @@ -0,0 +1,62 @@ +/* + * + * Copyright (c) 2024 Project CHIP Authors + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "SoftwareDiagnostics.h" + +#include +#include +#include + +namespace chip { +namespace DeviceLayer { +namespace Infineon { +namespace CYW30739 { + +using namespace chip::app::Clusters; + +void OnSoftwareFaultEventHandler(const char * faultRecordString) +{ +#ifdef MATTER_DM_PLUGIN_SOFTWARE_DIAGNOSTICS_SERVER + SoftwareDiagnostics::Events::SoftwareFault::Type softwareFault; + + /* Unable to access thread ID in the application layer. */ + softwareFault.id = 0; + + if (DeviceLayer::PlatformMgrImpl().IsCurrentTask()) + { + softwareFault.name.SetValue("Matter"_span); + } + else if (DeviceLayer::ThreadStackMgrImpl().IsCurrentTask()) + { + softwareFault.name.SetValue("Thread"_span); + } + else + { + softwareFault.name.SetValue("App"_span); + } + + softwareFault.faultRecording.SetValue(ByteSpan(Uint8::from_const_char(faultRecordString), strlen(faultRecordString))); + + SoftwareDiagnosticsServer::Instance().OnSoftwareFaultDetect(softwareFault); +#endif // MATTER_DM_PLUGIN_SOFTWARE_DIAGNOSTICS_SERVER +} + +} // namespace CYW30739 +} // namespace Infineon +} // namespace DeviceLayer +} // namespace chip diff --git a/examples/platform/infineon/cyw30739/SoftwareDiagnostics.h b/examples/platform/infineon/cyw30739/SoftwareDiagnostics.h new file mode 100644 index 00000000000000..b076d6e1bfe44c --- /dev/null +++ b/examples/platform/infineon/cyw30739/SoftwareDiagnostics.h @@ -0,0 +1,29 @@ +/* + * + * Copyright (c) 2024 Project CHIP Authors + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace chip { +namespace DeviceLayer { +namespace Infineon { +namespace CYW30739 { + +void OnSoftwareFaultEventHandler(const char * faultRecordString); + +} // namespace CYW30739 +} // namespace Infineon +} // namespace DeviceLayer +} // namespace chip diff --git a/examples/platform/infineon/cyw30739/cyw30739_example.gni b/examples/platform/infineon/cyw30739/cyw30739_example.gni index df8e50ee68bf2f..ff07ff6eb28633 100644 --- a/examples/platform/infineon/cyw30739/cyw30739_example.gni +++ b/examples/platform/infineon/cyw30739/cyw30739_example.gni @@ -24,8 +24,10 @@ template("cyw30739_example") { static_library(target_name) { sources = [ + "${cyw30739_example_dir}/EventManagementTestEventTriggerHandler.cpp", "${cyw30739_example_dir}/LEDWidget.cpp", "${cyw30739_example_dir}/OTAConfig.cpp", + "${cyw30739_example_dir}/SoftwareDiagnostics.cpp", "${cyw30739_example_dir}/matter_config.cpp", ] diff --git a/examples/platform/infineon/cyw30739/matter_config.cpp b/examples/platform/infineon/cyw30739/matter_config.cpp index 16d2517affe788..c30d55e55bc623 100644 --- a/examples/platform/infineon/cyw30739/matter_config.cpp +++ b/examples/platform/infineon/cyw30739/matter_config.cpp @@ -19,6 +19,7 @@ #include "matter_config.h" #include "AppTask.h" +#include "EventManagementTestEventTriggerHandler.h" #ifdef BOARD_ENABLE_DISPLAY #include "GUI.h" #endif @@ -208,8 +209,10 @@ void CYW30739MatterConfig::InitApp(void) /* Start CHIP datamodel server */ static chip::SimpleTestEventTriggerDelegate sTestEventTriggerDelegate{}; static chip::OTATestEventTriggerHandler sOtaTestEventTriggerHandler{}; + static Infineon::CYW30739::EventManagementTestEventTriggerHandler sEventManagementTestEventTriggerHandler{}; VerifyOrDie(sTestEventTriggerDelegate.Init(chip::ByteSpan(sTestEventTriggerEnableKey)) == CHIP_NO_ERROR); VerifyOrDie(sTestEventTriggerDelegate.AddHandler(&sOtaTestEventTriggerHandler) == CHIP_NO_ERROR); + VerifyOrDie(sTestEventTriggerDelegate.AddHandler(&sEventManagementTestEventTriggerHandler) == CHIP_NO_ERROR); // Create initParams with SDK example defaults here static chip::CommonCaseDeviceServerInitParams initParams; (void) initParams.InitializeStaticResourcesBeforeServerInit(); diff --git a/src/app/BUILD.gn b/src/app/BUILD.gn index 0eb7e1456e02e0..4bb4a05a555d39 100644 --- a/src/app/BUILD.gn +++ b/src/app/BUILD.gn @@ -325,6 +325,8 @@ static_library("app") { "EventManagement.h", "FailSafeContext.cpp", "FailSafeContext.h", + "GenericEventManagementTestEventTriggerHandler.cpp", + "GenericEventManagementTestEventTriggerHandler.h", "OTAUserConsentCommon.h", "ReadHandler.cpp", "SafeAttributePersistenceProvider.h", diff --git a/src/app/GenericEventManagementTestEventTriggerHandler.cpp b/src/app/GenericEventManagementTestEventTriggerHandler.cpp new file mode 100644 index 00000000000000..9c4cc11c8851a9 --- /dev/null +++ b/src/app/GenericEventManagementTestEventTriggerHandler.cpp @@ -0,0 +1,72 @@ +/* + * + * Copyright (c) 2024 Project CHIP Authors + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "GenericEventManagementTestEventTriggerHandler.h" + +#include +#include + +namespace chip { +namespace app { + +using namespace chip::DeviceLayer; +using namespace chip::app::Clusters; + +CHIP_ERROR GenericEventManagementTestEventTriggerHandler::HandleFillUpEventLoggingBufferEventTriger() +{ + /* Create a fake hardware fault list. */ + GeneralFaults hardwareFaults; + for (uint8_t hardwareFault = to_underlying(GeneralDiagnostics::HardwareFaultEnum::kUnspecified); + hardwareFault < kMaxHardwareFaults; hardwareFault++) + { + hardwareFaults.add(hardwareFault); + } + + /* Fill up the critical logging buffer by 10 hardware faults. */ + constexpr uint8_t kHardwareFaultCountForCriticalBuffer = 10; + for (uint8_t i = 0; i < kHardwareFaultCountForCriticalBuffer; i++) + { + GeneralDiagnosticsServer::Instance().OnHardwareFaultsDetect(hardwareFaults, hardwareFaults); + } + + /* Fill up the info logging buffer. */ + FillUpEventLoggingBufferWithFakeSoftwareFault(CHIP_DEVICE_CONFIG_EVENT_LOGGING_INFO_BUFFER_SIZE); + + /* Fill up the debug logging buffer. */ + FillUpEventLoggingBufferWithFakeSoftwareFault(CHIP_DEVICE_CONFIG_EVENT_LOGGING_DEBUG_BUFFER_SIZE); + + return CHIP_NO_ERROR; +} + +void GenericEventManagementTestEventTriggerHandler::FillUpEventLoggingBufferWithFakeSoftwareFault(size_t bufferSize) +{ + /* Create a fake fault message. */ + constexpr size_t kEncodingOverhead = 0x40; + const size_t recordSize = bufferSize - kEncodingOverhead; + char * recordBuffer = static_cast(Platform::MemoryAlloc(recordSize)); + VerifyOrReturn(recordBuffer != nullptr); + std::unique_ptr recordString(recordBuffer, &Platform::MemoryFree); + memset(recordString.get(), 0x55, recordSize); + recordString.get()[recordSize - 1] = '\0'; + + /* Fill up the logging buffer by a software fault. */ + TriggerSoftwareFaultEvent(recordString.get()); +} + +} // namespace app +} // namespace chip diff --git a/src/app/GenericEventManagementTestEventTriggerHandler.h b/src/app/GenericEventManagementTestEventTriggerHandler.h new file mode 100644 index 00000000000000..da205a420bfaf3 --- /dev/null +++ b/src/app/GenericEventManagementTestEventTriggerHandler.h @@ -0,0 +1,37 @@ +/* + * + * Copyright (c) 2024 Project CHIP Authors + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include + +namespace chip { +namespace app { + +class GenericEventManagementTestEventTriggerHandler : public TestEventTriggerHandler +{ +protected: + CHIP_ERROR HandleFillUpEventLoggingBufferEventTriger(); + +private: + void FillUpEventLoggingBufferWithFakeSoftwareFault(size_t bufferSize); + virtual void TriggerSoftwareFaultEvent(const char * faultRecordString) = 0; +}; + +} // namespace app +} // namespace chip