Skip to content

Commit a9c1bb8

Browse files
committed
Implement io for UEFI
Add implementation for IoSlice and IoSliceMut based on Fragment Data Signed-off-by: Ayush Singh <ayushsingh1325@gmail.com>
1 parent 1baa38f commit a9c1bb8

File tree

3 files changed

+83
-3
lines changed

3 files changed

+83
-3
lines changed

library/std/src/sys/uefi/io.rs

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
use crate::ffi::c_void;
2+
use crate::marker::PhantomData;
3+
use crate::slice;
4+
5+
#[derive(Copy, Clone)]
6+
pub struct IoSlice<'a> {
7+
vec: UefiBuf,
8+
_p: PhantomData<&'a [u8]>,
9+
}
10+
11+
impl<'a> IoSlice<'a> {
12+
#[inline]
13+
pub fn new(buf: &'a [u8]) -> IoSlice<'a> {
14+
let len = buf.len().try_into().unwrap();
15+
IoSlice {
16+
vec: UefiBuf { len, buf: buf.as_ptr() as *mut u8 as *mut c_void },
17+
_p: PhantomData,
18+
}
19+
}
20+
21+
#[inline]
22+
pub fn advance(&mut self, n: usize) {
23+
let n_u32 = n.try_into().unwrap();
24+
if self.vec.len < n_u32 {
25+
panic!("advancing IoSlice beyond its length");
26+
}
27+
28+
unsafe {
29+
self.vec.len -= n_u32;
30+
self.vec.buf = self.vec.buf.add(n);
31+
}
32+
}
33+
34+
#[inline]
35+
pub fn as_slice(&self) -> &[u8] {
36+
unsafe { slice::from_raw_parts(self.vec.buf as *mut u8, self.vec.len as usize) }
37+
}
38+
}
39+
40+
pub struct IoSliceMut<'a> {
41+
vec: UefiBuf,
42+
_p: PhantomData<&'a mut [u8]>,
43+
}
44+
45+
impl<'a> IoSliceMut<'a> {
46+
#[inline]
47+
pub fn new(buf: &'a mut [u8]) -> IoSliceMut<'a> {
48+
let len = buf.len().try_into().unwrap();
49+
IoSliceMut { vec: UefiBuf { len, buf: buf.as_mut_ptr().cast() }, _p: PhantomData }
50+
}
51+
52+
#[inline]
53+
pub fn advance(&mut self, n: usize) {
54+
let n_u32 = n.try_into().unwrap();
55+
if self.vec.len < n_u32 {
56+
panic!("advancing IoSlice beyond its length");
57+
}
58+
59+
unsafe {
60+
self.vec.len -= n_u32;
61+
self.vec.buf = self.vec.buf.add(n);
62+
}
63+
}
64+
65+
#[inline]
66+
pub fn as_slice(&self) -> &[u8] {
67+
unsafe { slice::from_raw_parts(self.vec.buf as *mut u8, self.vec.len as usize) }
68+
}
69+
70+
#[inline]
71+
pub fn as_mut_slice(&mut self) -> &mut [u8] {
72+
unsafe { slice::from_raw_parts_mut(self.vec.buf as *mut u8, self.vec.len as usize) }
73+
}
74+
}
75+
76+
#[derive(Copy, Clone)]
77+
#[repr(C)]
78+
struct UefiBuf {
79+
pub len: u32,
80+
pub buf: *mut c_void,
81+
}

library/std/src/sys/uefi/mod.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ pub mod args;
1919
pub mod cmath;
2020
pub mod env;
2121
pub mod fs;
22-
#[path = "../unsupported/io.rs"]
2322
pub mod io;
2423
#[path = "../unsupported/locks/mod.rs"]
2524
pub mod locks;

library/std/src/sys/uefi/net/tcp4.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ impl Tcp4Protocol {
173173
let fragment_tables: Vec<tcp4::FragmentData> = buf
174174
.iter()
175175
.map(|b| tcp4::FragmentData {
176-
fragment_length: crate::mem::size_of_val(b) as u32,
176+
fragment_length: b.len() as u32,
177177
fragment_buffer: (*b).as_ptr() as *mut crate::ffi::c_void,
178178
})
179179
.collect();
@@ -277,7 +277,7 @@ impl Tcp4Protocol {
277277
let fragment_tables: Vec<tcp4::FragmentData> = buf
278278
.iter_mut()
279279
.map(|b| tcp4::FragmentData {
280-
fragment_length: crate::mem::size_of_val(b) as u32,
280+
fragment_length: b.len() as u32,
281281
fragment_buffer: b.as_mut_ptr().cast(),
282282
})
283283
.collect();

0 commit comments

Comments
 (0)