opentitanlib/test_utils/
bootstrap.rs

1// Copyright lowRISC contributors (OpenTitan project).
2// Licensed under the Apache License, Version 2.0, see LICENSE for details.
3// SPDX-License-Identifier: Apache-2.0
4
5use anyhow::Result;
6use clap::Args;
7use serde_annotate::Annotate;
8use std::path::{Path, PathBuf};
9
10use crate::app::{StagedProgressBar, TransportWrapper};
11use crate::bootstrap::{self, BootstrapOptions};
12
13/// Load a program into the chip.
14#[derive(Debug, Args)]
15pub struct Bootstrap {
16    #[command(flatten)]
17    pub options: BootstrapOptions,
18
19    /// RV32 test binary to load.
20    #[arg(long)]
21    pub bootstrap: Option<PathBuf>,
22}
23
24impl Bootstrap {
25    pub fn init(&self, transport: &TransportWrapper) -> Result<Option<Box<dyn Annotate>>> {
26        if let Some(bootstrap) = &self.bootstrap {
27            self.load(transport, bootstrap)?;
28        }
29        Ok(None)
30    }
31
32    pub fn load(&self, transport: &TransportWrapper, file: &Path) -> Result<()> {
33        let payload = std::fs::read(file)?;
34        let progress = StagedProgressBar::new();
35        let mut options = self.options.clone();
36        if options.clear_uart.is_none() {
37            options.clear_uart = Some(true);
38        }
39        bootstrap::Bootstrap::update_with_progress(transport, &options, &payload, &progress)?;
40        Ok(())
41    }
42}