62 lines
1.1 KiB
ArmAsm
62 lines
1.1 KiB
ArmAsm
// Copyright (c) 2026 Petr Balvín <opensource@petrbalvin.org> (https://petrbalvin.org)
|
|||
|
|
// SPDX-License-Identifier: BSD-3-Clause
|
||
|
|
|
||
|
|
// Differential kernel for the arm64 system instructions: barriers,
|
||
|
|
// cache maintenance, the system register accesses, supervisor calls,
|
||
|
|
// breakpoints and prefetches. Every function is byte-compared against
|
||
|
|
// go tool asm.
|
||
|
|
|
||
|
|
#include "textflag.h"
|
||
|
|
|
||
|
|
// func barriers()
|
||
|
|
TEXT ·barriers(SB), NOSPLIT, $0-0
|
||
|
|
DMB $15
|
||
|
|
DMB $1
|
||
|
|
DSB $15
|
||
|
|
DSB $4
|
||
|
|
ISB $15
|
||
|
|
ISB $1
|
||
|
|
RET
|
||
|
|
|
||
|
|
// func cacheOps()
|
||
|
|
TEXT ·cacheOps(SB), NOSPLIT, $0-0
|
||
|
|
DC ZVA, R4
|
||
|
|
DC IVAC, R1
|
||
|
|
DC CVAC, R2
|
||
|
|
DC CVAU, R3
|
||
|
|
DC CIVAC, R7
|
||
|
|
RET
|
||
|
|
|
||
|
|
// func sysRegs()
|
||
|
|
TEXT ·sysRegs(SB), NOSPLIT, $0-0
|
||
|
|
MRS DCZID_EL0, R3
|
||
|
|
MRS CNTVCT_EL0, R0
|
||
|
|
MRS CNTPCT_EL0, R1
|
||
|
|
MRS CNTFRQ_EL0, R2
|
||
|
|
MRS MIDR_EL1, R0
|
||
|
|
MRS ID_AA64PFR0_EL1, R0
|
||
|
|
MRS ID_AA64ISAR0_EL1, R0
|
||
|
|
MRS ID_AA64ISAR1_EL1, R0
|
||
|
|
MRS DIT, R0
|
||
|
|
MSR $3, SPSel
|
||
|
|
MSR $9, DAIFSet
|
||
|
|
MSR $6, DAIFClr
|
||
|
|
MSR $1, DIT
|
||
|
|
RET
|
||
|
|
|
||
|
|
// func exceptions()
|
||
|
|
TEXT ·exceptions(SB), NOSPLIT, $0-0
|
||
|
|
SVC $0
|
||
|
|
SVC $7165
|
||
|
|
BRK
|
||
|
|
BRK $35943
|
||
|
|
RET
|
||
|
|
|
||
|
|
// func prefetch()
|
||
|
|
TEXT ·prefetch(SB), NOSPLIT, $0-0
|
||
|
|
PRFM (R0), PLDL1KEEP
|
||
|
|
PRFM (R3), PLDL3KEEP
|
||
|
|
PRFM (R4), PSTL1KEEP
|
||
|
|
PRFM (R2), $25
|
||
|
|
RET
|