Skip to content

Commit ab1a17c

Browse files
committed
Allow command line --epoch for Bootleby which has no proper app.toml(epoch)
1 parent 50c25f6 commit ab1a17c

File tree

2 files changed

+42
-18
lines changed

2 files changed

+42
-18
lines changed

hubedit/src/main.rs

+6-2
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ pub enum Command {
3333
#[clap(short, long)]
3434
version: String,
3535

36+
#[clap(short, long)]
37+
epoch: Option<String>,
38+
3639
#[clap(short, long)]
3740
force: bool,
3841

@@ -129,6 +132,7 @@ fn main() -> Result<()> {
129132
}
130133
Command::WriteCaboose {
131134
version,
135+
epoch,
132136
force,
133137
no_defaults,
134138
} => {
@@ -143,9 +147,9 @@ fn main() -> Result<()> {
143147
}
144148
}
145149
if no_defaults {
146-
archive.write_version_to_caboose(&version)?;
150+
archive.write_version_to_caboose(&version, epoch.as_ref())?;
147151
} else {
148-
archive.write_default_caboose(Some(&version))?;
152+
archive.write_default_caboose(Some(&version), epoch.as_ref())?;
149153
}
150154
archive.overwrite()?;
151155
}

hubtools/src/lib.rs

+36-16
Original file line numberDiff line numberDiff line change
@@ -471,6 +471,9 @@ pub enum Error {
471471

472472
#[error("packing error: {0}")]
473473
PackingError(String),
474+
475+
#[error("invalid epoch value: {0}")]
476+
InvalidEpoch(String),
474477
}
475478

476479
////////////////////////////////////////////////////////////////////////////////
@@ -618,13 +621,25 @@ impl RawHubrisArchive {
618621
pub fn write_version_to_caboose(
619622
&mut self,
620623
version: &str,
624+
epoch: Option<&String>,
621625
) -> Result<(), Error> {
622626
// Manually build the TLV-C data for the caboose
623-
let data = tlvc_text::Piece::Chunk(
624-
tlvc_text::Tag::new(caboose::tags::VERS),
625-
vec![tlvc_text::Piece::String(version.to_owned())],
626-
);
627-
let out = tlvc_text::pack(&[data]);
627+
let mut chunks = vec![
628+
tlvc_text::Piece::Chunk(
629+
tlvc_text::Tag::new(caboose::tags::VERS),
630+
vec![tlvc_text::Piece::String(version.to_owned())],
631+
),
632+
];
633+
if let Some(param) = epoch {
634+
let epoc = param.parse::<u32>().map_err(|_| Error::InvalidEpoch(param.to_string()))?;
635+
let caboose_epoc = format!("{:010}", epoc).to_owned();
636+
let data = tlvc_text::Piece::Chunk(
637+
tlvc_text::Tag::new(caboose::tags::EPOC),
638+
vec![tlvc_text::Piece::String(caboose_epoc)],
639+
);
640+
chunks.push(data);
641+
}
642+
let out = tlvc_text::pack(&chunks);
628643
self.write_caboose(&out)?;
629644
Ok(())
630645
}
@@ -642,6 +657,7 @@ impl RawHubrisArchive {
642657
fn generate_default_caboose(
643658
&mut self,
644659
version: Option<&String>,
660+
epoch: Option<&String>,
645661
) -> Result<Vec<tlvc_text::Piece>, Error> {
646662
let manifest = self.extract_file("app.toml")?;
647663
let git = self.extract_file("git-rev")?;
@@ -667,19 +683,21 @@ impl RawHubrisArchive {
667683
.as_str()
668684
.ok_or(Error::BadTomlType)?
669685
.to_owned();
670-
let epoch = if let Some(epoch) =
671-
manifest.as_table().ok_or(Error::BadTomlType)?.get("epoch")
672-
{
673-
epoch.as_integer().ok_or(Error::BadTomlType)?
686+
// Hubris has an epoch in the app.toml but Bootleby does not.
687+
// CLI arg overrides app.toml, value will default to zero.
688+
let epoc: u32 = if let Some(param) = epoch {
689+
param.parse::<u32>().map_err(|_| Error::InvalidEpoch(param.to_string()))?
690+
} else if let Some(param) = manifest.as_table().ok_or(Error::BadTomlType)?.get("epoch") {
691+
let toml_int = param.as_integer().ok_or(Error::BadTomlType)?;
692+
u32::try_from(toml_int).map_err(|_| Error::InvalidEpoch(format!("epoch from toml = {}", toml_int)))?
674693
} else {
675694
// Default is zero if missing from app.toml
676-
0i64
695+
0u32
677696
};
678697
// EPOC in the caboose is a u32, zero-padded 10-digit ascii number.
679698
// Missing EPOC or all-zeros is equivalent to EPOC zero.
680699
// Anything else represents some future scheme or a typo in toml file.
681-
let epoch = u32::try_from(epoch).map_err(|_| Error::BadTomlType)?;
682-
let epoch = format!("{:010}", epoch as u32).to_owned();
700+
let caboose_epoc = format!("{:010}", epoc).to_owned();
683701

684702
// If this Hubris archive used our TOML inheritance system, then the
685703
// name could be overridden in the `patches.toml` file.
@@ -713,7 +731,7 @@ impl RawHubrisArchive {
713731
),
714732
tlvc_text::Piece::Chunk(
715733
tlvc_text::Tag::new(caboose::tags::EPOC),
716-
vec![tlvc_text::Piece::String(epoch)],
734+
vec![tlvc_text::Piece::String(caboose_epoc)],
717735
),
718736
];
719737
if let Some(v) = version {
@@ -729,8 +747,9 @@ impl RawHubrisArchive {
729747
pub fn write_default_caboose(
730748
&mut self,
731749
version: Option<&String>,
750+
epoch: Option<&String>,
732751
) -> Result<(), Error> {
733-
let out = tlvc_text::pack(&self.generate_default_caboose(version)?);
752+
let out = tlvc_text::pack(&self.generate_default_caboose(version, epoch)?);
734753
self.write_caboose(&out)
735754
}
736755

@@ -876,6 +895,7 @@ impl RawHubrisArchive {
876895
root_certs: Vec<Certificate>,
877896
signing_certs: Vec<Certificate>,
878897
version: Option<&String>,
898+
epoch: Option<&String>,
879899
) -> Result<Vec<u8>, Error> {
880900
match self.is_lpc55() {
881901
Ok(_) => {
@@ -911,7 +931,7 @@ impl RawHubrisArchive {
911931
)?;
912932
}
913933

914-
let mut caboose = self.generate_default_caboose(version)?;
934+
let mut caboose = self.generate_default_caboose(version, epoch)?;
915935

916936
caboose.push(tlvc_text::Piece::Chunk(
917937
tlvc_text::Tag::new(caboose::tags::SIGN),
@@ -930,7 +950,7 @@ impl RawHubrisArchive {
930950
Ok(stamped)
931951
}
932952
Err(_) => {
933-
self.write_default_caboose(version)?;
953+
self.write_default_caboose(version, epoch)?;
934954
// Not an LPC55 image, just return the image back for now
935955
self.image.to_binary()
936956
}

0 commit comments

Comments
 (0)