Skip to content

Commit

Permalink
runtime: Check LSE support on ARM64 at runtime init
Browse files Browse the repository at this point in the history
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 <[email protected]>
LUCI-TryBot-Result: Go LUCI <[email protected]>
Reviewed-by: Shu-Chun Weng <[email protected]>
  • Loading branch information
andreybokhanko authored and cherrymui committed Oct 22, 2024
1 parent 38f8596 commit 4e70258
Showing 1 changed file with 37 additions and 0 deletions.
37 changes: 37 additions & 0 deletions src/runtime/asm_arm64.s
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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
Expand All @@ -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.
Expand Down

0 comments on commit 4e70258

Please sign in to comment.