aboutsummaryrefslogtreecommitdiff
path: root/core/sys/info/cpu_linux_arm.odin
diff options
context:
space:
mode:
Diffstat (limited to 'core/sys/info/cpu_linux_arm.odin')
-rw-r--r--core/sys/info/cpu_linux_arm.odin65
1 files changed, 65 insertions, 0 deletions
diff --git a/core/sys/info/cpu_linux_arm.odin b/core/sys/info/cpu_linux_arm.odin
new file mode 100644
index 000000000..dcc252971
--- /dev/null
+++ b/core/sys/info/cpu_linux_arm.odin
@@ -0,0 +1,65 @@
+//+build arm32, arm64
+//+build linux
+package sysinfo
+
+import "core:sys/linux"
+import "core:strings"
+
+@(init, private)
+init_cpu_features :: proc() {
+ fd, err := linux.open("/proc/cpuinfo", {})
+ if err != .NONE { return }
+ defer linux.close(fd)
+
+ // This is probably enough right?
+ buf: [4096]byte
+ n, rerr := linux.read(fd, buf[:])
+ if rerr != .NONE || n == 0 { return }
+
+ features: CPU_Features
+ defer cpu_features = features
+
+ str := string(buf[:n])
+ for line in strings.split_lines_iterator(&str) {
+ key, _, value := strings.partition(line, ":")
+ key = strings.trim_space(key)
+ value = strings.trim_space(value)
+
+ if key != "Features" { continue }
+
+ for feature in strings.split_by_byte_iterator(&value, ' ') {
+ switch feature {
+ case "asimd", "neon": features += { .asimd }
+ case "fp": features += { .floatingpoint }
+ case "asimdhp": features += { .asimdhp }
+ case "asimdbf16": features += { .bf16 }
+ case "fcma": features += { .fcma }
+ case "asimdfhm": features += { .fhm }
+ case "fphp", "half": features += { .fp16 }
+ case "frint": features += { .frint }
+ case "i8mm": features += { .i8mm }
+ case "jscvt": features += { .jscvt }
+ case "asimdrdm": features += { .rdm }
+
+ case "flagm": features += { .flagm }
+ case "flagm2": features += { .flagm2 }
+ case "crc32": features += { .crc32 }
+
+ case "atomics": features += { .lse }
+ case "lrcpc": features += { .lrcpc }
+ case "ilrcpc": features += { .lrcpc2 }
+
+ case "aes": features += { .aes }
+ case "pmull": features += { .pmull }
+ case "sha1": features += { .sha1 }
+ case "sha2": features += { .sha256 }
+ case "sha3": features += { .sha3 }
+ case "sha512": features += { .sha512 }
+
+ case "sb": features += { .sb }
+ case "ssbs": features += { .ssbs }
+ }
+ }
+ break
+ }
+}