Commit 83824639 authored by Russ Cox's avatar Russ Cox

syscall: in linux/arm Syscall, zero R3, R4, R5

The general kernel system call interface
takes 6 arguments: R0, R1, R2, R3, R4, R5.

Syscall is for calls that only need 3.
The amd64 and 386 versions zero the extra arg registers,
but the arm version does not.

func utimensat calls Syscall with 3 arguments.
The kernel expects a 4th argument.
That turns out to be whatever is in R3 at the time of the call.
CL 137160043 changed various pieces of code and apparently
changed the value left in R3 at the time of utimensat's Syscall.
This causes the kernel to return EINVAL.

Change linux/arm Syscall to zero R3, R4, R5, so that calls will
behave deterministically, even if they pass too few arguments.

Arguably, utimensat could be fixed too, but the predictable
zeroing is certainly worth doing, and once done utimensat's
use of Syscall is fine.

Fixes arm build.

TBR=bradfitz
CC=golang-codereviews
https://golang.org/cl/141080043
parent cb040d59
...@@ -18,6 +18,9 @@ TEXT ·Syscall(SB),NOSPLIT,$0-28 ...@@ -18,6 +18,9 @@ TEXT ·Syscall(SB),NOSPLIT,$0-28
MOVW 8(SP), R0 MOVW 8(SP), R0
MOVW 12(SP), R1 MOVW 12(SP), R1
MOVW 16(SP), R2 MOVW 16(SP), R2
MOVW $0, R3
MOVW $0, R4
MOVW $0, R5
SWI $0 SWI $0
MOVW $0xfffff001, R1 MOVW $0xfffff001, R1
CMP R1, R0 CMP R1, R0
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment