| // 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 |