From 8f512c2e9b2fd0c580b379f8d6990b1eea041fb6 Mon Sep 17 00:00:00 2001 From: Guennadi Liakhovetski Date: Fri, 8 Sep 2023 15:23:44 +0200 Subject: [PATCH] IDC: fix message cache handling When an IDC message is received from another core, the receiver core doesn't have any useful data for it in cache. Writing back the cache can corrupt the message data. Cache has to be invalidated instead. Signed-off-by: Guennadi Liakhovetski --- src/idc/zephyr_idc.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/idc/zephyr_idc.c b/src/idc/zephyr_idc.c index 36b373e1aad8..9c33128349f4 100644 --- a/src/idc/zephyr_idc.c +++ b/src/idc/zephyr_idc.c @@ -63,7 +63,8 @@ static void idc_handler(struct k_p4wq_work *work) int payload = -1; k_spinlock_key_t key; - sys_cache_data_flush_range(msg, sizeof(*msg)); + /* A message is received from another core, invalidate local cache */ + sys_cache_data_invd_range(msg, sizeof(*msg)); if (msg->size == sizeof(int)) { const int idc_handler_memcpy_err __unused = @@ -123,12 +124,14 @@ int idc_send_msg(struct idc_msg *msg, uint32_t mode) msg->payload, msg->size); assert(!idc_send_memcpy_err); + /* Sending a message to another core, write back local payload cache */ sys_cache_data_flush_range(payload->data, MIN(sizeof(payload->data), msg->size)); } /* Temporarily store sender core ID */ msg_cp->core = cpu_get_id(); + /* Sending a message to another core, write back local message cache */ sys_cache_data_flush_range(msg_cp, sizeof(*msg_cp)); k_p4wq_submit(q_zephyr_idc + target_cpu, work);