diff --git a/src/backend/linux_raw/arch/riscv64.rs b/src/backend/linux_raw/arch/riscv64.rs index 512657acc..234d90339 100644 --- a/src/backend/linux_raw/arch/riscv64.rs +++ b/src/backend/linux_raw/arch/riscv64.rs @@ -1,4 +1,7 @@ //! riscv64 Linux system calls. +//! +//! Syscalls do not preserve vector registers. +//! use crate::backend::reg::{ ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm as _, A0, A1, A2, A3, A4, A5, R0, @@ -12,7 +15,39 @@ pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber<'_>) -> Ret "ecall", in("a7") nr.to_asm(), lateout("a0") r0, - options(nostack, preserves_flags, readonly) + lateout("v0") _, + lateout("v1") _, + lateout("v2") _, + lateout("v3") _, + lateout("v4") _, + lateout("v5") _, + lateout("v6") _, + lateout("v7") _, + lateout("v8") _, + lateout("v9") _, + lateout("v10") _, + lateout("v11") _, + lateout("v12") _, + lateout("v13") _, + lateout("v14") _, + lateout("v15") _, + lateout("v16") _, + lateout("v17") _, + lateout("v18") _, + lateout("v19") _, + lateout("v20") _, + lateout("v21") _, + lateout("v22") _, + lateout("v23") _, + lateout("v24") _, + lateout("v25") _, + lateout("v26") _, + lateout("v27") _, + lateout("v28") _, + lateout("v29") _, + lateout("v30") _, + lateout("v31") _, + options(nostack, readonly) ); FromAsm::from_asm(r0) } @@ -24,7 +59,39 @@ pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, "ecall", in("a7") nr.to_asm(), inlateout("a0") a0.to_asm() => r0, - options(nostack, preserves_flags) + lateout("v0") _, + lateout("v1") _, + lateout("v2") _, + lateout("v3") _, + lateout("v4") _, + lateout("v5") _, + lateout("v6") _, + lateout("v7") _, + lateout("v8") _, + lateout("v9") _, + lateout("v10") _, + lateout("v11") _, + lateout("v12") _, + lateout("v13") _, + lateout("v14") _, + lateout("v15") _, + lateout("v16") _, + lateout("v17") _, + lateout("v18") _, + lateout("v19") _, + lateout("v20") _, + lateout("v21") _, + lateout("v22") _, + lateout("v23") _, + lateout("v24") _, + lateout("v25") _, + lateout("v26") _, + lateout("v27") _, + lateout("v28") _, + lateout("v29") _, + lateout("v30") _, + lateout("v31") _, + options(nostack) ); FromAsm::from_asm(r0) } @@ -39,7 +106,39 @@ pub(in crate::backend) unsafe fn syscall1_readonly( "ecall", in("a7") nr.to_asm(), inlateout("a0") a0.to_asm() => r0, - options(nostack, preserves_flags, readonly) + lateout("v0") _, + lateout("v1") _, + lateout("v2") _, + lateout("v3") _, + lateout("v4") _, + lateout("v5") _, + lateout("v6") _, + lateout("v7") _, + lateout("v8") _, + lateout("v9") _, + lateout("v10") _, + lateout("v11") _, + lateout("v12") _, + lateout("v13") _, + lateout("v14") _, + lateout("v15") _, + lateout("v16") _, + lateout("v17") _, + lateout("v18") _, + lateout("v19") _, + lateout("v20") _, + lateout("v21") _, + lateout("v22") _, + lateout("v23") _, + lateout("v24") _, + lateout("v25") _, + lateout("v26") _, + lateout("v27") _, + lateout("v28") _, + lateout("v29") _, + lateout("v30") _, + lateout("v31") _, + options(nostack, readonly) ); FromAsm::from_asm(r0) } @@ -67,7 +166,39 @@ pub(in crate::backend) unsafe fn syscall2( in("a7") nr.to_asm(), inlateout("a0") a0.to_asm() => r0, in("a1") a1.to_asm(), - options(nostack, preserves_flags) + lateout("v0") _, + lateout("v1") _, + lateout("v2") _, + lateout("v3") _, + lateout("v4") _, + lateout("v5") _, + lateout("v6") _, + lateout("v7") _, + lateout("v8") _, + lateout("v9") _, + lateout("v10") _, + lateout("v11") _, + lateout("v12") _, + lateout("v13") _, + lateout("v14") _, + lateout("v15") _, + lateout("v16") _, + lateout("v17") _, + lateout("v18") _, + lateout("v19") _, + lateout("v20") _, + lateout("v21") _, + lateout("v22") _, + lateout("v23") _, + lateout("v24") _, + lateout("v25") _, + lateout("v26") _, + lateout("v27") _, + lateout("v28") _, + lateout("v29") _, + lateout("v30") _, + lateout("v31") _, + options(nostack) ); FromAsm::from_asm(r0) } @@ -84,7 +215,39 @@ pub(in crate::backend) unsafe fn syscall2_readonly( in("a7") nr.to_asm(), inlateout("a0") a0.to_asm() => r0, in("a1") a1.to_asm(), - options(nostack, preserves_flags, readonly) + lateout("v0") _, + lateout("v1") _, + lateout("v2") _, + lateout("v3") _, + lateout("v4") _, + lateout("v5") _, + lateout("v6") _, + lateout("v7") _, + lateout("v8") _, + lateout("v9") _, + lateout("v10") _, + lateout("v11") _, + lateout("v12") _, + lateout("v13") _, + lateout("v14") _, + lateout("v15") _, + lateout("v16") _, + lateout("v17") _, + lateout("v18") _, + lateout("v19") _, + lateout("v20") _, + lateout("v21") _, + lateout("v22") _, + lateout("v23") _, + lateout("v24") _, + lateout("v25") _, + lateout("v26") _, + lateout("v27") _, + lateout("v28") _, + lateout("v29") _, + lateout("v30") _, + lateout("v31") _, + options(nostack, readonly) ); FromAsm::from_asm(r0) } @@ -103,7 +266,39 @@ pub(in crate::backend) unsafe fn syscall3( inlateout("a0") a0.to_asm() => r0, in("a1") a1.to_asm(), in("a2") a2.to_asm(), - options(nostack, preserves_flags) + lateout("v0") _, + lateout("v1") _, + lateout("v2") _, + lateout("v3") _, + lateout("v4") _, + lateout("v5") _, + lateout("v6") _, + lateout("v7") _, + lateout("v8") _, + lateout("v9") _, + lateout("v10") _, + lateout("v11") _, + lateout("v12") _, + lateout("v13") _, + lateout("v14") _, + lateout("v15") _, + lateout("v16") _, + lateout("v17") _, + lateout("v18") _, + lateout("v19") _, + lateout("v20") _, + lateout("v21") _, + lateout("v22") _, + lateout("v23") _, + lateout("v24") _, + lateout("v25") _, + lateout("v26") _, + lateout("v27") _, + lateout("v28") _, + lateout("v29") _, + lateout("v30") _, + lateout("v31") _, + options(nostack) ); FromAsm::from_asm(r0) } @@ -122,7 +317,39 @@ pub(in crate::backend) unsafe fn syscall3_readonly( inlateout("a0") a0.to_asm() => r0, in("a1") a1.to_asm(), in("a2") a2.to_asm(), - options(nostack, preserves_flags, readonly) + lateout("v0") _, + lateout("v1") _, + lateout("v2") _, + lateout("v3") _, + lateout("v4") _, + lateout("v5") _, + lateout("v6") _, + lateout("v7") _, + lateout("v8") _, + lateout("v9") _, + lateout("v10") _, + lateout("v11") _, + lateout("v12") _, + lateout("v13") _, + lateout("v14") _, + lateout("v15") _, + lateout("v16") _, + lateout("v17") _, + lateout("v18") _, + lateout("v19") _, + lateout("v20") _, + lateout("v21") _, + lateout("v22") _, + lateout("v23") _, + lateout("v24") _, + lateout("v25") _, + lateout("v26") _, + lateout("v27") _, + lateout("v28") _, + lateout("v29") _, + lateout("v30") _, + lateout("v31") _, + options(nostack, readonly) ); FromAsm::from_asm(r0) } @@ -143,7 +370,39 @@ pub(in crate::backend) unsafe fn syscall4( in("a1") a1.to_asm(), in("a2") a2.to_asm(), in("a3") a3.to_asm(), - options(nostack, preserves_flags) + lateout("v0") _, + lateout("v1") _, + lateout("v2") _, + lateout("v3") _, + lateout("v4") _, + lateout("v5") _, + lateout("v6") _, + lateout("v7") _, + lateout("v8") _, + lateout("v9") _, + lateout("v10") _, + lateout("v11") _, + lateout("v12") _, + lateout("v13") _, + lateout("v14") _, + lateout("v15") _, + lateout("v16") _, + lateout("v17") _, + lateout("v18") _, + lateout("v19") _, + lateout("v20") _, + lateout("v21") _, + lateout("v22") _, + lateout("v23") _, + lateout("v24") _, + lateout("v25") _, + lateout("v26") _, + lateout("v27") _, + lateout("v28") _, + lateout("v29") _, + lateout("v30") _, + lateout("v31") _, + options(nostack) ); FromAsm::from_asm(r0) } @@ -164,7 +423,39 @@ pub(in crate::backend) unsafe fn syscall4_readonly( in("a1") a1.to_asm(), in("a2") a2.to_asm(), in("a3") a3.to_asm(), - options(nostack, preserves_flags, readonly) + lateout("v0") _, + lateout("v1") _, + lateout("v2") _, + lateout("v3") _, + lateout("v4") _, + lateout("v5") _, + lateout("v6") _, + lateout("v7") _, + lateout("v8") _, + lateout("v9") _, + lateout("v10") _, + lateout("v11") _, + lateout("v12") _, + lateout("v13") _, + lateout("v14") _, + lateout("v15") _, + lateout("v16") _, + lateout("v17") _, + lateout("v18") _, + lateout("v19") _, + lateout("v20") _, + lateout("v21") _, + lateout("v22") _, + lateout("v23") _, + lateout("v24") _, + lateout("v25") _, + lateout("v26") _, + lateout("v27") _, + lateout("v28") _, + lateout("v29") _, + lateout("v30") _, + lateout("v31") _, + options(nostack, readonly) ); FromAsm::from_asm(r0) } @@ -187,7 +478,39 @@ pub(in crate::backend) unsafe fn syscall5( in("a2") a2.to_asm(), in("a3") a3.to_asm(), in("a4") a4.to_asm(), - options(nostack, preserves_flags) + lateout("v0") _, + lateout("v1") _, + lateout("v2") _, + lateout("v3") _, + lateout("v4") _, + lateout("v5") _, + lateout("v6") _, + lateout("v7") _, + lateout("v8") _, + lateout("v9") _, + lateout("v10") _, + lateout("v11") _, + lateout("v12") _, + lateout("v13") _, + lateout("v14") _, + lateout("v15") _, + lateout("v16") _, + lateout("v17") _, + lateout("v18") _, + lateout("v19") _, + lateout("v20") _, + lateout("v21") _, + lateout("v22") _, + lateout("v23") _, + lateout("v24") _, + lateout("v25") _, + lateout("v26") _, + lateout("v27") _, + lateout("v28") _, + lateout("v29") _, + lateout("v30") _, + lateout("v31") _, + options(nostack) ); FromAsm::from_asm(r0) } @@ -210,7 +533,39 @@ pub(in crate::backend) unsafe fn syscall5_readonly( in("a2") a2.to_asm(), in("a3") a3.to_asm(), in("a4") a4.to_asm(), - options(nostack, preserves_flags, readonly) + lateout("v0") _, + lateout("v1") _, + lateout("v2") _, + lateout("v3") _, + lateout("v4") _, + lateout("v5") _, + lateout("v6") _, + lateout("v7") _, + lateout("v8") _, + lateout("v9") _, + lateout("v10") _, + lateout("v11") _, + lateout("v12") _, + lateout("v13") _, + lateout("v14") _, + lateout("v15") _, + lateout("v16") _, + lateout("v17") _, + lateout("v18") _, + lateout("v19") _, + lateout("v20") _, + lateout("v21") _, + lateout("v22") _, + lateout("v23") _, + lateout("v24") _, + lateout("v25") _, + lateout("v26") _, + lateout("v27") _, + lateout("v28") _, + lateout("v29") _, + lateout("v30") _, + lateout("v31") _, + options(nostack, readonly) ); FromAsm::from_asm(r0) } @@ -235,7 +590,39 @@ pub(in crate::backend) unsafe fn syscall6( in("a3") a3.to_asm(), in("a4") a4.to_asm(), in("a5") a5.to_asm(), - options(nostack, preserves_flags) + lateout("v0") _, + lateout("v1") _, + lateout("v2") _, + lateout("v3") _, + lateout("v4") _, + lateout("v5") _, + lateout("v6") _, + lateout("v7") _, + lateout("v8") _, + lateout("v9") _, + lateout("v10") _, + lateout("v11") _, + lateout("v12") _, + lateout("v13") _, + lateout("v14") _, + lateout("v15") _, + lateout("v16") _, + lateout("v17") _, + lateout("v18") _, + lateout("v19") _, + lateout("v20") _, + lateout("v21") _, + lateout("v22") _, + lateout("v23") _, + lateout("v24") _, + lateout("v25") _, + lateout("v26") _, + lateout("v27") _, + lateout("v28") _, + lateout("v29") _, + lateout("v30") _, + lateout("v31") _, + options(nostack) ); FromAsm::from_asm(r0) } @@ -260,7 +647,39 @@ pub(in crate::backend) unsafe fn syscall6_readonly( in("a3") a3.to_asm(), in("a4") a4.to_asm(), in("a5") a5.to_asm(), - options(nostack, preserves_flags, readonly) + lateout("v0") _, + lateout("v1") _, + lateout("v2") _, + lateout("v3") _, + lateout("v4") _, + lateout("v5") _, + lateout("v6") _, + lateout("v7") _, + lateout("v8") _, + lateout("v9") _, + lateout("v10") _, + lateout("v11") _, + lateout("v12") _, + lateout("v13") _, + lateout("v14") _, + lateout("v15") _, + lateout("v16") _, + lateout("v17") _, + lateout("v18") _, + lateout("v19") _, + lateout("v20") _, + lateout("v21") _, + lateout("v22") _, + lateout("v23") _, + lateout("v24") _, + lateout("v25") _, + lateout("v26") _, + lateout("v27") _, + lateout("v28") _, + lateout("v29") _, + lateout("v30") _, + lateout("v31") _, + options(nostack, readonly) ); FromAsm::from_asm(r0) }