| ... | ... | @@ -115,9 +115,10 @@ pub fn clone() callconv(.naked) u32 { |
| 115 | 115 | // |
| 116 | 116 | // syscall(SYS_clone, flags, stack, ptid, tls, ctid) |
| 117 | 117 | // a2 a6, a3, a4, a5, a8 |
| 118 | | asm volatile ( |
| 118 | if (builtin.abi != .call0) asm volatile ( |
| 119 | 119 | \\ entry sp, 16 |
| 120 | | \\ |
| 120 | ); |
| 121 | asm volatile ( |
| 121 | 122 | \\ movi a8, -16 |
| 122 | 123 | \\ and a3, a3, a8 |
| 123 | 124 | \\ |
| ... | ... | @@ -128,10 +129,29 @@ pub fn clone() callconv(.naked) u32 { |
| 128 | 129 | \\ mov a8, a6 |
| 129 | 130 | \\ mov a6, a4 |
| 130 | 131 | \\ mov a4, a8 |
| 132 | ); |
| 133 | if (builtin.abi == .call0) asm volatile ( |
| 134 | \\ l32i a8, sp, 0 |
| 135 | ) else asm volatile ( |
| 131 | 136 | \\ l32i a8, sp, 16 |
| 137 | ); |
| 138 | asm volatile ( |
| 132 | 139 | \\ movi a2, 116 // SYS_clone |
| 133 | 140 | \\ syscall |
| 141 | ); |
| 142 | if (builtin.abi == .call0) asm volatile ( |
| 143 | \\ beqz a2, 1f |
| 144 | \\ // parent |
| 145 | \\ ret |
| 146 | \\ |
| 147 | \\ // child |
| 148 | \\1: |
| 149 | \\ movi a15, 0 |
| 150 | \\ movi a0, 0 |
| 134 | 151 | \\ |
| 152 | \\ mov a2, a10 |
| 153 | \\ callx0 a9 |
| 154 | ) else asm volatile ( |
| 135 | 155 | \\ beqz a2, 1f |
| 136 | 156 | \\ // parent |
| 137 | 157 | \\ retw |
| ... | ... | @@ -143,6 +163,8 @@ pub fn clone() callconv(.naked) u32 { |
| 143 | 163 | \\ |
| 144 | 164 | \\ mov a6, a10 |
| 145 | 165 | \\ callx4 a9 |
| 166 | ); |
| 167 | asm volatile ( |
| 146 | 168 | \\ movi a2, 118 // SYS_exit |
| 147 | 169 | \\ syscall |
| 148 | 170 | ); |