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