From 5568b709a86e6c90344534dfaf805409259c6cdf Mon Sep 17 00:00:00 2001 From: Junior Martinez <67972863+jmartinez-silabs@users.noreply.github.com> Date: Thu, 13 Apr 2023 19:25:40 -0400 Subject: [PATCH] [Silabs] Fix compilation issues with gcc 12.2 (#26090) * disable -Werror=array-parameter= for gsdk sources build * Fix compilation issues with gcc arm 12.2 * Restyled by whitespace * Comment the cflag -Wno-error=array-parameter until gcc 12.2 is used --------- Co-authored-by: Restyled.io --- examples/platform/silabs/efr32/BUILD.gn | 5 + examples/platform/silabs/syscalls_stubs.cpp | 215 ++++++++++++++++++ .../silabs/KeyValueStoreManagerImpl.cpp | 2 +- third_party/silabs/efr32_sdk.gni | 4 + 4 files changed, 225 insertions(+), 1 deletion(-) create mode 100644 examples/platform/silabs/syscalls_stubs.cpp diff --git a/examples/platform/silabs/efr32/BUILD.gn b/examples/platform/silabs/efr32/BUILD.gn index 05f9c6797c0b69..aaa3213138e8eb 100644 --- a/examples/platform/silabs/efr32/BUILD.gn +++ b/examples/platform/silabs/efr32/BUILD.gn @@ -227,6 +227,10 @@ config("efr32-common-config") { if (enable_heap_monitoring) { defines += [ "HEAP_MONITORING" ] } + + # Do not warn for LOAD segment with RWX permissions + # Uncomment this cflag when pigweed update is done and GCC 12.2 is used. + #ldflags = [ "-Wl,--no-warn-rwx-segment" ] } config("silabs-wifi-config") { @@ -279,6 +283,7 @@ source_set("efr32-common") { sources = [ "${silabs_common_plat_dir}/heap_4_silabs.c", + "${silabs_common_plat_dir}/syscalls_stubs.cpp", "efr32_utils.cpp", "init_efrPlatform.cpp", "matter_config.cpp", diff --git a/examples/platform/silabs/syscalls_stubs.cpp b/examples/platform/silabs/syscalls_stubs.cpp new file mode 100644 index 00000000000000..f6a845639c6e7c --- /dev/null +++ b/examples/platform/silabs/syscalls_stubs.cpp @@ -0,0 +1,215 @@ +/* + * + * Copyright (c) 2023 Project CHIP Authors + * + * 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. + */ + +/* + This file is only used to implement weak syscall stubs + that gcc-arm-none-eabi 12.2.1 expect to link when using Libc + (newlib/libc_nano) +*/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#if SILABS_LOG_OUT_UART +#include "uart.h" +#endif + +int _close(int file); +int _fstat(int file, struct stat * st); +int _isatty(int file); +int _lseek(int file, int ptr, int dir); +int _read(int file, char * ptr, int len); +int _write(int file, const char * ptr, int len); + +/************************************************************************** + * @brief + * Close a file. + * + * @param[in] file + * File you want to close. + * + * @return + * Returns 0 when the file is closed. + **************************************************************************/ +int __attribute__((weak)) _close(int file) +{ + (void) file; + return 0; +} + +/************************************************************************** + * @brief Exit the program. + * @param[in] status The value to return to the parent process as the + * exit status (not used). + **************************************************************************/ +void __attribute__((weak)) _exit(int status) +{ + (void) status; + while (1) + { + } /* Hang here forever... */ +} + +/************************************************************************* + * @brief + * Status of an open file. + * + * @param[in] file + * Check status for this file. + * + * @param[in] st + * Status information. + * + * @return + * Returns 0 when st_mode is set to character special. + ************************************************************************/ +int __attribute__((weak)) _fstat(int file, struct stat * st) +{ + (void) file; + (void) st; + return 0; +} + +/************************************************************************** + * @brief Get process ID. + *************************************************************************/ +int __attribute__((weak)) _getpid(void) +{ + return 1; +} + +/************************************************************************** + * @brief + * Query whether output stream is a terminal. + * + * @param[in] file + * Descriptor for the file. + * + * @return + * Returns 1 when query is done. + **************************************************************************/ +int __attribute__((weak)) _isatty(int file) +{ + (void) file; + return 1; +} + +/************************************************************************** + * @brief Send signal to process. + * @param[in] pid Process id (not used). + * @param[in] sig Signal to send (not used). + *************************************************************************/ +int __attribute__((weak)) _kill(int pid, int sig) +{ + (void) pid; + (void) sig; + return -1; +} + +/************************************************************************** + * @brief + * Set position in a file. + * + * @param[in] file + * Descriptor for the file. + * + * @param[in] ptr + * Poiter to the argument offset. + * + * @param[in] dir + * Directory whence. + * + * @return + * Returns 0 when position is set. + *************************************************************************/ +int __attribute__((weak)) _lseek(int file, int ptr, int dir) +{ + (void) file; + (void) ptr; + (void) dir; + return 0; +} + +/************************************************************************** + * @brief + * Read from a file. + * + * @param[in] file + * Descriptor for the file you want to read from. + * + * @param[in] ptr + * Pointer to the chacaters that are beeing read. + * + * @param[in] len + * Number of characters to be read. + * + * @return + * Number of characters that have been read. + *************************************************************************/ +int __attribute__((weak)) _read(int file, char * ptr, int len) +{ + (void) file; +#if SILABS_LOG_OUT_UART + return = uartConsoleRead(ptr, len); +#else + (void) ptr; + (void) len; +#endif + return 0; +} + +/************************************************************************** + * @brief + * Write to a file. + * + * @param[in] file + * Descriptor for the file you want to write to. + * + * @param[in] ptr + * Pointer to the text you want to write + * + * @param[in] len + * Number of characters to be written. + * + * @return + * Number of characters that have been written. + **************************************************************************/ +int __attribute__((weak)) _write(int file, const char * ptr, int len) +{ + (void) file; +#if SILABS_LOG_OUT_UART + uartConsoleWrite(ptr, len); +#else + (void) ptr; +#endif + + return len; +} + +#ifdef __cplusplus +} +#endif diff --git a/src/platform/silabs/KeyValueStoreManagerImpl.cpp b/src/platform/silabs/KeyValueStoreManagerImpl.cpp index ffff7b945186bb..88b494d9771448 100644 --- a/src/platform/silabs/KeyValueStoreManagerImpl.cpp +++ b/src/platform/silabs/KeyValueStoreManagerImpl.cpp @@ -75,7 +75,7 @@ uint16_t KeyValueStoreManagerImpl::hashKvsKeyString(const char * key) const uint8_t hash256[Crypto::kSHA256_Hash_Length] = { 0 }; Crypto::Hash_SHA256(reinterpret_cast(key), strlen(key), hash256); - uint16_t hash16, i = 0; + uint16_t hash16 = 0, i = 0; while (!hash16 && (i < (Crypto::kSHA256_Hash_Length - 1))) { diff --git a/third_party/silabs/efr32_sdk.gni b/third_party/silabs/efr32_sdk.gni index 55ff1066d214ff..baf89660ce836b 100644 --- a/third_party/silabs/efr32_sdk.gni +++ b/third_party/silabs/efr32_sdk.gni @@ -502,6 +502,10 @@ template("efr32_sdk") { cflags += [ "-Wno-maybe-uninitialized", "-Wno-shadow", + + # see https://github.com/project-chip/connectedhomeip/issues/26058 + # Uncomment this cflag when pigweed update is done and GCC 12.2 is used. + # "-Wno-error=array-parameter", ] if (silabs_family == "efr32mg24" || silabs_family == "mgm24") {