| author | |
| committer | |
| log | c5a61e8998742ee0627afd80f35008b5d2703e61 |
| tree | b512a2969c5d8fe3611088be4b7c743f480fd72e |
| parent | 9c79c784acff94a76fe931a422ef6fecbbb3066b |
| parent | 7dfa64eb263a2dc3453a6667ca2f843202e11b31 |
Reviewed-on: https://codeberg.org/ziglang/zig/pulls/355274 files changed, 43 insertions(+), 15 deletions(-)
lib/std/debug/SelfInfo/Elf.zig+1-1| ... | @@ -116,7 +116,7 @@ pub const can_unwind: bool = s: { | ... | @@ -116,7 +116,7 @@ pub const can_unwind: bool = s: { |
| 116 | .x86, | 116 | .x86, |
| 117 | .x86_64, | 117 | .x86_64, |
| 118 | }, | 118 | }, |
| 119 | // Not supported yet: arm/armeb/thumb/thumbeb, hppa, hppa64, microblaze/microblazeel, xtensa/xtensaeb | 119 | // Not supported yet: arm/armeb/thumb/thumbeb, hppa, hppa64, microblaze/microblazeel |
| 120 | .linux => &.{ | 120 | .linux => &.{ |
| 121 | .aarch64, | 121 | .aarch64, |
| 122 | .aarch64_be, | 122 | .aarch64_be, |
lib/std/os/linux/xtensa.zig+26-4| ... | @@ -115,9 +115,10 @@ pub fn clone() callconv(.naked) u32 { | ... | @@ -115,9 +115,10 @@ pub fn clone() callconv(.naked) u32 { |
| 115 | // | 115 | // |
| 116 | // syscall(SYS_clone, flags, stack, ptid, tls, ctid) | 116 | // syscall(SYS_clone, flags, stack, ptid, tls, ctid) |
| 117 | // a2 a6, a3, a4, a5, a8 | 117 | // a2 a6, a3, a4, a5, a8 |
| 118 | asm volatile ( | 118 | if (builtin.abi != .call0) asm volatile ( |
| 119 | \\ entry sp, 16 | 119 | \\ entry sp, 16 |
| 120 | \\ | 120 | ); |
| 121 | asm volatile ( | ||
| 121 | \\ movi a8, -16 | 122 | \\ movi a8, -16 |
| 122 | \\ and a3, a3, a8 | 123 | \\ and a3, a3, a8 |
| 123 | \\ | 124 | \\ |
| ... | @@ -128,10 +129,29 @@ pub fn clone() callconv(.naked) u32 { | ... | @@ -128,10 +129,29 @@ pub fn clone() callconv(.naked) u32 { |
| 128 | \\ mov a8, a6 | 129 | \\ mov a8, a6 |
| 129 | \\ mov a6, a4 | 130 | \\ mov a6, a4 |
| 130 | \\ mov a4, a8 | 131 | \\ mov a4, a8 |
| 132 | ); | ||
| 133 | if (builtin.abi == .call0) asm volatile ( | ||
| 134 | \\ l32i a8, sp, 0 | ||
| 135 | ) else asm volatile ( | ||
| 131 | \\ l32i a8, sp, 16 | 136 | \\ l32i a8, sp, 16 |
| 137 | ); | ||
| 138 | asm volatile ( | ||
| 132 | \\ movi a2, 116 // SYS_clone | 139 | \\ movi a2, 116 // SYS_clone |
| 133 | \\ syscall | 140 | \\ syscall |
| 141 | ); | ||
| 142 | if (builtin.abi == .call0) asm volatile ( | ||
| 143 | \\ beqz a2, 1f | ||
| 144 | \\ // parent | ||
| 145 | \\ ret | ||
| 134 | \\ | 146 | \\ |
| 147 | \\ // child | ||
| 148 | \\1: | ||
| 149 | \\ movi a15, 0 | ||
| 150 | \\ movi a0, 0 | ||
| 151 | \\ | ||
| 152 | \\ mov a2, a10 | ||
| 153 | \\ callx0 a9 | ||
| 154 | ) else asm volatile ( | ||
| 135 | \\ beqz a2, 1f | 155 | \\ beqz a2, 1f |
| 136 | \\ // parent | 156 | \\ // parent |
| 137 | \\ retw | 157 | \\ retw |
| ... | @@ -141,8 +161,10 @@ pub fn clone() callconv(.naked) u32 { | ... | @@ -141,8 +161,10 @@ pub fn clone() callconv(.naked) u32 { |
| 141 | \\ movi a7, 0 | 161 | \\ movi a7, 0 |
| 142 | \\ movi a0, 0 | 162 | \\ movi a0, 0 |
| 143 | \\ | 163 | \\ |
| 144 | \\ mov a2, a10 | 164 | \\ mov a6, a10 |
| 145 | \\ callx0 a9 | 165 | \\ callx4 a9 |
| 166 | ); | ||
| 167 | asm volatile ( | ||
| 146 | \\ movi a2, 118 // SYS_exit | 168 | \\ movi a2, 118 // SYS_exit |
| 147 | \\ syscall | 169 | \\ syscall |
| 148 | ); | 170 | ); |
lib/std/pie.zig-2| ... | @@ -270,9 +270,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn { | ... | @@ -270,9 +270,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn { |
| 270 | // embedded constant. Note that `call0` is a 3-byte instruction, so we need both | 270 | // embedded constant. Note that `call0` is a 3-byte instruction, so we need both |
| 271 | // `.balign` directives to be safe. | 271 | // `.balign` directives to be safe. |
| 272 | \\ .balign 4 | 272 | \\ .balign 4 |
| 273 | \\ .begin no-transform | ||
| 274 | \\ call0 1f | 273 | \\ call0 1f |
| 275 | \\ .end no-transform | ||
| 276 | \\ .balign 4 | 274 | \\ .balign 4 |
| 277 | \\ .word _DYNAMIC - . | 275 | \\ .word _DYNAMIC - . |
| 278 | \\1: | 276 | \\1: |
lib/std/start.zig+16-8| ... | @@ -487,14 +487,22 @@ fn _start() callconv(.naked) noreturn { | ... | @@ -487,14 +487,22 @@ fn _start() callconv(.naked) noreturn { |
| 487 | \\ sub %%sp, 2047, %%sp | 487 | \\ sub %%sp, 2047, %%sp |
| 488 | \\ ba,a %[posixCallMainAndExit] | 488 | \\ ba,a %[posixCallMainAndExit] |
| 489 | , | 489 | , |
| 490 | .xtensa, .xtensaeb => | 490 | .xtensa, .xtensaeb => if (builtin.abi == .call0) |
| 491 | // a0 = LR, a7 = FP, a1 = SP | 491 | // a0 = LR, a15 = FP, a1 = SP |
| 492 | \\ movi a0, 0 | 492 | \\ movi a0, 0 |
| 493 | \\ movi a7, 0 | 493 | \\ movi a15, 0 |
| 494 | \\ mov a2, sp | 494 | \\ mov a2, sp |
| 495 | \\ movi a8, -16 | 495 | \\ movi a8, -16 |
| 496 | \\ and sp, sp, a8 | 496 | \\ and sp, sp, a8 |
| 497 | \\ callx0 %[posixCallMainAndExit] | 497 | \\ call0 %[posixCallMainAndExit] |
| 498 | else | ||
| 499 | // a0 = LR, a7 = FP, a1 = SP | ||
| 500 | \\ movi a0, 0 | ||
| 501 | \\ movi a7, 0 | ||
| 502 | \\ mov a6, sp | ||
| 503 | \\ movi a8, -16 | ||
| 504 | \\ and sp, sp, a8 | ||
| 505 | \\ call4 %[posixCallMainAndExit] | ||
| 498 | , | 506 | , |
| 499 | else => @compileError("unsupported arch"), | 507 | else => @compileError("unsupported arch"), |
| 500 | } | 508 | } |