authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-06-22 14:52:31+02:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-07-29 09:50:09+02:00
logb958225e687c3b044d52a5adcb58dfb413ee141a
treeb1b827e234af368b4e9b584f16579e2f1d4b0642
parent8b176ab303724054f0fcef21c3d849c377b54421
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

c: Implement clone() for riscv32-linux.


1 files changed, 34 insertions(+), 0 deletions(-)

lib/c.zig+34
...@@ -319,6 +319,40 @@ fn clone() callconv(.Naked) void {...@@ -319,6 +319,40 @@ fn clone() callconv(.Naked) void {
319 \\3: bx r5319 \\3: bx r5
320 );320 );
321 },321 },
322 .riscv32 => {
323 // __clone(func, stack, flags, arg, ptid, tls, ctid)
324 // a0, a1, a2, a3, a4, a5, a6
325
326 // syscall(SYS_clone, flags, stack, ptid, tls, ctid)
327 // a7 a0, a1, a2, a3, a4
328 asm volatile (
329 \\ # Save func and arg to stack
330 \\ addi a1, a1, -8
331 \\ sw a0, 0(a1)
332 \\ sw a3, 4(a1)
333 \\
334 \\ # Call SYS_clone
335 \\ mv a0, a2
336 \\ mv a2, a4
337 \\ mv a3, a5
338 \\ mv a4, a6
339 \\ li a7, 220 # SYS_clone
340 \\ ecall
341 \\
342 \\ beqz a0, 1f
343 \\ # Parent
344 \\ ret
345 \\
346 \\ # Child
347 \\1: lw a1, 0(sp)
348 \\ lw a0, 4(sp)
349 \\ jalr a1
350 \\
351 \\ # Exit
352 \\ li a7, 93 # SYS_exit
353 \\ ecall
354 );
355 },
322 .riscv64 => {356 .riscv64 => {
323 // __clone(func, stack, flags, arg, ptid, tls, ctid)357 // __clone(func, stack, flags, arg, ptid, tls, ctid)
324 // a0, a1, a2, a3, a4, a5, a6358 // a0, a1, a2, a3, a4, a5, a6