authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-11-12 18:06:42+01:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-12-11 00:10:17+01:00
log43b6bd42434cdc71e3405b4d5c3a36f6ff76ed01
tree0cbf136c79108ff0434f5739e4cb590d5720e535
parent8af82621d75f9f0d96ebf734f5ea862d06a5f1fa
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

start: Zero the link and frame pointer registers on all architectures.


1 files changed, 22 insertions(+), 5 deletions(-)

lib/std/start.zig+22-5
......@@ -279,8 +279,10 @@ fn _start() callconv(.naked) noreturn {
279279 ,
280280 .arm, .armeb, .thumb, .thumbeb =>
281281 // Note that this code must work for Thumb-1.
282 // r7 = FP (local), r11 = FP (unwind)
282283 \\ movs v1, #0
283 \\ mov fp, v1
284 \\ mov r7, v1
285 \\ mov r11, v1
284286 \\ mov lr, v1
285287 \\ mov a1, sp
286288 \\ subs v1, #16
......@@ -290,20 +292,23 @@ fn _start() callconv(.naked) noreturn {
290292 ,
291293 .csky =>
292294 // The CSKY ABI assumes that `gb` is set to the address of the GOT in order for
293 // position-independent code to work. We depend on this in `std.os.linux.start_pie`
294 // to locate `_DYNAMIC` as well.
295 // position-independent code to work. We depend on this in `std.os.linux.pie` to locate
296 // `_DYNAMIC` as well.
297 // r8 = FP
295298 \\ grs t0, 1f
296299 \\ 1:
297300 \\ lrw gb, 1b@GOTPC
298301 \\ addu gb, t0
302 \\ movi r8, 0
299303 \\ movi lr, 0
300304 \\ mov a0, sp
301305 \\ andi sp, sp, -8
302306 \\ jmpi %[posixCallMainAndExit]
303307 ,
304308 .hexagon =>
305 // r29 = SP, r30 = FP
309 // r29 = SP, r30 = FP, r31 = LR
306310 \\ r30 = #0
311 \\ r31 = #0
307312 \\ r0 = r29
308313 \\ r29 = and(r29, #-16)
309314 \\ memw(r29 + #-8) = r29
......@@ -312,12 +317,13 @@ fn _start() callconv(.naked) noreturn {
312317 ,
313318 .loongarch32, .loongarch64 =>
314319 \\ move $fp, $zero
320 \\ move $ra, $zero
315321 \\ move $a0, $sp
316322 \\ bstrins.d $sp, $zero, 3, 0
317323 \\ b %[posixCallMainAndExit]
318324 ,
319325 .riscv32, .riscv64 =>
320 \\ li s0, 0
326 \\ li fp, 0
321327 \\ li ra, 0
322328 \\ mv a0, sp
323329 \\ andi sp, sp, -16
......@@ -371,28 +377,35 @@ fn _start() callconv(.naked) noreturn {
371377 ,
372378 .powerpc, .powerpcle =>
373379 // Set up the initial stack frame, and clear the back chain pointer.
380 // r1 = SP, r31 = FP
374381 \\ mr 3, 1
375382 \\ clrrwi 1, 1, 4
376383 \\ li 0, 0
377384 \\ stwu 1, -16(1)
378385 \\ stw 0, 0(1)
386 \\ li 31, 0
379387 \\ mtlr 0
380388 \\ b %[posixCallMainAndExit]
381389 ,
382390 .powerpc64, .powerpc64le =>
383391 // Set up the ToC and initial stack frame, and clear the back chain pointer.
392 // r1 = SP, r2 = ToC, r31 = FP
384393 \\ addis 2, 12, .TOC. - %[_start]@ha
385394 \\ addi 2, 2, .TOC. - %[_start]@l
386395 \\ mr 3, 1
387396 \\ clrrdi 1, 1, 4
388397 \\ li 0, 0
389398 \\ stdu 0, -32(1)
399 \\ li 31, 0
390400 \\ mtlr 0
391401 \\ b %[posixCallMainAndExit]
392402 \\ nop
393403 ,
394404 .s390x =>
395405 // Set up the stack frame (register save area and cleared back-chain slot).
406 // r11 = FP, r14 = LR, r15 = SP
407 \\ lghi %%r11, 0
408 \\ lghi %%r14, 0
396409 \\ lgr %%r2, %%r15
397410 \\ lghi %%r0, -16
398411 \\ ngr %%r15, %%r0
......@@ -403,7 +416,9 @@ fn _start() callconv(.naked) noreturn {
403416 ,
404417 .sparc =>
405418 // argc is stored after a register window (16 registers * 4 bytes).
419 // i7 = LR
406420 \\ mov %%g0, %%fp
421 \\ mov %%g0, %%i7
407422 \\ add %%sp, 64, %%o0
408423 \\ and %%sp, -8, %%sp
409424 \\ ba,a %[posixCallMainAndExit]
......@@ -411,7 +426,9 @@ fn _start() callconv(.naked) noreturn {
411426 .sparc64 =>
412427 // argc is stored after a register window (16 registers * 8 bytes) plus the stack bias
413428 // (2047 bytes).
429 // i7 = LR
414430 \\ mov %%g0, %%fp
431 \\ mov %%g0, %%i7
415432 \\ add %%sp, 2175, %%o0
416433 \\ add %%sp, 2047, %%sp
417434 \\ and %%sp, -16, %%sp