15eee6313SChris Fallin #[cfg(all(not(target_os = "windows"), not(miri)))] 25eee6313SChris Fallin mod not_for_windows { 390ac295eSAlex Crichton use rustix::mm::{MprotectFlags, mprotect}; 45eee6313SChris Fallin use rustix::param::page_size; 55eee6313SChris Fallin use std::sync::Arc; 65eee6313SChris Fallin use wasmtime::*; 75eee6313SChris Fallin 85eee6313SChris Fallin struct CustomCodePublish; 95eee6313SChris Fallin impl CustomCodeMemory for CustomCodePublish { required_alignment(&self) -> usize105eee6313SChris Fallin fn required_alignment(&self) -> usize { 115eee6313SChris Fallin page_size() 125eee6313SChris Fallin } 135eee6313SChris Fallin publish_executable(&self, ptr: *const u8, len: usize) -> wasmtime::Result<()>14*94740588SNick Fitzgerald fn publish_executable(&self, ptr: *const u8, len: usize) -> wasmtime::Result<()> { 155eee6313SChris Fallin unsafe { 165eee6313SChris Fallin mprotect( 175eee6313SChris Fallin ptr as *mut _, 185eee6313SChris Fallin len, 195eee6313SChris Fallin MprotectFlags::READ | MprotectFlags::EXEC, 205eee6313SChris Fallin )?; 215eee6313SChris Fallin } 225eee6313SChris Fallin Ok(()) 235eee6313SChris Fallin } 245eee6313SChris Fallin unpublish_executable(&self, ptr: *const u8, len: usize) -> wasmtime::Result<()>25*94740588SNick Fitzgerald fn unpublish_executable(&self, ptr: *const u8, len: usize) -> wasmtime::Result<()> { 265eee6313SChris Fallin unsafe { 275eee6313SChris Fallin mprotect( 285eee6313SChris Fallin ptr as *mut _, 295eee6313SChris Fallin len, 305eee6313SChris Fallin MprotectFlags::READ | MprotectFlags::WRITE, 315eee6313SChris Fallin )?; 325eee6313SChris Fallin } 335eee6313SChris Fallin Ok(()) 345eee6313SChris Fallin } 355eee6313SChris Fallin } 365eee6313SChris Fallin 375eee6313SChris Fallin #[test] custom_code_publish()385eee6313SChris Fallin fn custom_code_publish() { 395eee6313SChris Fallin let mut config = Config::default(); 405eee6313SChris Fallin config.with_custom_code_memory(Some(Arc::new(CustomCodePublish))); 415eee6313SChris Fallin let engine = Engine::new(&config).unwrap(); 425eee6313SChris Fallin let module = Module::new( 435eee6313SChris Fallin &engine, 445eee6313SChris Fallin "(module (func (export \"main\") (result i32) i32.const 42))", 455eee6313SChris Fallin ) 465eee6313SChris Fallin .unwrap(); 475eee6313SChris Fallin let mut store = Store::new(&engine, ()); 485eee6313SChris Fallin let instance = Instance::new(&mut store, &module, &[]).unwrap(); 495eee6313SChris Fallin let func: TypedFunc<(), i32> = instance.get_typed_func(&mut store, "main").unwrap(); 505eee6313SChris Fallin let result = func.call(&mut store, ()).unwrap(); 515eee6313SChris Fallin assert_eq!(result, 42); 525eee6313SChris Fallin } 535eee6313SChris Fallin } 54