| ... | ... | @@ -319,6 +319,40 @@ fn clone() callconv(.Naked) void { |
| 319 | 319 | \\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 | 356 | .riscv64 => { |
| 323 | 357 | // __clone(func, stack, flags, arg, ptid, tls, ctid) |
| 324 | 358 | // a0, a1, a2, a3, a4, a5, a6 |