Linux clone调用在RISC-V上的参数顺序

最近在给kobayashi-compiler补risc-v的线程管理功能,相当于要用汇编写一个迷你的runtime,提供__create_threads__join_threads两个函数。但是问题来了,创建线程用的clone调用的raw syscall接口在不同架构上不一样(见manpage的C library/kernel differences部分),而它并没有提到risc-v上这个接口是啥样的。

经过一番查找后,发现这个接口在linux kernel中由CONFIG_CLONE_BACKWARDS等几个宏控制(见https://github.com/torvalds/linux/blob/v5.17/kernel/fork.c#L2649),但我不熟悉linux内核,不知道内核怎么管理构建、怎么处理架构差异的,所以也不知道这些宏在哪定义。

查了一番,最终在这里找到了提示。在https://github.com/torvalds/linux/blob/v5.17/arch/riscv/Kconfig找到了CLONE_BACKWARDS,说明risc-v上这个接口是

1
2
3
long clone(unsigned long flags, void *stack,
int *parent_tid, unsigned long tls,
int *child_tid);

也就是manpage上提到的第二种。