diff --git a/src/drivers/dw/ssi-spi.c b/src/drivers/dw/ssi-spi.c index a7d2c7509f7d..dd2204ccacd6 100644 --- a/src/drivers/dw/ssi-spi.c +++ b/src/drivers/dw/ssi-spi.c @@ -120,6 +120,7 @@ struct spi_dma_config { enum spi_xfer_direction dir; void *src_buf; void *dest_buf; + uint32_t buffer_size; uint32_t transfer_len; }; @@ -133,6 +134,7 @@ struct spi { const struct gpio *gpio; uint32_t index; uint32_t chan[2]; /* spi-slave rx/tx dma */ + uint32_t buffer_size; uint8_t *rx_buffer; uint8_t *tx_buffer; struct dma *dma[2]; @@ -379,7 +381,8 @@ int spi_push(struct spi *spi, const void *data, size_t size) spi->ipc_status = IPC_WRITE; /* Actually we have to send IPC messages in one go */ - rmemcpy(config->src_buf, data, size); + assert(!memcpy_s(config->src_buf, config->buffer_size, data, size)); + dcache_writeback_region(config->src_buf, size); ret = spi_trigger(spi, SPI_TRIGGER_START, SPI_DIR_TX); @@ -427,6 +430,7 @@ static int spi_slave_init(struct spi *spi) config = spi->config + SPI_DIR_TX; config->dir = SPI_DIR_TX; config->src_buf = spi->tx_buffer; + config->buffer_size = spi->buffer_size; spi->completion.private = NULL; return schedule_task_init(&spi->completion, SOF_SCHEDULE_EDF, @@ -475,6 +479,7 @@ int spi_probe(struct spi *spi) spi->tx_buffer = rzalloc(RZONE_SYS_RUNTIME, SOF_MEM_CAPS_DMA, SPI_BUFFER_SIZE); + spi->buffer_size = SPI_BUFFER_SIZE; if (spi->tx_buffer == NULL) { rfree(spi->rx_buffer); trace_ipc_error("eSp"); diff --git a/src/drivers/intel/baytrail/ipc.c b/src/drivers/intel/baytrail/ipc.c index c69fffd03717..1802a73fbadc 100644 --- a/src/drivers/intel/baytrail/ipc.c +++ b/src/drivers/intel/baytrail/ipc.c @@ -67,7 +67,8 @@ static void do_notify(void) /* copy the data returned from DSP */ if (msg->rx_size && msg->rx_size < SOF_IPC_MSG_MAX_SIZE) - mailbox_dspbox_read(msg->rx_data, 0, msg->rx_size); + mailbox_dspbox_read(msg->rx_data, SOF_IPC_MSG_MAX_SIZE, + 0, msg->rx_size); /* any callback ? */ if (msg->cb) diff --git a/src/drivers/intel/cavs/dmic.c b/src/drivers/intel/cavs/dmic.c index f153729097ab..cb42eaedd4d1 100644 --- a/src/drivers/intel/cavs/dmic.c +++ b/src/drivers/intel/cavs/dmic.c @@ -1164,8 +1164,8 @@ static int dmic_set_config(struct dai *dai, struct sof_ipc_dai_config *config) /* Copy the new DMIC params to persistent. The last request * determines the parameters. */ - memcpy(dmic_prm[di], &config->dmic, - sizeof(struct sof_ipc_dai_dmic_params)); + assert(!memcpy_s(dmic_prm[di], sizeof(*dmic_prm[di]), &config->dmic, + sizeof(struct sof_ipc_dai_dmic_params))); if (config->dmic.num_pdm_active > DMIC_HW_CONTROLLERS) { trace_dmic_error("dmic_set_config() error: the requested " @@ -1179,11 +1179,14 @@ static int dmic_set_config(struct dai *dai, struct sof_ipc_dai_config *config) dmic_prm[di]->pdm[i].id = i; for (j = 0; j < config->dmic.num_pdm_active; j++) { /* copy the pdm controller params id the id's match */ - if (dmic_prm[di]->pdm[i].id == config->dmic.pdm[j].id) - memcpy(&dmic_prm[di]->pdm[i], + if (dmic_prm[di]->pdm[i].id == config->dmic.pdm[j].id) { + assert(!memcpy_s(&dmic_prm[di]->pdm[i], + sizeof( + dmic_prm[di]->pdm[i]), &config->dmic.pdm[j], sizeof( - struct sof_ipc_dai_dmic_pdm_ctrl)); + struct sof_ipc_dai_dmic_pdm_ctrl))); + } } } diff --git a/src/drivers/intel/cavs/sue-ipc.c b/src/drivers/intel/cavs/sue-ipc.c index c2555b894749..68d2a649656e 100644 --- a/src/drivers/intel/cavs/sue-ipc.c +++ b/src/drivers/intel/cavs/sue-ipc.c @@ -64,7 +64,8 @@ void ipc_platform_do_cmd(struct ipc *ipc) /* perform command and return any error */ err = ipc_cmd(); if (err > 0) { - mailbox_hostbox_read(&reply, 0, sizeof(reply)); + mailbox_hostbox_read(&reply, SOF_IPC_MSG_MAX_SIZE, + 0, sizeof(reply)); goto done; /* reply created and copied by cmd() */ } else if (err < 0) { /* send std error reply */ diff --git a/src/drivers/intel/haswell/ipc.c b/src/drivers/intel/haswell/ipc.c index 253bc8aec585..4905485164ec 100644 --- a/src/drivers/intel/haswell/ipc.c +++ b/src/drivers/intel/haswell/ipc.c @@ -67,7 +67,8 @@ static void do_notify(void) /* copy the data returned from DSP */ if (msg->rx_size && msg->rx_size < SOF_IPC_MSG_MAX_SIZE) - mailbox_dspbox_read(msg->rx_data, 0, msg->rx_size); + mailbox_dspbox_read(msg->rx_data, SOF_IPC_MSG_MAX_SIZE, + 0, msg->rx_size); /* any callback ? */ if (msg->cb) diff --git a/src/include/sof/debug.h b/src/include/sof/debug.h index 075f834e8809..089d74238223 100644 --- a/src/include/sof/debug.h +++ b/src/include/sof/debug.h @@ -183,8 +183,9 @@ static inline uint32_t dump_stack(uint32_t p, void *addr, size_t offset, size = limit; /* copy stack contents and writeback */ - rmemcpy(addr, (void*)stack_top, size - sizeof(void *)); + assert(!memcpy_s(addr, limit, (void *)stack_top, size - sizeof(void *))); dcache_writeback_region(addr, size - sizeof(void *)); + return p; } diff --git a/src/include/sof/mailbox.h b/src/include/sof/mailbox.h index 17d9daa8c6dc..af8af01fa97d 100644 --- a/src/include/sof/mailbox.h +++ b/src/include/sof/mailbox.h @@ -36,6 +36,7 @@ #include #include #include +#include /* For those platform did not have SW_REG window, use DEBUG at now */ #ifndef MAILBOX_SW_REG_BASE @@ -72,36 +73,47 @@ static inline void mailbox_dspbox_write(size_t offset, const void *src, size_t bytes) { - rmemcpy((void *)(MAILBOX_DSPBOX_BASE + offset), src, bytes); + assert(!memcpy_s((void *)(MAILBOX_DSPBOX_BASE + offset), + MAILBOX_DSPBOX_SIZE - offset - MAILBOX_DSPBOX_BASE, + src, bytes)); dcache_writeback_region((void *)(MAILBOX_DSPBOX_BASE + offset), bytes); } static inline -void mailbox_dspbox_read(void *dest, size_t offset, size_t bytes) +void mailbox_dspbox_read(void *dest, size_t dest_size, + size_t offset, size_t bytes) { - dcache_invalidate_region((void *)(MAILBOX_DSPBOX_BASE + offset), bytes); - rmemcpy(dest, (void *)(MAILBOX_DSPBOX_BASE + offset), bytes); + dcache_invalidate_region((void *)(MAILBOX_DSPBOX_BASE + offset), + bytes); + assert(!memcpy_s(dest, dest_size, (void *)(MAILBOX_DSPBOX_BASE + offset), + bytes)); } static inline void mailbox_hostbox_write(size_t offset, const void *src, size_t bytes) { - rmemcpy((void *)(MAILBOX_HOSTBOX_BASE + offset), src, bytes); + assert(!memcpy_s((void *)(MAILBOX_HOSTBOX_BASE + offset), + MAILBOX_HOSTBOX_SIZE - offset - MAILBOX_HOSTBOX_BASE, + src, bytes)); dcache_writeback_region((void *)(MAILBOX_HOSTBOX_BASE + offset), bytes); } static inline -void mailbox_hostbox_read(void *dest, size_t offset, size_t bytes) +void mailbox_hostbox_read(void *dest, size_t dest_size, + size_t offset, size_t bytes) { dcache_invalidate_region((void *)(MAILBOX_HOSTBOX_BASE + offset), bytes); - rmemcpy(dest, (void *)(MAILBOX_HOSTBOX_BASE + offset), bytes); + assert(!memcpy_s(dest, dest_size, (void *)(MAILBOX_HOSTBOX_BASE + offset), + bytes)); } static inline void mailbox_stream_write(size_t offset, const void *src, size_t bytes) { - rmemcpy((void *)(MAILBOX_STREAM_BASE + offset), src, bytes); + assert(!memcpy_s((void *)(MAILBOX_STREAM_BASE + offset), + MAILBOX_STREAM_SIZE - offset - MAILBOX_STREAM_BASE, + src, bytes)); dcache_writeback_region((void *)(MAILBOX_STREAM_BASE + offset), bytes); } diff --git a/src/include/sof/panic.h b/src/include/sof/panic.h index e56738e9d14e..e95dd52e8b28 100644 --- a/src/include/sof/panic.h +++ b/src/include/sof/panic.h @@ -32,6 +32,7 @@ #define __INCLUDE_SOF_IPC_PANIC__ #include +#include struct sof_ipc_panic_info; @@ -43,4 +44,7 @@ void __panic(uint32_t p, char *filename, uint32_t linenum); /* panic dump filename and linenumber of the call */ #define panic(x) __panic((x), (__FILE__), (__LINE__)) +/* runtime assertion */ +#define assert(cond) (void)((cond) || (panic(SOF_IPC_PANIC_ASSERT), 0)) + #endif diff --git a/src/include/sof/sof.h b/src/include/sof/sof.h index 7cff13251419..4b7dbc8208b7 100644 --- a/src/include/sof/sof.h +++ b/src/include/sof/sof.h @@ -57,9 +57,6 @@ struct sa; __attribute__((unused)) \ typedef char META_CONCAT(assertion_failed_, MESSAGE)[(COND) ? 1 : -1] -/* runtime assertion */ -#define assert(cond) (void)((cond) || (panic(SOF_IPC_PANIC_ASSERT), 0)) - /* general firmware context */ struct sof { /* init data */ diff --git a/src/ipc/handler.c b/src/ipc/handler.c index 8c7fe2b909e8..04bea47003c6 100644 --- a/src/ipc/handler.c +++ b/src/ipc/handler.c @@ -105,16 +105,17 @@ #define _IPC_COPY_CMD(rx, tx, rx_size) \ do { \ if (rx_size > tx->size) { \ - memcpy(rx, tx, tx->size); \ + assert(!memcpy_s(rx, rx_size, tx, tx->size)); \ bzero((void *)rx + tx->size, rx_size - tx->size);\ trace_ipc("ipc: hdr 0x%x rx (%d) > tx (%d)", \ rx->cmd, rx_size, tx->size); \ } else if (tx->size > rx_size) { \ - memcpy(rx, tx, rx_size); \ + assert(!memcpy_s(rx, rx_size, tx, rx_size)); \ trace_ipc("ipc: hdr 0x%x tx (%d) > rx (%d)", \ rx->cmd, tx->size, rx_size); \ } else \ - memcpy(rx, tx, rx_size); \ + assert(!memcpy_s(rx, rx_size, tx, rx_size)); \ + \ } while (0) /* copies whole message from Tx to Rx, follows above ABI rules */ @@ -131,7 +132,7 @@ static inline struct sof_ipc_cmd_hdr *mailbox_validate(void) struct sof_ipc_cmd_hdr *hdr = _ipc->comp_data; /* read component values from the inbox */ - mailbox_hostbox_read(hdr, 0, sizeof(*hdr)); + mailbox_hostbox_read(hdr, SOF_IPC_MSG_MAX_SIZE, 0, sizeof(*hdr)); /* validate component header */ if (hdr->size > SOF_IPC_MSG_MAX_SIZE) { @@ -140,7 +141,8 @@ static inline struct sof_ipc_cmd_hdr *mailbox_validate(void) } /* read rest of component data */ - mailbox_hostbox_read(hdr + 1, sizeof(*hdr), hdr->size - sizeof(*hdr)); + mailbox_hostbox_read(hdr + 1, SOF_IPC_MSG_MAX_SIZE, + sizeof(*hdr), hdr->size - sizeof(*hdr)); dcache_writeback_region(hdr, hdr->size); @@ -1247,7 +1249,7 @@ int ipc_queue_host_message(struct ipc *ipc, uint32_t header, void *tx_data, /* copy mailbox data to message */ if (tx_bytes > 0 && tx_bytes < SOF_IPC_MSG_MAX_SIZE) - rmemcpy(msg->tx_data, tx_data, tx_bytes); + assert(!memcpy_s(msg->tx_data, msg->tx_size, tx_data, tx_bytes)); if (!found) { /* now queue the message */ diff --git a/src/lib/panic.c b/src/lib/panic.c index 84f3b2a3e0b8..2526d4bc7935 100644 --- a/src/lib/panic.c +++ b/src/lib/panic.c @@ -46,7 +46,7 @@ void dump_panicinfo(void *addr, struct sof_ipc_panic_info *panic_info) { if (!panic_info) return; - rmemcpy(addr, panic_info, sizeof(struct sof_ipc_panic_info)); + memcpy(addr, panic_info, sizeof(struct sof_ipc_panic_info)); dcache_writeback_region(addr, sizeof(struct sof_ipc_panic_info)); } @@ -95,18 +95,21 @@ void panic_rewind(uint32_t p, uint32_t stack_rewind_frames, void __panic(uint32_t p, char *filename, uint32_t linenum) { - struct sof_ipc_panic_info panicinfo; + struct sof_ipc_panic_info panicinfo = { .linenum = linenum }; int strlen; strlen = rstrlen(filename); + if (strlen >= SOF_TRACE_FILENAME_SIZE) { - rmemcpy(panicinfo.filename, filename + strlen - - SOF_TRACE_FILENAME_SIZE, SOF_TRACE_FILENAME_SIZE); - rmemcpy(panicinfo.filename, "...", 3); + memcpy_s(panicinfo.filename, sizeof(panicinfo.filename), + filename + strlen - SOF_TRACE_FILENAME_SIZE, + SOF_TRACE_FILENAME_SIZE); + memcpy_s(panicinfo.filename, sizeof(panicinfo.filename), + "...", 3); } else { - rmemcpy(panicinfo.filename, filename, strlen + 1); + memcpy_s(panicinfo.filename, sizeof(panicinfo.filename), + filename, strlen + 1); } - panicinfo.linenum = linenum; panic_rewind(p, 0, &panicinfo); } diff --git a/src/library/include/platform/memory.h b/src/library/include/platform/memory.h index 3305645dfcb3..bb91f760bfde 100644 --- a/src/library/include/platform/memory.h +++ b/src/library/include/platform/memory.h @@ -41,7 +41,10 @@ #define SOF_STACK_SIZE 0x1000 #define MAILBOX_DSPBOX_BASE 0 +#define MAILBOX_DSPBOX_SIZE 0x400 #define MAILBOX_HOSTBOX_BASE 0 +#define MAILBOX_HOSTBOX_SIZE 0x400 #define MAILBOX_BASE 0 +#define MAILBOX_BASE_SIZE 0x400 #endif