proc: use NonNull in Place/Placer

This commit is contained in:
Mark Poliakov 2023-11-16 16:45:15 +02:00
parent de63a0456b
commit 4e1560f38b

View File

@ -1,5 +1,5 @@
//! Binary execution functions //! Binary execution functions
use core::alloc::Layout; use core::{alloc::Layout, ptr::NonNull};
use abi::{ use abi::{
error::Error, error::Error,
@ -33,40 +33,43 @@ impl<'a> BufferPlacer<'a> {
} }
} }
unsafe fn alloc_layout(&mut self, layout: Layout) -> Result<(*mut u8, usize), Error> { unsafe fn alloc_layout<T>(
&mut self,
layout: Layout,
) -> Result<(NonNull<T>, NonNull<T>), Error> {
// TODO checks // TODO checks
let aligned = (self.offset + layout.align() - 1) & !(layout.align() - 1); let aligned = (self.offset + layout.align() - 1) & !(layout.align() - 1);
self.offset = aligned + layout.size(); self.offset = aligned + layout.size();
Ok(( Ok((
self.buffer.as_mut_ptr().add(aligned), NonNull::new_unchecked(self.buffer.as_mut_ptr().add(aligned) as *mut T),
self.virtual_offset + aligned, NonNull::new_unchecked((self.virtual_offset + aligned) as *mut T),
)) ))
} }
} }
impl<'a> Placer for BufferPlacer<'a> { unsafe impl<'a> Placer for BufferPlacer<'a> {
fn place_ref<T: Place>(&mut self, r: &T) -> Result<*const T::Output, Error> { fn place_ref<T: Place>(&mut self, r: &T) -> Result<NonNull<T::Output>, Error> {
let layout = Layout::new::<T::Output>(); let layout = Layout::new::<T::Output>();
unsafe { unsafe {
let (ptr, addr) = self.alloc_layout(layout)?; let (kernel, user) = self.alloc_layout::<T::Output>(layout)?;
let ptr = ptr as *mut T::Output; kernel.as_ptr().write(r.place(self)?);
ptr.write(r.place(self)?); Ok(user)
Ok(&*(addr as *const T::Output))
} }
} }
fn place_slice<T: Place>(&mut self, r: &[T]) -> Result<*const [T::Output], Error> { fn place_slice<T: Place>(&mut self, r: &[T]) -> Result<NonNull<[T::Output]>, Error> {
let layout = Layout::array::<T>(r.len()).unwrap(); let layout = Layout::array::<T>(r.len()).unwrap();
unsafe { unsafe {
let (ptr, addr) = self.alloc_layout(layout)?; let (kernel, user) = self.alloc_layout::<T::Output>(layout)?;
let ptr_slice = core::ptr::slice_from_raw_parts_mut(ptr as *mut T::Output, r.len()); let kernel = NonNull::slice_from_raw_parts(kernel, r.len());
let user = NonNull::slice_from_raw_parts(user, r.len());
for (i, elem) in r.iter().enumerate() { for (i, elem) in r.iter().enumerate() {
ptr_slice.get_unchecked_mut(i).write(elem.place(self)?); kernel
.get_unchecked_mut(i)
.as_ptr()
.write(elem.place(self)?);
} }
Ok(core::slice::from_raw_parts( Ok(user)
addr as *const T::Output,
r.len(),
))
} }
} }
} }