@@ -31,14 +31,26 @@ struct CommonArgs {
3131
3232#[ derive( Subcommand , Debug ) ]
3333enum Commands {
34+ AmdSevSnp ( AmdSevSnpArgs ) ,
3435 AwsNitro ( AwsNitroArgs ) ,
3536}
3637
38+ struct AmdSevSnpCli {
39+ common_args : CommonArgs ,
40+ amd_sev_snp_args : AmdSevSnpArgs ,
41+ }
42+
3743struct 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 ) ]
4355struct 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
5674fn 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+
137199fn 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
196244fn 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 ) ]
210270enum CommandFail {
211271 #[ error( "Failed to run {0}" ) ]
0 commit comments