mirror of
https://github.com/ziglang/zig.git
synced 2025-12-06 14:23:09 +00:00
c: Implement clone() for riscv32-linux.
This commit is contained in:
parent
8b176ab303
commit
b958225e68
34
lib/c.zig
34
lib/c.zig
@ -319,6 +319,40 @@ fn clone() callconv(.Naked) void {
|
|||||||
\\3: bx r5
|
\\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 => {
|
.riscv64 => {
|
||||||
// __clone(func, stack, flags, arg, ptid, tls, ctid)
|
// __clone(func, stack, flags, arg, ptid, tls, ctid)
|
||||||
// a0, a1, a2, a3, a4, a5, a6
|
// a0, a1, a2, a3, a4, a5, a6
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user