tracing: ctf: add condition variables

Add hooks for condition variables.

Signed-off-by: Anas Nashif <anas.nashif@intel.com>
diff --git a/include/zephyr/tracing/tracing.h b/include/zephyr/tracing/tracing.h
index b9624dd..e4411fe 100644
--- a/include/zephyr/tracing/tracing.h
+++ b/include/zephyr/tracing/tracing.h
@@ -885,15 +885,17 @@
 /**
  * @brief Trace Conditional Variable wait enter
  * @param condvar Conditional Variable object
+ * @param timeout Timeout period
  */
-#define sys_port_trace_k_condvar_wait_enter(condvar)
+#define sys_port_trace_k_condvar_wait_enter(condvar, timeout)
 
 /**
  * @brief Trace Conditional Variable wait exit
  * @param condvar Conditional Variable object
+ * @param timeout Timeout period
  * @param ret Return value
  */
-#define sys_port_trace_k_condvar_wait_exit(condvar, ret)
+#define sys_port_trace_k_condvar_wait_exit(condvar, timeout, ret)
 
 /** @} */ /* end of subsys_tracing_apis_condvar */
 
diff --git a/kernel/condvar.c b/kernel/condvar.c
index d00eb55..4259083 100644
--- a/kernel/condvar.c
+++ b/kernel/condvar.c
@@ -117,7 +117,7 @@
 	k_spinlock_key_t key;
 	int ret;
 
-	SYS_PORT_TRACING_OBJ_FUNC_ENTER(k_condvar, wait, condvar);
+	SYS_PORT_TRACING_OBJ_FUNC_ENTER(k_condvar, wait, condvar, timeout);
 
 	key = k_spin_lock(&lock);
 	k_mutex_unlock(mutex);
@@ -125,7 +125,7 @@
 	ret = z_pend_curr(&lock, key, &condvar->wait_q, timeout);
 	k_mutex_lock(mutex, K_FOREVER);
 
-	SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_condvar, wait, condvar, ret);
+	SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_condvar, wait, condvar, timeout, ret);
 
 	return ret;
 }
diff --git a/subsys/tracing/ctf/ctf_top.c b/subsys/tracing/ctf/ctf_top.c
index b0adeb1..d1f1d55 100644
--- a/subsys/tracing/ctf/ctf_top.c
+++ b/subsys/tracing/ctf/ctf_top.c
@@ -388,6 +388,7 @@
 		(uint32_t)(uintptr_t)msgq
 		);
 }
+
 void sys_trace_k_msgq_cleanup_exit(struct k_msgq *msgq, int ret)
 {
 	ctf_top_msgq_cleanup_exit(
@@ -396,6 +397,69 @@
 		);
 }
 
+/* Condition Variables */
+void sys_trace_k_condvar_init(struct k_condvar *condvar, int ret)
+{
+	ctf_top_condvar_init(
+		(uint32_t)(uintptr_t)condvar,
+		(int32_t)ret
+		);
+}
+
+void sys_trace_k_condvar_wait_enter(struct k_condvar *condvar, k_timeout_t timeout)
+{
+	ctf_top_condvar_wait_enter(
+		(uint32_t)(uintptr_t)condvar,
+		k_ticks_to_us_floor32((uint32_t)timeout.ticks)
+		);
+}
+
+void sys_trace_k_condvar_wait_exit(struct k_condvar *condvar, k_timeout_t timeout, int ret)
+{
+	ctf_top_condvar_wait_exit(
+		(uint32_t)(uintptr_t)condvar,
+		k_ticks_to_us_floor32((uint32_t)timeout.ticks),
+		(int32_t)ret
+		);
+}
+
+void sys_trace_k_condvar_signal_enter(struct k_condvar *condvar)
+{
+	ctf_top_condvar_signal_enter(
+		(uint32_t)(uintptr_t)condvar
+		);
+}
+
+void sys_trace_k_condvar_signal_blocking(struct k_condvar *condvar, k_timeout_t timeout)
+{
+	ctf_top_condvar_signal_blocking(
+		(uint32_t)(uintptr_t)condvar,
+		k_ticks_to_us_floor32((uint32_t)timeout.ticks)
+		);
+}
+
+void sys_trace_k_condvar_signal_exit(struct k_condvar *condvar, int ret)
+{
+	ctf_top_condvar_signal_exit(
+		(uint32_t)(uintptr_t)condvar,
+		(int32_t)ret
+		);
+}
+void sys_trace_k_condvar_broadcast_enter(struct k_condvar *condvar)
+{
+	ctf_top_condvar_broadcast_enter(
+		(uint32_t)(uintptr_t)condvar
+		);
+}
+void sys_trace_k_condvar_broadcast_exit(struct k_condvar *condvar, int ret)
+{
+	ctf_top_condvar_broadcast_exit(
+		(uint32_t)(uintptr_t)condvar,
+		(int32_t)ret
+		);
+}
+
+
 /* Semaphore */
 void sys_trace_k_sem_init(struct k_sem *sem, int ret)
 {
diff --git a/subsys/tracing/ctf/ctf_top.h b/subsys/tracing/ctf/ctf_top.h
index dd11ee7..efea550 100644
--- a/subsys/tracing/ctf/ctf_top.h
+++ b/subsys/tracing/ctf/ctf_top.h
@@ -215,6 +215,17 @@
 	CTF_EVENT_MSGQ_PUT_FRONT_BLOCKING = 0x94,
 	CTF_EVENT_MSGQ_CLEANUP_ENTER = 0x95,
 	CTF_EVENT_MSGQ_CLEANUP_EXIT = 0x96,
+
+	/* Condition Variables */
+	CTF_EVENT_CONDVAR_INIT = 0x97,
+	CTF_EVENT_CONDVAR_SIGNAL_ENTER = 0x98,
+	CTF_EVENT_CONDVAR_SIGNAL_BLOCKING = 0x99,
+	CTF_EVENT_CONDVAR_SIGNAL_EXIT = 0x9A,
+	CTF_EVENT_CONDVAR_BROADCAST_ENTER = 0x9B,
+	CTF_EVENT_CONDVAR_BROADCAST_EXIT = 0x9C,
+	CTF_EVENT_CONDVAR_WAIT_ENTER = 0x9D,
+	CTF_EVENT_CONDVAR_WAIT_EXIT = 0x9E,
+
 } ctf_event_t;
 
 typedef struct {
@@ -462,6 +473,39 @@
 	CTF_EVENT(CTF_LITERAL(uint8_t, CTF_EVENT_MSGQ_CLEANUP_EXIT), msgq_id, ret);
 }
 
