Commit b958225e68

Alex Rønne Petersen <alex@alexrp.com>
2024-06-22 14:52:31
c: Implement clone() for riscv32-linux.
1 parent 8b176ab
Changed files (1)
lib
lib/c.zig
@@ -319,6 +319,40 @@ fn clone() callconv(.Naked) void {
                 \\3:  bx r5
             );
         },
+        .riscv32 => {
+            // __clone(func, stack, flags, arg, ptid, tls, ctid)
+            //           a0,    a1,    a2,  a3,   a4,  a5,   a6
+
+            // syscall(SYS_clone, flags, stack, ptid, tls, ctid)
+            //                a7     a0,    a1,   a2,  a3,   a4
+            asm volatile (
+                \\    # Save func and arg to stack
+                \\    addi a1, a1, -8
+                \\    sw a0, 0(a1)
+                \\    sw a3, 4(a1)
+                \\
+                \\    # Call SYS_clone
+                \\    mv a0, a2
+                \\    mv a2, a4
+                \\    mv a3, a5
+                \\    mv a4, a6
+                \\    li a7, 220 # SYS_clone
+                \\    ecall
+                \\
+                \\    beqz a0, 1f
+                \\    # Parent
+                \\    ret
+                \\
+                \\    # Child
+                \\1:  lw a1, 0(sp)
+                \\    lw a0, 4(sp)
+                \\    jalr a1
+                \\
+                \\    # Exit
+                \\    li a7, 93 # SYS_exit
+                \\    ecall
+            );
+        },
         .riscv64 => {
             // __clone(func, stack, flags, arg, ptid, tls, ctid)
             //           a0,    a1,    a2,  a3,   a4,  a5,   a6