Skip to content

Commit

Permalink
IDC: fix message cache handling
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
lyakh committed Sep 13, 2023
1 parent bec031a commit 8f512c2
Showing 1 changed file with 4 additions and 1 deletion.
5 changes: 4 additions & 1 deletion src/idc/zephyr_idc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 =
Expand Down Expand Up @@ -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);

Expand Down

0 comments on commit 8f512c2

Please sign in to comment.