1 //! ISA-specific stack-switching routines. 2 3 // The bodies are defined in inline assembly in the conditionally 4 // included modules below; their symbols are visible in the binary and 5 // accessed via the `extern "C"` declarations below that. 6 7 cfg_if::cfg_if! { 8 if #[cfg(target_arch = "aarch64")] { 9 mod aarch64; 10 pub(crate) use supported::*; 11 pub(crate) use aarch64::*; 12 } else if #[cfg(target_arch = "x86_64")] { 13 mod x86_64; 14 pub(crate) use supported::*; 15 pub(crate) use x86_64::*; 16 } else if #[cfg(target_arch = "x86")] { 17 mod x86; 18 pub(crate) use supported::*; 19 pub(crate) use x86::*; 20 } else if #[cfg(target_arch = "arm")] { 21 mod arm; 22 pub(crate) use supported::*; 23 pub(crate) use arm::*; 24 } else if #[cfg(target_arch = "s390x")] { 25 mod s390x; 26 pub(crate) use supported::*; 27 pub(crate) use s390x::*; 28 } else if #[cfg(target_arch = "riscv64")] { 29 mod riscv64; 30 pub(crate) use supported::*; 31 pub(crate) use riscv64::*; 32 } else if #[cfg(all(target_arch = "riscv32", not(target_feature = "f"), not(target_feature = "v")))] { 33 mod riscv32imac; 34 pub(crate) use supported::*; 35 pub(crate) use riscv32imac::*; 36 } else { 37 // No support for this platform. Don't fail compilation though and 38 // instead defer the error to happen at runtime when a fiber is created. 39 // Should help keep compiles working and narrows the failure to only 40 // situations that need fibers on unsupported platforms. 41 pub(crate) use unsupported::*; 42 } 43 } 44 45 /// A helper module to get reexported above in each case that we actually have 46 /// stack-switching routines available in inline asm. The fall-through case 47 /// though reexports the `unsupported` module instead. 48 #[allow( 49 dead_code, 50 reason = "expected to have dead code in some configurations" 51 )] 52 mod supported { 53 pub const SUPPORTED_ARCH: bool = true; 54 } 55 56 /// Helper module reexported in the fallback case above when the current host 57 /// architecture is not supported for stack switching. The `SUPPORTED_ARCH` 58 /// boolean here is set to `false` which causes `Fiber::new` to return `false`. 59 #[allow( 60 dead_code, 61 reason = "expected to have dead code in some configurations" 62 )] 63 mod unsupported { 64 pub const SUPPORTED_ARCH: bool = false; 65 66 pub(crate) unsafe fn wasmtime_fiber_init( 67 _top_of_stack: *mut u8, 68 _entry: extern "C" fn(*mut u8, *mut u8), 69 _entry_arg0: *mut u8, 70 ) { 71 unreachable!(); 72 } 73 74 pub(crate) unsafe fn wasmtime_fiber_switch(_top_of_stack: *mut u8) { 75 unreachable!(); 76 } 77 } 78