// Copyright 2014 The Go Authors. All rights reserved. | |
// Use of this source code is governed by a BSD-style | |
// license that can be found in the LICENSE file. | |
// +build !gccgo | |
#include "textflag.h" | |
TEXT ·RewindAndSetgid(SB),NOSPLIT|NOFRAME,$0-0 | |
// Save link register | |
MOVD R30, R9 | |
// Rewind stack pointer so anything that happens on the stack | |
// will clobber the test pattern created by the caller | |
ADD $(1024 * 8), RSP | |
// Ask signaller to setgid | |
MOVD $·Baton(SB), R0 | |
MOVD $1, R1 | |
storeloop: | |
LDAXRW (R0), R2 | |
STLXRW R1, (R0), R3 | |
CBNZ R3, storeloop | |
// Wait for setgid completion | |
MOVW $0, R1 | |
MOVW $0, R2 | |
loop: | |
LDAXRW (R0), R3 | |
CMPW R1, R3 | |
BNE loop | |
STLXRW R2, (R0), R3 | |
CBNZ R3, loop | |
// Restore stack | |
SUB $(1024 * 8), RSP | |
MOVD R9, R30 | |
RET |