+/* Condition Variables */
+static inline void ctf_top_condvar_init(uint32_t condvar_id, int32_t ret)
+{
+	CTF_EVENT(CTF_LITERAL(uint8_t, CTF_EVENT_CONDVAR_INIT), condvar_id, ret);
+}
+static inline void ctf_top_condvar_signal_enter(uint32_t condvar_id)
+{
+	CTF_EVENT(CTF_LITERAL(uint8_t, CTF_EVENT_CONDVAR_SIGNAL_ENTER), condvar_id);
+}
+static inline void ctf_top_condvar_signal_blocking(uint32_t condvar_id, uint32_t timeout)
+{
+	CTF_EVENT(CTF_LITERAL(uint8_t, CTF_EVENT_CONDVAR_SIGNAL_BLOCKING), condvar_id, timeout);
+}
+static inline void ctf_top_condvar_signal_exit(uint32_t condvar_id, int32_t ret)
+{
+	CTF_EVENT(CTF_LITERAL(uint8_t, CTF_EVENT_CONDVAR_SIGNAL_EXIT), condvar_id, ret);
+}
+static inline void ctf_top_condvar_broadcast_enter(uint32_t condvar_id)
+{
+	CTF_EVENT(CTF_LITERAL(uint8_t, CTF_EVENT_CONDVAR_BROADCAST_ENTER), condvar_id);
+}
+static inline void ctf_top_condvar_broadcast_exit(uint32_t condvar_id, int32_t ret)
+{
+	CTF_EVENT(CTF_LITERAL(uint8_t, CTF_EVENT_CONDVAR_BROADCAST_EXIT), condvar_id, ret);
+}
+static inline void ctf_top_condvar_wait_enter(uint32_t condvar_id, uint32_t timeout)
+{
+	CTF_EVENT(CTF_LITERAL(uint8_t, CTF_EVENT_CONDVAR_WAIT_ENTER), condvar_id, timeout);
+}
+static inline void ctf_top_condvar_wait_exit(uint32_t condvar_id, uint32_t timeout, int32_t ret)
+{
+	CTF_EVENT(CTF_LITERAL(uint8_t, CTF_EVENT_CONDVAR_WAIT_EXIT), condvar_id, timeout, ret);
+}
 
 /* Semaphore */
 static inline void ctf_top_semaphore_init(uint32_t sem_id,
diff --git a/subsys/tracing/ctf/tracing_ctf.h b/subsys/tracing/ctf/tracing_ctf.h
index e671172..f64ed9b 100644
--- a/subsys/tracing/ctf/tracing_ctf.h
+++ b/subsys/tracing/ctf/tracing_ctf.h
@@ -181,14 +181,22 @@
 #define sys_port_trace_k_timer_status_sync_exit(timer, result)			\
 	sys_trace_k_timer_status_sync_exit(timer, result)
 
-#define sys_port_trace_k_condvar_init(condvar, ret)
-#define sys_port_trace_k_condvar_signal_enter(condvar)
-#define sys_port_trace_k_condvar_signal_blocking(condvar, timeout)
-#define sys_port_trace_k_condvar_signal_exit(condvar, ret)
-#define sys_port_trace_k_condvar_broadcast_enter(condvar)
-#define sys_port_trace_k_condvar_broadcast_exit(condvar, ret)
-#define sys_port_trace_k_condvar_wait_enter(condvar)
-#define sys_port_trace_k_condvar_wait_exit(condvar, ret)
+#define sys_port_trace_k_condvar_init(condvar, ret) \
+	sys_trace_k_condvar_init(condvar, ret)
+#define sys_port_trace_k_condvar_signal_enter(condvar) \
+	sys_trace_k_condvar_signal_enter(condvar)
+#define sys_port_trace_k_condvar_signal_blocking(condvar, timeout) \
+	sys_trace_k_condvar_signal_blocking(condvar, timeout)
+#define sys_port_trace_k_condvar_signal_exit(condvar, ret) \
+	sys_trace_k_condvar_signal_exit(condvar, ret)
+#define sys_port_trace_k_condvar_broadcast_enter(condvar) \
+	sys_trace_k_condvar_broadcast_enter(condvar)
+#define sys_port_trace_k_condvar_broadcast_exit(condvar, ret) \
+	sys_trace_k_condvar_broadcast_exit(condvar, ret)
+#define sys_port_trace_k_condvar_wait_enter(condvar, timeout) \
+	sys_trace_k_condvar_wait_enter(condvar, timeout)
+#define sys_port_trace_k_condvar_wait_exit(condvar, timeout, ret) \
+	sys_trace_k_condvar_wait_exit(condvar, timeout, ret)
 
 #define sys_port_trace_k_queue_init(queue)
 #define sys_port_trace_k_queue_cancel_wait(queue)
@@ -464,8 +472,17 @@
 void sys_trace_k_msgq_peek(struct k_msgq *msgq, int ret);
 void sys_trace_k_msgq_purge(struct k_msgq *msgq);
 
-/* Semaphore */
+/* Condition Variables */
+void sys_trace_k_condvar_init(struct k_condvar *condvar, int ret);
+void sys_trace_k_condvar_signal_enter(struct k_condvar *condvar);
+void sys_trace_k_condvar_signal_blocking(struct k_condvar *condvar, k_timeout_t timeout);
+void sys_trace_k_condvar_signal_exit(struct k_condvar *condvar, int ret);
+void sys_trace_k_condvar_broadcast_enter(struct k_condvar *condvar);
+void sys_trace_k_condvar_broadcast_exit(struct k_condvar *condvar, int ret);
+void sys_trace_k_condvar_wait_enter(struct k_condvar *condvar, k_timeout_t timeout);
+void sys_trace_k_condvar_wait_exit(struct k_condvar *condvar, k_timeout_t timeout, int ret);
 
+/* Semaphore */
 void sys_trace_k_sem_init(struct k_sem *sem, int ret);
 void sys_trace_k_sem_give_enter(struct k_sem *sem);
 
diff --git a/subsys/tracing/ctf/tsdl/metadata b/subsys/tracing/ctf/tsdl/metadata
index ef37dbf..a199d5a 100644
--- a/subsys/tracing/ctf/tsdl/metadata
+++ b/subsys/tracing/ctf/tsdl/metadata
@@ -1267,3 +1267,75 @@
 		int32_t ret;
 	};
 };
