matcha/tock: tar_loader changes for spiflash seL4 elfloader - pad header to 512 bytes - new api's for accessing name & header fields - copy_File api for in-memory copy of a file's contents Change-Id: I6da1d06607b3b0350403e5e9699d2d8f6c74399e
diff --git a/utils/src/tar_loader.rs b/utils/src/tar_loader.rs index 176d9e8..10a3024 100644 --- a/utils/src/tar_loader.rs +++ b/utils/src/tar_loader.rs
@@ -1,6 +1,7 @@ // Trivial tar loader. use core::mem::transmute; +use core::ptr; use matcha_hal::dprintf; const EFLASH_START: u32 = 0x44000000; @@ -25,7 +26,7 @@ devmajor: [u8; 8], /* 329 */ devminor: [u8; 8], /* 337 */ prefix: [u8; 155], /* 345 */ - /* 500 */ + reserved: [u8; 12], /* 512 */ } impl Default for TarHeader { @@ -47,10 +48,25 @@ devmajor: [0; 8], devminor: [0; 8], prefix: [0; 155], + reserved: [0; 12], }; } } +impl TarHeader { + pub fn from_bytes(b: &mut [u8]) -> TarHeader { + unsafe { ptr::read(b.as_ptr() as *const TarHeader) } + } + + pub fn name(&self) -> &str { + core::str::from_utf8(&self.name).unwrap() + } + + pub fn size(&self) -> u32 { + parse_octal(&self.size) + } +} + fn parse_octal(text: &[u8]) -> u32 { let mut n: u32 = 0; for x in text.iter() { @@ -80,3 +96,13 @@ dprintf!("Could not find tar entry for '{}'\n", name); return (0, 0); } + +// TODO(sleffler): rethink api, e.g. supply a range for bounds check +pub unsafe fn copy_file(name: &str, offset: u32) -> bool { + let (cursor, size) = find_file(name); + if size == 0 { + return false; + } + ptr::copy_nonoverlapping::<u8>(transmute(cursor), transmute(offset), size as usize); + true +}