runtime: Check LSE support on ARM64 at runtime init

Check presence of LSE support on ARM64 chip if we targeted it at compile time.

Related to #69124
Update #60905

Change-Id: I6fe244decbb4982548982e1f88376847721a33c7
Reviewed-on: https://go-review.googlesource.com/c/go/+/610195
Reviewed-by: Cherry Mui <cherryyz@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Shu-Chun Weng <scw@google.com>
This commit is contained in:
Andrey Bokhanko 2024-09-03 08:19:18 +03:00 committed by Cherry Mui
parent 38f8596787
commit 4e70258601
1 changed files with 37 additions and 0 deletions

View File

@ -8,6 +8,11 @@
#include "funcdata.h"
#include "textflag.h"
#ifdef GOARM64_LSE
DATA no_lse_msg<>+0x00(SB)/64, $"This program can only run on ARM64 processors with LSE support.\n"
GLOBL no_lse_msg<>(SB), RODATA, $64
#endif
TEXT runtime·rt0_go(SB),NOSPLIT|TOPFRAME,$0
// SP = stack; R0 = argc; R1 = argv
@ -77,6 +82,21 @@ nocgo:
BL runtime·wintls(SB)
#endif
// Check that CPU we use for execution supports instructions targeted during compile-time.
#ifdef GOARM64_LSE
#ifndef GOOS_openbsd
// Read the ID_AA64ISAR0_EL1 register
MRS ID_AA64ISAR0_EL1, R0
// Extract the LSE field (bits [23:20])
LSR $20, R0, R0
AND $0xf, R0, R0
// LSE support is indicated by a non-zero value
CBZ R0, no_lse
#endif
#endif
MOVW 8(RSP), R0 // copy argc
MOVW R0, -8(RSP)
MOVD 16(RSP), R0 // copy argv
@ -95,6 +115,23 @@ nocgo:
// start this M
BL runtime·mstart(SB)
RET
#ifdef GOARM64_LSE
#ifndef GOOS_openbsd
no_lse:
MOVD $1, R0 // stderr
MOVD R0, 8(RSP)
MOVD $no_lse_msg<>(SB), R1 // message address
MOVD R1, 16(RSP)
MOVD $64, R2 // message length
MOVD R2, 24(RSP)
CALL runtime·write(SB)
CALL runtime·exit(SB)
CALL runtime·abort(SB)
RET
#endif
#endif
// Prevent dead-code elimination of debugCallV2 and debugPinnerV1, which are
// intended to be called by debuggers.