+
+/* Condition Variables */
+event {
+	name = condvar_init;
+	id = 0x97;
+	fields := struct {
+		uint32_t id;
+		int32_t ret;
+	};
+};
+
+event {
+	name = condvar_signal_enter;
+	id = 0x98;
+	fields := struct {
+		uint32_t id;
+	};
+};
+
+event {
+	name = condvar_signal_blocking;
+	id = 0x99;
+	fields := struct {
+		uint32_t id;
+		uint32_t timeout;
+	};
+};
+
+event {
+	name = condvar_signal_exit;
+	id = 0x9A;
+	fields := struct {
+		uint32_t id;
+		int32_t ret;
+	};
+};
+
+event {
+	name = condvar_broadcast_enter;
+	id = 0x9B;
+	fields := struct {
+		uint32_t id;
+	};
+};
+
+event {
+	name = condvar_broadcast_exit;
+	id = 0x9C;
+	fields := struct {
+		uint32_t id;
+		int32_t ret;
+	};
+};
+
+event {
+	name = condvar_wait_enter;
+	id = 0x9D;
+	fields := struct {
+		uint32_t id;
+		uint32_t timeout;
+	};
+};
+
+event {
+	name = condvar_wait_exit;
+	id = 0x9E;
+	fields := struct {
+		uint32_t id;
+		uint32_t timeout;
+		int32_t ret;
+	};
+};
diff --git a/subsys/tracing/test/tracing_string_format_test.c b/subsys/tracing/test/tracing_string_format_test.c
index 0dda01f..65250b9 100644
--- a/subsys/tracing/test/tracing_string_format_test.c
+++ b/subsys/tracing/test/tracing_string_format_test.c
@@ -243,14 +243,13 @@
 	TRACING_STRING("%s: %p\n", __func__, condvar);
 }
 
-void sys_trace_k_condvar_wait_enter(struct k_condvar *condvar, struct k_mutex *mutex,
-				    k_timeout_t timeout)
+void sys_trace_k_condvar_wait_enter(struct k_condvar *condvar, k_timeout_t timeout)
 {
 	TRACING_STRING("%s: %p\n", __func__, condvar);
 }
 
-void sys_trace_k_condvar_wait_exit(struct k_condvar *condvar, struct k_mutex *mutex,
-				   k_timeout_t timeout, int ret)
+void sys_trace_k_condvar_wait_exit(struct k_condvar *condvar, k_timeout_t timeout,
+				   int ret)
 {
 	TRACING_STRING("%s: %p\n", __func__, condvar);
 }
diff --git a/subsys/tracing/test/tracing_test.h b/subsys/tracing/test/tracing_test.h
index 22c243c..0261201 100644
--- a/subsys/tracing/test/tracing_test.h
+++ b/subsys/tracing/test/tracing_test.h
@@ -152,10 +152,10 @@
 	sys_trace_k_condvar_broadcast_enter(condvar)
 #define sys_port_trace_k_condvar_broadcast_exit(condvar, ret)                                      \
 	sys_trace_k_condvar_broadcast_exit(condvar, ret)
