Skip to content

Commit eeaaa9d

Browse files
committed
feat(ftxvme-runner-cargo): add amd-sev-snp logic
1 parent fe09d87 commit eeaaa9d

File tree

1 file changed

+79
-19
lines changed

1 file changed

+79
-19
lines changed

fortanix-vme/fortanix-vme-tools/src/bin/ftxvme-runner-cargo.rs

Lines changed: 79 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,26 @@ struct CommonArgs {
3131

3232
#[derive(Subcommand, Debug)]
3333
enum Commands {
34+
AmdSevSnp(AmdSevSnpArgs),
3435
AwsNitro(AwsNitroArgs),
3536
}
3637

38+
struct AmdSevSnpCli {
39+
common_args: CommonArgs,
40+
amd_sev_snp_args: AmdSevSnpArgs,
41+
}
42+
3743
struct AwsNitroCli {
3844
common_args: CommonArgs,
3945
aws_nitro_args: AwsNitroArgs,
4046
}
4147

48+
#[derive(Clone, Debug, Args)]
49+
struct AmdSevSnpArgs {
50+
#[arg(trailing_var_arg = true)]
51+
others: Vec<String>,
52+
}
53+
4254
#[derive(Clone, Debug, Args)]
4355
struct AwsNitroArgs {
4456
#[arg(trailing_var_arg = true)]
@@ -51,6 +63,12 @@ impl CommonArgs {
5163
eif_path.set_extension("elf");
5264
eif_path
5365
}
66+
67+
pub fn uki_path(&self) -> PathBuf {
68+
let mut uki_path = self.elf_path.clone();
69+
uki_path.set_extension("efi");
70+
uki_path
71+
}
5472
}
5573

5674
fn parse_elf_path(arg: &str) -> Result<PathBuf> {
@@ -124,6 +142,13 @@ fn main() -> anyhow::Result<()> {
124142
let fortanix_vme_config = FortanixVmeConfig::get()?;
125143

126144
match cli.command {
145+
Commands::AmdSevSnp(amd_sev_snp_args) => {
146+
let amd_sev_snp_cli = AmdSevSnpCli {
147+
common_args: cli.common_args,
148+
amd_sev_snp_args,
149+
};
150+
cargo_run_sev_snp_vm(amd_sev_snp_cli, fortanix_vme_config)
151+
}
127152
Commands::AwsNitro(aws_nitro_args) => {
128153
let aws_nitro_cli = AwsNitroCli {
129154
common_args: cli.common_args,
@@ -134,6 +159,43 @@ fn main() -> anyhow::Result<()> {
134159
}
135160
}
136161

162+
fn cargo_run_sev_snp_vm(
163+
amd_sev_snp_cli: AmdSevSnpCli,
164+
fortanix_vme_config: FortanixVmeConfig,
165+
) -> Result<(), anyhow::Error> {
166+
let AmdSevSnpCli {
167+
common_args,
168+
amd_sev_snp_args,
169+
} = amd_sev_snp_cli;
170+
171+
let uki_path = common_args.uki_path();
172+
173+
// TODO: we can assume this is installed right?
174+
let mut ftxvme_elf2uki = Command::new("ftxvme-elf2uki");
175+
ftxvme_elf2uki
176+
.arg("--app")
177+
.arg(&common_args.elf_path)
178+
.arg("--output-path")
179+
.arg(&uki_path)
180+
.arg("--cmdline")
181+
.arg("console=ttyS0 earlyprintk=serial"); //TODO: should we use this as default?
182+
run_command(ftxvme_elf2uki)?;
183+
184+
let mut fortanix_vme_runner = Command::new("fortanix-vme-runner");
185+
fortanix_vme_runner.arg("--enclave-file").arg(&uki_path);
186+
187+
add_runner_config_args(&mut fortanix_vme_runner, &fortanix_vme_config);
188+
189+
add_runner_common_args(&mut fortanix_vme_runner, &common_args);
190+
191+
fortanix_vme_runner.arg("amd-sev-snp");
192+
add_other_args(&mut fortanix_vme_runner, amd_sev_snp_args.others);
193+
194+
run_command(fortanix_vme_runner)?;
195+
196+
Ok(())
197+
}
198+
137199
fn cargo_run_nitro_enclave(
138200
aws_nitro_cli: AwsNitroCli,
139201
fortanix_vme_config: FortanixVmeConfig,
@@ -158,25 +220,17 @@ fn cargo_run_nitro_enclave(
158220

159221
add_runner_config_args(&mut fortanix_vme_runner, &fortanix_vme_config);
160222

161-
add_runner_common_args::<_, String>(
162-
&mut fortanix_vme_runner,
163-
&common_args,
164-
aws_nitro_args.others,
165-
);
223+
add_runner_common_args(&mut fortanix_vme_runner, &common_args);
224+
225+
fortanix_vme_runner.arg("aws-nitro");
226+
add_other_args(&mut fortanix_vme_runner, aws_nitro_args.others);
166227

167228
run_command(fortanix_vme_runner)?;
168229

169230
Ok(())
170231
}
171232

172-
fn add_runner_common_args<I, S>(
173-
fortanix_vme_runner: &mut Command,
174-
common_args: &CommonArgs,
175-
other_args: I,
176-
) where
177-
I: IntoIterator<Item = S>,
178-
S: AsRef<OsStr>,
179-
{
233+
fn add_runner_common_args(fortanix_vme_runner: &mut Command, common_args: &CommonArgs) {
180234
if common_args.simulate {
181235
fortanix_vme_runner.arg("--simulate");
182236
}
@@ -185,12 +239,6 @@ fn add_runner_common_args<I, S>(
185239
fortanix_vme_runner.env("RUST_LOG", "debug");
186240
fortanix_vme_runner.arg("--verbose");
187241
}
188-
189-
let mut peek = other_args.into_iter().peekable();
190-
if !peek.peek().is_none() {
191-
fortanix_vme_runner.arg("--");
192-
fortanix_vme_runner.args(peek);
193-
}
194242
}
195243

196244
fn add_runner_config_args(
@@ -206,6 +254,18 @@ fn add_runner_config_args(
206254
}
207255
}
208256

257+
fn add_other_args<I, S>(fortanix_vme_runner: &mut Command, other_args: I)
258+
where
259+
I: IntoIterator<Item = S>,
260+
S: AsRef<OsStr>,
261+
{
262+
let mut peek = other_args.into_iter().peekable();
263+
if !peek.peek().is_none() {
264+
fortanix_vme_runner.arg("--");
265+
fortanix_vme_runner.args(peek);
266+
}
267+
}
268+
209269
#[derive(Debug, Error)]
210270
enum CommandFail {
211271
#[error("Failed to run {0}")]

0 commit comments

Comments
 (0)