1use crate::mm::{
6 MemoryAccessorExt, NumberOfElementsRead, RemoteMemoryManager, TaskMemoryAccessor,
7 UNIFIED_ASPACES_ENABLED, read_to_array, read_to_object_as_bytes, read_to_vec,
8};
9use crate::task::{CurrentTask, Task};
10use smallvec::{SmallVec, smallvec};
11use starnix_types::user_buffer::{UserBuffer, UserBuffers};
12use starnix_uapi::errors::{ENOTSUP, Errno};
13use starnix_uapi::user_address::UserAddress;
14use starnix_uapi::{errno, error};
15use std::mem::MaybeUninit;
16use std::ops::{Deref, DerefMut};
17use zerocopy::FromBytes;
18
19pub type OutputBufferCallback<'a> = dyn FnMut(&mut [MaybeUninit<u8>]) -> Result<usize, Errno> + 'a;
22
23fn slice_to_maybe_uninit(buffer: &[u8]) -> &[MaybeUninit<u8>] {
24 unsafe { std::slice::from_raw_parts(buffer.as_ptr() as *const MaybeUninit<u8>, buffer.len()) }
26}
27
28pub trait Iovec: Sized {
29 fn create(buffer: &UserBuffer) -> Self;
30}
31
32impl Iovec for syncio::zxio::iovec {
33 fn create(buffer: &UserBuffer) -> Self {
34 Self { iov_base: buffer.address.ptr() as *mut starnix_uapi::c_void, iov_len: buffer.length }
35 }
36}
37
38impl Iovec for syncio::zxio::zx_iovec {
39 fn create(buffer: &UserBuffer) -> Self {
40 Self { buffer: buffer.address.ptr() as *mut starnix_uapi::c_void, capacity: buffer.length }
41 }
42}
43
44const IOVECS_IN_HEAP_THRESHOLD: usize = 5;
45
46pub struct IovecsRef<'a, I: Sized> {
48 iovecs: SmallVec<[I; IOVECS_IN_HEAP_THRESHOLD]>,
49 _marker: std::marker::PhantomData<&'a I>,
50}
51
52impl<'a, I: Iovec> IovecsRef<'a, I> {
53 fn new<B: Buffer + ?Sized>(buf: &'a mut B) -> Result<Self, Errno> {
59 let mut iovecs = SmallVec::with_capacity(buf.segments_count()?);
60 buf.peek_each_segment(&mut |buffer| iovecs.push(I::create(buffer)))?;
61 Ok(IovecsRef { iovecs, _marker: Default::default() })
62 }
63}
64
65impl<I> Deref for IovecsRef<'_, I> {
66 type Target = [I];
67 fn deref(&self) -> &Self::Target {
68 &self.iovecs
69 }
70}
71
72impl<I> DerefMut for IovecsRef<'_, I> {
73 fn deref_mut(&mut self) -> &mut Self::Target {
74 &mut self.iovecs
75 }
76}
77
78pub type PeekBufferSegmentsCallback<'a> = dyn FnMut(&UserBuffer) + 'a;
79
80pub trait Buffer: std::fmt::Debug {
84 fn segments_count(&self) -> Result<usize, Errno>;
87
88 fn peek_each_segment(
93 &mut self,
94 callback: &mut PeekBufferSegmentsCallback<'_>,
95 ) -> Result<(), Errno>;
96
97 fn peek_all_segments_as_iovecs(&mut self) -> Result<IovecsRef<'_, syncio::zxio::iovec>, Errno> {
106 IovecsRef::new(self)
107 }
108}
109
110pub fn with_iovec_segments<B: Buffer + ?Sized, I: Iovec, T>(
119 data: &mut B,
120 f: impl FnOnce(&mut [I]) -> Result<T, Errno>,
121) -> Option<Result<T, Errno>> {
122 if !UNIFIED_ASPACES_ENABLED {
123 return None;
124 }
125
126 match IovecsRef::new(data) {
127 Ok(mut o) => Some(f(&mut o)),
128 Err(e) => {
129 if e.code == ENOTSUP {
130 None
131 } else {
132 Some(Err(e))
133 }
134 }
135 }
136}
137
138pub trait OutputBuffer: Buffer {
142 fn write_each(&mut self, callback: &mut OutputBufferCallback<'_>) -> Result<usize, Errno>;
148
149 fn available(&self) -> usize;
151
152 fn bytes_written(&self) -> usize;
154
155 fn zero(&mut self) -> Result<usize, Errno>;
157
158 unsafe fn advance(&mut self, length: usize) -> Result<(), Errno>;
164
165 fn write(&mut self, buffer: &[u8]) -> Result<usize, Errno> {
170 let mut buffer = slice_to_maybe_uninit(buffer);
171
172 self.write_each(&mut move |data| {
173 let size = std::cmp::min(buffer.len(), data.len());
174 let (to_clone, remaining) = buffer.split_at(size);
175 data[0..size].clone_from_slice(to_clone);
176 buffer = remaining;
177 Ok(size)
178 })
179 }
180
181 fn write_all(&mut self, buffer: &[u8]) -> Result<usize, Errno> {
187 let size = self.write(buffer)?;
188 if size != buffer.len() { error!(EINVAL) } else { Ok(size) }
189 }
190
191 fn write_buffer(&mut self, input: &mut dyn InputBuffer) -> Result<usize, Errno> {
197 self.write_each(&mut move |data| {
198 let size = std::cmp::min(data.len(), input.available());
199 input.read_exact(&mut data[0..size])
200 })
201 }
202}
203
204pub type InputBufferCallback<'a> = dyn FnMut(&[u8]) -> Result<usize, Errno> + 'a;
208
209pub trait InputBuffer: Buffer {
213 fn peek_each(&mut self, callback: &mut InputBufferCallback<'_>) -> Result<usize, Errno>;
219
220 fn available(&self) -> usize;
222
223 fn bytes_read(&self) -> usize;
225
226 fn drain(&mut self) -> usize;
229
230 fn advance(&mut self, length: usize) -> Result<(), Errno>;
232
233 fn read_each(&mut self, callback: &mut InputBufferCallback<'_>) -> Result<usize, Errno> {
239 let length = self.peek_each(callback)?;
240 self.advance(length)?;
241 Ok(length)
242 }
243
244 fn read_all(&mut self) -> Result<Vec<u8>, Errno> {
246 let result = self.peek_all()?;
247 let drain_result = self.drain();
248 assert!(result.len() == drain_result);
249 Ok(result)
250 }
251
252 fn peek_all(&mut self) -> Result<Vec<u8>, Errno> {
254 unsafe {
256 read_to_vec::<u8, _>(self.available(), |buf| self.peek(buf).map(NumberOfElementsRead))
257 }
258 }
259
260 fn peek(&mut self, buffer: &mut [MaybeUninit<u8>]) -> Result<usize, Errno> {
266 let mut index = 0;
267 self.peek_each(&mut move |data| {
268 let data = slice_to_maybe_uninit(data);
269 let size = std::cmp::min(buffer.len() - index, data.len());
270 buffer[index..index + size].clone_from_slice(&data[..size]);
271 index += size;
272 Ok(size)
273 })
274 }
275
276 fn read(&mut self, buffer: &mut [MaybeUninit<u8>]) -> Result<usize, Errno> {
282 let length = self.peek(buffer)?;
283 self.advance(length)?;
284 Ok(length)
285 }
286
287 fn read_exact(&mut self, buffer: &mut [MaybeUninit<u8>]) -> Result<usize, Errno> {
293 let size = self.read(buffer)?;
294 if size != buffer.len() { error!(EINVAL) } else { Ok(size) }
295 }
296}
297
298pub trait InputBufferExt: InputBuffer {
299 fn read_to_vec_exact(&mut self, len: usize) -> Result<Vec<u8>, Errno> {
303 unsafe { read_to_vec::<u8, _>(len, |buf| self.read_exact(buf).map(NumberOfElementsRead)) }
305 }
306
307 fn read_to_vec_limited(&mut self, limit: usize) -> Result<Vec<u8>, Errno> {
309 unsafe { read_to_vec::<u8, _>(limit, |buf| self.read(buf).map(NumberOfElementsRead)) }
311 }
312
313 fn read_to_array<const N: usize>(&mut self) -> Result<[u8; N], Errno> {
317 unsafe {
319 read_to_array::<_, _, N>(|buf| {
320 self.read_exact(buf).map(|bytes_read| debug_assert_eq!(bytes_read, buf.len()))
321 })
322 }
323 }
324
325 fn read_to_object<T: FromBytes>(&mut self) -> Result<T, Errno> {
330 unsafe {
333 read_to_object_as_bytes(|buf| {
334 if self.read(buf)? != buf.len() { error!(EINVAL) } else { Ok(()) }
335 })
336 }
337 }
338}
339
340impl InputBufferExt for dyn InputBuffer + '_ {}
341impl<T: InputBuffer> InputBufferExt for T {}
342
343pub struct UserBuffersOutputBuffer<'a, M> {
345 mm: &'a M,
346 buffers: UserBuffers,
347 available: usize,
348 bytes_written: usize,
349}
350
351impl<'a, M> std::fmt::Debug for UserBuffersOutputBuffer<'a, M> {
352 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
353 f.debug_struct("UserBuffersOutputBuffer")
354 .field("buffers", &self.buffers)
355 .field("available", &self.available)
356 .field("bytes_written", &self.bytes_written)
357 .finish()
358 }
359}
360
361impl<'a, M: TaskMemoryAccessor> UserBuffersOutputBuffer<'a, M> {
362 fn new_inner(mm: &'a M, mut buffers: UserBuffers) -> Result<Self, Errno> {
363 let available = UserBuffer::cap_buffers_to_max_rw_count(
364 mm.maximum_valid_address().ok_or_else(|| errno!(EINVAL))?,
365 &mut buffers,
366 )?;
367 buffers.reverse();
369 Ok(Self { mm, buffers, available, bytes_written: 0 })
370 }
371
372 fn write_each_inner<B: AsRef<[u8]>, F: FnMut(usize) -> Result<B, Errno>>(
373 &mut self,
374 mut callback: F,
375 ) -> Result<usize, Errno> {
376 let mut bytes_written = 0;
377 while let Some(mut buffer) = self.buffers.pop() {
378 if buffer.is_null() {
379 continue;
380 }
381
382 let bytes = callback(buffer.length)?;
383 let bytes = bytes.as_ref();
384
385 bytes_written += self.mm.write_memory(buffer.address, bytes)?;
386 let bytes_len = bytes.len();
387 buffer.advance(bytes_len)?;
388 self.available -= bytes_len;
389 self.bytes_written += bytes_len;
390 if !buffer.is_empty() {
391 self.buffers.push(buffer);
392 break;
393 }
394 }
395 Ok(bytes_written)
396 }
397}
398
399impl<'a> UserBuffersOutputBuffer<'a, CurrentTask> {
400 pub fn unified_new(task: &'a CurrentTask, buffers: UserBuffers) -> Result<Self, Errno> {
401 Self::new_inner(task, buffers)
402 }
403
404 pub fn unified_new_at(
405 task: &'a CurrentTask,
406 address: UserAddress,
407 length: usize,
408 ) -> Result<Self, Errno> {
409 Self::unified_new(task, smallvec![UserBuffer { address, length }])
410 }
411}
412
413impl<'a> UserBuffersOutputBuffer<'a, Task> {
414 pub fn syscall_new(task: &'a Task, buffers: UserBuffers) -> Result<Self, Errno> {
415 Self::new_inner(task, buffers)
416 }
417}
418
419impl<'a> UserBuffersOutputBuffer<'a, RemoteMemoryManager> {
420 pub fn remote_new(mm: &'a RemoteMemoryManager, buffers: UserBuffers) -> Result<Self, Errno> {
421 Self::new_inner(mm, buffers)
422 }
423}
424
425impl<'a, M: TaskMemoryAccessor> Buffer for UserBuffersOutputBuffer<'a, M> {
426 fn segments_count(&self) -> Result<usize, Errno> {
427 Ok(self.buffers.len())
428 }
429
430 fn peek_each_segment(
431 &mut self,
432 callback: &mut PeekBufferSegmentsCallback<'_>,
433 ) -> Result<(), Errno> {
434 for buffer in self.buffers.iter().rev() {
438 if buffer.is_null() {
439 continue;
440 }
441 callback(buffer)
442 }
443
444 Ok(())
445 }
446}
447
448impl<'a, M: TaskMemoryAccessor> OutputBuffer for UserBuffersOutputBuffer<'a, M> {
449 fn write(&mut self, mut bytes: &[u8]) -> Result<usize, Errno> {
450 self.write_each_inner(|buflen| {
451 let bytes_len = std::cmp::min(bytes.len(), buflen);
452 let (to_write, remaining) = bytes.split_at(bytes_len);
453 bytes = remaining;
454 Ok(to_write)
455 })
456 }
457
458 fn write_each(&mut self, callback: &mut OutputBufferCallback<'_>) -> Result<usize, Errno> {
459 self.write_each_inner(|buflen| {
460 unsafe {
462 read_to_vec::<u8, _>(buflen, |buf| {
463 let result = callback(buf)?;
464 if result > buflen {
465 return error!(EINVAL);
466 }
467 Ok(NumberOfElementsRead(result))
468 })
469 }
470 })
471 }
472
473 fn available(&self) -> usize {
474 self.available
475 }
476
477 fn bytes_written(&self) -> usize {
478 self.bytes_written
479 }
480
481 fn zero(&mut self) -> Result<usize, Errno> {
482 let mut bytes_written = 0;
483 while let Some(mut buffer) = self.buffers.pop() {
484 if buffer.is_null() {
485 continue;
486 }
487
488 let count = self.mm.zero(buffer.address, buffer.length)?;
489 buffer.advance(count)?;
490 bytes_written += count;
491
492 self.available -= count;
493 self.bytes_written += count;
494
495 if !buffer.is_empty() {
496 self.buffers.push(buffer);
497 break;
498 }
499 }
500
501 Ok(bytes_written)
502 }
503
504 unsafe fn advance(&mut self, mut length: usize) -> Result<(), Errno> {
505 if length > self.available() {
506 return error!(EINVAL);
507 }
508
509 while let Some(mut buffer) = self.buffers.pop() {
510 if buffer.is_null() {
511 continue;
512 }
513
514 let advance_by = std::cmp::min(length, buffer.length);
515 buffer.advance(advance_by)?;
516 self.available -= advance_by;
517 self.bytes_written += advance_by;
518 if !buffer.is_empty() {
519 self.buffers.push(buffer);
520 break;
521 }
522 length -= advance_by;
523 }
524
525 Ok(())
526 }
527}
528
529pub struct UserBuffersInputBuffer<'a, M> {
531 mm: &'a M,
532 buffers: UserBuffers,
533 available: usize,
534 bytes_read: usize,
535}
536
537impl<'a, M> std::fmt::Debug for UserBuffersInputBuffer<'a, M> {
538 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
539 f.debug_struct("UserBuffersInputBuffer")
540 .field("buffers", &self.buffers)
541 .field("available", &self.available)
542 .field("bytes_read", &self.bytes_read)
543 .finish()
544 }
545}
546
547impl<'a, M: TaskMemoryAccessor> UserBuffersInputBuffer<'a, M> {
548 fn new_inner(mm: &'a M, mut buffers: UserBuffers) -> Result<Self, Errno> {
549 let available = UserBuffer::cap_buffers_to_max_rw_count(
550 mm.maximum_valid_address().ok_or_else(|| errno!(EINVAL))?,
551 &mut buffers,
552 )?;
553 buffers.reverse();
555 Ok(Self { mm, buffers, available, bytes_read: 0 })
556 }
557
558 fn peek_each_inner<F: FnMut(&UserBuffer, usize) -> Result<usize, Errno>>(
559 &mut self,
560 mut callback: F,
561 ) -> Result<usize, Errno> {
562 let mut read = 0;
563 for buffer in self.buffers.iter().rev() {
564 if buffer.is_null() {
565 continue;
566 }
567
568 let result = callback(buffer, read)?;
569 if result > buffer.length {
570 return error!(EINVAL);
571 }
572 read += result;
573 if result != buffer.length {
574 break;
575 }
576 }
577 Ok(read)
578 }
579}
580
581impl<'a> UserBuffersInputBuffer<'a, CurrentTask> {
582 pub fn unified_new(task: &'a CurrentTask, buffers: UserBuffers) -> Result<Self, Errno> {
583 Self::new_inner(task, buffers)
584 }
585
586 pub fn unified_new_at(
587 task: &'a CurrentTask,
588 address: UserAddress,
589 length: usize,
590 ) -> Result<Self, Errno> {
591 Self::unified_new(task, smallvec![UserBuffer { address, length }])
592 }
593}
594
595impl<'a> UserBuffersInputBuffer<'a, Task> {
596 pub fn syscall_new(task: &'a Task, buffers: UserBuffers) -> Result<Self, Errno> {
597 Self::new_inner(task, buffers)
598 }
599}
600
601impl<'a> UserBuffersInputBuffer<'a, RemoteMemoryManager> {
602 pub fn remote_new(mm: &'a RemoteMemoryManager, buffers: UserBuffers) -> Result<Self, Errno> {
603 Self::new_inner(mm, buffers)
604 }
605}
606
607impl<'a, M: TaskMemoryAccessor> Buffer for UserBuffersInputBuffer<'a, M> {
608 fn segments_count(&self) -> Result<usize, Errno> {
609 Ok(self.buffers.iter().filter(|b| b.is_null()).count())
610 }
611
612 fn peek_each_segment(
613 &mut self,
614 callback: &mut PeekBufferSegmentsCallback<'_>,
615 ) -> Result<(), Errno> {
616 for buffer in self.buffers.iter().rev() {
620 if buffer.is_null() {
621 continue;
622 }
623 callback(buffer)
624 }
625
626 Ok(())
627 }
628}
629
630impl<'a, M: TaskMemoryAccessor> InputBuffer for UserBuffersInputBuffer<'a, M> {
631 fn peek(&mut self, uninit_bytes: &mut [MaybeUninit<u8>]) -> Result<usize, Errno> {
632 self.peek_each_inner(|buffer, read_so_far| {
633 let read_to = &mut uninit_bytes[read_so_far..];
634 let read_count = std::cmp::min(buffer.length, read_to.len());
635 let read_to = &mut read_to[..read_count];
636 let read_bytes = self.mm.read_memory(buffer.address, read_to)?;
637 debug_assert_eq!(read_bytes.len(), read_count);
638 Ok(read_count)
639 })
640 }
641
642 fn peek_each(&mut self, callback: &mut InputBufferCallback<'_>) -> Result<usize, Errno> {
643 self.peek_each_inner(|buffer, _read_so_far| {
644 let bytes = self.mm.read_memory_to_vec(buffer.address, buffer.length)?;
645 callback(&bytes)
646 })
647 }
648
649 fn drain(&mut self) -> usize {
650 let result = self.available;
651 self.bytes_read += self.available;
652 self.available = 0;
653 self.buffers.clear();
654 result
655 }
656
657 fn advance(&mut self, mut length: usize) -> Result<(), Errno> {
658 if length > self.available {
659 return error!(EINVAL);
660 }
661 self.available -= length;
662 self.bytes_read += length;
663 while let Some(mut buffer) = self.buffers.pop() {
664 if length < buffer.length {
665 buffer.advance(length)?;
666 self.buffers.push(buffer);
667 return Ok(());
668 }
669 length -= buffer.length;
670 if length == 0 {
671 return Ok(());
672 }
673 }
674 if length != 0 { error!(EINVAL) } else { Ok(()) }
675 }
676
677 fn available(&self) -> usize {
678 self.available
679 }
680 fn bytes_read(&self) -> usize {
681 self.bytes_read
682 }
683}
684
685#[derive(Debug)]
687pub struct VecOutputBuffer {
688 buffer: Vec<u8>,
689 capacity: usize,
693}
694
695impl VecOutputBuffer {
696 pub fn new(capacity: usize) -> Self {
697 Self { buffer: Vec::with_capacity(capacity), capacity }
698 }
699
700 pub fn data(&self) -> &[u8] {
701 &self.buffer
702 }
703
704 pub fn reset(&mut self) {
705 self.buffer.truncate(0)
706 }
707}
708
709impl From<VecOutputBuffer> for Vec<u8> {
710 fn from(data: VecOutputBuffer) -> Self {
711 data.buffer
712 }
713}
714
715impl Buffer for VecOutputBuffer {
716 fn segments_count(&self) -> Result<usize, Errno> {
717 Ok(1)
718 }
719
720 fn peek_each_segment(
721 &mut self,
722 callback: &mut PeekBufferSegmentsCallback<'_>,
723 ) -> Result<(), Errno> {
724 let current_len = self.buffer.len();
725 let buffer = &mut self.buffer.spare_capacity_mut()[..self.capacity - current_len];
726 callback(&UserBuffer {
727 address: UserAddress::from(buffer.as_mut_ptr() as u64),
728 length: buffer.len(),
729 });
730
731 Ok(())
732 }
733}
734
735impl OutputBuffer for VecOutputBuffer {
736 fn write_each(&mut self, callback: &mut OutputBufferCallback<'_>) -> Result<usize, Errno> {
737 let current_len = self.buffer.len();
738 let written =
739 callback(&mut self.buffer.spare_capacity_mut()[..self.capacity - current_len])?;
740 if current_len + written > self.capacity {
741 return error!(EINVAL);
742 }
743 unsafe { self.buffer.set_len(current_len + written) }
745 Ok(written)
746 }
747
748 fn available(&self) -> usize {
749 self.capacity - self.buffer.len()
750 }
751
752 fn bytes_written(&self) -> usize {
753 self.buffer.len()
754 }
755
756 fn zero(&mut self) -> Result<usize, Errno> {
757 let zeroed = self.capacity - self.buffer.len();
758 self.buffer.resize(self.capacity, 0);
759 Ok(zeroed)
760 }
761
762 unsafe fn advance(&mut self, length: usize) -> Result<(), Errno> {
763 if length > self.available() {
764 return error!(EINVAL);
765 }
766
767 self.capacity -= length;
768 let current_len = self.buffer.len();
769 unsafe { self.buffer.set_len(current_len + length) };
775 Ok(())
776 }
777}
778
779#[derive(Debug)]
781pub struct VecInputBuffer {
782 buffer: Vec<u8>,
783
784 bytes_read: usize,
786}
787
788impl VecInputBuffer {
789 pub fn new(buffer: &[u8]) -> Self {
790 Self { buffer: buffer.to_vec(), bytes_read: 0 }
791 }
792}
793
794impl From<Vec<u8>> for VecInputBuffer {
795 fn from(buffer: Vec<u8>) -> Self {
796 Self { buffer, bytes_read: 0 }
797 }
798}
799
800impl Buffer for VecInputBuffer {
801 fn segments_count(&self) -> Result<usize, Errno> {
802 Ok(1)
803 }
804
805 fn peek_each_segment(
806 &mut self,
807 callback: &mut PeekBufferSegmentsCallback<'_>,
808 ) -> Result<(), Errno> {
809 let buffer = &self.buffer[self.bytes_read..];
810 callback(&UserBuffer {
811 address: UserAddress::from(buffer.as_ptr() as u64),
812 length: buffer.len(),
813 });
814
815 Ok(())
816 }
817}
818
819impl InputBuffer for VecInputBuffer {
820 fn peek_each(&mut self, callback: &mut InputBufferCallback<'_>) -> Result<usize, Errno> {
821 let read = callback(&self.buffer[self.bytes_read..])?;
822 if self.bytes_read + read > self.buffer.len() {
823 return error!(EINVAL);
824 }
825 debug_assert!(self.bytes_read <= self.buffer.len());
826 Ok(read)
827 }
828 fn advance(&mut self, length: usize) -> Result<(), Errno> {
829 if length > self.buffer.len() {
830 return error!(EINVAL);
831 }
832 self.bytes_read += length;
833 debug_assert!(self.bytes_read <= self.buffer.len());
834 Ok(())
835 }
836 fn available(&self) -> usize {
837 self.buffer.len() - self.bytes_read
838 }
839 fn bytes_read(&self) -> usize {
840 self.bytes_read
841 }
842 fn drain(&mut self) -> usize {
843 let result = self.available();
844 self.bytes_read += result;
845 result
846 }
847}
848
849impl VecInputBuffer {
850 pub fn read_object<T: FromBytes>(&mut self) -> Result<T, Errno> {
854 let size = std::mem::size_of::<T>();
855 let end = self.bytes_read + size;
856 if end > self.buffer.len() {
857 return error!(EINVAL);
858 }
859 let obj =
860 T::read_from_bytes(&self.buffer[self.bytes_read..end]).map_err(|_| errno!(EINVAL))?;
861 self.bytes_read = end;
862 debug_assert!(self.bytes_read <= self.buffer.len());
863 Ok(obj)
864 }
865}
866
867#[cfg(test)]
868mod tests {
869 use super::*;
870 use crate::mm::{MemoryAccessor as _, PAGE_SIZE};
871 use crate::testing::*;
872 use usercopy::slice_to_maybe_uninit_mut;
873
874 #[test]
875 fn test_data_input_buffer() {
876 let mut executor = fuchsia_async::TestExecutor::new();
877 executor.run_singlethreaded(async {
878 spawn_kernel_and_run(async |locked, current_task| {
879 let page_size = *PAGE_SIZE;
880 let addr =
881 map_memory(locked, ¤t_task, UserAddress::default(), 64 * page_size);
882
883 let data: Vec<u8> = (0..1024).map(|i| (i % 256) as u8).collect();
884 let mm = current_task.deref();
885 mm.write_memory(addr, &data).expect("failed to write test data");
886
887 let input_iovec = smallvec![
888 UserBuffer { address: addr, length: 25 },
889 UserBuffer {
890 address: (addr + 64usize).expect("Memory mapped OOB!"),
891 length: 12
892 },
893 ];
894
895 {
897 let mut input_buffer =
898 UserBuffersInputBuffer::unified_new(mm, input_iovec.clone())
899 .expect("UserBuffersInputBuffer");
900 assert!(input_buffer.peek_each(&mut |data| Ok(data.len() + 1)).is_err());
901 }
902
903 {
905 let mut input_buffer =
906 UserBuffersInputBuffer::unified_new(mm, input_iovec.clone())
907 .expect("UserBuffersInputBuffer");
908 assert_eq!(input_buffer.available(), 37);
909 assert_eq!(input_buffer.bytes_read(), 0);
910 assert_eq!(input_buffer.drain(), 37);
911 assert_eq!(input_buffer.available(), 0);
912 assert_eq!(input_buffer.bytes_read(), 37);
913 }
914
915 {
917 let mut input_buffer =
918 UserBuffersInputBuffer::unified_new(mm, input_iovec.clone())
919 .expect("UserBuffersInputBuffer");
920 assert_eq!(input_buffer.available(), 37);
921 assert_eq!(input_buffer.bytes_read(), 0);
922 let buffer = input_buffer.read_all().expect("read_all");
923 assert_eq!(input_buffer.available(), 0);
924 assert_eq!(input_buffer.bytes_read(), 37);
925 assert_eq!(buffer.len(), 37);
926 assert_eq!(&data[..25], &buffer[..25]);
927 assert_eq!(&data[64..76], &buffer[25..37]);
928 }
929
930 {
932 let mut input_buffer = UserBuffersInputBuffer::unified_new(mm, input_iovec)
933 .expect("UserBuffersInputBuffer");
934 let mut buffer = [0; 50];
935 assert_eq!(input_buffer.available(), 37);
936 assert_eq!(input_buffer.bytes_read(), 0);
937 assert_eq!(
938 input_buffer
939 .read_exact(slice_to_maybe_uninit_mut(&mut buffer[0..20]))
940 .expect("read"),
941 20
942 );
943 assert_eq!(input_buffer.available(), 17);
944 assert_eq!(input_buffer.bytes_read(), 20);
945 assert_eq!(
946 input_buffer
947 .read_exact(slice_to_maybe_uninit_mut(&mut buffer[20..37]))
948 .expect("read"),
949 17
950 );
951 assert!(
952 input_buffer
953 .read_exact(slice_to_maybe_uninit_mut(&mut buffer[37..]))
954 .is_err()
955 );
956 assert_eq!(input_buffer.available(), 0);
957 assert_eq!(input_buffer.bytes_read(), 37);
958 assert_eq!(&data[..25], &buffer[..25]);
959 assert_eq!(&data[64..76], &buffer[25..37]);
960 }
961 })
962 .await;
963 });
964 }
965
966 #[test]
967 fn test_data_output_buffer() {
968 let mut executor = fuchsia_async::TestExecutor::new();
969 executor.run_singlethreaded(async {
970 spawn_kernel_and_run(async |locked, current_task| {
971 let page_size = *PAGE_SIZE;
972 let addr =
973 map_memory(locked, ¤t_task, UserAddress::default(), 64 * page_size);
974
975 let output_iovec = smallvec![
976 UserBuffer { address: addr, length: 25 },
977 UserBuffer {
978 address: (addr + 64usize).expect("Memory was mapped OOB!"),
979 length: 12
980 },
981 ];
982
983 let mm = current_task.deref();
984 let data: Vec<u8> = (0..1024).map(|i| (i % 256) as u8).collect();
985
986 {
988 let mut output_buffer =
989 UserBuffersOutputBuffer::unified_new(mm, output_iovec.clone())
990 .expect("UserBuffersOutputBuffer");
991 assert!(output_buffer.write_each(&mut |data| Ok(data.len() + 1)).is_err());
992 }
993
994 {
996 let mut output_buffer = UserBuffersOutputBuffer::unified_new(mm, output_iovec)
997 .expect("UserBuffersOutputBuffer");
998 assert_eq!(output_buffer.available(), 37);
999 assert_eq!(output_buffer.bytes_written(), 0);
1000 assert_eq!(output_buffer.write_all(&data[0..20]).expect("write"), 20);
1001 assert_eq!(output_buffer.available(), 17);
1002 assert_eq!(output_buffer.bytes_written(), 20);
1003 assert_eq!(output_buffer.write_all(&data[20..37]).expect("write"), 17);
1004 assert_eq!(output_buffer.available(), 0);
1005 assert_eq!(output_buffer.bytes_written(), 37);
1006 assert!(output_buffer.write_all(&data[37..50]).is_err());
1007
1008 let buffer = current_task
1009 .read_memory_to_array::<128>(addr)
1010 .expect("failed to write test data");
1011 assert_eq!(&data[0..25], &buffer[0..25]);
1012 assert_eq!(&data[25..37], &buffer[64..76]);
1013 }
1014 })
1015 .await;
1016 });
1017 }
1018
1019 #[::fuchsia::test]
1020 fn test_vec_input_buffer() {
1021 let mut input_buffer = VecInputBuffer::new(b"helloworld");
1022 assert!(input_buffer.peek_each(&mut |data| Ok(data.len() + 1)).is_err());
1023
1024 let mut input_buffer = VecInputBuffer::new(b"helloworld");
1025 assert_eq!(input_buffer.bytes_read(), 0);
1026 assert_eq!(input_buffer.available(), 10);
1027 assert_eq!(input_buffer.drain(), 10);
1028 assert_eq!(input_buffer.bytes_read(), 10);
1029 assert_eq!(input_buffer.available(), 0);
1030
1031 let mut input_buffer = VecInputBuffer::new(b"helloworld");
1032 assert_eq!(input_buffer.bytes_read(), 0);
1033 assert_eq!(input_buffer.available(), 10);
1034 assert_eq!(&input_buffer.read_all().expect("read_all"), b"helloworld");
1035 assert_eq!(input_buffer.bytes_read(), 10);
1036 assert_eq!(input_buffer.available(), 0);
1037
1038 let mut input_buffer = VecInputBuffer::new(b"helloworld");
1039 let mut buffer = [0; 5];
1040 assert_eq!(
1041 input_buffer.read_exact(slice_to_maybe_uninit_mut(&mut buffer)).expect("read"),
1042 5
1043 );
1044 assert_eq!(input_buffer.bytes_read(), 5);
1045 assert_eq!(input_buffer.available(), 5);
1046 assert_eq!(&buffer, b"hello");
1047 assert_eq!(
1048 input_buffer.read_exact(slice_to_maybe_uninit_mut(&mut buffer)).expect("read"),
1049 5
1050 );
1051 assert_eq!(input_buffer.bytes_read(), 10);
1052 assert_eq!(input_buffer.available(), 0);
1053 assert_eq!(&buffer, b"world");
1054 assert!(input_buffer.read_exact(slice_to_maybe_uninit_mut(&mut buffer)).is_err());
1055
1056 let mut input_buffer = VecInputBuffer::new(b"hello");
1058 assert_eq!(input_buffer.bytes_read(), 0);
1059 let buffer: [u8; 3] = input_buffer.read_object().expect("read_object");
1060 assert_eq!(&buffer, b"hel");
1061 assert_eq!(input_buffer.bytes_read(), 3);
1062 let buffer: [u8; 2] = input_buffer.read_object().expect("read_object");
1063 assert_eq!(&buffer, b"lo");
1064 assert_eq!(input_buffer.bytes_read(), 5);
1065 assert!(input_buffer.read_object::<[u8; 1]>().is_err());
1066 assert_eq!(input_buffer.bytes_read(), 5);
1067
1068 let mut input_buffer = VecInputBuffer::new(b"hello");
1069 assert_eq!(input_buffer.bytes_read(), 0);
1070 assert!(input_buffer.read_object::<[u8; 100]>().is_err());
1071 assert_eq!(input_buffer.bytes_read(), 0);
1072 }
1073
1074 #[::fuchsia::test]
1075 fn test_vec_output_buffer() {
1076 let mut output_buffer = VecOutputBuffer::new(10);
1077 assert!(output_buffer.write_each(&mut |data| Ok(data.len() + 1)).is_err());
1078 assert_eq!(output_buffer.bytes_written(), 0);
1079 assert_eq!(output_buffer.available(), 10);
1080 assert_eq!(output_buffer.write_all(b"hello").expect("write"), 5);
1081 assert_eq!(output_buffer.bytes_written(), 5);
1082 assert_eq!(output_buffer.available(), 5);
1083 assert_eq!(output_buffer.data(), b"hello");
1084 assert_eq!(output_buffer.write_all(b"world").expect("write"), 5);
1085 assert_eq!(output_buffer.bytes_written(), 10);
1086 assert_eq!(output_buffer.available(), 0);
1087 assert_eq!(output_buffer.data(), b"helloworld");
1088 assert!(output_buffer.write_all(b"foo").is_err());
1089 let data: Vec<u8> = output_buffer.into();
1090 assert_eq!(data, b"helloworld".to_vec());
1091 }
1092
1093 #[::fuchsia::test]
1094 fn test_vec_write_buffer() {
1095 let mut input_buffer = VecInputBuffer::new(b"helloworld");
1096 let mut output_buffer = VecOutputBuffer::new(20);
1097 assert_eq!(output_buffer.write_buffer(&mut input_buffer).expect("write_buffer"), 10);
1098 assert_eq!(output_buffer.data(), b"helloworld");
1099 }
1100}