hypha: move libraries to libs/

This commit is contained in:
Alex Zenla
2024-02-01 10:01:49 +00:00
parent def4306a04
commit bd56de235f
36 changed files with 10 additions and 10 deletions

View File

@ -0,0 +1,20 @@
[package]
name = "xenevtchn"
version.workspace = true
edition = "2021"
resolver = "2"
[dependencies]
thiserror = { workspace = true }
log = { workspace = true }
[dependencies.nix]
workspace = true
features = ["ioctl"]
[lib]
path = "src/lib.rs"
[[example]]
name = "xenevtchn-simple"
path = "examples/simple.rs"

View File

@ -0,0 +1,11 @@
use xenevtchn::error::Result;
use xenevtchn::EventChannel;
fn main() -> Result<()> {
let mut channel = EventChannel::open()?;
println!("Channel opened.");
let port = channel.bind_unbound_port(1)?;
println!("port: {}", port);
channel.unbind(port)?;
Ok(())
}

View File

@ -0,0 +1,11 @@
use std::io;
#[derive(thiserror::Error, Debug)]
pub enum Error {
#[error("kernel error")]
Kernel(#[from] nix::errno::Errno),
#[error("io issue encountered")]
Io(#[from] io::Error),
}
pub type Result<T> = std::result::Result<T, Error>;

View File

@ -0,0 +1,66 @@
pub mod error;
pub mod sys;
use crate::error::Result;
use crate::sys::{BindInterdomain, BindUnboundPort, BindVirq, Notify, UnbindPort};
use std::fs::{File, OpenOptions};
use std::os::fd::AsRawFd;
pub struct EventChannel {
pub handle: File,
}
impl EventChannel {
pub fn open() -> Result<EventChannel> {
let file = OpenOptions::new()
.read(true)
.write(true)
.open("/dev/xen/evtchn")?;
Ok(EventChannel { handle: file })
}
pub fn bind_virq(&mut self, virq: u32) -> Result<u32> {
unsafe {
let mut request = BindVirq { virq };
Ok(sys::bind_virq(self.handle.as_raw_fd(), &mut request)? as u32)
}
}
pub fn bind_interdomain(&mut self, domid: u32, port: u32) -> Result<u32> {
unsafe {
let mut request = BindInterdomain {
remote_domain: domid,
remote_port: port,
};
Ok(sys::bind_interdomain(self.handle.as_raw_fd(), &mut request)? as u32)
}
}
pub fn bind_unbound_port(&mut self, domid: u32) -> Result<u32> {
unsafe {
let mut request = BindUnboundPort {
remote_domain: domid,
};
Ok(sys::bind_unbound_port(self.handle.as_raw_fd(), &mut request)? as u32)
}
}
pub fn unbind(&mut self, port: u32) -> Result<u32> {
unsafe {
let mut request = UnbindPort { port };
Ok(sys::unbind(self.handle.as_raw_fd(), &mut request)? as u32)
}
}
pub fn notify(&mut self, port: u32) -> Result<u32> {
unsafe {
let mut request = Notify { port };
Ok(sys::notify(self.handle.as_raw_fd(), &mut request)? as u32)
}
}
pub fn reset(&mut self) -> Result<u32> {
unsafe { Ok(sys::reset(self.handle.as_raw_fd())? as u32) }
}
}

View File

@ -0,0 +1,43 @@
use nix::{ioctl_none, ioctl_readwrite_bad, request_code_none};
use std::ffi::c_uint;
#[repr(C)]
pub struct BindVirq {
pub virq: c_uint,
}
#[repr(C)]
pub struct BindInterdomain {
pub remote_domain: c_uint,
pub remote_port: c_uint,
}
#[repr(C)]
pub struct BindUnboundPort {
pub remote_domain: c_uint,
}
#[repr(C)]
pub struct UnbindPort {
pub port: c_uint,
}
#[repr(C)]
pub struct Notify {
pub port: c_uint,
}
ioctl_readwrite_bad!(bind_virq, request_code_none!(b'E', 0), BindVirq);
ioctl_readwrite_bad!(
bind_interdomain,
request_code_none!(b'E', 1),
BindInterdomain
);
ioctl_readwrite_bad!(
bind_unbound_port,
request_code_none!(b'E', 2),
BindUnboundPort
);
ioctl_readwrite_bad!(unbind, request_code_none!(b'E', 3), UnbindPort);
ioctl_readwrite_bad!(notify, request_code_none!(b'E', 4), Notify);
ioctl_none!(reset, b'E', 5);