-
Notifications
You must be signed in to change notification settings - Fork 263
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Signed-off-by: Nuno Cruces <[email protected]>
- Loading branch information
Showing
9 changed files
with
115 additions
and
10 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
//go:build gc | ||
|
||
package platform | ||
|
||
import "runtime" | ||
|
||
// CpuFeatures exposes the capabilities for this CPU, queried via the Has, HasExtra methods. | ||
var CpuFeatures = loadCpuFeatureFlags() | ||
|
||
// cpuFeatureFlags implements CpuFeatureFlags interface. | ||
type cpuFeatureFlags struct { | ||
isar0 uint64 | ||
isar1 uint64 | ||
} | ||
|
||
// implemented in cpuid_arm64.s | ||
func getisar0() uint64 | ||
|
||
// implemented in cpuid_arm64.s | ||
func getisar1() uint64 | ||
|
||
func loadCpuFeatureFlags() CpuFeatureFlags { | ||
switch runtime.GOOS { | ||
case "darwin", "windows": | ||
// These OSes do not allow userland to read the instruction set attribute registers, | ||
// but basically require atomic instructions: | ||
// - "darwin" is the desktop version (mobile version is "ios"), | ||
// and the M1 is a ARMv8.4. | ||
// - "windows" requires them from Windows 11, see page 12 | ||
// https://download.microsoft.com/download/7/8/8/788bf5ab-0751-4928-a22c-dffdc23c27f2/Minimum%20Hardware%20Requirements%20for%20Windows%2011.pdf | ||
return &cpuFeatureFlags{ | ||
isar0: uint64(CpuFeatureArm64Atomic), | ||
isar1: 0, | ||
} | ||
case "linux", "freebsd": | ||
// These OSes allow userland to read the instruction set attribute registers, | ||
// which is otherwise restricted to EL0: | ||
// https://kernel.org/doc/Documentation/arm64/cpu-feature-registers.txt | ||
// See these for contents of the registers: | ||
// https://developer.arm.com/documentation/ddi0601/latest/AArch64-Registers/ID-AA64ISAR0-EL1--AArch64-Instruction-Set-Attribute-Register-0 | ||
// https://developer.arm.com/documentation/ddi0601/latest/AArch64-Registers/ID-AA64ISAR1-EL1--AArch64-Instruction-Set-Attribute-Register-1 | ||
return &cpuFeatureFlags{ | ||
isar0: getisar0(), | ||
isar1: getisar1(), | ||
} | ||
default: | ||
return &cpuFeatureFlags{} | ||
} | ||
} | ||
|
||
// Has implements the same method on the CpuFeatureFlags interface. | ||
func (f *cpuFeatureFlags) Has(cpuFeature CpuFeature) bool { | ||
return (f.isar0 & uint64(cpuFeature)) != 0 | ||
} | ||
|
||
// HasExtra implements the same method on the CpuFeatureFlags interface. | ||
func (f *cpuFeatureFlags) HasExtra(cpuFeature CpuFeature) bool { | ||
return (f.isar1 & uint64(cpuFeature)) != 0 | ||
} | ||
|
||
// Raw implements the same method on the CpuFeatureFlags interface. | ||
func (f *cpuFeatureFlags) Raw() uint64 { | ||
// Below, we only set bits for the features we care about, | ||
// instead of setting all the unnecessary bits obtained from the | ||
// instruction set attribute registers. | ||
var ret uint64 | ||
if f.Has(CpuFeatureArm64Atomic) { | ||
ret = 1 << 0 | ||
} | ||
return ret | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
//go:build gc | ||
|
||
#include "textflag.h" | ||
|
||
// lifted from github.com/golang/sys and cpu/cpu_arm64.s | ||
|
||
// func getisar0() uint64 | ||
TEXT ·getisar0(SB), NOSPLIT, $0-8 | ||
// get Instruction Set Attributes 0 into x0 | ||
// mrs x0, ID_AA64ISAR0_EL1 = d5380600 | ||
WORD $0xd5380600 | ||
MOVD R0, ret+0(FP) | ||
RET | ||
|
||
// func getisar1() uint64 | ||
TEXT ·getisar1(SB), NOSPLIT, $0-8 | ||
// get Instruction Set Attributes 1 into x0 | ||
// mrs x0, ID_AA64ISAR1_EL1 = d5380620 | ||
WORD $0xd5380620 | ||
MOVD R0, ret+0(FP) | ||
RET |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,4 @@ | ||
//go:build !amd64 || tinygo | ||
//go:build !(amd64 || arm64) || !gc | ||
|
||
package platform | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters