@@ -1636,6 +1636,11 @@ static int vie_init(struct instr_emul_vie *vie, struct vcpu *vcpu)
1636
1636
1637
1637
(void )memset (vie , 0U , sizeof (struct instr_emul_vie ));
1638
1638
1639
+ /* init register fields in vie. */
1640
+ vie -> base_register = CPU_REG_LAST ;
1641
+ vie -> index_register = CPU_REG_LAST ;
1642
+ vie -> segment_register = CPU_REG_LAST ;
1643
+
1639
1644
err_code = PAGE_FAULT_ID_FLAG ;
1640
1645
ret = copy_from_gva (vcpu , vie -> inst , guest_rip_gva ,
1641
1646
inst_len , & err_code , & fault_addr );
@@ -1859,6 +1864,42 @@ static int decode_modrm(struct instr_emul_vie *vie, enum vm_cpu_mode cpu_mode)
1859
1864
1860
1865
vie -> reg |= (vie -> rex_r << 3 );
1861
1866
1867
+ /* SIB */
1868
+ if (vie -> mod != VIE_MOD_DIRECT && vie -> rm == VIE_RM_SIB ) {
1869
+ goto done ;
1870
+ }
1871
+
1872
+ vie -> base_register = vie -> rm ;
1873
+
1874
+ switch (vie -> mod ) {
1875
+ case VIE_MOD_INDIRECT_DISP8 :
1876
+ vie -> disp_bytes = 1U ;
1877
+ break ;
1878
+ case VIE_MOD_INDIRECT_DISP32 :
1879
+ vie -> disp_bytes = 4U ;
1880
+ break ;
1881
+ case VIE_MOD_INDIRECT :
1882
+ if (vie -> rm == VIE_RM_DISP32 ) {
1883
+ vie -> disp_bytes = 4U ;
1884
+ /*
1885
+ * Table 2-7. RIP-Relative Addressing
1886
+ *
1887
+ * In 64-bit mode mod=00 r/m=101 implies [rip] + disp32
1888
+ * whereas in compatibility mode it just implies disp32.
1889
+ */
1890
+
1891
+ if (cpu_mode == CPU_MODE_64BIT ) {
1892
+ vie -> base_register = CPU_REG_RIP ;
1893
+ pr_err ("VM exit with RIP as indirect access" );
1894
+ }
1895
+ else {
1896
+ vie -> base_register = CPU_REG_LAST ;
1897
+ }
1898
+ }
1899
+ break ;
1900
+ }
1901
+
1902
+ done :
1862
1903
vie_advance (vie );
1863
1904
1864
1905
return 0 ;
@@ -1935,7 +1976,7 @@ static int decode_sib(struct instr_emul_vie *vie)
1935
1976
}
1936
1977
1937
1978
/* 'scale' makes sense only in the context of an index register */
1938
- if (vie -> index_register <= CPU_REG_LAST ) {
1979
+ if (vie -> index_register < CPU_REG_LAST ) {
1939
1980
vie -> scale = 1U << vie -> ss ;
1940
1981
}
1941
1982
0 commit comments