| ... | ... | @@ -0,0 +1,34 @@ |
| 1 | const builtin = @import("builtin"); |
| 2 | const std = @import("std"); |
| 3 | |
| 4 | const native_arch = builtin.target.cpu.arch; |
| 5 | |
| 6 | inline fn getAArch64CpuFeature(comptime feat_reg: []const u8) u64 { |
| 7 | return asm ("mrs %[ret], " ++ feat_reg |
| 8 | : [ret] "=r" (-> u64), |
| 9 | ); |
| 10 | } |
| 11 | |
| 12 | pub fn detectNativeCpuAndFeatures() ?std.Target.Cpu { |
| 13 | return switch (native_arch) { |
| 14 | .aarch64, .aarch64_be => b: { |
| 15 | const registers = [12]u64{ |
| 16 | getAArch64CpuFeature("MIDR_EL1"), |
| 17 | getAArch64CpuFeature("ID_AA64PFR0_EL1"), |
| 18 | getAArch64CpuFeature("ID_AA64PFR1_EL1"), |
| 19 | getAArch64CpuFeature("ID_AA64DFR0_EL1"), |
| 20 | getAArch64CpuFeature("ID_AA64DFR1_EL1"), |
| 21 | getAArch64CpuFeature("ID_AA64AFR0_EL1"), |
| 22 | getAArch64CpuFeature("ID_AA64AFR1_EL1"), |
| 23 | getAArch64CpuFeature("ID_AA64ISAR0_EL1"), |
| 24 | getAArch64CpuFeature("ID_AA64ISAR1_EL1"), |
| 25 | getAArch64CpuFeature("ID_AA64MMFR0_EL1"), |
| 26 | getAArch64CpuFeature("ID_AA64MMFR1_EL1"), |
| 27 | getAArch64CpuFeature("ID_AA64MMFR2_EL1"), |
| 28 | }; |
| 29 | |
| 30 | break :b @import("arm.zig").aarch64.detectNativeCpuAndFeatures(native_arch, registers); |
| 31 | }, |
| 32 | else => null, |
| 33 | }; |
| 34 | } |