diff --git a/kernel/include/process.h b/kernel/include/process.h
index 100b160109105b68e9238c898ada8ecd58f68670..c29ee9a444de7cdea66b2211819668f406cf05f8 100644
--- a/kernel/include/process.h
+++ b/kernel/include/process.h
@@ -13,6 +13,7 @@
 #include <sys/resource.h>
 #include <sys/signal.h>
 #include <sys/time.h>
+#include <sys/futex.h>
 #include <ref_count.h>
 #include <vm.h>
 
@@ -85,6 +86,8 @@ struct pcb_t
 
     __user_cap_data_struct cap[2];
 
+    robust_list_head *futex_robust_list;
+
     mode_t umask;
 
     rlimit rlimits[RLIMIT_NLIMITS];
diff --git a/kernel/include/sys/futex.h b/kernel/include/sys/futex.h
index c3a8b30ee00af963de892e078a3242ce8e448706..324d4a5ef643c675459cc808dd85c0bf373f6557 100644
--- a/kernel/include/sys/futex.h
+++ b/kernel/include/sys/futex.h
@@ -3,6 +3,7 @@
 #define _LINUX_FUTEX_H
 
 #include <stdint.h>
+#include <stddef.h>
 #include <sys/time.h>
 
 /* Second argument to futex syscall */
@@ -180,5 +181,7 @@ struct robust_list_head {
 long futex(uint32_t *uaddr, int futex_op, uint32_t val,
            timespec *timeout,
            uint32_t *uaddr2, uint32_t val3);
+long do_set_robust_list(robust_list_head *head, size_t len);
+long do_get_robust_list(int pid, robust_list_head **head_ptr, size_t *len_ptr);
 
 #endif /* _LINUX_FUTEX_H */
diff --git a/kernel/process/process.cpp b/kernel/process/process.cpp
index c901b24d5e4e908bdaa8b93ba285778d6d53918a..fe9c3e5d0209aa78029a7e8c2ce0bbe4eb93e09a 100644
--- a/kernel/process/process.cpp
+++ b/kernel/process/process.cpp
@@ -764,6 +764,7 @@ void exit_proc(pcb_t *proc, int status)
             fmt::warn("unimplemented: clear child tid when process get killed\n");
         }
     }
+    // TODO: robust_list
     send_parent_sigchld(proc, true);
     if (proc->pid == NUM_HART) { // FIXME: correct logic
         fmt::err("!TEST FINISH!");
diff --git a/kernel/sys/futex.cpp b/kernel/sys/futex.cpp
index 16ece809e258dfe7689ed5d53bc8f8a8e9088ad0..f10e33dfb97786aa3db77310e7bb48ba1e7da485 100644
--- a/kernel/sys/futex.cpp
+++ b/kernel/sys/futex.cpp
@@ -130,4 +130,21 @@ long futex(uint32_t *uaddr, int futex_op, uint32_t val,
             fmt::err("unimplemented futex op {}\n", futex_op);
     }
     return -ENOSYS;
+}
+
+long do_set_robust_list(robust_list_head *head, size_t len)
+{
+    if (len != sizeof(robust_list_head)) return -EINVAL;
+    pcb_t *proc = get_current_proc();
+    proc->futex_robust_list = head;
+    return 0;
+}
+
+long do_get_robust_list(int pid, robust_list_head **head_ptr, size_t *len_ptr)
+{
+    pcb_t *proc = pid ? find_pcb(pid) : get_current_proc();
+    *head_ptr = proc->futex_robust_list;
+    *len_ptr = sizeof(robust_list_head);
+    if (proc == nullptr) return -ESRCH;
+    return 0;
 }
\ No newline at end of file
diff --git a/kernel/syscall/syscall.cpp b/kernel/syscall/syscall.cpp
index 9b87e498abf3ada4da95c5f6278f29e225d44c67..ca7b5799bd8d5b85144c9a927b8b8aedaaec0a92 100644
--- a/kernel/syscall/syscall.cpp
+++ b/kernel/syscall/syscall.cpp
@@ -444,11 +444,11 @@ static void sys_futex(Context *c) {
 }
 
 static void sys_set_robust_list(Context *c) {
-    sys_unimplemented(c, "set_robust_list");
+    a0 = do_set_robust_list((robust_list_head *)a0, a1);
 }
 
 static void sys_get_robust_list(Context *c) {
-    sys_unimplemented(c, "get_robust_list");
+    a0 = do_get_robust_list(a0, (robust_list_head **)a1, (size_t *)a2);
 }
 
 static void sys_nanosleep(Context *c) {