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);