@@ -172,35 +172,28 @@ static inline void set_idt(struct vcpu_state_t *state, uint64_t base,
172172 state -> _idt .limit = limit ;
173173}
174174
175- static uint64_t vcpu_read_cr (struct vcpu_state_t * state , uint32_t n )
175+ static uint64_t vcpu_read_cr (struct vcpu_t * vcpu , uint32_t n )
176176{
177177 uint64_t val = 0 ;
178178
179179 switch (n ) {
180- case 0 : {
181- val = state -> _cr0 ;
182- break ;
183- }
184- case 2 : {
185- val = state -> _cr2 ;
186- break ;
187- }
188- case 3 : {
189- val = state -> _cr3 ;
190- break ;
191- }
192- case 4 : {
193- val = state -> _cr4 ;
194- break ;
195- }
196- default : {
197- hax_error ("Unsupported CR%d access\n" , n );
198- break ;
199- }
180+ case 0 :
181+ val = vcpu_get_cr0 (vcpu );
182+ break ;
183+ case 2 :
184+ val = vcpu -> state -> _cr2 ;
185+ break ;
186+ case 3 :
187+ val = vcpu_get_cr3 (vcpu );
188+ break ;
189+ case 4 :
190+ val = vcpu_get_cr4 (vcpu );
191+ break ;
192+ default :
193+ hax_error ("Unsupported CR%d access\n" , n );
194+ break ;
200195 }
201-
202196 hax_debug ("vcpu_read_cr cr %x val %llx\n" , n , val );
203-
204197 return val ;
205198}
206199
@@ -1665,7 +1658,7 @@ int vcpu_execute(struct vcpu_t *vcpu)
16651658 hax_mutex_lock (vcpu -> tmutex );
16661659 hax_debug ("vcpu begin to run....\n" );
16671660 // QEMU will do realmode stuff for us
1668- if (!hax -> ug_enable_flag && !(vcpu -> state -> _cr0 & CR0_PE )) {
1661+ if (!hax -> ug_enable_flag && !(vcpu_get_cr0 ( vcpu ) & CR0_PE )) {
16691662 htun -> _exit_reason = 0 ;
16701663 htun -> _exit_status = HAX_EXIT_REALMODE ;
16711664 hax_debug ("Guest is in realmode.\n" );
@@ -1723,14 +1716,14 @@ int vcpu_vmexit_handler(struct vcpu_t *vcpu, exit_reason_t exit_reason,
17231716
17241717int vtlb_active (struct vcpu_t * vcpu )
17251718{
1726- struct vcpu_state_t * state = vcpu -> state ;
17271719 struct per_cpu_data * cpu_data = current_cpu_data ();
1720+ uint64_t cr0 = vcpu_get_cr0 (vcpu );
17281721
17291722 if (hax -> ug_enable_flag )
17301723 return 0 ;
17311724
1732- hax_debug ("vtlb active: cr0, %llx\n" , state -> _cr0 );
1733- if ((state -> _cr0 & CR0_PG ) == 0 )
1725+ hax_debug ("vtlb active: cr0, %llx\n" , cr0 );
1726+ if ((cr0 & CR0_PG ) == 0 )
17341727 return 1 ;
17351728
17361729 if (config .disable_ept )
@@ -2099,6 +2092,7 @@ static int vcpu_emulate_insn(struct vcpu_t *vcpu)
20992092 em_context_t * em_ctxt = & vcpu -> emulate_ctxt ;
21002093 uint8_t instr [INSTR_MAX_LEN ] = {0 };
21012094 uint32_t exit_instr_length = vmcs_read (vcpu , VM_EXIT_INFO_INSTRUCTION_LENGTH );
2095+ uint64_t cr0 = vcpu_get_cr0 (vcpu );
21022096 uint64_t rip = vcpu_get_rip (vcpu );
21032097 segment_desc_t cs ;
21042098 uint64_t va ;
@@ -2109,7 +2103,7 @@ static int vcpu_emulate_insn(struct vcpu_t *vcpu)
21092103
21102104 // Detect guest mode
21112105 cs .ar = vcpu_get_seg_ar (vcpu , SEG_CS );
2112- if (!(vcpu -> state -> _cr0 & CR0_PE ))
2106+ if (!(cr0 & CR0_PE ))
21132107 mode = EM_MODE_REAL ;
21142108 else if (cs .long_mode == 1 )
21152109 mode = EM_MODE_PROT64 ;
@@ -2794,11 +2788,14 @@ static int exit_cr_access(struct vcpu_t *vcpu, struct hax_tunnel *htun)
27942788 bool is_ept_pae = false;
27952789 preempt_flag flags ;
27962790 uint32_t vmcs_err = 0 ;
2791+ state -> _cr0 = vcpu_get_cr0 (vcpu );
2792+ state -> _cr3 = vcpu_get_cr3 (vcpu );
2793+ state -> _cr4 = vcpu_get_cr4 (vcpu );
27972794
27982795 htun -> _exit_reason = vmx (vcpu , exit_reason ).basic_reason ;
27992796
28002797 cr = qual .cr .creg ;
2801- cr_ptr = vcpu_read_cr (state , cr );
2798+ cr_ptr = vcpu_read_cr (vcpu , cr );
28022799
28032800 switch (qual .cr .type ) {
28042801 case 0 : { // MOV CR <- GPR
@@ -3259,6 +3256,7 @@ static int handle_msr_read(struct vcpu_t *vcpu, uint32_t msr, uint64_t *val)
32593256 int index , r = 0 ;
32603257 struct vcpu_state_t * state = vcpu -> state ;
32613258 struct gstate * gstate = & vcpu -> gstate ;
3259+ uint64_t cr0 , cr4 ;
32623260
32633261 switch (msr ) {
32643262 case IA32_TSC : {
@@ -3278,7 +3276,9 @@ static int handle_msr_read(struct vcpu_t *vcpu, uint32_t msr, uint64_t *val)
32783276 break ;
32793277 }
32803278 case IA32_EFER : {
3281- if (!(state -> _cr4 & CR4_PAE ) && (state -> _cr0 & CR0_PG )) {
3279+ cr0 = vcpu_get_cr0 (vcpu );
3280+ cr4 = vcpu_get_cr4 (vcpu );
3281+ if (!(cr4 & CR4_PAE ) && (cr0 & CR0_PG )) {
32823282 r = 1 ;
32833283 } else {
32843284 * val = state -> _efer ;
@@ -3462,8 +3462,9 @@ static int handle_msr_read(struct vcpu_t *vcpu, uint32_t msr, uint64_t *val)
34623462static void vmwrite_efer (struct vcpu_t * vcpu )
34633463{
34643464 struct vcpu_state_t * state = vcpu -> state ;
3465+ uint64_t cr0 = vcpu_get_cr0 (vcpu );
34653466
3466- if ((state -> _cr0 & CR0_PG ) && (state -> _efer & IA32_EFER_LME )) {
3467+ if ((state -> _efer & IA32_EFER_LME ) && (cr0 & CR0_PG )) {
34673468 state -> _efer |= IA32_EFER_LMA ;
34683469
34693470 vmwrite (vcpu , VMX_ENTRY_CONTROLS , vmread (vcpu , VMX_ENTRY_CONTROLS ) |
@@ -3515,6 +3516,7 @@ static int handle_msr_write(struct vcpu_t *vcpu, uint32_t msr, uint64_t val)
35153516 int index , r = 0 ;
35163517 struct vcpu_state_t * state = vcpu -> state ;
35173518 struct gstate * gstate = & vcpu -> gstate ;
3519+ uint64_t cr0 , cr4 ;
35183520
35193521 switch (msr ) {
35203522 case IA32_TSC : {
@@ -3539,10 +3541,12 @@ static int handle_msr_write(struct vcpu_t *vcpu, uint32_t msr, uint64_t val)
35393541 break ;
35403542 }
35413543 case IA32_EFER : {
3544+ cr0 = vcpu_get_cr0 (vcpu );
3545+ cr4 = vcpu_get_cr4 (vcpu );
35423546 hax_info ("Guest writing to EFER[%u]: 0x%x -> 0x%llx, _cr0=0x%llx,"
35433547 " _cr4=0x%llx\n" , vcpu -> vcpu_id , state -> _efer , val ,
3544- state -> _cr0 , state -> _cr4 );
3545- if ((state -> _cr0 & CR0_PG ) && !(state -> _cr4 & CR4_PAE )) {
3548+ cr0 , cr4 );
3549+ if ((cr0 & CR0_PG ) && !(cr4 & CR4_PAE )) {
35463550 state -> _efer = 0 ;
35473551 } else {
35483552 state -> _efer = val ;
0 commit comments