diff --git a/Cargo.lock b/Cargo.lock index c4c0c7b23..da30ad9b9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -277,6 +277,7 @@ dependencies = [ "aster-rights", "aster-rights-proc", "bitvec", + "inherit-methods-macro", "ktest", "pod", "typeflags-util", diff --git a/framework/aster-frame/src/vm/dma/mod.rs b/framework/aster-frame/src/vm/dma/mod.rs index f38fd7c00..7d5c22f34 100644 --- a/framework/aster-frame/src/vm/dma/mod.rs +++ b/framework/aster-frame/src/vm/dma/mod.rs @@ -7,6 +7,7 @@ use alloc::collections::BTreeSet; pub use dma_coherent::DmaCoherent; pub use dma_stream::{DmaDirection, DmaStream, DmaStreamSlice}; +use inherit_methods_macro::inherit_methods; use spin::Once; use super::Paddr; @@ -36,6 +37,11 @@ pub trait HasDaddr { fn daddr(&self) -> Daddr; } +#[inherit_methods(from = "(**self)")] +impl HasDaddr for &T { + fn daddr(&self) -> Daddr; +} + /// Set of all physical addresses with dma mapping. static DMA_MAPPING_SET: Once>> = Once::new(); diff --git a/kernel/comps/virtio/src/device/input/device.rs b/kernel/comps/virtio/src/device/input/device.rs index 9f2b8c988..948fc3197 100644 --- a/kernel/comps/virtio/src/device/input/device.rs +++ b/kernel/comps/virtio/src/device/input/device.rs @@ -250,11 +250,11 @@ impl EventTable { Self { stream, num_events } } - fn get(&self, idx: usize) -> EventBuf { + fn get(&self, idx: usize) -> EventBuf<'_> { assert!(idx < self.num_events); let offset = idx * EVENT_SIZE; - SafePtr::new(self.stream.clone(), offset) + SafePtr::new(&self.stream, offset) } const fn num_events(&self) -> usize { @@ -263,7 +263,7 @@ impl EventTable { } const EVENT_SIZE: usize = core::mem::size_of::(); -type EventBuf = SafePtr; +type EventBuf<'a> = SafePtr; impl DmaBuf for SafePtr { fn len(&self) -> usize { diff --git a/kernel/libs/aster-util/Cargo.toml b/kernel/libs/aster-util/Cargo.toml index d21d6723f..b821939cd 100644 --- a/kernel/libs/aster-util/Cargo.toml +++ b/kernel/libs/aster-util/Cargo.toml @@ -12,5 +12,6 @@ typeflags-util = { path = "../typeflags-util" } aster-rights-proc = { path = "../aster-rights-proc" } aster-rights = { path = "../aster-rights" } bitvec = { version = "1.0", default-features = false, features = ["alloc"] } +inherit-methods-macro = { git = "https://github.com/asterinas/inherit-methods-macro", rev = "98f7e3e" } ktest = { path = "../../../framework/libs/ktest" } [features] diff --git a/kernel/libs/aster-util/src/safe_ptr.rs b/kernel/libs/aster-util/src/safe_ptr.rs index 8fc110f8c..540582e87 100644 --- a/kernel/libs/aster-util/src/safe_ptr.rs +++ b/kernel/libs/aster-util/src/safe_ptr.rs @@ -8,6 +8,7 @@ use aster_frame::{ }; use aster_rights::{Dup, Exec, Full, Read, Signal, TRightSet, TRights, Write}; use aster_rights_proc::require; +use inherit_methods_macro::inherit_methods; pub use pod::Pod; pub use typeflags_util::SetContain; @@ -337,6 +338,11 @@ impl SafePtr { } } +#[inherit_methods(from = "(*self)")] +impl<'a, T, R> SafePtr { + pub fn sync(&self) -> Result<()>; +} + #[require(R > Dup)] impl Clone for SafePtr> { fn clone(&self) -> Self {