pub fn detectNativeCpuAndFeatures(io: Io) ?Target.Cpu {
var file = Io.Dir.openFileAbsolute(io, "/proc/cpuinfo", .{}) catch |err| switch (err) {
else => return null,
};
defer file.close(io);
var buffer: [4096]u8 = undefined; // "flags" lines can get pretty long.
var file_reader = file.reader(io, &buffer);
const current_arch = builtin.cpu.arch;
return switch (current_arch) {
.aarch64, .aarch64_be => b: {
const registers = [12]u64{
getAArch64CpuFeature("MIDR_EL1"),
getAArch64CpuFeature("ID_AA64PFR0_EL1"),
getAArch64CpuFeature("ID_AA64PFR1_EL1"),
getAArch64CpuFeature("ID_AA64DFR0_EL1"),
getAArch64CpuFeature("ID_AA64DFR1_EL1"),
getAArch64CpuFeature("ID_AA64AFR0_EL1"),
getAArch64CpuFeature("ID_AA64AFR1_EL1"),
getAArch64CpuFeature("ID_AA64ISAR0_EL1"),
getAArch64CpuFeature("ID_AA64ISAR1_EL1"),
getAArch64CpuFeature("ID_AA64MMFR0_EL1"),
getAArch64CpuFeature("ID_AA64MMFR1_EL1"),
getAArch64CpuFeature("ID_AA64MMFR2_EL1"),
};
break :b @import("arm.zig").aarch64.detectNativeCpuAndFeatures(current_arch, registers);
},
.arm, .armeb, .thumb, .thumbeb => ArmCpuinfoParser.parse(current_arch, &file_reader.interface) catch null,
.powerpc, .powerpcle, .powerpc64, .powerpc64le => PowerpcCpuinfoParser.parse(current_arch, &file_reader.interface) catch null,
.riscv64, .riscv32 => b: {
var cpu = (RiscvCpuinfoParser.parse(current_arch, &file_reader.interface) catch null) orelse cpu: {
const model = Target.Cpu.Model.generic(current_arch);
break :cpu Target.Cpu{
.arch = current_arch,
.model = model,
.features = model.features,
};
};
riscv.detectCpuFeatures(&cpu);
cpu.features.populateDependencies(cpu.arch.allFeaturesList());
break :b cpu;
},
.s390x => S390xCpuinfoParser.parse(current_arch, &file_reader.interface) catch null,
.sparc, .sparc64 => SparcCpuinfoParser.parse(current_arch, &file_reader.interface) catch null,
else => null,
};
}