| ... | @@ -292,6 +292,61 @@ const csky = struct { | ... | @@ -292,6 +292,61 @@ const csky = struct { |
| 292 | } | 292 | } |
| 293 | }; | 293 | }; |
| 294 | | 294 | |
| | 295 | const m68k = struct { |
| | 296 | const cpuinfo = struct { |
| | 297 | const Impl = struct { |
| | 298 | model: ?*const Target.Cpu.Model = null, |
| | 299 | |
| | 300 | const cpu_names = .{ |
| | 301 | .{ "68020", &Target.m68k.cpu.M68020 }, |
| | 302 | .{ "68030", &Target.m68k.cpu.M68030 }, |
| | 303 | .{ "68040", &Target.m68k.cpu.M68040 }, |
| | 304 | .{ "68060", &Target.m68k.cpu.M68060 }, |
| | 305 | }; |
| | 306 | |
| | 307 | fn lineHook(self: *Impl, key: []const u8, value: []const u8) !bool { |
| | 308 | if (mem.eql(u8, key, "CPU")) { |
| | 309 | inline for (cpu_names) |pair| { |
| | 310 | if (mem.eql(u8, value, pair[0])) { |
| | 311 | self.model = pair[1]; |
| | 312 | break; |
| | 313 | } |
| | 314 | } |
| | 315 | |
| | 316 | return false; |
| | 317 | } |
| | 318 | |
| | 319 | return true; |
| | 320 | } |
| | 321 | |
| | 322 | fn finalize(self: *const Impl, arch: Target.Cpu.Arch) ?Target.Cpu { |
| | 323 | const model = self.model orelse return null; |
| | 324 | return .{ |
| | 325 | .arch = arch, |
| | 326 | .model = model, |
| | 327 | .features = model.features, |
| | 328 | }; |
| | 329 | } |
| | 330 | }; |
| | 331 | |
| | 332 | const Parser = CpuinfoParser(Impl); |
| | 333 | }; |
| | 334 | |
| | 335 | pub fn detectNativeCpu(io: Io, arch: Target.Cpu.Arch) ?Target.Cpu { |
| | 336 | var file = Io.Dir.openFileAbsolute(io, "/proc/cpuinfo", .{}) catch return null; |
| | 337 | defer file.close(io); |
| | 338 | |
| | 339 | var buffer: [4096]u8 = undefined; |
| | 340 | var file_reader = file.reader(io, &buffer); |
| | 341 | |
| | 342 | var cpu = (cpuinfo.Parser.parse(arch, &file_reader.interface) catch null) orelse return null; |
| | 343 | |
| | 344 | cpu.features.populateDependencies(cpu.arch.allFeaturesList()); |
| | 345 | |
| | 346 | return cpu; |
| | 347 | } |
| | 348 | }; |
| | 349 | |
| 295 | const powerpc = struct { | 350 | const powerpc = struct { |
| 296 | const cpuinfo = struct { | 351 | const cpuinfo = struct { |
| 297 | const Impl = struct { | 352 | const Impl = struct { |
| ... | @@ -818,6 +873,7 @@ pub fn detectNativeCpuAndFeatures(io: Io) ?Target.Cpu { | ... | @@ -818,6 +873,7 @@ pub fn detectNativeCpuAndFeatures(io: Io) ?Target.Cpu { |
| 818 | .aarch64, .aarch64_be => aarch64.detectNativeCpuAndFeatures(current_arch), | 873 | .aarch64, .aarch64_be => aarch64.detectNativeCpuAndFeatures(current_arch), |
| 819 | .arm, .armeb, .thumb, .thumbeb => arm.detectNativeCpu(io, current_arch), | 874 | .arm, .armeb, .thumb, .thumbeb => arm.detectNativeCpu(io, current_arch), |
| 820 | .csky => csky.detectNativeCpu(io, current_arch), | 875 | .csky => csky.detectNativeCpu(io, current_arch), |
| | 876 | .m68k => m68k.detectNativeCpu(io, current_arch), |
| 821 | .powerpc, .powerpcle, .powerpc64, .powerpc64le => powerpc.detectNativeCpu(io, current_arch), | 877 | .powerpc, .powerpcle, .powerpc64, .powerpc64le => powerpc.detectNativeCpu(io, current_arch), |
| 822 | .riscv64, .riscv32 => riscv.detectNativeCpuAndFeatures(io, current_arch), | 878 | .riscv64, .riscv32 => riscv.detectNativeCpuAndFeatures(io, current_arch), |
| 823 | .s390x => s390x.detectNativeCpu(io, current_arch), | 879 | .s390x => s390x.detectNativeCpu(io, current_arch), |