authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-09-07 09:57:43+02:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-09-07 14:28:43+02:00
logf4c38a3686f190ec2b9c58cfeea1636d19e5c896
treeb496371b2b97292ebb330209f430166f5d134a3e
parentea6fa69ef558531300e67fd07abf81c92b86949c
signature Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

std.zig.system.openbsd: return aarch64 model even if registers are unavailable


1 files changed, 22 insertions(+), 16 deletions(-)

lib/std/zig/system/openbsd.zig+22-16
......@@ -113,32 +113,38 @@ const aarch64 = struct {
113113 }
114114
115115 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: {
117117 var buf: [64:0]u8 = undefined;
118 const name = hwModelName(&buf) orelse return null;
118 const name = hwModelName(&buf) orelse break :blk null;
119119
120120 inline for (models) |pair| {
121121 if (std.mem.startsWith(u8, name, pair[0])) break :blk pair[1];
122122 }
123123
124 break :blk .generic(arch);
124 break :blk null;
125125 };
126126
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;
139145 };
140146
141 return @import("arm.zig").aarch64.detectNativeFeatures(arch, model, registers);
147 return @import("arm.zig").aarch64.detectNativeFeatures(arch, maybe_model orelse .generic(arch), registers);
142148 }
143149};
144150