Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit b3c1e83

Browse files
committed
Add support for the permission TBF header
Signed-off-by: Alistair Francis <[email protected]>
1 parent ecb5844 commit b3c1e83

File tree

3 files changed

+88
-1
lines changed

3 files changed

+88
-1
lines changed

src/cmdline.rs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,27 @@
11
//! Command line parser setup for elf2tab.
22
3+
use std::error::Error;
34
use std::path::PathBuf;
4-
55
use structopt::StructOpt;
66

77
fn usage() -> &'static str {
88
"elf2tab [FLAGS] [OPTIONS] ELF...
99
Converts Tock userspace programs from .elf files to Tock Application Bundles."
1010
}
1111

12+
fn parse_perms<T, U>(s: &str) -> Result<(T, U), Box<dyn Error>>
13+
where
14+
T: std::str::FromStr,
15+
T::Err: Error + 'static,
16+
U: std::str::FromStr,
17+
U::Err: Error + 'static,
18+
{
19+
let pos = s
20+
.find(',')
21+
.ok_or_else(|| format!("invalid number,option: no `,` found in `{}`", s))?;
22+
Ok((s[..pos].parse()?, s[pos + 1..].parse()?))
23+
}
24+
1225
#[derive(StructOpt, Debug)]
1326
#[structopt(
1427
about = "Convert Tock userland apps from .elf files to Tock Application Bundles (TABs or .tab files).",
@@ -88,6 +101,14 @@ pub struct Opt {
88101
help = "Size of the protected region (including headers)"
89102
)]
90103
pub protected_region_size: Option<u32>,
104+
105+
#[structopt(
106+
long = "permissions",
107+
name = "permissions",
108+
help = "A list of driver numbers and options",
109+
parse(try_from_str = parse_perms),
110+
)]
111+
pub permissions: Vec<(u32, u16)>,
91112
}
92113

93114
mod test {

src/header.rs

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ enum TbfHeaderTypes {
1515
PackageName = 3,
1616
PicOption1 = 4,
1717
FixedAddresses = 5,
18+
Permissions = 6,
1819
}
1920

2021
#[repr(C)]
@@ -59,6 +60,22 @@ struct TbfHeaderFixedAddresses {
5960
start_process_flash: u32,
6061
}
6162

63+
#[repr(C)]
64+
#[derive(Clone, Copy, Debug)]
65+
struct TbfHeaderDriverPermission {
66+
driver_number: u32,
67+
// Bit 0 of `driver_options` indicates exclusive.
68+
driver_options: u16,
69+
}
70+
71+
#[repr(C)]
72+
#[derive(Debug)]
73+
struct TbfHeaderPermissions {
74+
base: TbfHeaderTlv,
75+
array_length: u16,
76+
perms: Vec<TbfHeaderDriverPermission>,
77+
}
78+
6279
impl fmt::Display for TbfHeaderBase {
6380
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
6481
writeln!(
@@ -111,12 +128,34 @@ impl fmt::Display for TbfHeaderFixedAddresses {
111128
}
112129
}
113130

131+
impl fmt::Display for TbfHeaderPermissions {
132+
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
133+
writeln!(
134+
f,
135+
"
136+
array_length: {0:>8} {0:>#10X}
137+
permissions: Number Options",
138+
self.array_length,
139+
)?;
140+
141+
for perm in &self.perms {
142+
writeln!(
143+
f,
144+
" : {0:>#8X} {1:>#10X}",
145+
perm.driver_number, perm.driver_options,
146+
)?;
147+
}
148+
Ok(())
149+
}
150+
}
151+
114152
pub struct TbfHeader {
115153
hdr_base: TbfHeaderBase,
116154
hdr_main: TbfHeaderMain,
117155
hdr_pkg_name_tlv: Option<TbfHeaderTlv>,
118156
hdr_wfr: Vec<TbfHeaderWriteableFlashRegion>,
119157
hdr_fixed_addresses: Option<TbfHeaderFixedAddresses>,
158+
hdr_permissions: Option<TbfHeaderPermissions>,
120159
package_name: String,
121160
package_name_pad: usize,
122161
}
@@ -144,6 +183,7 @@ impl TbfHeader {
144183
hdr_pkg_name_tlv: None,
145184
hdr_wfr: Vec::new(),
146185
hdr_fixed_addresses: None,
186+
hdr_permissions: None,
147187
package_name: String::new(),
148188
package_name_pad: 0,
149189
}
@@ -163,6 +203,7 @@ impl TbfHeader {
163203
package_name: String,
164204
fixed_address_ram: Option<u32>,
165205
fixed_address_flash: Option<u32>,
206+
permissions: Vec<(u32, u16)>,
166207
) -> usize {
167208
// Need to calculate lengths ahead of time.
168209
// Need the base and the main section.
@@ -232,6 +273,25 @@ impl TbfHeader {
232273
});
233274
}
234275

276+
let mut perms: Vec<TbfHeaderDriverPermission> = Vec::new();
277+
for perm in permissions {
278+
perms.push(TbfHeaderDriverPermission {
279+
driver_number: perm.0,
280+
driver_options: perm.1,
281+
})
282+
}
283+
284+
if perms.len() > 0 {
285+
self.hdr_permissions = Some(TbfHeaderPermissions {
286+
base: TbfHeaderTlv {
287+
tipe: TbfHeaderTypes::Permissions,
288+
length: 8,
289+
},
290+
array_length: perms.len() as u16,
291+
perms,
292+
});
293+
}
294+
235295
// Return the length by generating the header and seeing how long it is.
236296
self.generate()
237297
.expect("No header was generated")
@@ -348,6 +408,9 @@ impl fmt::Display for TbfHeader {
348408
}
349409
self.hdr_fixed_addresses
350410
.map_or(Ok(()), |hdr| write!(f, "{}", hdr))?;
411+
self.hdr_permissions
412+
.as_ref()
413+
.map_or(Ok(()), |hdr| write!(f, "{}", hdr))?;
351414
Ok(())
352415
}
353416
}

src/main.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ fn main() {
8080
opt.app_heap_size,
8181
opt.kernel_heap_size,
8282
opt.protected_region_size,
83+
opt.permissions.to_vec(),
8384
)
8485
.unwrap();
8586
if opt.verbose {
@@ -120,6 +121,7 @@ fn elf_to_tbf<W: Write>(
120121
app_heap_len: u32,
121122
kernel_heap_len: u32,
122123
protected_region_size_arg: Option<u32>,
124+
permissions: Vec<(u32, u16)>,
123125
) -> io::Result<()> {
124126
let package_name = package_name.unwrap_or_default();
125127

@@ -320,6 +322,7 @@ fn elf_to_tbf<W: Write>(
320322
package_name,
321323
fixed_address_ram,
322324
fixed_address_flash,
325+
permissions,
323326
);
324327
// If a protected region size was passed, confirm the header will fit.
325328
// Otherwise, use the header size as the protected region size.

0 commit comments

Comments
 (0)