59
59
*/
60
60
#define KRUN_VM_FILE "/.krun_vm.json"
61
61
62
+ #define KRUN_FLAVOR_SEV "sev"
63
+
62
64
struct krun_config
63
65
{
64
66
void * handle ;
@@ -199,6 +201,50 @@ libkrun_configure_vm (uint32_t ctx_id, void *handle, bool *configured, yajl_val
199
201
return 0 ;
200
202
}
201
203
204
+ static int
205
+ libkrun_configure_flavor (void * cookie , yajl_val * config_tree , libcrun_error_t * err )
206
+ {
207
+ int sev_indicated = 0 ;
208
+ const char * path_flavor [] = { "flavor" , (const char * ) 0 };
209
+ struct krun_config * kconf = (struct krun_config * ) cookie ;
210
+ yajl_val val_flavor = NULL ;
211
+ char * flavor = NULL ;
212
+
213
+ // Read if the SEV flavor was indicated in the krun VM config.
214
+ val_flavor = yajl_tree_get (* config_tree , path_flavor , yajl_t_string );
215
+ if (val_flavor != NULL && YAJL_IS_STRING (val_flavor ))
216
+ {
217
+ flavor = YAJL_GET_STRING (val_flavor );
218
+
219
+ // The SEV flavor will be used if the krun VM config indicates to use SEV
220
+ // within the "flavor" field.
221
+ sev_indicated |= strcmp (flavor , KRUN_FLAVOR_SEV ) == 0 ;
222
+ }
223
+
224
+ // To maintain backward compatibility, also use the SEV flavor if the
225
+ // KRUN_SEV_FILE was found.
226
+ sev_indicated |= access (KRUN_SEV_FILE , F_OK ) == 0 ;
227
+
228
+ if (sev_indicated )
229
+ {
230
+ if (kconf -> handle_sev == NULL )
231
+ error (EXIT_FAILURE , 0 , "the container requires libkrun-sev but it's not available" );
232
+
233
+ kconf -> handle = kconf -> handle_sev ;
234
+ kconf -> ctx_id = kconf -> ctx_id_sev ;
235
+ kconf -> sev = true;
236
+ }
237
+ else
238
+ {
239
+ if (kconf -> handle == NULL )
240
+ error (EXIT_FAILURE , 0 , "the container requires libkrun but it's not available" );
241
+
242
+ kconf -> sev = false;
243
+ }
244
+
245
+ return 0 ;
246
+ }
247
+
202
248
static int
203
249
libkrun_exec (void * cookie , libcrun_container_t * container , const char * pathname , char * const argv [])
204
250
{
@@ -222,22 +268,12 @@ libkrun_exec (void *cookie, libcrun_container_t *container, const char *pathname
222
268
if (UNLIKELY (ret < 0 ))
223
269
error (EXIT_FAILURE , - ret , "libkrun VM config exists, but unable to parse" );
224
270
225
- if (access (KRUN_SEV_FILE , F_OK ) == 0 )
226
- {
227
- if (kconf -> handle_sev == NULL )
228
- error (EXIT_FAILURE , 0 , "the container requires libkrun-sev but it's not available" );
229
- handle = kconf -> handle_sev ;
230
- ctx_id = kconf -> ctx_id_sev ;
231
- kconf -> sev = true;
232
- }
233
- else
234
- {
235
- if (kconf -> handle == NULL )
236
- error (EXIT_FAILURE , 0 , "the container requires libkrun but it's not available" );
237
- handle = kconf -> handle ;
238
- ctx_id = kconf -> ctx_id ;
239
- kconf -> sev = false;
240
- }
271
+ ret = libkrun_configure_flavor (cookie , & config_tree , & err );
272
+ if (UNLIKELY (ret < 0 ))
273
+ error (EXIT_FAILURE , - ret , "unable to configure libkrun flavor" );
274
+
275
+ handle = kconf -> handle ;
276
+ ctx_id = kconf -> ctx_id ;
241
277
242
278
krun_set_log_level = dlsym (handle , "krun_set_log_level" );
243
279
krun_start_enter = dlsym (handle , "krun_start_enter" );
0 commit comments