authorgravatar for rqm@uvxi.orgVitor Fernandes <rqm@uvxi.org> 2026-07-09 08:32:59+02:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-08-29 19:40:43+02:00
log321faf4e167e9de2588ba61bbd1f4ef3632b6c62
treec5cc4decffddd2225693e1e92257307aee357367
parent5a625d5f3cb094242e6a310082c74f1b6461d606
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

std.os.linux: implement SYS_riscv_hwprobe syscall


3 files changed, 168 insertions(+), 0 deletions(-)

lib/std/os/linux.zig+162
......@@ -3258,6 +3258,44 @@ pub fn sysinfo(info: *Sysinfo) usize {
32583258 return syscall1(.sysinfo, @intFromPtr(info));
32593259}
32603260
3261const VdsoSysRiscvHwprobe = *align(1) const fn (
3262 pairs: [*]riscv_hwprobe,
3263 pair_count: usize,
3264 cpusetsize: usize,
3265 cpus: ?[*]cpu_set_t,
3266 flags: u32,
3267) callconv(.c) usize;
3268var vdso_sys_riscv_hwprobe: ?VdsoSysRiscvHwprobe = &init_vdso_sys_riscv_hwprobe;
3269
3270fn init_vdso_sys_riscv_hwprobe(
3271 pairs: [*]riscv_hwprobe,
3272 pair_count: usize,
3273 cpusetsize: usize,
3274 cpus: ?[*]cpu_set_t,
3275 flags: u32,
3276) callconv(.c) usize {
3277 const ptr: ?VdsoSysRiscvHwprobe = @ptrFromInt(vdso.lookup(VDSO.HWPROBE_VER, VDSO.HWPROBE_SYM));
3278 @atomicStore(?VdsoSysRiscvHwprobe, &vdso_sys_riscv_hwprobe, ptr, .monotonic);
3279 if (ptr) |f| return f(pairs, pair_count, cpusetsize, cpus, flags);
3280 return @bitCast(-@as(isize, @backingInt(E.NOSYS)));
3281}
3282
3283pub fn sys_riscv_hwprobe(
3284 pairs: [*]riscv_hwprobe,
3285 pair_count: usize,
3286 cpusetsize: usize,
3287 cpus: ?[*]cpu_set_t,
3288 flags: u32,
3289) usize {
3290 if (VDSO != void) {
3291 const ptr = @atomicLoad(?VdsoSysRiscvHwprobe, &vdso_sys_riscv_hwprobe, .unordered);
3292 if (ptr) |f| {
3293 if (f(pairs, pair_count, cpusetsize, cpus, flags) == 0) return 0;
3294 }
3295 }
3296 return syscall5(.riscv_hwprobe, @intFromPtr(pairs), pair_count, cpusetsize, @intFromPtr(cpus), flags);
3297}
3298
32613299pub const E = switch (native_arch) {
32623300 .mips, .mipsel, .mips64, .mips64el => enum(u16) {
32633301 /// No error occurred.
......@@ -10920,3 +10958,127 @@ pub const cmsghdr = extern struct {
1092010958 level: i32,
1092110959 type: i32,
1092210960};
10961
10962pub const riscv_hwprobe = extern struct {
10963 key: i64,
10964 value: u64,
10965};
10966
10967pub const RISCV_HWPROBE = struct {
10968 pub const KEY = struct {
10969 pub const MVENDORID = 0;
10970 pub const MARCHID = 1;
10971 pub const MIMPID = 2;
10972 pub const BASE_BEHAVIOR = 3;
10973 pub const IMA_EXT_0 = 4;
10974 pub const CPUPERF_0 = 5;
10975 pub const ZICBOZ_BLOCK_SIZE = 6;
10976 pub const HIGHEST_VIRT_ADDRESS = 7;
10977 pub const TIME_CSR_FREQ = 8;
10978 pub const MISALIGNED_SCALAR_PERF = 9;
10979 pub const MISALIGNED_VECTOR_PERF = 10;
10980 pub const VENDOR_EXT_THEAD_0 = 11;
10981 pub const ZICBOM_BLOCK_SIZE = 12;
10982 pub const VENDOR_EXT_SIFIVE_0 = 13;
10983 pub const VENDOR_EXT_MIPS_0 = 14;
10984 pub const ZICBOP_BLOCK_SIZE = 15;
10985 pub const IMA_EXT_1 = 16;
10986 };
10987
10988 pub const FLAGS_WHICH_CPUS = 1 << 0;
10989
10990 pub const BASE_BEHAVIOR_IMA = 1 << 0;
10991
10992 pub const IMA_EXT_0 = struct {
10993 pub const IMA_FD = 1 << 0;
10994 pub const IMA_C = 1 << 1;
10995 pub const IMA_V = 1 << 2;
10996 pub const EXT_ZBA = 1 << 3;
10997 pub const EXT_ZBB = 1 << 4;
10998 pub const EXT_ZBS = 1 << 5;
10999 pub const EXT_ZICBOZ = 1 << 6;
11000 pub const EXT_ZBC = 1 << 7;
11001 pub const EXT_ZBKB = 1 << 8;
11002 pub const EXT_ZBKC = 1 << 9;
11003 pub const EXT_ZBKX = 1 << 10;
11004 pub const EXT_ZKND = 1 << 11;
11005 pub const EXT_ZKNE = 1 << 12;
11006 pub const EXT_ZKNH = 1 << 13;
11007 pub const EXT_ZKSED = 1 << 14;
11008 pub const EXT_ZKSH = 1 << 15;
11009 pub const EXT_ZKT = 1 << 16;
11010 pub const EXT_ZVBB = 1 << 17;
11011 pub const EXT_ZVBC = 1 << 18;
11012 pub const EXT_ZVKB = 1 << 19;
11013 pub const EXT_ZVKG = 1 << 20;
11014 pub const EXT_ZVKNED = 1 << 21;
11015 pub const EXT_ZVKNHA = 1 << 22;
11016 pub const EXT_ZVKNHB = 1 << 23;
11017 pub const EXT_ZVKSED = 1 << 24;
11018 pub const EXT_ZVKSH = 1 << 25;
11019 pub const EXT_ZVKT = 1 << 26;
11020 pub const EXT_ZFH = 1 << 27;
11021 pub const EXT_ZFHMIN = 1 << 28;
11022 pub const EXT_ZIHINTNTL = 1 << 29;
11023 pub const EXT_ZVFH = 1 << 30;
11024 pub const EXT_ZVFHMIN = 1 << 31;
11025 pub const EXT_ZFA = 1 << 32;
11026 pub const EXT_ZTSO = 1 << 33;
11027 pub const EXT_ZACAS = 1 << 34;
11028 pub const EXT_ZICOND = 1 << 35;
11029 pub const EXT_ZIHINTPAUSE = 1 << 36;
11030 pub const EXT_ZVE32X = 1 << 37;
11031 pub const EXT_ZVE32F = 1 << 38;
11032 pub const EXT_ZVE64X = 1 << 39;
11033 pub const EXT_ZVE64F = 1 << 40;
11034 pub const EXT_ZVE64D = 1 << 41;
11035 pub const EXT_ZIMOP = 1 << 42;
11036 pub const EXT_ZCA = 1 << 43;
11037 pub const EXT_ZCB = 1 << 44;
11038 pub const EXT_ZCD = 1 << 45;
11039 pub const EXT_ZCF = 1 << 46;
11040 pub const EXT_ZCMOP = 1 << 47;
11041 pub const EXT_ZAWRS = 1 << 48;
11042 pub const EXT_SUPM = 1 << 49;
11043 pub const EXT_ZICNTR = 1 << 50;
11044 pub const EXT_ZIHPM = 1 << 51;
11045 pub const EXT_ZFBFMIN = 1 << 52;
11046 pub const EXT_ZVFBFMIN = 1 << 53;
11047 pub const EXT_ZVFBFWMA = 1 << 54;
11048 pub const EXT_ZICBOM = 1 << 55;
11049 pub const EXT_ZAAMO = 1 << 56;
11050 pub const EXT_ZALRSC = 1 << 57;
11051 pub const EXT_ZABHA = 1 << 58;
11052 pub const EXT_ZALASR = 1 << 59;
11053 pub const EXT_ZICBOP = 1 << 60;
11054 pub const EXT_ZILSD = 1 << 61;
11055 pub const EXT_ZCLSD = 1 << 62;
11056 pub const EXT_ZICFILP = 1 << 63;
11057 };
11058
11059 pub const IMA_EXT_1_EXT_ZICFISS = 1 << 0;
11060
11061 pub const MISALIGNED_SCALAR = struct {
11062 pub const UNKNOWN = 0;
11063 pub const EMULATED = 1;
11064 pub const SLOW = 2;
11065 pub const FAST = 3;
11066 pub const UNSUPPORTED = 4;
11067 };
11068
11069 pub const MISALIGNED_VECTOR = struct {
11070 pub const UNKNOWN = 0;
11071 pub const SLOW = 2;
11072 pub const FAST = 3;
11073 pub const UNSUPPORTED = 4;
11074 };
11075
11076 pub const MIPS_VENDOR_EXT_XMIPSEXECTL = 1 << 0;
11077
11078 pub const SIFIVE_VENDOR_EXT = struct {
11079 pub const XSFVQMACCDOD = 1 << 0;
11080 pub const XSFVQMACCQOQ = 1 << 1;
11081 pub const XSFVFNRCLIPXFQF = 1 << 2;
11082 pub const XSFVFWMACCQQQ = 1 << 3;
11083 };
11084};
lib/std/os/linux/riscv32.zig+3
......@@ -159,4 +159,7 @@ pub const time_t = i64;
159159pub const VDSO = struct {
160160 pub const CGT_SYM = "__vdso_clock_gettime";
161161 pub const CGT_VER = "LINUX_4.15";
162
163 pub const HWPROBE_SYM = "__vdso_riscv_hwprobe";
164 pub const HWPROBE_VER = "LINUX_4.15";
162165};
lib/std/os/linux/riscv64.zig+3
......@@ -159,4 +159,7 @@ pub const time_t = i64;
159159pub const VDSO = struct {
160160 pub const CGT_SYM = "__vdso_clock_gettime";
161161 pub const CGT_VER = "LINUX_4.15";
162
163 pub const HWPROBE_SYM = "__vdso_riscv_hwprobe";
164 pub const HWPROBE_VER = "LINUX_4.15";
162165};