blob: 483ac6bf21d5162266d0a0229c484aece7354ae2 [file] [edit]
// Copyright 2024 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.
#include "go_asm.h"
#include "textflag.h"
TEXT ·EnableDIT(SB),$0-1
MRS DIT, R0
UBFX $24, R0, $1, R1
MOVB R1, ret+0(FP)
TBNZ $0, R1, ret
MSR $1, DIT
#ifdef GOOS_darwin
// Arm documents that barriers are not necessary when writing to, or reading
// from, PSTATE fields. However, Apple documentation indicates that barriers
// should be used, in particular when setting the PSTATE.DIT field. Barriers
// aren't cheap, so only use them on Apple silicon for now.
//
// See go.dev/issue/77776.
MOVBU internal∕cpu·ARM64+const_offsetARM64HasSB(SB), R2
TBZ $0, R2, sbFallback
SB
#endif
ret:
RET
sbFallback:
DSB $7 // nsh
ISB $15 // sy
RET
TEXT ·DITEnabled(SB),$0-1
MRS DIT, R0
UBFX $24, R0, $1, R1
MOVB R1, ret+0(FP)
RET
TEXT ·DisableDIT(SB),$0
MSR $0, DIT
RET