2 use core
::ops
::{Deref, DerefMut}
;
12 fn new(size
: usize) -> Result
<PhysBox
> {
13 let address
= unsafe { ::physalloc(size)? }
;
21 impl Drop
for PhysBox
{
23 let _
= unsafe { ::physfree(self.address, self.size) }
;
33 pub fn new(value
: T
) -> Result
<Dma
<T
>> {
34 let phys
= PhysBox
::new(mem
::size_of
::<T
>())?
;
35 let virt
= unsafe { ::physmap(phys.address, phys.size, ::MAP_WRITE)? }
as *mut T
;
36 unsafe { ptr::write(virt, value); }
43 pub fn zeroed() -> Result
<Dma
<T
>> {
44 let phys
= PhysBox
::new(mem
::size_of
::<T
>())?
;
45 let virt
= unsafe { ::physmap(phys.address, phys.size, ::MAP_WRITE)? }
as *mut T
;
46 unsafe { ptr::write_bytes(virt as *mut u8, 0, phys.size); }
53 pub fn physical(&self) -> usize {
58 impl<T
> Deref
for Dma
<T
> {
60 fn deref(&self) -> &T
{
61 unsafe { &*self.virt }
65 impl<T
> DerefMut
for Dma
<T
> {
66 fn deref_mut(&mut self) -> &mut T
{
67 unsafe { &mut *self.virt }
71 impl<T
> Drop
for Dma
<T
> {
73 unsafe { drop(ptr::read(self.virt)); }
74 let _
= unsafe { ::physunmap(self.virt as usize) }
;