@@ -114,7 +114,7 @@ static bool is_vmpck_empty(struct snp_guest_dev *snp_dev)
114
114
*/
115
115
static void snp_disable_vmpck (struct snp_guest_dev * snp_dev )
116
116
{
117
- dev_alert (snp_dev -> dev , "Disabling vmpck_id %d to prevent IV reuse.\n" ,
117
+ dev_alert (snp_dev -> dev , "Disabling VMPCK%d communication key to prevent IV reuse.\n" ,
118
118
vmpck_id );
119
119
memzero_explicit (snp_dev -> vmpck , VMPCK_KEY_LEN );
120
120
snp_dev -> vmpck = NULL ;
@@ -291,44 +291,45 @@ static int dec_payload(struct snp_guest_dev *snp_dev, struct snp_guest_msg *msg,
291
291
static int verify_and_dec_payload (struct snp_guest_dev * snp_dev , void * payload , u32 sz )
292
292
{
293
293
struct snp_guest_crypto * crypto = snp_dev -> crypto ;
294
- struct snp_guest_msg * resp = & snp_dev -> secret_response ;
295
- struct snp_guest_msg * req = & snp_dev -> secret_request ;
296
- struct snp_guest_msg_hdr * req_hdr = & req -> hdr ;
297
- struct snp_guest_msg_hdr * resp_hdr = & resp -> hdr ;
294
+ struct snp_guest_msg * resp_msg = & snp_dev -> secret_response ;
295
+ struct snp_guest_msg * req_msg = & snp_dev -> secret_request ;
296
+ struct snp_guest_msg_hdr * req_msg_hdr = & req_msg -> hdr ;
297
+ struct snp_guest_msg_hdr * resp_msg_hdr = & resp_msg -> hdr ;
298
298
299
- dev_dbg (snp_dev -> dev , "response [seqno %lld type %d version %d sz %d]\n" ,
300
- resp_hdr -> msg_seqno , resp_hdr -> msg_type , resp_hdr -> msg_version , resp_hdr -> msg_sz );
299
+ pr_debug ("response [seqno %lld type %d version %d sz %d]\n" ,
300
+ resp_msg_hdr -> msg_seqno , resp_msg_hdr -> msg_type , resp_msg_hdr -> msg_version ,
301
+ resp_msg_hdr -> msg_sz );
301
302
302
303
/* Copy response from shared memory to encrypted memory. */
303
- memcpy (resp , snp_dev -> response , sizeof (* resp ));
304
+ memcpy (resp_msg , snp_dev -> response , sizeof (* resp_msg ));
304
305
305
306
/* Verify that the sequence counter is incremented by 1 */
306
- if (unlikely (resp_hdr -> msg_seqno != (req_hdr -> msg_seqno + 1 )))
307
+ if (unlikely (resp_msg_hdr -> msg_seqno != (req_msg_hdr -> msg_seqno + 1 )))
307
308
return - EBADMSG ;
308
309
309
310
/* Verify response message type and version number. */
310
- if (resp_hdr -> msg_type != (req_hdr -> msg_type + 1 ) ||
311
- resp_hdr -> msg_version != req_hdr -> msg_version )
311
+ if (resp_msg_hdr -> msg_type != (req_msg_hdr -> msg_type + 1 ) ||
312
+ resp_msg_hdr -> msg_version != req_msg_hdr -> msg_version )
312
313
return - EBADMSG ;
313
314
314
315
/*
315
316
* If the message size is greater than our buffer length then return
316
317
* an error.
317
318
*/
318
- if (unlikely ((resp_hdr -> msg_sz + crypto -> a_len ) > sz ))
319
+ if (unlikely ((resp_msg_hdr -> msg_sz + crypto -> a_len ) > sz ))
319
320
return - EBADMSG ;
320
321
321
322
/* Decrypt the payload */
322
- return dec_payload (snp_dev , resp , payload , resp_hdr -> msg_sz + crypto -> a_len );
323
+ return dec_payload (snp_dev , resp_msg , payload , resp_msg_hdr -> msg_sz + crypto -> a_len );
323
324
}
324
325
325
326
static int enc_payload (struct snp_guest_dev * snp_dev , u64 seqno , int version , u8 type ,
326
327
void * payload , size_t sz )
327
328
{
328
- struct snp_guest_msg * req = & snp_dev -> secret_request ;
329
- struct snp_guest_msg_hdr * hdr = & req -> hdr ;
329
+ struct snp_guest_msg * msg = & snp_dev -> secret_request ;
330
+ struct snp_guest_msg_hdr * hdr = & msg -> hdr ;
330
331
331
- memset (req , 0 , sizeof (* req ));
332
+ memset (msg , 0 , sizeof (* msg ));
332
333
333
334
hdr -> algo = SNP_AEAD_AES_256_GCM ;
334
335
hdr -> hdr_version = MSG_HDR_VER ;
@@ -343,10 +344,10 @@ static int enc_payload(struct snp_guest_dev *snp_dev, u64 seqno, int version, u8
343
344
if (!hdr -> msg_seqno )
344
345
return - ENOSR ;
345
346
346
- dev_dbg ( snp_dev -> dev , "request [seqno %lld type %d version %d sz %d]\n" ,
347
- hdr -> msg_seqno , hdr -> msg_type , hdr -> msg_version , hdr -> msg_sz );
347
+ pr_debug ( "request [seqno %lld type %d version %d sz %d]\n" ,
348
+ hdr -> msg_seqno , hdr -> msg_type , hdr -> msg_version , hdr -> msg_sz );
348
349
349
- return __enc_payload (snp_dev , req , payload , sz );
350
+ return __enc_payload (snp_dev , msg , payload , sz );
350
351
}
351
352
352
353
static int __handle_guest_request (struct snp_guest_dev * snp_dev , u64 exit_code ,
@@ -495,47 +496,46 @@ struct snp_req_resp {
495
496
static int get_report (struct snp_guest_dev * snp_dev , struct snp_guest_request_ioctl * arg )
496
497
{
497
498
struct snp_guest_crypto * crypto = snp_dev -> crypto ;
498
- struct snp_report_req * req = & snp_dev -> req .report ;
499
- struct snp_report_resp * resp ;
499
+ struct snp_report_req * report_req = & snp_dev -> req .report ;
500
+ struct snp_report_resp * report_resp ;
500
501
int rc , resp_len ;
501
502
502
503
lockdep_assert_held (& snp_cmd_mutex );
503
504
504
505
if (!arg -> req_data || !arg -> resp_data )
505
506
return - EINVAL ;
506
507
507
- if (copy_from_user (req , (void __user * )arg -> req_data , sizeof (* req )))
508
+ if (copy_from_user (report_req , (void __user * )arg -> req_data , sizeof (* report_req )))
508
509
return - EFAULT ;
509
510
510
511
/*
511
512
* The intermediate response buffer is used while decrypting the
512
513
* response payload. Make sure that it has enough space to cover the
513
514
* authtag.
514
515
*/
515
- resp_len = sizeof (resp -> data ) + crypto -> a_len ;
516
- resp = kzalloc (resp_len , GFP_KERNEL_ACCOUNT );
517
- if (!resp )
516
+ resp_len = sizeof (report_resp -> data ) + crypto -> a_len ;
517
+ report_resp = kzalloc (resp_len , GFP_KERNEL_ACCOUNT );
518
+ if (!report_resp )
518
519
return - ENOMEM ;
519
520
520
- rc = handle_guest_request (snp_dev , SVM_VMGEXIT_GUEST_REQUEST , arg ,
521
- SNP_MSG_REPORT_REQ , req , sizeof (* req ), resp -> data ,
522
- resp_len );
521
+ rc = handle_guest_request (snp_dev , SVM_VMGEXIT_GUEST_REQUEST , arg , SNP_MSG_REPORT_REQ ,
522
+ report_req , sizeof (* report_req ), report_resp -> data , resp_len );
523
523
if (rc )
524
524
goto e_free ;
525
525
526
- if (copy_to_user ((void __user * )arg -> resp_data , resp , sizeof (* resp )))
526
+ if (copy_to_user ((void __user * )arg -> resp_data , report_resp , sizeof (* report_resp )))
527
527
rc = - EFAULT ;
528
528
529
529
e_free :
530
- kfree (resp );
530
+ kfree (report_resp );
531
531
return rc ;
532
532
}
533
533
534
534
static int get_derived_key (struct snp_guest_dev * snp_dev , struct snp_guest_request_ioctl * arg )
535
535
{
536
- struct snp_derived_key_req * req = & snp_dev -> req .derived_key ;
536
+ struct snp_derived_key_req * derived_key_req = & snp_dev -> req .derived_key ;
537
537
struct snp_guest_crypto * crypto = snp_dev -> crypto ;
538
- struct snp_derived_key_resp resp = {0 };
538
+ struct snp_derived_key_resp derived_key_resp = {0 };
539
539
int rc , resp_len ;
540
540
/* Response data is 64 bytes and max authsize for GCM is 16 bytes. */
541
541
u8 buf [64 + 16 ];
@@ -550,35 +550,37 @@ static int get_derived_key(struct snp_guest_dev *snp_dev, struct snp_guest_reque
550
550
* response payload. Make sure that it has enough space to cover the
551
551
* authtag.
552
552
*/
553
- resp_len = sizeof (resp .data ) + crypto -> a_len ;
553
+ resp_len = sizeof (derived_key_resp .data ) + crypto -> a_len ;
554
554
if (sizeof (buf ) < resp_len )
555
555
return - ENOMEM ;
556
556
557
- if (copy_from_user (req , (void __user * )arg -> req_data , sizeof (* req )))
557
+ if (copy_from_user (derived_key_req , (void __user * )arg -> req_data ,
558
+ sizeof (* derived_key_req )))
558
559
return - EFAULT ;
559
560
560
- rc = handle_guest_request (snp_dev , SVM_VMGEXIT_GUEST_REQUEST , arg ,
561
- SNP_MSG_KEY_REQ , req , sizeof (* req ), buf , resp_len );
561
+ rc = handle_guest_request (snp_dev , SVM_VMGEXIT_GUEST_REQUEST , arg , SNP_MSG_KEY_REQ ,
562
+ derived_key_req , sizeof (* derived_key_req ), buf , resp_len );
562
563
if (rc )
563
564
return rc ;
564
565
565
- memcpy (resp .data , buf , sizeof (resp .data ));
566
- if (copy_to_user ((void __user * )arg -> resp_data , & resp , sizeof (resp )))
566
+ memcpy (derived_key_resp .data , buf , sizeof (derived_key_resp .data ));
567
+ if (copy_to_user ((void __user * )arg -> resp_data , & derived_key_resp ,
568
+ sizeof (derived_key_resp )))
567
569
rc = - EFAULT ;
568
570
569
571
/* The response buffer contains the sensitive data, explicitly clear it. */
570
572
memzero_explicit (buf , sizeof (buf ));
571
- memzero_explicit (& resp , sizeof (resp ));
573
+ memzero_explicit (& derived_key_resp , sizeof (derived_key_resp ));
572
574
return rc ;
573
575
}
574
576
575
577
static int get_ext_report (struct snp_guest_dev * snp_dev , struct snp_guest_request_ioctl * arg ,
576
578
struct snp_req_resp * io )
577
579
578
580
{
579
- struct snp_ext_report_req * req = & snp_dev -> req .ext_report ;
581
+ struct snp_ext_report_req * report_req = & snp_dev -> req .ext_report ;
580
582
struct snp_guest_crypto * crypto = snp_dev -> crypto ;
581
- struct snp_report_resp * resp ;
583
+ struct snp_report_resp * report_resp ;
582
584
int ret , npages = 0 , resp_len ;
583
585
sockptr_t certs_address ;
584
586
@@ -587,22 +589,22 @@ static int get_ext_report(struct snp_guest_dev *snp_dev, struct snp_guest_reques
587
589
if (sockptr_is_null (io -> req_data ) || sockptr_is_null (io -> resp_data ))
588
590
return - EINVAL ;
589
591
590
- if (copy_from_sockptr (req , io -> req_data , sizeof (* req )))
592
+ if (copy_from_sockptr (report_req , io -> req_data , sizeof (* report_req )))
591
593
return - EFAULT ;
592
594
593
595
/* caller does not want certificate data */
594
- if (!req -> certs_len || !req -> certs_address )
596
+ if (!report_req -> certs_len || !report_req -> certs_address )
595
597
goto cmd ;
596
598
597
- if (req -> certs_len > SEV_FW_BLOB_MAX_SIZE ||
598
- !IS_ALIGNED (req -> certs_len , PAGE_SIZE ))
599
+ if (report_req -> certs_len > SEV_FW_BLOB_MAX_SIZE ||
600
+ !IS_ALIGNED (report_req -> certs_len , PAGE_SIZE ))
599
601
return - EINVAL ;
600
602
601
603
if (sockptr_is_kernel (io -> resp_data )) {
602
- certs_address = KERNEL_SOCKPTR ((void * )req -> certs_address );
604
+ certs_address = KERNEL_SOCKPTR ((void * )report_req -> certs_address );
603
605
} else {
604
- certs_address = USER_SOCKPTR ((void __user * )req -> certs_address );
605
- if (!access_ok (certs_address .user , req -> certs_len ))
606
+ certs_address = USER_SOCKPTR ((void __user * )report_req -> certs_address );
607
+ if (!access_ok (certs_address .user , report_req -> certs_len ))
606
608
return - EFAULT ;
607
609
}
608
610
@@ -612,45 +614,45 @@ static int get_ext_report(struct snp_guest_dev *snp_dev, struct snp_guest_reques
612
614
* the host. If host does not supply any certs in it, then copy
613
615
* zeros to indicate that certificate data was not provided.
614
616
*/
615
- memset (snp_dev -> certs_data , 0 , req -> certs_len );
616
- npages = req -> certs_len >> PAGE_SHIFT ;
617
+ memset (snp_dev -> certs_data , 0 , report_req -> certs_len );
618
+ npages = report_req -> certs_len >> PAGE_SHIFT ;
617
619
cmd :
618
620
/*
619
621
* The intermediate response buffer is used while decrypting the
620
622
* response payload. Make sure that it has enough space to cover the
621
623
* authtag.
622
624
*/
623
- resp_len = sizeof (resp -> data ) + crypto -> a_len ;
624
- resp = kzalloc (resp_len , GFP_KERNEL_ACCOUNT );
625
- if (!resp )
625
+ resp_len = sizeof (report_resp -> data ) + crypto -> a_len ;
626
+ report_resp = kzalloc (resp_len , GFP_KERNEL_ACCOUNT );
627
+ if (!report_resp )
626
628
return - ENOMEM ;
627
629
628
630
snp_dev -> input .data_npages = npages ;
629
- ret = handle_guest_request (snp_dev , SVM_VMGEXIT_EXT_GUEST_REQUEST , arg ,
630
- SNP_MSG_REPORT_REQ , & req -> data ,
631
- sizeof ( req -> data ), resp -> data , resp_len );
631
+ ret = handle_guest_request (snp_dev , SVM_VMGEXIT_EXT_GUEST_REQUEST , arg , SNP_MSG_REPORT_REQ ,
632
+ & report_req -> data , sizeof ( report_req -> data ) ,
633
+ report_resp -> data , resp_len );
632
634
633
635
/* If certs length is invalid then copy the returned length */
634
636
if (arg -> vmm_error == SNP_GUEST_VMM_ERR_INVALID_LEN ) {
635
- req -> certs_len = snp_dev -> input .data_npages << PAGE_SHIFT ;
637
+ report_req -> certs_len = snp_dev -> input .data_npages << PAGE_SHIFT ;
636
638
637
- if (copy_to_sockptr (io -> req_data , req , sizeof (* req )))
639
+ if (copy_to_sockptr (io -> req_data , report_req , sizeof (* report_req )))
638
640
ret = - EFAULT ;
639
641
}
640
642
641
643
if (ret )
642
644
goto e_free ;
643
645
644
- if (npages && copy_to_sockptr (certs_address , snp_dev -> certs_data , req -> certs_len )) {
646
+ if (npages && copy_to_sockptr (certs_address , snp_dev -> certs_data , report_req -> certs_len )) {
645
647
ret = - EFAULT ;
646
648
goto e_free ;
647
649
}
648
650
649
- if (copy_to_sockptr (io -> resp_data , resp , sizeof (* resp )))
651
+ if (copy_to_sockptr (io -> resp_data , report_resp , sizeof (* report_resp )))
650
652
ret = - EFAULT ;
651
653
652
654
e_free :
653
- kfree (resp );
655
+ kfree (report_resp );
654
656
return ret ;
655
657
}
656
658
@@ -1090,6 +1092,8 @@ static int __init sev_guest_probe(struct platform_device *pdev)
1090
1092
void __iomem * mapping ;
1091
1093
int ret ;
1092
1094
1095
+ BUILD_BUG_ON (sizeof (struct snp_guest_msg ) > PAGE_SIZE );
1096
+
1093
1097
if (!cc_platform_has (CC_ATTR_GUEST_SEV_SNP ))
1094
1098
return - ENODEV ;
1095
1099
@@ -1115,13 +1119,13 @@ static int __init sev_guest_probe(struct platform_device *pdev)
1115
1119
ret = - EINVAL ;
1116
1120
snp_dev -> vmpck = get_vmpck (vmpck_id , secrets , & snp_dev -> os_area_msg_seqno );
1117
1121
if (!snp_dev -> vmpck ) {
1118
- dev_err (dev , "invalid vmpck id %d \n" , vmpck_id );
1122
+ dev_err (dev , "Invalid VMPCK%d communication key \n" , vmpck_id );
1119
1123
goto e_unmap ;
1120
1124
}
1121
1125
1122
1126
/* Verify that VMPCK is not zero. */
1123
1127
if (is_vmpck_empty (snp_dev )) {
1124
- dev_err (dev , "vmpck id %d is null \n" , vmpck_id );
1128
+ dev_err (dev , "Empty VMPCK %d communication key \n" , vmpck_id );
1125
1129
goto e_unmap ;
1126
1130
}
1127
1131
@@ -1172,7 +1176,7 @@ static int __init sev_guest_probe(struct platform_device *pdev)
1172
1176
if (ret )
1173
1177
goto e_free_cert_data ;
1174
1178
1175
- dev_info (dev , "Initialized SEV guest driver (using vmpck_id %d )\n" , vmpck_id );
1179
+ dev_info (dev , "Initialized SEV guest driver (using VMPCK%d communication key )\n" , vmpck_id );
1176
1180
return 0 ;
1177
1181
1178
1182
e_free_cert_data :
0 commit comments