| ... | ... | @@ -113,32 +113,38 @@ const aarch64 = struct { |
| 113 | 113 | } |
| 114 | 114 | |
| 115 | 115 | fn detectNativeCpuAndFeatures(arch: std.Target.Cpu.Arch) ?std.Target.Cpu { |
| 116 | | const model: *const std.Target.Cpu.Model = blk: { |
| 116 | const maybe_model: ?*const std.Target.Cpu.Model = blk: { |
| 117 | 117 | var buf: [64:0]u8 = undefined; |
| 118 | | const name = hwModelName(&buf) orelse return null; |
| 118 | const name = hwModelName(&buf) orelse break :blk null; |
| 119 | 119 | |
| 120 | 120 | inline for (models) |pair| { |
| 121 | 121 | if (std.mem.startsWith(u8, name, pair[0])) break :blk pair[1]; |
| 122 | 122 | } |
| 123 | 123 | |
| 124 | | break :blk .generic(arch); |
| 124 | break :blk null; |
| 125 | 125 | }; |
| 126 | 126 | |
| 127 | | const registers = [11]u64{ |
| 128 | | sysctlReg(std.c.CPU.AA64PFR0) orelse return null, |
| 129 | | sysctlReg(std.c.CPU.AA64PFR1) orelse return null, |
| 130 | | 0, // ID_AA64DFR0_EL1 |
| 131 | | 0, // ID_AA64DFR1_EL1 |
| 132 | | 0, // ID_AA64AFR0_EL1 |
| 133 | | 0, // ID_AA64AFR1_EL1 |
| 134 | | sysctlReg(std.c.CPU.ID_AA64ISAR0) orelse return null, |
| 135 | | sysctlReg(std.c.CPU.ID_AA64ISAR1) orelse return null, |
| 136 | | sysctlReg(std.c.CPU.ID_AA64MMFR0) orelse return null, |
| 137 | | sysctlReg(std.c.CPU.ID_AA64MMFR1) orelse return null, |
| 138 | | sysctlReg(std.c.CPU.ID_AA64MMFR2) orelse return null, |
| 127 | const registers = blk: { |
| 128 | break :blk [11]u64{ |
| 129 | sysctlReg(std.c.CPU.AA64PFR0) orelse break :blk null, |
| 130 | sysctlReg(std.c.CPU.AA64PFR1) orelse break :blk null, |
| 131 | 0, // ID_AA64DFR0_EL1 |
| 132 | 0, // ID_AA64DFR1_EL1 |
| 133 | 0, // ID_AA64AFR0_EL1 |
| 134 | 0, // ID_AA64AFR1_EL1 |
| 135 | sysctlReg(std.c.CPU.ID_AA64ISAR0) orelse break :blk null, |
| 136 | sysctlReg(std.c.CPU.ID_AA64ISAR1) orelse break :blk null, |
| 137 | sysctlReg(std.c.CPU.ID_AA64MMFR0) orelse break :blk null, |
| 138 | sysctlReg(std.c.CPU.ID_AA64MMFR1) orelse break :blk null, |
| 139 | sysctlReg(std.c.CPU.ID_AA64MMFR2) orelse break :blk null, |
| 140 | }; |
| 141 | } orelse { |
| 142 | // Even if the registers are unavailable, we should still return the |
| 143 | // model if we managed to detect it. |
| 144 | return if (maybe_model) |m| m.toCpu(arch) else null; |
| 139 | 145 | }; |
| 140 | 146 | |
| 141 | | return @import("arm.zig").aarch64.detectNativeFeatures(arch, model, registers); |
| 147 | return @import("arm.zig").aarch64.detectNativeFeatures(arch, maybe_model orelse .generic(arch), registers); |
| 142 | 148 | } |
| 143 | 149 | }; |
| 144 | 150 | |