| ... | ... | @@ -71,6 +71,53 @@ test "cpuinfo: SPARC" { |
| 71 | 71 | ); |
| 72 | 72 | } |
| 73 | 73 | |
| 74 | const RiscvCpuinfoImpl = struct { |
| 75 | model: ?*const Target.Cpu.Model = null, |
| 76 | |
| 77 | const cpu_names = .{ |
| 78 | .{ "sifive,u54", &Target.riscv.cpu.sifive_u54 }, |
| 79 | .{ "sifive,u7", &Target.riscv.cpu.sifive_7_series }, |
| 80 | .{ "sifive,u74", &Target.riscv.cpu.sifive_u74 }, |
| 81 | .{ "sifive,u74-mc", &Target.riscv.cpu.sifive_u74 }, |
| 82 | }; |
| 83 | |
| 84 | fn line_hook(self: *RiscvCpuinfoImpl, key: []const u8, value: []const u8) !bool { |
| 85 | if (mem.eql(u8, key, "uarch")) { |
| 86 | inline for (cpu_names) |pair| { |
| 87 | if (mem.eql(u8, value, pair[0])) { |
| 88 | self.model = pair[1]; |
| 89 | break; |
| 90 | } |
| 91 | } |
| 92 | return false; |
| 93 | } |
| 94 | |
| 95 | return true; |
| 96 | } |
| 97 | |
| 98 | fn finalize(self: *const RiscvCpuinfoImpl, arch: Target.Cpu.Arch) ?Target.Cpu { |
| 99 | const model = self.model orelse return null; |
| 100 | return Target.Cpu{ |
| 101 | .arch = arch, |
| 102 | .model = model, |
| 103 | .features = model.features, |
| 104 | }; |
| 105 | } |
| 106 | }; |
| 107 | |
| 108 | const RiscvCpuinfoParser = CpuinfoParser(RiscvCpuinfoImpl); |
| 109 | |
| 110 | test "cpuinfo: RISC-V" { |
| 111 | try testParser(RiscvCpuinfoParser, .riscv64, &Target.riscv.cpu.sifive_u74, |
| 112 | \\processor	: 0 |
| 113 | \\hart		: 1 |
| 114 | \\isa		: rv64imafdc |
| 115 | \\mmu		: sv39 |
| 116 | \\isa-ext : |
| 117 | \\uarch		: sifive,u74-mc |
| 118 | ); |
| 119 | } |
| 120 | |
| 74 | 121 | const PowerpcCpuinfoImpl = struct { |
| 75 | 122 | model: ?*const Target.Cpu.Model = null, |
| 76 | 123 | |
| ... | ... | @@ -344,6 +391,9 @@ pub fn detectNativeCpuAndFeatures() ?Target.Cpu { |
| 344 | 391 | .powerpc, .powerpcle, .powerpc64, .powerpc64le => { |
| 345 | 392 | return PowerpcCpuinfoParser.parse(current_arch, f.reader()) catch null; |
| 346 | 393 | }, |
| 394 | .riscv64, .riscv32 => { |
| 395 | return RiscvCpuinfoParser.parse(current_arch, f.reader()) catch null; |
| 396 | }, |
| 347 | 397 | else => {}, |
| 348 | 398 | } |
| 349 | 399 | |