From cfa82af363ad1bb6501f629939be5131802c2819 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sun, 4 Oct 2026 04:52:13 +0200 Subject: [PATCH] std.os.linux.riscv(32,64): declare all vector registers as syscall clobbers The kernel intentionally clobbers vector registers (by setting them to all 1s). --- lib/std/os/linux/riscv32.zig | 280 ++++++++++++++++++++++++++++++++++- lib/std/os/linux/riscv64.zig | 280 ++++++++++++++++++++++++++++++++++- 2 files changed, 546 insertions(+), 14 deletions(-) diff --git a/lib/std/os/linux/riscv32.zig b/lib/std/os/linux/riscv32.zig index 278b1ff27b9f98a16f6343ae5410c32d4182042c..5f64b8c16552390afa7401be68796a7983a63baa 100644 --- a/lib/std/os/linux/riscv32.zig +++ b/lib/std/os/linux/riscv32.zig @@ -10,7 +10,45 @@ pub fn syscall0( return asm volatile ("ecall" : [ret] "={x10}" (-> u32), : [number] "{x17}" (@backingInt(number)), - : .{ .memory = true }); + : .{ + .memory = true, + .v0 = true, + .v1 = true, + .v2 = true, + .v3 = true, + .v4 = true, + .v5 = true, + .v6 = true, + .v7 = true, + .v8 = true, + .v9 = true, + .v10 = true, + .v11 = true, + .v12 = true, + .v13 = true, + .v14 = true, + .v15 = true, + .v16 = true, + .v17 = true, + .v18 = true, + .v19 = true, + .v20 = true, + .v21 = true, + .v22 = true, + .v23 = true, + .v24 = true, + .v25 = true, + .v26 = true, + .v27 = true, + .v28 = true, + .v29 = true, + .v30 = true, + .v31 = true, + .vtype = true, + .vl = true, + .vxsat = true, + .vxrm = true, + }); } pub fn syscall1( @@ -21,7 +59,45 @@ pub fn syscall1( : [ret] "={x10}" (-> u32), : [number] "{x17}" (@backingInt(number)), [arg1] "{x10}" (arg1), - : .{ .memory = true }); + : .{ + .memory = true, + .v0 = true, + .v1 = true, + .v2 = true, + .v3 = true, + .v4 = true, + .v5 = true, + .v6 = true, + .v7 = true, + .v8 = true, + .v9 = true, + .v10 = true, + .v11 = true, + .v12 = true, + .v13 = true, + .v14 = true, + .v15 = true, + .v16 = true, + .v17 = true, + .v18 = true, + .v19 = true, + .v20 = true, + .v21 = true, + .v22 = true, + .v23 = true, + .v24 = true, + .v25 = true, + .v26 = true, + .v27 = true, + .v28 = true, + .v29 = true, + .v30 = true, + .v31 = true, + .vtype = true, + .vl = true, + .vxsat = true, + .vxrm = true, + }); } pub fn syscall2( @@ -34,7 +110,45 @@ pub fn syscall2( : [number] "{x17}" (@backingInt(number)), [arg1] "{x10}" (arg1), [arg2] "{x11}" (arg2), - : .{ .memory = true }); + : .{ + .memory = true, + .v0 = true, + .v1 = true, + .v2 = true, + .v3 = true, + .v4 = true, + .v5 = true, + .v6 = true, + .v7 = true, + .v8 = true, + .v9 = true, + .v10 = true, + .v11 = true, + .v12 = true, + .v13 = true, + .v14 = true, + .v15 = true, + .v16 = true, + .v17 = true, + .v18 = true, + .v19 = true, + .v20 = true, + .v21 = true, + .v22 = true, + .v23 = true, + .v24 = true, + .v25 = true, + .v26 = true, + .v27 = true, + .v28 = true, + .v29 = true, + .v30 = true, + .v31 = true, + .vtype = true, + .vl = true, + .vxsat = true, + .vxrm = true, + }); } pub fn syscall3( @@ -49,7 +163,45 @@ pub fn syscall3( [arg1] "{x10}" (arg1), [arg2] "{x11}" (arg2), [arg3] "{x12}" (arg3), - : .{ .memory = true }); + : .{ + .memory = true, + .v0 = true, + .v1 = true, + .v2 = true, + .v3 = true, + .v4 = true, + .v5 = true, + .v6 = true, + .v7 = true, + .v8 = true, + .v9 = true, + .v10 = true, + .v11 = true, + .v12 = true, + .v13 = true, + .v14 = true, + .v15 = true, + .v16 = true, + .v17 = true, + .v18 = true, + .v19 = true, + .v20 = true, + .v21 = true, + .v22 = true, + .v23 = true, + .v24 = true, + .v25 = true, + .v26 = true, + .v27 = true, + .v28 = true, + .v29 = true, + .v30 = true, + .v31 = true, + .vtype = true, + .vl = true, + .vxsat = true, + .vxrm = true, + }); } pub fn syscall4( @@ -66,7 +218,45 @@ pub fn syscall4( [arg2] "{x11}" (arg2), [arg3] "{x12}" (arg3), [arg4] "{x13}" (arg4), - : .{ .memory = true }); + : .{ + .memory = true, + .v0 = true, + .v1 = true, + .v2 = true, + .v3 = true, + .v4 = true, + .v5 = true, + .v6 = true, + .v7 = true, + .v8 = true, + .v9 = true, + .v10 = true, + .v11 = true, + .v12 = true, + .v13 = true, + .v14 = true, + .v15 = true, + .v16 = true, + .v17 = true, + .v18 = true, + .v19 = true, + .v20 = true, + .v21 = true, + .v22 = true, + .v23 = true, + .v24 = true, + .v25 = true, + .v26 = true, + .v27 = true, + .v28 = true, + .v29 = true, + .v30 = true, + .v31 = true, + .vtype = true, + .vl = true, + .vxsat = true, + .vxrm = true, + }); } pub fn syscall5( @@ -85,7 +275,45 @@ pub fn syscall5( [arg3] "{x12}" (arg3), [arg4] "{x13}" (arg4), [arg5] "{x14}" (arg5), - : .{ .memory = true }); + : .{ + .memory = true, + .v0 = true, + .v1 = true, + .v2 = true, + .v3 = true, + .v4 = true, + .v5 = true, + .v6 = true, + .v7 = true, + .v8 = true, + .v9 = true, + .v10 = true, + .v11 = true, + .v12 = true, + .v13 = true, + .v14 = true, + .v15 = true, + .v16 = true, + .v17 = true, + .v18 = true, + .v19 = true, + .v20 = true, + .v21 = true, + .v22 = true, + .v23 = true, + .v24 = true, + .v25 = true, + .v26 = true, + .v27 = true, + .v28 = true, + .v29 = true, + .v30 = true, + .v31 = true, + .vtype = true, + .vl = true, + .vxsat = true, + .vxrm = true, + }); } pub fn syscall6( @@ -106,7 +334,45 @@ pub fn syscall6( [arg4] "{x13}" (arg4), [arg5] "{x14}" (arg5), [arg6] "{x15}" (arg6), - : .{ .memory = true }); + : .{ + .memory = true, + .v0 = true, + .v1 = true, + .v2 = true, + .v3 = true, + .v4 = true, + .v5 = true, + .v6 = true, + .v7 = true, + .v8 = true, + .v9 = true, + .v10 = true, + .v11 = true, + .v12 = true, + .v13 = true, + .v14 = true, + .v15 = true, + .v16 = true, + .v17 = true, + .v18 = true, + .v19 = true, + .v20 = true, + .v21 = true, + .v22 = true, + .v23 = true, + .v24 = true, + .v25 = true, + .v26 = true, + .v27 = true, + .v28 = true, + .v29 = true, + .v30 = true, + .v31 = true, + .vtype = true, + .vl = true, + .vxsat = true, + .vxrm = true, + }); } pub fn clone() callconv(.naked) u32 { diff --git a/lib/std/os/linux/riscv64.zig b/lib/std/os/linux/riscv64.zig index 75024ec2a775c811f64d489d76918c20728dd9f4..51f5fc5d45cbf6db403785dec3311d4b9d274504 100644 --- a/lib/std/os/linux/riscv64.zig +++ b/lib/std/os/linux/riscv64.zig @@ -10,7 +10,45 @@ pub fn syscall0( return asm volatile ("ecall" : [ret] "={x10}" (-> u64), : [number] "{x17}" (@backingInt(number)), - : .{ .memory = true }); + : .{ + .memory = true, + .v0 = true, + .v1 = true, + .v2 = true, + .v3 = true, + .v4 = true, + .v5 = true, + .v6 = true, + .v7 = true, + .v8 = true, + .v9 = true, + .v10 = true, + .v11 = true, + .v12 = true, + .v13 = true, + .v14 = true, + .v15 = true, + .v16 = true, + .v17 = true, + .v18 = true, + .v19 = true, + .v20 = true, + .v21 = true, + .v22 = true, + .v23 = true, + .v24 = true, + .v25 = true, + .v26 = true, + .v27 = true, + .v28 = true, + .v29 = true, + .v30 = true, + .v31 = true, + .vtype = true, + .vl = true, + .vxsat = true, + .vxrm = true, + }); } pub fn syscall1( @@ -21,7 +59,45 @@ pub fn syscall1( : [ret] "={x10}" (-> u64), : [number] "{x17}" (@backingInt(number)), [arg1] "{x10}" (arg1), - : .{ .memory = true }); + : .{ + .memory = true, + .v0 = true, + .v1 = true, + .v2 = true, + .v3 = true, + .v4 = true, + .v5 = true, + .v6 = true, + .v7 = true, + .v8 = true, + .v9 = true, + .v10 = true, + .v11 = true, + .v12 = true, + .v13 = true, + .v14 = true, + .v15 = true, + .v16 = true, + .v17 = true, + .v18 = true, + .v19 = true, + .v20 = true, + .v21 = true, + .v22 = true, + .v23 = true, + .v24 = true, + .v25 = true, + .v26 = true, + .v27 = true, + .v28 = true, + .v29 = true, + .v30 = true, + .v31 = true, + .vtype = true, + .vl = true, + .vxsat = true, + .vxrm = true, + }); } pub fn syscall2( @@ -34,7 +110,45 @@ pub fn syscall2( : [number] "{x17}" (@backingInt(number)), [arg1] "{x10}" (arg1), [arg2] "{x11}" (arg2), - : .{ .memory = true }); + : .{ + .memory = true, + .v0 = true, + .v1 = true, + .v2 = true, + .v3 = true, + .v4 = true, + .v5 = true, + .v6 = true, + .v7 = true, + .v8 = true, + .v9 = true, + .v10 = true, + .v11 = true, + .v12 = true, + .v13 = true, + .v14 = true, + .v15 = true, + .v16 = true, + .v17 = true, + .v18 = true, + .v19 = true, + .v20 = true, + .v21 = true, + .v22 = true, + .v23 = true, + .v24 = true, + .v25 = true, + .v26 = true, + .v27 = true, + .v28 = true, + .v29 = true, + .v30 = true, + .v31 = true, + .vtype = true, + .vl = true, + .vxsat = true, + .vxrm = true, + }); } pub fn syscall3( @@ -49,7 +163,45 @@ pub fn syscall3( [arg1] "{x10}" (arg1), [arg2] "{x11}" (arg2), [arg3] "{x12}" (arg3), - : .{ .memory = true }); + : .{ + .memory = true, + .v0 = true, + .v1 = true, + .v2 = true, + .v3 = true, + .v4 = true, + .v5 = true, + .v6 = true, + .v7 = true, + .v8 = true, + .v9 = true, + .v10 = true, + .v11 = true, + .v12 = true, + .v13 = true, + .v14 = true, + .v15 = true, + .v16 = true, + .v17 = true, + .v18 = true, + .v19 = true, + .v20 = true, + .v21 = true, + .v22 = true, + .v23 = true, + .v24 = true, + .v25 = true, + .v26 = true, + .v27 = true, + .v28 = true, + .v29 = true, + .v30 = true, + .v31 = true, + .vtype = true, + .vl = true, + .vxsat = true, + .vxrm = true, + }); } pub fn syscall4( @@ -66,7 +218,45 @@ pub fn syscall4( [arg2] "{x11}" (arg2), [arg3] "{x12}" (arg3), [arg4] "{x13}" (arg4), - : .{ .memory = true }); + : .{ + .memory = true, + .v0 = true, + .v1 = true, + .v2 = true, + .v3 = true, + .v4 = true, + .v5 = true, + .v6 = true, + .v7 = true, + .v8 = true, + .v9 = true, + .v10 = true, + .v11 = true, + .v12 = true, + .v13 = true, + .v14 = true, + .v15 = true, + .v16 = true, + .v17 = true, + .v18 = true, + .v19 = true, + .v20 = true, + .v21 = true, + .v22 = true, + .v23 = true, + .v24 = true, + .v25 = true, + .v26 = true, + .v27 = true, + .v28 = true, + .v29 = true, + .v30 = true, + .v31 = true, + .vtype = true, + .vl = true, + .vxsat = true, + .vxrm = true, + }); } pub fn syscall5( @@ -85,7 +275,45 @@ pub fn syscall5( [arg3] "{x12}" (arg3), [arg4] "{x13}" (arg4), [arg5] "{x14}" (arg5), - : .{ .memory = true }); + : .{ + .memory = true, + .v0 = true, + .v1 = true, + .v2 = true, + .v3 = true, + .v4 = true, + .v5 = true, + .v6 = true, + .v7 = true, + .v8 = true, + .v9 = true, + .v10 = true, + .v11 = true, + .v12 = true, + .v13 = true, + .v14 = true, + .v15 = true, + .v16 = true, + .v17 = true, + .v18 = true, + .v19 = true, + .v20 = true, + .v21 = true, + .v22 = true, + .v23 = true, + .v24 = true, + .v25 = true, + .v26 = true, + .v27 = true, + .v28 = true, + .v29 = true, + .v30 = true, + .v31 = true, + .vtype = true, + .vl = true, + .vxsat = true, + .vxrm = true, + }); } pub fn syscall6( @@ -106,7 +334,45 @@ pub fn syscall6( [arg4] "{x13}" (arg4), [arg5] "{x14}" (arg5), [arg6] "{x15}" (arg6), - : .{ .memory = true }); + : .{ + .memory = true, + .v0 = true, + .v1 = true, + .v2 = true, + .v3 = true, + .v4 = true, + .v5 = true, + .v6 = true, + .v7 = true, + .v8 = true, + .v9 = true, + .v10 = true, + .v11 = true, + .v12 = true, + .v13 = true, + .v14 = true, + .v15 = true, + .v16 = true, + .v17 = true, + .v18 = true, + .v19 = true, + .v20 = true, + .v21 = true, + .v22 = true, + .v23 = true, + .v24 = true, + .v25 = true, + .v26 = true, + .v27 = true, + .v28 = true, + .v29 = true, + .v30 = true, + .v31 = true, + .vtype = true, + .vl = true, + .vxsat = true, + .vxrm = true, + }); } pub fn clone() callconv(.naked) u64 { -- 2.54.0