-#define sys_port_trace_k_condvar_wait_enter(condvar)                                               \
-	sys_trace_k_condvar_wait_enter(condvar, mutex, timeout)
-#define sys_port_trace_k_condvar_wait_exit(condvar, ret)                                           \
-	sys_trace_k_condvar_wait_exit(condvar, mutex, timeout, ret)
+#define sys_port_trace_k_condvar_wait_enter(condvar, timeout)                                      \
+	sys_trace_k_condvar_wait_enter(condvar, timeout)
+#define sys_port_trace_k_condvar_wait_exit(condvar, timeout, ret)                                  \
+	sys_trace_k_condvar_wait_exit(condvar, timeout, ret)
 
 #define sys_port_trace_k_queue_init(queue) sys_trace_k_queue_init(queue)
 #define sys_port_trace_k_queue_cancel_wait(queue) sys_trace_k_queue_cancel_wait(queue)
@@ -530,10 +530,8 @@
 void sys_trace_k_condvar_signal_exit(struct k_condvar *condvar, int ret);
 void sys_trace_k_condvar_broadcast_enter(struct k_condvar *condvar);
 void sys_trace_k_condvar_broadcast_exit(struct k_condvar *condvar, int ret);
-void sys_trace_k_condvar_wait_enter(struct k_condvar *condvar, struct k_mutex *mutex,
-				    k_timeout_t timeout);
-void sys_trace_k_condvar_wait_exit(struct k_condvar *condvar, struct k_mutex *mutex,
-				   k_timeout_t timeout, int ret);
+void sys_trace_k_condvar_wait_enter(struct k_condvar *condvar, k_timeout_t timeout);
+void sys_trace_k_condvar_wait_exit(struct k_condvar *condvar, k_timeout_t timeout, int ret);
 
 void sys_trace_k_queue_init(struct k_queue *queue);
 void sys_trace_k_queue_cancel_wait(struct k_queue *queue);
diff --git a/subsys/tracing/user/tracing_user.h b/subsys/tracing/user/tracing_user.h
index 70cf02e..346f6fa 100644
--- a/subsys/tracing/user/tracing_user.h
+++ b/subsys/tracing/user/tracing_user.h
@@ -224,8 +224,8 @@
 #define sys_port_trace_k_condvar_signal_exit(condvar, ret)
 #define sys_port_trace_k_condvar_broadcast_enter(condvar)
 #define sys_port_trace_k_condvar_broadcast_exit(condvar, ret)
-#define sys_port_trace_k_condvar_wait_enter(condvar)
-#define sys_port_trace_k_condvar_wait_exit(condvar, ret)
+#define sys_port_trace_k_condvar_wait_enter(condvar, timeout)
+#define sys_port_trace_k_condvar_wait_exit(condvar, timeout, ret)
 
 #define sys_port_trace_k_queue_init(queue)
 #define sys_port_trace_k_queue_cancel_wait(queue)
diff --git a/tests/subsys/tracing/tracing_api/src/main.c b/tests/subsys/tracing/tracing_api/src/main.c
index 89f1478..e42a483 100644
--- a/tests/subsys/tracing/tracing_api/src/main.c
+++ b/tests/subsys/tracing/tracing_api/src/main.c
@@ -170,8 +170,8 @@
 	sys_trace_k_condvar_signal_enter(&condvar);
 	sys_trace_k_condvar_signal_blocking(&condvar);
 	sys_trace_k_condvar_signal_exit(&condvar, ret);
-	sys_trace_k_condvar_wait_enter(&condvar, &mutex, timeout);
-	sys_trace_k_condvar_wait_exit(&condvar, &mutex, timeout, ret);
+	sys_trace_k_condvar_wait_enter(&condvar, timeout);
+	sys_trace_k_condvar_wait_exit(&condvar, timeout, ret);
 	/* sem api */
 	sys_trace_k_sem_init(&sem, ret);
 	sys_trace_k_sem_give_enter(&sem);