diff --git a/components/libc/compilers/common/ctime.c b/components/libc/compilers/common/ctime.c
index 7910356704e..dcb4cafaafa 100644
--- a/components/libc/compilers/common/ctime.c
+++ b/components/libc/compilers/common/ctime.c
@@ -828,6 +828,7 @@ struct lwp_timer_event_param
         pid_t pid;
     };
     int signo;
+    union sigval sigval;
 };
 
 static void _lwp_timer_event_from_tid(struct rt_work *work, void *param)
@@ -835,13 +836,19 @@ static void _lwp_timer_event_from_tid(struct rt_work *work, void *param)
     rt_err_t ret;
     struct lwp_timer_event_param *data = rt_container_of(work, struct lwp_timer_event_param, work);
     rt_thread_t thread;
+    lwp_siginfo_ext_t ext;
 
     RT_ASSERT(data->tid);
 
     /* stop others from delete thread */
     thread = lwp_tid_get_thread_and_inc_ref(data->tid);
     /** The tid of thread is a READ ONLY value, but here still facing the risk of thread already been delete error */
-    ret = lwp_thread_signal_kill(thread, data->signo, SI_TIMER, 0);
+    ext = rt_malloc(sizeof(struct lwp_siginfo_ext));
+    if (ext)
+    {
+        ext->sigval = data->sigval;
+    }
+    ret = lwp_thread_signal_kill(thread, data->signo, SI_TIMER, ext);
     lwp_tid_dec_ref(thread);
 
     if (ret)
@@ -855,6 +862,7 @@ static void _lwp_timer_event_from_pid(struct rt_work *work, void *param)
     rt_err_t ret;
     struct lwp_timer_event_param *data = rt_container_of(work, struct lwp_timer_event_param, work);
     struct rt_lwp *lwp;
+    lwp_siginfo_ext_t ext;
 
     lwp_pid_lock_take();
     lwp = lwp_from_pid_locked(data->pid);
@@ -862,7 +870,12 @@ static void _lwp_timer_event_from_pid(struct rt_work *work, void *param)
         lwp_ref_inc(lwp);
     lwp_pid_lock_release();
 
-    ret = lwp_signal_kill(lwp, data->signo, SI_TIMER, 0);
+    ext = rt_malloc(sizeof(struct lwp_siginfo_ext));
+    if (ext)
+    {
+        ext->sigval = data->sigval;
+    }
+    ret = lwp_signal_kill(lwp, data->signo, SI_TIMER, ext);
     if (lwp)
         lwp_ref_dec(lwp);
 
diff --git a/components/lwp/lwp_signal.c b/components/lwp/lwp_signal.c
index 8c88e68151e..925c1bd1213 100644
--- a/components/lwp/lwp_signal.c
+++ b/components/lwp/lwp_signal.c
@@ -347,6 +347,8 @@ RT_STATIC_ASSERT(lp_width_same, sizeof(void *) == sizeof(long));
 rt_inline void siginfo_k2u(lwp_siginfo_t ksigi, siginfo_t *usigi)
 {
     int signo = ksigi->ksiginfo.signo;
+
+    memset(usigi, 0, sizeof(siginfo_t));
     usigi->si_code = ksigi->ksiginfo.code;
     usigi->si_signo = signo;
     usigi->si_pid = ksigi->ksiginfo.from_pid;
@@ -359,6 +361,10 @@ rt_inline void siginfo_k2u(lwp_siginfo_t ksigi, siginfo_t *usigi)
             usigi->si_utime = ksigi->ext->sigchld.stime;
             usigi->si_stime = ksigi->ext->sigchld.utime;
         }
+        else
+        {
+            usigi->si_value = ksigi->ext->sigval;
+        }
     }
 
     /* deprecated field */
diff --git a/include/rtdef.h b/include/rtdef.h
index b1f8e48c6f9..8b15f8b923a 100644
--- a/include/rtdef.h
+++ b/include/rtdef.h
@@ -804,6 +804,7 @@ typedef struct lwp_siginfo_ext {
             clock_t utime;
             clock_t stime;
         } sigchld;
+        union sigval sigval;
     };
 } *lwp_siginfo_ext_t;