Skip to main content

flowey_lib_hvlite/
build_snp_bootshim.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4//! Build the x86_64 SNP boot shim.
5
6use crate::common::CommonArch;
7use crate::run_cargo_build::BuildProfile;
8use flowey::node::prelude::*;
9use flowey_lib_common::run_cargo_build::CargoCrateType;
10
11#[derive(Serialize, Deserialize)]
12pub struct SnpBootshimOutput {
13    pub bin: PathBuf,
14}
15
16flowey_request! {
17    pub struct Request {
18        pub snp_bootshim: WriteVar<SnpBootshimOutput>,
19    }
20}
21
22new_simple_flow_node!(struct Node);
23
24impl SimpleFlowNode for Node {
25    type Request = Request;
26
27    fn imports(ctx: &mut ImportCtx<'_>) {
28        ctx.import::<crate::run_cargo_build::Node>();
29    }
30
31    fn process_request(request: Self::Request, ctx: &mut NodeCtx<'_>) -> anyhow::Result<()> {
32        let target = target_lexicon::Triple {
33            architecture: CommonArch::X86_64.as_arch(),
34            operating_system: target_lexicon::OperatingSystem::None_,
35            environment: target_lexicon::Environment::Unknown,
36            vendor: target_lexicon::Vendor::Custom(target_lexicon::CustomVendor::Static(
37                "minimal_rt",
38            )),
39            binary_format: target_lexicon::BinaryFormat::Unknown,
40        };
41
42        let output = ctx.reqv(|v| crate::run_cargo_build::Request {
43            crate_name: "snp_bootshim".into(),
44            out_name: "snp_bootshim".into(),
45            crate_type: CargoCrateType::Bin,
46            profile: BuildProfile::BootDev,
47            features: Default::default(),
48            target,
49            no_split_dbg_info: true,
50            extra_env: Some(ReadVar::from_static(
51                [("RUSTC_BOOTSTRAP".to_string(), "1".to_string())]
52                    .into_iter()
53                    .collect(),
54            )),
55            pre_build_deps: Vec::new(),
56            output: v,
57        });
58
59        output.write_into_with(ctx, request.snp_bootshim, |o| match o {
60            crate::run_cargo_build::CargoBuildOutput::ElfBin { bin, .. } => {
61                SnpBootshimOutput { bin }
62            }
63            _ => unreachable!("snp_bootshim builds for minimal_rt"),
64        });
65        Ok(())
66    }
67}