From 5c25ad0fda23eca4b98aad48d709b3b1b9caf2d6 Mon Sep 17 00:00:00 2001 From: Tristan Ross Date: Wed, 7 Feb 2024 13:44:34 -0800 Subject: [PATCH] std.zig.system.linux: detect risc-v --- lib/std/zig/system/linux.zig | 50 ++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/lib/std/zig/system/linux.zig b/lib/std/zig/system/linux.zig index ad49f4d626..b05b86995f 100644 --- a/lib/std/zig/system/linux.zig +++ b/lib/std/zig/system/linux.zig @@ -71,6 +71,53 @@ test "cpuinfo: SPARC" { ); } +const RiscvCpuinfoImpl = struct { + model: ?*const Target.Cpu.Model = null, + + const cpu_names = .{ + .{ "sifive,u54", &Target.riscv.cpu.sifive_u54 }, + .{ "sifive,u7", &Target.riscv.cpu.sifive_7_series }, + .{ "sifive,u74", &Target.riscv.cpu.sifive_u74 }, + .{ "sifive,u74-mc", &Target.riscv.cpu.sifive_u74 }, + }; + + fn line_hook(self: *RiscvCpuinfoImpl, key: []const u8, value: []const u8) !bool { + if (mem.eql(u8, key, "uarch")) { + inline for (cpu_names) |pair| { + if (mem.eql(u8, value, pair[0])) { + self.model = pair[1]; + break; + } + } + return false; + } + + return true; + } + + fn finalize(self: *const RiscvCpuinfoImpl, arch: Target.Cpu.Arch) ?Target.Cpu { + const model = self.model orelse return null; + return Target.Cpu{ + .arch = arch, + .model = model, + .features = model.features, + }; + } +}; + +const RiscvCpuinfoParser = CpuinfoParser(RiscvCpuinfoImpl); + +test "cpuinfo: RISC-V" { + try testParser(RiscvCpuinfoParser, .riscv64, &Target.riscv.cpu.sifive_u74, + \\processor : 0 + \\hart : 1 + \\isa : rv64imafdc + \\mmu : sv39 + \\isa-ext : + \\uarch : sifive,u74-mc + ); +} + const PowerpcCpuinfoImpl = struct { model: ?*const Target.Cpu.Model = null, @@ -344,6 +391,9 @@ pub fn detectNativeCpuAndFeatures() ?Target.Cpu { .powerpc, .powerpcle, .powerpc64, .powerpc64le => { return PowerpcCpuinfoParser.parse(current_arch, f.reader()) catch null; }, + .riscv64, .riscv32 => { + return RiscvCpuinfoParser.parse(current_arch, f.reader()) catch null; + }, else => {}, }