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