From 93cb0f1552b0c7285ef22f6713239675170a348b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sun, 6 Sep 2026 09:09:30 +0200 Subject: [PATCH] std.zig.system.openbsd: implement powerpc CPU model detection ref https://codeberg.org/ziglang/zig/issues/36726 --- lib/std/zig/system/openbsd.zig | 55 ++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/lib/std/zig/system/openbsd.zig b/lib/std/zig/system/openbsd.zig index 4a6b064210db8af1ade69625d6769657f1042420..39f2156ffa7dd189d826c4c4549e6e21445a6ee1 100644 --- a/lib/std/zig/system/openbsd.zig +++ b/lib/std/zig/system/openbsd.zig @@ -43,9 +43,64 @@ const aarch64 = struct { } }; +const powerpc = struct { + const models = .{ + .{ "601", &std.Target.powerpc.cpu.@"601" }, + .{ "603ev", &std.Target.powerpc.cpu.@"603ev" }, + .{ "603e", &std.Target.powerpc.cpu.@"603e" }, + .{ "603", &std.Target.powerpc.cpu.@"603" }, + .{ "604ev", &std.Target.powerpc.cpu.@"604e" }, + .{ "604", &std.Target.powerpc.cpu.@"604" }, + .{ "7400", &std.Target.powerpc.cpu.@"7400" }, + .{ "7410", &std.Target.powerpc.cpu.@"7400" }, + .{ "7450", &std.Target.powerpc.cpu.@"7450" }, + .{ "7451", &std.Target.powerpc.cpu.@"7450" }, + .{ "7455", &std.Target.powerpc.cpu.@"7450" }, + .{ "7457", &std.Target.powerpc.cpu.@"7450" }, + .{ "7447A", &std.Target.powerpc.cpu.@"7450" }, + .{ "7448", &std.Target.powerpc.cpu.@"7450" }, + .{ "750FX", &std.Target.powerpc.cpu.@"750" }, + .{ "750", &std.Target.powerpc.cpu.@"750" }, + .{ "970FX", &std.Target.powerpc.cpu.@"970" }, + .{ "970MP", &std.Target.powerpc.cpu.@"970" }, + .{ "970", &std.Target.powerpc.cpu.@"970" }, + .{ "IBM POWER8E", &std.Target.powerpc.cpu.pwr8 }, + .{ "IBM POWER8NVL", &std.Target.powerpc.cpu.pwr8 }, + .{ "IBM POWER8", &std.Target.powerpc.cpu.pwr8 }, + .{ "IBM POWER9P", &std.Target.powerpc.cpu.pwr9 }, + .{ "IBM POWER9", &std.Target.powerpc.cpu.pwr9 }, + }; + + fn detectNativeCpu(arch: std.Target.Cpu.Arch) ?std.Target.Cpu { + const mib: [2]c_int = [_]c_int{ + std.c.CTL.HW, + std.c.HW.MODEL, + }; + var buf: [64:0]u8 = undefined; + var len: usize = buf.len + 1; + + std.posix.sysctl(&mib, &buf, &len, null, 0) catch |err| switch (err) { + error.NameTooLong => unreachable, + error.PermissionDenied => unreachable, + error.SystemResources => unreachable, + error.UnknownName => unreachable, + error.Unexpected => return null, + }; + + const name = buf[0 .. len - 1 :0]; + + inline for (models) |pair| { + if (std.mem.startsWith(u8, name, pair[0])) return pair[1].toCpu(arch); + } + + return null; + } +}; + pub fn detectNativeCpuAndFeatures() ?std.Target.Cpu { return switch (native_arch) { .aarch64 => aarch64.detectNativeCpuAndFeatures(native_arch), + .powerpc, .powerpc64 => powerpc.detectNativeCpu(native_arch), else => null, }; } -- 2.54.0