diff options
author | Alyssa Ross <hi@alyssa.is> | 2020-03-07 19:29:32 +0000 |
---|---|---|
committer | Alyssa Ross <hi@alyssa.is> | 2020-06-15 09:36:11 +0000 |
commit | 3d1bc2e0bb5bae7f32a9fa18b5348295facd5ab6 (patch) | |
tree | 7ef9793ab664fc67509007e5bcf2f99d5290fa05 /src | |
parent | b98b666b1f3f50fa94e5862d3627101c085d3ed8 (diff) | |
download | crosvm-3d1bc2e0bb5bae7f32a9fa18b5348295facd5ab6.tar crosvm-3d1bc2e0bb5bae7f32a9fa18b5348295facd5ab6.tar.gz crosvm-3d1bc2e0bb5bae7f32a9fa18b5348295facd5ab6.tar.bz2 crosvm-3d1bc2e0bb5bae7f32a9fa18b5348295facd5ab6.tar.lz crosvm-3d1bc2e0bb5bae7f32a9fa18b5348295facd5ab6.tar.xz crosvm-3d1bc2e0bb5bae7f32a9fa18b5348295facd5ab6.tar.zst crosvm-3d1bc2e0bb5bae7f32a9fa18b5348295facd5ab6.zip |
hacky working out-of-process virtio_wl
Diffstat (limited to 'src')
-rw-r--r-- | src/wl.rs | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/src/wl.rs b/src/wl.rs new file mode 100644 index 0000000..419fb67 --- /dev/null +++ b/src/wl.rs @@ -0,0 +1,113 @@ +// SPDX-License-Identifier: BSD-3-Clause + +use std::os::unix::prelude::*; + +use devices::virtio::{InterruptProxy, InterruptProxyEvent, SingleFd, Worker}; +use msg_socket::{MsgReceiver, MsgSocket}; +use std::collections::BTreeMap; +use std::fs::remove_file; +use sys_util::{ + net::{UnixSeqpacket, UnixSeqpacketListener}, + EventFd, GuestMemory, SharedMemory, +}; +use vm_control::VmMemoryControlRequestSocket; + +#[cfg(any(target_arch = "arm", target_arch = "aarch64"))] +pub use aarch64::{arch_memory_regions, MemoryParams}; +#[cfg(any(target_arch = "x86", target_arch = "x86_64"))] +pub use x86_64::{arch_memory_regions, MemoryParams}; + +type Socket = MsgSocket<(), SingleFd>; + +fn main() { + eprintln!("hello world"); + + // Create and display the socket. + let mut path = std::env::var("XDG_RUNTIME_DIR").expect("XDG_RUNTIME_DIR missing"); + path.push_str("/crosvm-wl.sock"); + let _ = remove_file(&path); + let server = UnixSeqpacketListener::bind(&path).expect("failed to create control socket"); + println!("{}", path); + + // Receive connection from crosvm. + let conn = server.accept().expect("accept failed"); + let msg_socket: Socket = MsgSocket::new(conn); + + loop { + match msg_socket.recv() { + Ok(SingleFd { + memfd, + interrupt, + interrupt_resample_evt, + in_queue, + out_queue, + vm_socket, + use_transition_flags, + in_queue_evt, + out_queue_evt, + kill_evt, + }) => { + let shm = unsafe { SharedMemory::from_raw_fd(memfd.as_raw_fd()) }; + std::mem::forget(memfd); + + let regions = arch_memory_regions(MemoryParams { + size: shm.size(), + has_bios: false, + }); + let mem = + GuestMemory::with_memfd(®ions, shm).expect("GuestMemory::with_memfd failed"); + + let interrupt: MsgSocket<InterruptProxyEvent, ()> = MsgSocket::new(unsafe { + let sock = UnixSeqpacket::from_raw_fd(interrupt.as_raw_fd()); + std::mem::forget(interrupt); + sock + }); + let vm_socket: VmMemoryControlRequestSocket = MsgSocket::new(unsafe { + let sock = UnixSeqpacket::from_raw_fd(vm_socket.as_raw_fd()); + std::mem::forget(vm_socket); + sock + }); + + let mut wayland_paths = BTreeMap::new(); + wayland_paths.insert("".into(), "/run/user/1000/wayland-0".into()); + + let mut worker = Worker::new( + mem, + Box::new(InterruptProxy::new(interrupt, unsafe { + let evt = EventFd::from_raw_fd(interrupt_resample_evt.as_raw_fd()); + std::mem::forget(interrupt_resample_evt); + evt + })), + in_queue, + out_queue, + wayland_paths, + vm_socket, + use_transition_flags, + None, + ); + + worker.run( + vec![ + unsafe { + let evt = EventFd::from_raw_fd(in_queue_evt.as_raw_fd()); + std::mem::forget(in_queue_evt); + evt + }, + unsafe { + let evt = EventFd::from_raw_fd(out_queue_evt.as_raw_fd()); + std::mem::forget(out_queue_evt); + evt + }, + ], + unsafe { + let evt = EventFd::from_raw_fd(kill_evt.as_raw_fd()); + std::mem::forget(kill_evt); + evt + }, + ); + } + + Err(e) => panic!("recv failed {:?}", e), + } + } +} |