Skip to content

Commit

Permalink
Merge branch 'bugfix/sdio_slave_gcc11_crash' into 'master'
Browse files Browse the repository at this point in the history
sdio_slave: workaround the sdio_slave crash issue with release config + GCC11

Closes IDFCI-1296, IDFCI-1297, and IDFCI-1298

See merge request espressif/esp-idf!19680
  • Loading branch information
ginkgm committed Aug 25, 2022
2 parents 9523c78 + 19add3f commit 8e361d3
Showing 1 changed file with 7 additions and 2 deletions.
9 changes: 7 additions & 2 deletions components/hal/sdio_slave_hal.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ typedef enum {
} sdio_ringbuf_pointer_t;

static esp_err_t sdio_ringbuf_send(sdio_ringbuf_t *buf, esp_err_t (*copy_callback)(uint8_t *, void *), void *arg);
static inline esp_err_t sdio_ringbuf_recv(sdio_ringbuf_t *buf, uint8_t **start, uint8_t **end, ringbuf_get_all_t get_all);
esp_err_t sdio_ringbuf_recv(sdio_ringbuf_t *buf, uint8_t **start, uint8_t **end, ringbuf_get_all_t get_all);
static inline int sdio_ringbuf_return(sdio_ringbuf_t* buf, uint8_t *ptr);

#define _SEND_DESC_NEXT(x) STAILQ_NEXT(&((sdio_slave_hal_send_desc_t*)x)->dma_desc, qe)
Expand Down Expand Up @@ -95,7 +95,12 @@ static esp_err_t sdio_ringbuf_send(sdio_ringbuf_t *buf, esp_err_t (*copy_callbac

// this ringbuf is a return-before-recv-again strategy
// since this is designed to be called in the ISR, no parallel logic
static inline esp_err_t sdio_ringbuf_recv(sdio_ringbuf_t *buf, uint8_t **start, uint8_t **end, ringbuf_get_all_t get_all)
/*
* Workaround for gcc 11. GCC-277. Break the inferring of callers.
* This function used to be static inline.
*/
__attribute__((weak))
esp_err_t sdio_ringbuf_recv(sdio_ringbuf_t *buf, uint8_t **start, uint8_t **end, ringbuf_get_all_t get_all)
{
HAL_ASSERT(buf->free_ptr == buf->read_ptr); //must return before recv again
if (start == NULL && end == NULL) return ESP_ERR_INVALID_ARG; // must have a output
Expand Down

0 comments on commit 8e361d3

Please sign in to comment.