From 6f9979451ba05c2998a121a75fb5746fd31b9fc1 Mon Sep 17 00:00:00 2001 From: Song Ruo Jing Date: Mon, 24 Feb 2025 21:56:00 +0800 Subject: [PATCH] fix(gpio): fix bad bit shift operation and OOB (h2) in io_mux.c --- .../esp_hw_support/port/esp32c6/io_mux.c | 2 ++ .../esp_hw_support/port/esp32h2/io_mux.c | 31 +++++++++++-------- .../esp_hw_support/port/esp32s2/io_mux.c | 2 ++ .../esp_hw_support/port/esp32s3/io_mux.c | 2 ++ 4 files changed, 24 insertions(+), 13 deletions(-) diff --git a/components/esp_hw_support/port/esp32c6/io_mux.c b/components/esp_hw_support/port/esp32c6/io_mux.c index ff8181259d..53074ecda2 100644 --- a/components/esp_hw_support/port/esp32c6/io_mux.c +++ b/components/esp_hw_support/port/esp32c6/io_mux.c @@ -47,6 +47,7 @@ esp_err_t io_mux_set_clock_source(soc_module_clk_t clk_src) void io_mux_enable_lp_io_clock(gpio_num_t gpio_num, bool enable) { + assert(gpio_num != GPIO_NUM_NC); portENTER_CRITICAL(&s_io_mux_spinlock); if (enable) { if (s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] == 0) { @@ -71,6 +72,7 @@ void io_mux_enable_lp_io_clock(gpio_num_t gpio_num, bool enable) void io_mux_force_disable_lp_io_clock(gpio_num_t gpio_num) { + assert(gpio_num != GPIO_NUM_NC); portENTER_CRITICAL(&s_io_mux_spinlock); s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] = 0; s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << gpio_num); diff --git a/components/esp_hw_support/port/esp32h2/io_mux.c b/components/esp_hw_support/port/esp32h2/io_mux.c index 65422c808d..f45796b66b 100644 --- a/components/esp_hw_support/port/esp32h2/io_mux.c +++ b/components/esp_hw_support/port/esp32h2/io_mux.c @@ -14,8 +14,11 @@ static portMUX_TYPE s_io_mux_spinlock = portMUX_INITIALIZER_UNLOCKED; static soc_module_clk_t s_io_mux_clk_src = 0; // by default, the clock source is not set explicitly by any consumer (e.g. SDM, Filter) -static uint8_t s_rtc_io_enabled_cnt[MAX_RTC_GPIO_NUM] = { 0 }; -static uint32_t s_rtc_io_using_mask = 0; + +static rtc_io_status_t s_rtc_io_status = { + .rtc_io_enabled_cnt = { 0 }, + .rtc_io_using_mask = 0 +}; esp_err_t io_mux_set_clock_source(soc_module_clk_t clk_src) { @@ -40,20 +43,21 @@ esp_err_t io_mux_set_clock_source(soc_module_clk_t clk_src) void io_mux_enable_lp_io_clock(gpio_num_t gpio_num, bool enable) { + assert(gpio_num != GPIO_NUM_NC); portENTER_CRITICAL(&s_io_mux_spinlock); if (enable) { - if (s_rtc_io_enabled_cnt[gpio_num] == 0) { - s_rtc_io_using_mask |= (1ULL << gpio_num); + if (s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] == 0) { + s_rtc_io_status.rtc_io_using_mask |= (1ULL << gpio_num); } - s_rtc_io_enabled_cnt[gpio_num]++; - } else if (!enable && (s_rtc_io_enabled_cnt[gpio_num] > 0)) { - s_rtc_io_enabled_cnt[gpio_num]--; - if (s_rtc_io_enabled_cnt[gpio_num] == 0) { - s_rtc_io_using_mask &= ~(1ULL << gpio_num); + s_rtc_io_status.rtc_io_enabled_cnt[gpio_num]++; + } else if (!enable && (s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] > 0)) { + s_rtc_io_status.rtc_io_enabled_cnt[gpio_num]--; + if (s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] == 0) { + s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << gpio_num); } } RTCIO_RCC_ATOMIC() { - if (s_rtc_io_using_mask == 0) { + if (s_rtc_io_status.rtc_io_using_mask == 0) { rtcio_ll_enable_io_clock(false); } else { rtcio_ll_enable_io_clock(true); @@ -64,10 +68,11 @@ void io_mux_enable_lp_io_clock(gpio_num_t gpio_num, bool enable) void io_mux_force_disable_lp_io_clock(gpio_num_t gpio_num) { + assert(gpio_num != GPIO_NUM_NC); portENTER_CRITICAL(&s_io_mux_spinlock); - s_rtc_io_enabled_cnt[gpio_num] = 0; - s_rtc_io_using_mask &= ~(1ULL << gpio_num); - if (s_rtc_io_using_mask == 0) { + s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] = 0; + s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << gpio_num); + if (s_rtc_io_status.rtc_io_using_mask == 0) { RTCIO_RCC_ATOMIC() { rtcio_ll_enable_io_clock(false); } diff --git a/components/esp_hw_support/port/esp32s2/io_mux.c b/components/esp_hw_support/port/esp32s2/io_mux.c index 4dc0131cf1..979cd55489 100644 --- a/components/esp_hw_support/port/esp32s2/io_mux.c +++ b/components/esp_hw_support/port/esp32s2/io_mux.c @@ -31,6 +31,7 @@ static rtc_io_status_t s_rtc_io_status = { void io_mux_enable_lp_io_clock(gpio_num_t gpio_num, bool enable) { + assert(gpio_num != GPIO_NUM_NC); portENTER_CRITICAL(&s_io_mux_spinlock); if (enable) { if (s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] == 0) { @@ -55,6 +56,7 @@ void io_mux_enable_lp_io_clock(gpio_num_t gpio_num, bool enable) void io_mux_force_disable_lp_io_clock(gpio_num_t gpio_num) { + assert(gpio_num != GPIO_NUM_NC); portENTER_CRITICAL(&s_io_mux_spinlock); s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] = 0; s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << gpio_num); diff --git a/components/esp_hw_support/port/esp32s3/io_mux.c b/components/esp_hw_support/port/esp32s3/io_mux.c index 4dc0131cf1..979cd55489 100644 --- a/components/esp_hw_support/port/esp32s3/io_mux.c +++ b/components/esp_hw_support/port/esp32s3/io_mux.c @@ -31,6 +31,7 @@ static rtc_io_status_t s_rtc_io_status = { void io_mux_enable_lp_io_clock(gpio_num_t gpio_num, bool enable) { + assert(gpio_num != GPIO_NUM_NC); portENTER_CRITICAL(&s_io_mux_spinlock); if (enable) { if (s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] == 0) { @@ -55,6 +56,7 @@ void io_mux_enable_lp_io_clock(gpio_num_t gpio_num, bool enable) void io_mux_force_disable_lp_io_clock(gpio_num_t gpio_num) { + assert(gpio_num != GPIO_NUM_NC); portENTER_CRITICAL(&s_io_mux_spinlock); s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] = 0; s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << gpio_num);