@@ -306,75 +306,61 @@ static uint32_t get_vmcs_field(enum cpu_reg_name ident)
306
306
return VMX_GUEST_PDPTE2_FULL ;
307
307
case CPU_REG_PDPTE3 :
308
308
return VMX_GUEST_PDPTE3_FULL ;
309
- default :
309
+ default : /* Never get here */
310
310
return VMX_INVALID_VMCS_FIELD ;
311
311
}
312
312
}
313
313
314
- static int vm_get_register (struct vcpu * vcpu , enum cpu_reg_name reg ,
315
- uint64_t * retval )
314
+ /**
315
+ * @pre vcpu != NULL
316
+ * @pre ((reg <= CPU_REG_LAST) && (reg >= CPU_REG_FIRST))
317
+ * @pre ((reg != CPU_REG_CR2) && (reg != CPU_REG_IDTR) && (reg != CPU_REG_GDTR))
318
+ */
319
+ static uint64_t vm_get_register (struct vcpu * vcpu , enum cpu_reg_name reg )
316
320
{
317
- if (vcpu == NULL ) {
318
- return - EINVAL ;
319
- }
320
-
321
- if ((reg > CPU_REG_LAST ) || (reg < CPU_REG_FIRST )) {
322
- return - EINVAL ;
323
- }
324
-
321
+ uint64_t reg_val ;
322
+
325
323
if ((reg >= CPU_REG_GENERAL_FIRST ) && (reg <= CPU_REG_GENERAL_LAST )) {
326
- * retval = vcpu_get_gpreg (vcpu , reg );
324
+ reg_val = vcpu_get_gpreg (vcpu , reg );
327
325
} else if ((reg >= CPU_REG_NONGENERAL_FIRST ) &&
328
326
(reg <= CPU_REG_NONGENERAL_LAST )) {
329
327
uint32_t field = get_vmcs_field (reg );
330
328
331
- if (field != VMX_INVALID_VMCS_FIELD ) {
332
- if (reg <= CPU_REG_NATURAL_LAST ) {
333
- * retval = exec_vmread (field );
334
- } else if (reg <= CPU_REG_64BIT_LAST ) {
335
- * retval = exec_vmread64 (field );
336
- } else {
337
- * retval = (uint64_t )exec_vmread16 (field );
338
- }
329
+ if (reg <= CPU_REG_NATURAL_LAST ) {
330
+ reg_val = exec_vmread (field );
331
+ } else if (reg <= CPU_REG_64BIT_LAST ) {
332
+ reg_val = exec_vmread64 (field );
339
333
} else {
340
- return - EINVAL ;
334
+ reg_val = ( uint64_t ) exec_vmread16 ( field ) ;
341
335
}
342
336
}
343
337
344
- return 0 ;
338
+ return reg_val ;
345
339
}
346
340
347
- static int vm_set_register (struct vcpu * vcpu , enum cpu_reg_name reg ,
341
+ /**
342
+ * @pre vcpu != NULL
343
+ * @pre ((reg <= CPU_REG_LAST) && (reg >= CPU_REG_FIRST))
344
+ * @pre ((reg != CPU_REG_CR2) && (reg != CPU_REG_IDTR) && (reg != CPU_REG_GDTR))
345
+ */
346
+ static void vm_set_register (struct vcpu * vcpu , enum cpu_reg_name reg ,
348
347
uint64_t val )
349
348
{
350
- if (vcpu == NULL ) {
351
- return - EINVAL ;
352
- }
353
-
354
- if ((reg > CPU_REG_LAST ) || (reg < CPU_REG_FIRST )) {
355
- return - EINVAL ;
356
- }
357
349
358
350
if ((reg >= CPU_REG_GENERAL_FIRST ) && (reg <= CPU_REG_GENERAL_LAST )) {
359
351
vcpu_set_gpreg (vcpu , reg , val );
360
352
} else if ((reg >= CPU_REG_NONGENERAL_FIRST ) &&
361
353
(reg <= CPU_REG_NONGENERAL_LAST )) {
362
354
uint32_t field = get_vmcs_field (reg );
363
355
364
- if (field != VMX_INVALID_VMCS_FIELD ) {
365
- if (reg <= CPU_REG_NATURAL_LAST ) {
366
- exec_vmwrite (field , val );
367
- } else if (reg <= CPU_REG_64BIT_LAST ) {
368
- exec_vmwrite64 (field , val );
369
- } else {
370
- exec_vmwrite16 (field , (uint16_t )val );
371
- }
356
+ if (reg <= CPU_REG_NATURAL_LAST ) {
357
+ exec_vmwrite (field , val );
358
+ } else if (reg <= CPU_REG_64BIT_LAST ) {
359
+ exec_vmwrite64 (field , val );
372
360
} else {
373
- return - EINVAL ;
361
+ exec_vmwrite16 ( field , ( uint16_t ) val ) ;
374
362
}
375
363
}
376
-
377
- return 0 ;
378
364
}
379
365
380
366
/**
@@ -615,11 +601,11 @@ static int vie_read_bytereg(struct vcpu *vcpu, struct instr_emul_vie *vie,
615
601
uint8_t * rval )
616
602
{
617
603
uint64_t val ;
618
- int error , lhbr ;
604
+ int error = 0 , lhbr ;
619
605
enum cpu_reg_name reg ;
620
606
621
607
vie_calc_bytereg (vie , & reg , & lhbr );
622
- error = vm_get_register (vcpu , reg , & val );
608
+ val = vm_get_register (vcpu , reg );
623
609
624
610
/*
625
611
* To obtain the value of a legacy high byte register shift the
@@ -637,11 +623,11 @@ static int vie_write_bytereg(struct vcpu *vcpu, struct instr_emul_vie *vie,
637
623
uint8_t byte )
638
624
{
639
625
uint64_t origval , val , mask ;
640
- int error , lhbr ;
626
+ int error = 0 , lhbr ;
641
627
enum cpu_reg_name reg ;
642
628
643
629
vie_calc_bytereg (vie , & reg , & lhbr );
644
- error = vm_get_register (vcpu , reg , & origval );
630
+ origval = vm_get_register (vcpu , reg );
645
631
if (error == 0 ) {
646
632
val = byte ;
647
633
mask = 0xffU ;
@@ -654,25 +640,22 @@ static int vie_write_bytereg(struct vcpu *vcpu, struct instr_emul_vie *vie,
654
640
mask <<= 8 ;
655
641
}
656
642
val |= origval & ~mask ;
657
- error = vm_set_register (vcpu , reg , val );
643
+ vm_set_register (vcpu , reg , val );
658
644
}
659
645
return error ;
660
646
}
661
647
662
648
static int vie_update_register (struct vcpu * vcpu , enum cpu_reg_name reg ,
663
649
uint64_t val_arg , uint8_t size )
664
650
{
665
- int error ;
651
+ int error = 0 ;
666
652
uint64_t origval ;
667
653
uint64_t val = val_arg ;
668
654
669
655
switch (size ) {
670
656
case 1U :
671
657
case 2U :
672
- error = vm_get_register (vcpu , reg , & origval );
673
- if (error != 0 ) {
674
- return error ;
675
- }
658
+ origval = vm_get_register (vcpu , reg );
676
659
val &= size2mask [size ];
677
660
val |= origval & ~size2mask [size ];
678
661
break ;
@@ -685,7 +668,7 @@ static int vie_update_register(struct vcpu *vcpu, enum cpu_reg_name reg,
685
668
return - EINVAL ;
686
669
}
687
670
688
- error = vm_set_register (vcpu , reg , val );
671
+ vm_set_register (vcpu , reg , val );
689
672
690
673
return error ;
691
674
}
@@ -694,14 +677,11 @@ static int vie_update_register(struct vcpu *vcpu, enum cpu_reg_name reg,
694
677
695
678
static int vie_update_rflags (struct vcpu * vcpu , uint64_t rflags2 , uint64_t psl )
696
679
{
697
- int error ;
680
+ int error = 0 ;
698
681
uint8_t size ;
699
682
uint64_t rflags ;
700
683
701
- error = vm_get_register (vcpu , CPU_REG_RFLAGS , & rflags );
702
- if (error != 0 ) {
703
- return error ;
704
- }
684
+ rflags = vm_get_register (vcpu , CPU_REG_RFLAGS );
705
685
706
686
rflags &= ~RFLAGS_STATUS_BITS ;
707
687
rflags |= rflags2 & psl ;
@@ -778,11 +758,9 @@ static int emulate_mov(struct vcpu *vcpu, struct instr_emul_vie *vie)
778
758
*/
779
759
780
760
reg = vie -> reg ;
781
- error = vm_get_register (vcpu , reg , & val );
782
- if (error == 0 ) {
783
- val &= size2mask [size ];
784
- error = mmio_write (vcpu , val );
785
- }
761
+ val = vm_get_register (vcpu , reg );
762
+ val &= size2mask [size ];
763
+ error = mmio_write (vcpu , val );
786
764
break ;
787
765
case 0x8AU :
788
766
/*
@@ -831,12 +809,9 @@ static int emulate_mov(struct vcpu *vcpu, struct instr_emul_vie *vie)
831
809
* A3: mov moffs32, EAX
832
810
* REX.W + A3: mov moffs64, RAX
833
811
*/
834
- error = vm_get_register (vcpu , CPU_REG_RAX ,
835
- & val );
836
- if (error == 0 ) {
837
- val &= size2mask [size ];
838
- error = mmio_write (vcpu , val );
839
- }
812
+ val = vm_get_register (vcpu , CPU_REG_RAX );
813
+ val &= size2mask [size ];
814
+ error = mmio_write (vcpu , val );
840
815
break ;
841
816
case 0xC6U :
842
817
/*
@@ -962,19 +937,12 @@ static int get_gla(struct vcpu *vcpu, __unused struct instr_emul_vie *vie,
962
937
{
963
938
struct seg_desc desc ;
964
939
uint64_t cr0 , val , rflags ;
965
- int error ;
966
940
967
- error = vm_get_register (vcpu , CPU_REG_CR0 , & cr0 );
968
- error | = vm_get_register (vcpu , CPU_REG_RFLAGS , & rflags );
969
- error | = vm_get_register (vcpu , gpr , & val );
941
+ cr0 = vm_get_register (vcpu , CPU_REG_CR0 );
942
+ rflags = vm_get_register (vcpu , CPU_REG_RFLAGS );
943
+ val = vm_get_register (vcpu , gpr );
970
944
vm_get_seg_desc (seg , & desc );
971
945
972
- if (error ) {
973
- pr_err ("%s: error(%d) happens when getting cr0/rflags/segment"
974
- "desc/gpr" , __func__ , error );
975
- return -1 ;
976
- }
977
-
978
946
if (vie_calculate_gla (paging -> cpu_mode , seg , & desc , val , opsize ,
979
947
addrsize , prot , gla ) != 0 ) {
980
948
if (seg == CPU_REG_SS ) {
@@ -1034,7 +1002,7 @@ static int emulate_movs(struct vcpu *vcpu, struct instr_emul_vie *vie,
1034
1002
repeat = vie -> repz_present | vie -> repnz_present ;
1035
1003
1036
1004
if (repeat != 0 ) {
1037
- error = vm_get_register (vcpu , CPU_REG_RCX , & rcx );
1005
+ rcx = vm_get_register (vcpu , CPU_REG_RCX );
1038
1006
1039
1007
/*
1040
1008
* The count register is %rcx, %ecx or %cx depending on the
@@ -1062,9 +1030,9 @@ static int emulate_movs(struct vcpu *vcpu, struct instr_emul_vie *vie,
1062
1030
1063
1031
(void )memcpy_s ((void * )dstaddr , 16U , (void * )srcaddr , opsize );
1064
1032
1065
- error = vm_get_register (vcpu , CPU_REG_RSI , & rsi );
1066
- error = vm_get_register (vcpu , CPU_REG_RDI , & rdi );
1067
- error = vm_get_register (vcpu , CPU_REG_RFLAGS , & rflags );
1033
+ rsi = vm_get_register (vcpu , CPU_REG_RSI );
1034
+ rdi = vm_get_register (vcpu , CPU_REG_RDI );
1035
+ rflags = vm_get_register (vcpu , CPU_REG_RFLAGS );
1068
1036
1069
1037
if ((rflags & PSL_D ) != 0U ) {
1070
1038
rsi -= opsize ;
@@ -1107,7 +1075,7 @@ static int emulate_stos(struct vcpu *vcpu, struct instr_emul_vie *vie)
1107
1075
repeat = vie -> repz_present | vie -> repnz_present ;
1108
1076
1109
1077
if (repeat != 0 ) {
1110
- error = vm_get_register (vcpu , CPU_REG_RCX , & rcx );
1078
+ rcx = vm_get_register (vcpu , CPU_REG_RCX );
1111
1079
1112
1080
/*
1113
1081
* The count register is %rcx, %ecx or %cx depending on the
@@ -1118,15 +1086,15 @@ static int emulate_stos(struct vcpu *vcpu, struct instr_emul_vie *vie)
1118
1086
}
1119
1087
}
1120
1088
1121
- error = vm_get_register (vcpu , CPU_REG_RAX , & val );
1089
+ val = vm_get_register (vcpu , CPU_REG_RAX );
1122
1090
1123
1091
error = mmio_write (vcpu , val );
1124
1092
if (error != 0 ) {
1125
1093
return error ;
1126
1094
}
1127
1095
1128
- error = vm_get_register (vcpu , CPU_REG_RDI , & rdi );
1129
- error = vm_get_register (vcpu , CPU_REG_RFLAGS , & rflags );
1096
+ rdi = vm_get_register (vcpu , CPU_REG_RDI );
1097
+ rflags = vm_get_register (vcpu , CPU_REG_RFLAGS );
1130
1098
1131
1099
if ((rflags & PSL_D ) != 0U ) {
1132
1100
rdi -= opsize ;
@@ -1183,10 +1151,7 @@ static int emulate_test(struct vcpu *vcpu, struct instr_emul_vie *vie)
1183
1151
1184
1152
/* get the first operand */
1185
1153
reg = vie -> reg ;
1186
- error = vm_get_register (vcpu , reg , & val1 );
1187
- if (error != 0 ) {
1188
- break ;
1189
- }
1154
+ val1 = vm_get_register (vcpu , reg );
1190
1155
1191
1156
/* get the second operand */
1192
1157
error = mmio_read (vcpu , & val2 );
@@ -1239,10 +1204,7 @@ static int emulate_and(struct vcpu *vcpu, struct instr_emul_vie *vie)
1239
1204
1240
1205
/* get the first operand */
1241
1206
reg = vie -> reg ;
1242
- error = vm_get_register (vcpu , reg , & val1 );
1243
- if (error != 0 ) {
1244
- break ;
1245
- }
1207
+ val1 = vm_get_register (vcpu , reg );
1246
1208
1247
1209
/* get the second operand */
1248
1210
error = mmio_read (vcpu , & val2 );
@@ -1361,10 +1323,7 @@ static int emulate_or(struct vcpu *vcpu, struct instr_emul_vie *vie)
1361
1323
1362
1324
/* get the second operand */
1363
1325
reg = vie -> reg ;
1364
- error = vm_get_register (vcpu , reg , & val2 );
1365
- if (error != 0 ) {
1366
- break ;
1367
- }
1326
+ val2 = vm_get_register (vcpu , reg );
1368
1327
1369
1328
/* perform the operation and write the result */
1370
1329
result = val1 | val2 ;
@@ -1419,10 +1378,7 @@ static int emulate_cmp(struct vcpu *vcpu, struct instr_emul_vie *vie)
1419
1378
1420
1379
/* Get the register operand */
1421
1380
reg = vie -> reg ;
1422
- error = vm_get_register (vcpu , reg , & regop );
1423
- if (error != 0 ) {
1424
- return error ;
1425
- }
1381
+ regop = vm_get_register (vcpu , reg );
1426
1382
1427
1383
/* Get the memory operand */
1428
1384
error = mmio_read (vcpu , & memop );
@@ -1508,10 +1464,7 @@ static int emulate_sub(struct vcpu *vcpu, struct instr_emul_vie *vie)
1508
1464
1509
1465
/* get the first operand */
1510
1466
reg = vie -> reg ;
1511
- error = vm_get_register (vcpu , reg , & val1 );
1512
- if (error != 0 ) {
1513
- break ;
1514
- }
1467
+ val1 = vm_get_register (vcpu , reg );
1515
1468
1516
1469
/* get the second operand */
1517
1470
error = mmio_read (vcpu , & val2 );
@@ -1582,9 +1535,9 @@ static int emulate_stack_op(struct vcpu *vcpu, struct instr_emul_vie *vie,
1582
1535
}
1583
1536
}
1584
1537
1585
- error = vm_get_register (vcpu , CPU_REG_CR0 , & cr0 );
1586
- error = vm_get_register (vcpu , CPU_REG_RFLAGS , & rflags );
1587
- error = vm_get_register (vcpu , CPU_REG_RSP , & rsp );
1538
+ cr0 = vm_get_register (vcpu , CPU_REG_CR0 );
1539
+ rflags = vm_get_register (vcpu , CPU_REG_RFLAGS );
1540
+ rsp = vm_get_register (vcpu , CPU_REG_RSP );
1588
1541
1589
1542
if (pushop != 0 ) {
1590
1543
rsp -= size ;
@@ -1711,7 +1664,7 @@ static int emulate_bittest(struct vcpu *vcpu, struct instr_emul_vie *vie)
1711
1664
return - EINVAL ;
1712
1665
}
1713
1666
1714
- error = vm_get_register (vcpu , CPU_REG_RFLAGS , & rflags );
1667
+ rflags = vm_get_register (vcpu , CPU_REG_RFLAGS );
1715
1668
1716
1669
error = mmio_read (vcpu , & val );
1717
1670
if (error != 0 ) {
0 commit comments