cpu_linux_arm.odin 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #+build arm32, arm64
  2. #+build linux
  3. package sysinfo
  4. import "base:runtime"
  5. import "core:sys/linux"
  6. import "core:strings"
  7. @(init, private)
  8. init_cpu_features :: proc "contextless" () {
  9. context = runtime.default_context()
  10. fd, err := linux.open("/proc/cpuinfo", {})
  11. if err != .NONE { return }
  12. defer linux.close(fd)
  13. // This is probably enough right?
  14. buf: [4096]byte
  15. n, rerr := linux.read(fd, buf[:])
  16. if rerr != .NONE || n == 0 { return }
  17. features: CPU_Features
  18. defer cpu.features = features
  19. str := string(buf[:n])
  20. for line in strings.split_lines_iterator(&str) {
  21. key, _, value := strings.partition(line, ":")
  22. key = strings.trim_space(key)
  23. value = strings.trim_space(value)
  24. if key != "Features" { continue }
  25. for feature in strings.split_by_byte_iterator(&value, ' ') {
  26. switch feature {
  27. case "asimd", "neon": features += { .asimd }
  28. case "fp": features += { .floatingpoint }
  29. case "asimdhp": features += { .asimdhp }
  30. case "asimdbf16": features += { .bf16 }
  31. case "fcma": features += { .fcma }
  32. case "asimdfhm": features += { .fhm }
  33. case "fphp", "half": features += { .fp16 }
  34. case "frint": features += { .frint }
  35. case "i8mm": features += { .i8mm }
  36. case "jscvt": features += { .jscvt }
  37. case "asimdrdm": features += { .rdm }
  38. case "flagm": features += { .flagm }
  39. case "flagm2": features += { .flagm2 }
  40. case "crc32": features += { .crc32 }
  41. case "atomics": features += { .lse }
  42. case "lrcpc": features += { .lrcpc }
  43. case "ilrcpc": features += { .lrcpc2 }
  44. case "aes": features += { .aes }
  45. case "pmull": features += { .pmull }
  46. case "sha1": features += { .sha1 }
  47. case "sha2": features += { .sha256 }
  48. case "sha3": features += { .sha3 }
  49. case "sha512": features += { .sha512 }
  50. case "sb": features += { .sb }
  51. case "ssbs": features += { .ssbs }
  52. }
  53. }
  54. break
  55. }
  56. }